commit 8bbb50ceb2d5aea76f5e68fd0d07fbb25679ccc7 Author: 2dust <31833384+2dust@users.noreply.github.com> Date: Fri Oct 11 14:15:20 2019 +0800 mge diff --git a/.github/issue_template.md b/.github/issue_template.md new file mode 100644 index 00000000..b538ab52 --- /dev/null +++ b/.github/issue_template.md @@ -0,0 +1,25 @@ +在提出问题前请先自行排除服务器端问题,同时也请通过搜索确认是否有人提出过相同问题。 + +### 预期行为 +描述你认为应该发生什么 + +### 实际行为 +描述实际发生了什么 + +### 复现方法 +1. +2. +3. + +### 日志信息,位置在当前目录下的guiLogs +
+ +``` +在这里粘贴日志 +``` +
+ +### 环境信息 + +### 额外信息(可选) + diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..b416e378 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +################################################################################ +# 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。 +################################################################################ + +/v2rayN/.vs/ +/v2rayN/v2rayN/bin/Debug/app.publish +/v2rayN/v2rayN/bin/Debug +/v2rayN/v2rayN/obj/Debug +/v2rayN/.vs/v2rayN/DesignTimeBuild +/v2rayN/v2rayN/bin/Release +/v2rayN/v2rayN/obj/Release +/v2rayN/packages +.vs/ProjectSettings.json +.vs/slnx.sqlite +.vs/VSWorkspaceState.json diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..94a9ed02 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 00000000..bb10c507 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# v2rayN + +### How to use +- Download exe from release download +- Also need to download v2ray core in the same folder +- Run v2rayN.exe + +### Requirements +- Microsoft [.NET Framework 4.6](https://docs.microsoft.com/zh-cn/dotnet/framework/install/guide-for-developers) or higher +- Project V core [https://github.com/v2ray/v2ray-core/releases](https://github.com/v2ray/v2ray-core/releases) diff --git a/v2rayN/v2rayN.sln b/v2rayN/v2rayN.sln new file mode 100644 index 00000000..02f175e5 --- /dev/null +++ b/v2rayN/v2rayN.sln @@ -0,0 +1,30 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28010.2050 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "v2rayN", "v2rayN\v2rayN.csproj", "{0A9785E6-D256-4B73-9757-4EF59955FD1E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Debug|x86.ActiveCfg = Debug|Any CPU + {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Debug|x86.Build.0 = Debug|Any CPU + {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Release|Any CPU.Build.0 = Release|Any CPU + {0A9785E6-D256-4B73-9757-4EF59955FD1E}.Release|x86.ActiveCfg = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {56B88873-C9CC-4069-A1E5-DABD6C6E865E} + EndGlobalSection +EndGlobal diff --git a/v2rayN/v2rayN.v11.suo b/v2rayN/v2rayN.v11.suo new file mode 100644 index 00000000..91d8fcf0 Binary files /dev/null and b/v2rayN/v2rayN.v11.suo differ diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs new file mode 100644 index 00000000..0e407a43 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs @@ -0,0 +1,140 @@ +namespace v2rayN.Forms +{ + partial class AddServer2Form + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer2Form)); + this.btnClose = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.txtAddress = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.groupBox1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // groupBox1 + // + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Controls.Add(this.txtAddress); + this.groupBox1.Controls.Add(this.label13); + this.groupBox1.Controls.Add(this.txtRemarks); + this.groupBox1.Controls.Add(this.label6); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // txtAddress + // + resources.ApplyResources(this.txtAddress, "txtAddress"); + this.txtAddress.Name = "txtAddress"; + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // panel2 + // + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + this.panel2.Name = "panel2"; + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // AddServer2Form + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "AddServer2Form"; + this.Load += new System.EventHandler(this.AddServer2Form_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.panel2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.TextBox txtAddress; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.cs b/v2rayN/v2rayN/Forms/AddServer2Form.cs new file mode 100644 index 00000000..a88afb44 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer2Form.cs @@ -0,0 +1,75 @@ +using System; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class AddServer2Form : BaseForm + { + public int EditIndex { get; set; } + VmessItem vmessItem; + + public AddServer2Form() + { + InitializeComponent(); + } + + private void AddServer2Form_Load(object sender, EventArgs e) + { + if (EditIndex >= 0) + { + BindingServer(); + } + else + { + ClearServer(); + } + } + + /// + /// 绑定数据 + /// + private void BindingServer() + { + vmessItem = config.vmess[EditIndex]; + txtRemarks.Text = vmessItem.remarks; + txtAddress.Text = vmessItem.address; + txtAddress.ReadOnly = true; + } + + + /// + /// 清除设置 + /// + private void ClearServer() + { + txtRemarks.Text = ""; + } + + private void btnOK_Click(object sender, EventArgs e) + { + string remarks = txtRemarks.Text; + if (Utils.IsNullOrEmpty(remarks)) + { + UI.Show(UIRes.I18N("PleaseFillRemarks")); + return; + } + vmessItem.remarks = remarks; + + if (ConfigHandler.EditCustomServer(ref config, vmessItem, EditIndex) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.Show(UIRes.I18N("OperationFailed")); + } + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + } +} diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.resx b/v2rayN/v2rayN/Forms/AddServer2Form.resx new file mode 100644 index 00000000..c98d40e0 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer2Form.resx @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + txtAddress + + + Address + + + 0 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Bottom + + + + True + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + btnOK + + + txtRemarks + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + AddServer2Form + + + label1 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + panel2 + + + + 12, 27 + + + Fill + + + True + + + 313, 21 + + + groupBox1 + + + 6, 12 + + + True + + + Alias (remarks) + + + 127, 23 + + + 6 + + + 7 + + + groupBox1 + + + 113, 12 + + + 4 + + + Server + + + 23 + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + 611, 60 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Edit custom configuration server + + + 432, 104 + + + 611, 10 + + + groupBox1 + + + * Fill in manually + + + 11 + + + 10 + + + panel1 + + + 75, 23 + + + 2 + + + btnClose + + + 303, 17 + + + 0, 211 + + + 75, 23 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + Top + + + 0, 10 + + + 3 + + + 611, 201 + + + 2 + + + 4 + + + 3 + + + 127, 62 + + + groupBox1 + + + True + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 83, 12 + + + &Cancel + + + 12, 62 + + + &OK + + + 0 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 446, 26 + + + groupBox1 + + + label6 + + + $this + + + 1 + + + 0, 0 + + + panel2 + + + label13 + + + 83, 12 + + + 22 + + + 1 + + + panel2 + + + 5 + + + 611, 271 + + + 0 + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + $this + + + 396, 17 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + True + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx new file mode 100644 index 00000000..a01d4dfa --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer2Form.zh-Hans.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 取消(&C) + + + *手填,方便识别管理 + + + 别名(remarks) + + + 地址(address) + + + 服务器 + + + 确定(&O) + + + 编辑自定义配置服务器 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs new file mode 100644 index 00000000..3515e6b9 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs @@ -0,0 +1,231 @@ +namespace v2rayN.Forms +{ + partial class AddServer3Form + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer3Form)); + this.btnClose = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.label13 = new System.Windows.Forms.Label(); + this.cmbSecurity = new System.Windows.Forms.ComboBox(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.txtId = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.txtAddress = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.menuServer = new System.Windows.Forms.MenuStrip(); + this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.menuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBox1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.menuServer.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.label13); + this.groupBox1.Controls.Add(this.cmbSecurity); + this.groupBox1.Controls.Add(this.txtRemarks); + this.groupBox1.Controls.Add(this.label6); + this.groupBox1.Controls.Add(this.label5); + this.groupBox1.Controls.Add(this.txtId); + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Controls.Add(this.txtPort); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.txtAddress); + this.groupBox1.Controls.Add(this.label1); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // cmbSecurity + // + this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbSecurity.FormattingEnabled = true; + this.cmbSecurity.Items.AddRange(new object[] { + resources.GetString("cmbSecurity.Items"), + resources.GetString("cmbSecurity.Items1"), + resources.GetString("cmbSecurity.Items2"), + resources.GetString("cmbSecurity.Items3"), + resources.GetString("cmbSecurity.Items4"), + resources.GetString("cmbSecurity.Items5"), + resources.GetString("cmbSecurity.Items6"), + resources.GetString("cmbSecurity.Items7")}); + resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); + this.cmbSecurity.Name = "cmbSecurity"; + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // txtId + // + resources.ApplyResources(this.txtId, "txtId"); + this.txtId.Name = "txtId"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // txtPort + // + resources.ApplyResources(this.txtPort, "txtPort"); + this.txtPort.Name = "txtPort"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // txtAddress + // + resources.ApplyResources(this.txtAddress, "txtAddress"); + this.txtAddress.Name = "txtAddress"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // panel2 + // + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // menuServer + // + this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MenuItem1}); + resources.ApplyResources(this.menuServer, "menuServer"); + this.menuServer.Name = "menuServer"; + // + // MenuItem1 + // + this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuItemImportClipboard}); + this.MenuItem1.Name = "MenuItem1"; + resources.ApplyResources(this.MenuItem1, "MenuItem1"); + // + // menuItemImportClipboard + // + this.menuItemImportClipboard.Name = "menuItemImportClipboard"; + resources.ApplyResources(this.menuItemImportClipboard, "menuItemImportClipboard"); + this.menuItemImportClipboard.Click += new System.EventHandler(this.menuItemImportClipboard_Click); + // + // AddServer3Form + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.Controls.Add(this.menuServer); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MinimizeBox = true; + this.Name = "AddServer3Form"; + this.Load += new System.EventHandler(this.AddServer3Form_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.panel2.ResumeLayout(false); + this.menuServer.ResumeLayout(false); + this.menuServer.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox txtId; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtPort; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtAddress; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cmbSecurity; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.MenuStrip menuServer; + private System.Windows.Forms.ToolStripMenuItem MenuItem1; + private System.Windows.Forms.ToolStripMenuItem menuItemImportClipboard; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.cs b/v2rayN/v2rayN/Forms/AddServer3Form.cs new file mode 100644 index 00000000..c39f2cfe --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer3Form.cs @@ -0,0 +1,143 @@ +using System; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class AddServer3Form : BaseForm + { + public int EditIndex { get; set; } + VmessItem vmessItem = null; + + public AddServer3Form() + { + InitializeComponent(); + } + + private void AddServer3Form_Load(object sender, EventArgs e) + { + if (EditIndex >= 0) + { + vmessItem = config.vmess[EditIndex]; + BindingServer(); + } + else + { + vmessItem = new VmessItem(); + ClearServer(); + } + } + + /// + /// 绑定数据 + /// + private void BindingServer() + { + + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + txtId.Text = vmessItem.id; + cmbSecurity.Text = vmessItem.security; + txtRemarks.Text = vmessItem.remarks; + } + + + /// + /// 清除设置 + /// + private void ClearServer() + { + txtAddress.Text = ""; + txtPort.Text = ""; + txtId.Text = ""; + cmbSecurity.Text = Global.DefaultSecurity; + txtRemarks.Text = ""; + } + + private void btnOK_Click(object sender, EventArgs e) + { + string address = txtAddress.Text; + string port = txtPort.Text; + string id = txtId.Text; + string security = cmbSecurity.Text; + string remarks = txtRemarks.Text; + + if (Utils.IsNullOrEmpty(address)) + { + UI.Show(UIRes.I18N("FillServerAddress")); + return; + } + if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port)) + { + UI.Show(UIRes.I18N("FillCorrectServerPort")); + return; + } + if (Utils.IsNullOrEmpty(id)) + { + UI.Show(UIRes.I18N("FillPassword")); + return; + } + if (Utils.IsNullOrEmpty(security)) + { + UI.Show(UIRes.I18N("PleaseSelectEncryption")); + return; + } + + vmessItem.address = address; + vmessItem.port = Utils.ToInt(port); + vmessItem.id = id; + vmessItem.security = security; + vmessItem.remarks = remarks; + + if (ConfigHandler.AddShadowsocksServer(ref config, vmessItem, EditIndex) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.Show(UIRes.I18N("OperationFailed")); + } + } + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + + #region 导入配置 + + /// + /// 从剪贴板导入URL + /// + /// + /// + private void menuItemImportClipboard_Click(object sender, EventArgs e) + { + ImportConfig(); + } + + private void ImportConfig() + { + ClearServer(); + + string msg; + VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out msg); + if (vmessItem == null) + { + UI.Show(msg); + return; + } + + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + cmbSecurity.Text = vmessItem.security; + txtId.Text = vmessItem.id; + txtRemarks.Text = vmessItem.remarks; + } + + #endregion + + + } +} diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.resx b/v2rayN/v2rayN/Forms/AddServer3Form.resx new file mode 100644 index 00000000..f2f23bba --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer3Form.resx @@ -0,0 +1,606 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 396, 17 + + + 75, 23 + + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + True + + + 337, 158 + + + 113, 12 + + + 22 + + + * Fill in manually + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + aes-256-cfb + + + aes-128-cfb + + + chacha20 + + + chacha20-ietf + + + aes-256-gcm + + + aes-128-gcm + + + chacha20-poly1305 + + + chacha20-ietf-poly1305 + + + 127, 120 + + + 194, 20 + + + 6 + + + cmbSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + 127, 154 + + + 194, 21 + + + 11 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + True + + + 12, 158 + + + 95, 12 + + + 10 + + + Alias (remarks) + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + True + + + 12, 124 + + + 65, 12 + + + 8 + + + Encryption + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + 127, 85 + + + * + + + 278, 21 + + + 5 + + + txtId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + True + + + 12, 89 + + + 53, 12 + + + 4 + + + Password + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + + + 127, 56 + + + 194, 21 + + + 3 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + True + + + 12, 60 + + + 71, 12 + + + 2 + + + Server port + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + 127, 27 + + + 359, 21 + + + 1 + + + txtAddress + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 9 + + + True + + + 12, 31 + + + 89, 12 + + + 0 + + + Server address + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 10 + + + + Fill + + + 0, 35 + + + 547, 196 + + + 3 + + + Server + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + 303, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Bottom + + + 0, 231 + + + 547, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top + + + 0, 25 + + + 547, 10 + + + 6 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 17, 17 + + + 235, 22 + + + Import URL from clipboard + + + 162, 21 + + + Import configuration file + + + 0, 0 + + + 547, 25 + + + 8 + + + menuServer + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + True + + + 6, 12 + + + 547, 291 + + + Edit or add a [Shadowsocks] server + + + MenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuItemImportClipboard + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + AddServer3Form + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer3Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer3Form.zh-Hans.resx new file mode 100644 index 00000000..2a5968ca --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer3Form.zh-Hans.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 取消(&C) + + + *手填,方便识别管理 + + + 别名(remarks) + + + 加密方式 + + + 密码 + + + 服务器端口 + + + 服务器地址 + + + 服务器 + + + 确定(&O) + + + 从剪贴板导入URL + + + 扫描屏幕上的二维码 + + + 导入配置文件 + + + 编辑或添加[Shadowsocks]服务器 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs b/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs new file mode 100644 index 00000000..3ae98f0b --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs @@ -0,0 +1,220 @@ +namespace v2rayN.Forms +{ + partial class AddServer4Form + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer4Form)); + this.btnClose = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.txtSecurity = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.txtId = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label13 = new System.Windows.Forms.Label(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.txtAddress = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.menuServer = new System.Windows.Forms.MenuStrip(); + this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.menuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBox1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.menuServer.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.txtSecurity); + this.groupBox1.Controls.Add(this.label4); + this.groupBox1.Controls.Add(this.txtId); + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Controls.Add(this.label13); + this.groupBox1.Controls.Add(this.txtRemarks); + this.groupBox1.Controls.Add(this.label6); + this.groupBox1.Controls.Add(this.txtPort); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.txtAddress); + this.groupBox1.Controls.Add(this.label1); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // txtSecurity + // + resources.ApplyResources(this.txtSecurity, "txtSecurity"); + this.txtSecurity.Name = "txtSecurity"; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // txtId + // + resources.ApplyResources(this.txtId, "txtId"); + this.txtId.Name = "txtId"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // txtPort + // + resources.ApplyResources(this.txtPort, "txtPort"); + this.txtPort.Name = "txtPort"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // txtAddress + // + resources.ApplyResources(this.txtAddress, "txtAddress"); + this.txtAddress.Name = "txtAddress"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // panel2 + // + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // menuServer + // + this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MenuItem1}); + resources.ApplyResources(this.menuServer, "menuServer"); + this.menuServer.Name = "menuServer"; + // + // MenuItem1 + // + this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuItemImportClipboard}); + this.MenuItem1.Name = "MenuItem1"; + resources.ApplyResources(this.MenuItem1, "MenuItem1"); + // + // menuItemImportClipboard + // + this.menuItemImportClipboard.Name = "menuItemImportClipboard"; + resources.ApplyResources(this.menuItemImportClipboard, "menuItemImportClipboard"); + this.menuItemImportClipboard.Click += new System.EventHandler(this.menuItemImportClipboard_Click); + // + // AddServer4Form + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.Controls.Add(this.menuServer); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MinimizeBox = true; + this.Name = "AddServer4Form"; + this.Load += new System.EventHandler(this.AddServer4Form_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.panel2.ResumeLayout(false); + this.menuServer.ResumeLayout(false); + this.menuServer.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox txtPort; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtAddress; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.MenuStrip menuServer; + private System.Windows.Forms.ToolStripMenuItem MenuItem1; + private System.Windows.Forms.ToolStripMenuItem menuItemImportClipboard; + private System.Windows.Forms.TextBox txtId; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtSecurity; + private System.Windows.Forms.Label label4; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.cs b/v2rayN/v2rayN/Forms/AddServer4Form.cs new file mode 100644 index 00000000..d331bec2 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer4Form.cs @@ -0,0 +1,132 @@ +using System; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class AddServer4Form : BaseForm + { + public int EditIndex { get; set; } + VmessItem vmessItem = null; + + public AddServer4Form() + { + InitializeComponent(); + } + + private void AddServer4Form_Load(object sender, EventArgs e) + { + if (EditIndex >= 0) + { + vmessItem = config.vmess[EditIndex]; + BindingServer(); + } + else + { + vmessItem = new VmessItem(); + ClearServer(); + } + } + + /// + /// 绑定数据 + /// + private void BindingServer() + { + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + txtId.Text = vmessItem.id; + txtSecurity.Text = vmessItem.security; + txtRemarks.Text = vmessItem.remarks; + } + + + /// + /// 清除设置 + /// + private void ClearServer() + { + txtAddress.Text = ""; + txtPort.Text = ""; + txtId.Text = ""; + txtSecurity.Text = ""; + txtRemarks.Text = ""; + } + + private void btnOK_Click(object sender, EventArgs e) + { + string address = txtAddress.Text; + string port = txtPort.Text; + string id = txtId.Text; + string security = txtSecurity.Text; + string remarks = txtRemarks.Text; + + if (Utils.IsNullOrEmpty(address)) + { + UI.Show(UIRes.I18N("FillServerAddress")); + return; + } + if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port)) + { + UI.Show(UIRes.I18N("FillCorrectServerPort")); + return; + } + + vmessItem.address = address; + vmessItem.port = Utils.ToInt(port); + vmessItem.id = id; + vmessItem.security = security; + vmessItem.remarks = remarks; + + if (ConfigHandler.AddSocksServer(ref config, vmessItem, EditIndex) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.Show(UIRes.I18N("OperationFailed")); + } + } + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + + #region 导入配置 + + /// + /// 从剪贴板导入URL + /// + /// + /// + private void menuItemImportClipboard_Click(object sender, EventArgs e) + { + ImportConfig(); + } + + private void ImportConfig() + { + ClearServer(); + + string msg; + VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out msg); + if (vmessItem == null) + { + UI.Show(msg); + return; + } + + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + txtSecurity.Text = vmessItem.security; + txtId.Text = vmessItem.id; + txtRemarks.Text = vmessItem.remarks; + } + + #endregion + + + } +} diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.resx b/v2rayN/v2rayN/Forms/AddServer4Form.resx new file mode 100644 index 00000000..566de4b3 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer4Form.resx @@ -0,0 +1,588 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 396, 17 + + + 75, 23 + + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + 127, 84 + + + 278, 21 + + + 26 + + + txtSecurity + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + True + + + + NoControl + + + 12, 88 + + + 89, 12 + + + 25 + + + User(Optional) + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + 127, 117 + + + * + + + 278, 21 + + + 24 + + + txtId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + True + + + NoControl + + + 12, 121 + + + 113, 12 + + + 23 + + + Password(Optional) + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + True + + + 337, 158 + + + 113, 12 + + + 22 + + + * Fill in manually + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + 127, 154 + + + 194, 21 + + + 11 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + True + + + 12, 158 + + + 95, 12 + + + 10 + + + Alias (remarks) + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + + + 127, 56 + + + 194, 21 + + + 3 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + True + + + 12, 60 + + + 71, 12 + + + 2 + + + Server port + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + 127, 27 + + + 359, 21 + + + 1 + + + txtAddress + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 9 + + + True + + + 12, 31 + + + 89, 12 + + + 0 + + + Server address + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 10 + + + Fill + + + 0, 35 + + + 547, 196 + + + 3 + + + Server + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + 303, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Bottom + + + 0, 231 + + + 547, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top + + + 0, 25 + + + 547, 10 + + + 6 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 17, 17 + + + 235, 22 + + + Import URL from clipboard + + + 162, 21 + + + Import configuration file + + + 0, 0 + + + 547, 25 + + + 8 + + + menuServer + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + True + + + 6, 12 + + + 547, 291 + + + Edit or add a [Socks] server + + + MenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuItemImportClipboard + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + AddServer4Form + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx new file mode 100644 index 00000000..6a3cc081 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 取消(&C) + + + 服务器 + + + + 127, 85 + + + 12, 89 + + + 77, 12 + + + 用户名(可选) + + + 127, 115 + + + 12, 119 + + + 65, 12 + + + 密码(可选) + + + *手填,方便识别管理 + + + 83, 12 + + + 别名(remarks) + + + 65, 12 + + + 服务器端口 + + + 65, 12 + + + 服务器地址 + + + 确定(&O) + + + 92, 21 + + + 导入配置文件 + + + 171, 22 + + + 从剪贴板导入URL + + + 编辑或添加[Socks]服务器 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs new file mode 100644 index 00000000..c398397b --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServerForm.Designer.cs @@ -0,0 +1,516 @@ +namespace v2rayN.Forms +{ + partial class AddServerForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServerForm)); + this.btnClose = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.btnGUID = new System.Windows.Forms.Button(); + this.label13 = new System.Windows.Forms.Label(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.label24 = new System.Windows.Forms.Label(); + this.label23 = new System.Windows.Forms.Label(); + this.panTlsMore = new System.Windows.Forms.Panel(); + this.label22 = new System.Windows.Forms.Label(); + this.label21 = new System.Windows.Forms.Label(); + this.cmbAllowInsecure = new System.Windows.Forms.ComboBox(); + this.label20 = new System.Windows.Forms.Label(); + this.txtPath = new System.Windows.Forms.TextBox(); + this.label19 = new System.Windows.Forms.Label(); + this.label18 = new System.Windows.Forms.Label(); + this.label17 = new System.Windows.Forms.Label(); + this.label16 = new System.Windows.Forms.Label(); + this.label14 = new System.Windows.Forms.Label(); + this.label15 = new System.Windows.Forms.Label(); + this.cmbStreamSecurity = new System.Windows.Forms.ComboBox(); + this.label12 = new System.Windows.Forms.Label(); + this.txtRequestHost = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.cmbHeaderType = new System.Windows.Forms.ComboBox(); + this.label9 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.cmbNetwork = new System.Windows.Forms.ComboBox(); + this.label7 = new System.Windows.Forms.Label(); + this.cmbSecurity = new System.Windows.Forms.ComboBox(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.txtAlterId = new System.Windows.Forms.TextBox(); + this.label4 = new System.Windows.Forms.Label(); + this.txtId = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.txtAddress = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.menuServer = new System.Windows.Forms.MenuStrip(); + this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.MenuItemImportClient = new System.Windows.Forms.ToolStripMenuItem(); + this.MenuItemImportServer = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.MenuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.panTlsMore.SuspendLayout(); + this.panel2.SuspendLayout(); + this.menuServer.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.btnGUID); + this.groupBox1.Controls.Add(this.label13); + this.groupBox1.Controls.Add(this.groupBox2); + this.groupBox1.Controls.Add(this.label9); + this.groupBox1.Controls.Add(this.label8); + this.groupBox1.Controls.Add(this.cmbNetwork); + this.groupBox1.Controls.Add(this.label7); + this.groupBox1.Controls.Add(this.cmbSecurity); + this.groupBox1.Controls.Add(this.txtRemarks); + this.groupBox1.Controls.Add(this.label6); + this.groupBox1.Controls.Add(this.label5); + this.groupBox1.Controls.Add(this.txtAlterId); + this.groupBox1.Controls.Add(this.label4); + this.groupBox1.Controls.Add(this.txtId); + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Controls.Add(this.txtPort); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.txtAddress); + this.groupBox1.Controls.Add(this.label1); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // btnGUID + // + resources.ApplyResources(this.btnGUID, "btnGUID"); + this.btnGUID.Name = "btnGUID"; + this.btnGUID.UseVisualStyleBackColor = true; + this.btnGUID.Click += new System.EventHandler(this.btnGUID_Click); + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.label24); + this.groupBox2.Controls.Add(this.label23); + this.groupBox2.Controls.Add(this.panTlsMore); + this.groupBox2.Controls.Add(this.label20); + this.groupBox2.Controls.Add(this.txtPath); + this.groupBox2.Controls.Add(this.label19); + this.groupBox2.Controls.Add(this.label18); + this.groupBox2.Controls.Add(this.label17); + this.groupBox2.Controls.Add(this.label16); + this.groupBox2.Controls.Add(this.label14); + this.groupBox2.Controls.Add(this.label15); + this.groupBox2.Controls.Add(this.cmbStreamSecurity); + this.groupBox2.Controls.Add(this.label12); + this.groupBox2.Controls.Add(this.txtRequestHost); + this.groupBox2.Controls.Add(this.label11); + this.groupBox2.Controls.Add(this.label10); + this.groupBox2.Controls.Add(this.cmbHeaderType); + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // label24 + // + resources.ApplyResources(this.label24, "label24"); + this.label24.Name = "label24"; + // + // label23 + // + resources.ApplyResources(this.label23, "label23"); + this.label23.Name = "label23"; + // + // panTlsMore + // + this.panTlsMore.Controls.Add(this.label22); + this.panTlsMore.Controls.Add(this.label21); + this.panTlsMore.Controls.Add(this.cmbAllowInsecure); + resources.ApplyResources(this.panTlsMore, "panTlsMore"); + this.panTlsMore.Name = "panTlsMore"; + // + // label22 + // + resources.ApplyResources(this.label22, "label22"); + this.label22.Name = "label22"; + // + // label21 + // + resources.ApplyResources(this.label21, "label21"); + this.label21.Name = "label21"; + // + // cmbAllowInsecure + // + this.cmbAllowInsecure.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbAllowInsecure.FormattingEnabled = true; + this.cmbAllowInsecure.Items.AddRange(new object[] { + resources.GetString("cmbAllowInsecure.Items"), + resources.GetString("cmbAllowInsecure.Items1"), + resources.GetString("cmbAllowInsecure.Items2")}); + resources.ApplyResources(this.cmbAllowInsecure, "cmbAllowInsecure"); + this.cmbAllowInsecure.Name = "cmbAllowInsecure"; + // + // label20 + // + resources.ApplyResources(this.label20, "label20"); + this.label20.Name = "label20"; + // + // txtPath + // + resources.ApplyResources(this.txtPath, "txtPath"); + this.txtPath.Name = "txtPath"; + // + // label19 + // + resources.ApplyResources(this.label19, "label19"); + this.label19.Name = "label19"; + // + // label18 + // + resources.ApplyResources(this.label18, "label18"); + this.label18.Name = "label18"; + // + // label17 + // + resources.ApplyResources(this.label17, "label17"); + this.label17.Name = "label17"; + // + // label16 + // + resources.ApplyResources(this.label16, "label16"); + this.label16.Name = "label16"; + // + // label14 + // + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // + // cmbStreamSecurity + // + this.cmbStreamSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbStreamSecurity.FormattingEnabled = true; + this.cmbStreamSecurity.Items.AddRange(new object[] { + resources.GetString("cmbStreamSecurity.Items"), + resources.GetString("cmbStreamSecurity.Items1")}); + resources.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity"); + this.cmbStreamSecurity.Name = "cmbStreamSecurity"; + this.cmbStreamSecurity.SelectedIndexChanged += new System.EventHandler(this.cmbStreamSecurity_SelectedIndexChanged); + // + // label12 + // + resources.ApplyResources(this.label12, "label12"); + this.label12.Name = "label12"; + // + // txtRequestHost + // + resources.ApplyResources(this.txtRequestHost, "txtRequestHost"); + this.txtRequestHost.Name = "txtRequestHost"; + // + // label11 + // + resources.ApplyResources(this.label11, "label11"); + this.label11.Name = "label11"; + // + // label10 + // + resources.ApplyResources(this.label10, "label10"); + this.label10.Name = "label10"; + // + // cmbHeaderType + // + this.cmbHeaderType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbHeaderType.FormattingEnabled = true; + this.cmbHeaderType.Items.AddRange(new object[] { + resources.GetString("cmbHeaderType.Items"), + resources.GetString("cmbHeaderType.Items1"), + resources.GetString("cmbHeaderType.Items2"), + resources.GetString("cmbHeaderType.Items3"), + resources.GetString("cmbHeaderType.Items4"), + resources.GetString("cmbHeaderType.Items5"), + resources.GetString("cmbHeaderType.Items6")}); + resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType"); + this.cmbHeaderType.Name = "cmbHeaderType"; + // + // label9 + // + resources.ApplyResources(this.label9, "label9"); + this.label9.Name = "label9"; + // + // label8 + // + resources.ApplyResources(this.label8, "label8"); + this.label8.Name = "label8"; + // + // cmbNetwork + // + this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbNetwork.FormattingEnabled = true; + this.cmbNetwork.Items.AddRange(new object[] { + resources.GetString("cmbNetwork.Items"), + resources.GetString("cmbNetwork.Items1"), + resources.GetString("cmbNetwork.Items2"), + resources.GetString("cmbNetwork.Items3"), + resources.GetString("cmbNetwork.Items4")}); + resources.ApplyResources(this.cmbNetwork, "cmbNetwork"); + this.cmbNetwork.Name = "cmbNetwork"; + this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged); + // + // label7 + // + resources.ApplyResources(this.label7, "label7"); + this.label7.Name = "label7"; + // + // cmbSecurity + // + this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbSecurity.FormattingEnabled = true; + this.cmbSecurity.Items.AddRange(new object[] { + resources.GetString("cmbSecurity.Items"), + resources.GetString("cmbSecurity.Items1"), + resources.GetString("cmbSecurity.Items2"), + resources.GetString("cmbSecurity.Items3")}); + resources.ApplyResources(this.cmbSecurity, "cmbSecurity"); + this.cmbSecurity.Name = "cmbSecurity"; + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // txtAlterId + // + resources.ApplyResources(this.txtAlterId, "txtAlterId"); + this.txtAlterId.Name = "txtAlterId"; + // + // label4 + // + resources.ApplyResources(this.label4, "label4"); + this.label4.Name = "label4"; + // + // txtId + // + resources.ApplyResources(this.txtId, "txtId"); + this.txtId.Name = "txtId"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // txtPort + // + resources.ApplyResources(this.txtPort, "txtPort"); + this.txtPort.Name = "txtPort"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // txtAddress + // + resources.ApplyResources(this.txtAddress, "txtAddress"); + this.txtAddress.Name = "txtAddress"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // panel2 + // + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // menuServer + // + this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MenuItem1}); + resources.ApplyResources(this.menuServer, "menuServer"); + this.menuServer.Name = "menuServer"; + // + // MenuItem1 + // + this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MenuItemImportClient, + this.MenuItemImportServer, + this.toolStripSeparator1, + this.MenuItemImportClipboard}); + this.MenuItem1.Name = "MenuItem1"; + resources.ApplyResources(this.MenuItem1, "MenuItem1"); + // + // MenuItemImportClient + // + this.MenuItemImportClient.Name = "MenuItemImportClient"; + resources.ApplyResources(this.MenuItemImportClient, "MenuItemImportClient"); + this.MenuItemImportClient.Click += new System.EventHandler(this.MenuItemImportClient_Click); + // + // MenuItemImportServer + // + this.MenuItemImportServer.Name = "MenuItemImportServer"; + resources.ApplyResources(this.MenuItemImportServer, "MenuItemImportServer"); + this.MenuItemImportServer.Click += new System.EventHandler(this.MenuItemImportServer_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); + // + // MenuItemImportClipboard + // + this.MenuItemImportClipboard.Name = "MenuItemImportClipboard"; + resources.ApplyResources(this.MenuItemImportClipboard, "MenuItemImportClipboard"); + this.MenuItemImportClipboard.Click += new System.EventHandler(this.MenuItemImportClipboard_Click); + // + // AddServerForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.Controls.Add(this.menuServer); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "AddServerForm"; + this.Load += new System.EventHandler(this.AddServerForm_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.panTlsMore.ResumeLayout(false); + this.panTlsMore.PerformLayout(); + this.panel2.ResumeLayout(false); + this.menuServer.ResumeLayout(false); + this.menuServer.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox txtAlterId; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox txtId; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtPort; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtAddress; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cmbSecurity; + private System.Windows.Forms.ComboBox cmbNetwork; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.TextBox txtRequestHost; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.ComboBox cmbHeaderType; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.MenuStrip menuServer; + private System.Windows.Forms.ToolStripMenuItem MenuItem1; + private System.Windows.Forms.ToolStripMenuItem MenuItemImportClient; + private System.Windows.Forms.ToolStripMenuItem MenuItemImportServer; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.ComboBox cmbStreamSecurity; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem MenuItemImportClipboard; + private System.Windows.Forms.Button btnGUID; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.TextBox txtPath; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.ComboBox cmbAllowInsecure; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.Panel panTlsMore; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.Label label23; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServerForm.cs b/v2rayN/v2rayN/Forms/AddServerForm.cs new file mode 100644 index 00000000..816b7013 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServerForm.cs @@ -0,0 +1,293 @@ +using System; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class AddServerForm : BaseForm + { + public int EditIndex { get; set; } + VmessItem vmessItem = null; + + public AddServerForm() + { + InitializeComponent(); + } + + private void AddServerForm_Load(object sender, EventArgs e) + { + if (EditIndex >= 0) + { + vmessItem = config.vmess[EditIndex]; + BindingServer(); + } + else + { + vmessItem = new VmessItem(); + ClearServer(); + } + } + + /// + /// 绑定数据 + /// + private void BindingServer() + { + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + txtId.Text = vmessItem.id; + txtAlterId.Text = vmessItem.alterId.ToString(); + cmbSecurity.Text = vmessItem.security; + cmbNetwork.Text = vmessItem.network; + txtRemarks.Text = vmessItem.remarks; + + cmbHeaderType.Text = vmessItem.headerType; + txtRequestHost.Text = vmessItem.requestHost; + txtPath.Text = vmessItem.path; + cmbStreamSecurity.Text = vmessItem.streamSecurity; + cmbAllowInsecure.Text = vmessItem.allowInsecure; + } + + + /// + /// 清除设置 + /// + private void ClearServer() + { + txtAddress.Text = ""; + txtPort.Text = ""; + txtId.Text = ""; + txtAlterId.Text = "0"; + cmbSecurity.Text = Global.DefaultSecurity; + cmbNetwork.Text = Global.DefaultNetwork; + txtRemarks.Text = ""; + + cmbHeaderType.Text = Global.None; + txtRequestHost.Text = ""; + cmbStreamSecurity.Text = ""; + cmbAllowInsecure.Text = ""; + txtPath.Text = ""; + } + + + private void cmbNetwork_SelectedIndexChanged(object sender, EventArgs e) + { + SetHeaderType(); + } + + /// + /// 设置伪装选项 + /// + private void SetHeaderType() + { + cmbHeaderType.Items.Clear(); + + string network = cmbNetwork.Text; + if (Utils.IsNullOrEmpty(network)) + { + cmbHeaderType.Items.Add(Global.None); + return; + } + + cmbHeaderType.Items.Add(Global.None); + if (network.Equals(Global.DefaultNetwork)) + { + cmbHeaderType.Items.Add(Global.TcpHeaderHttp); + } + else if (network.Equals("kcp") || network.Equals("quic")) + { + cmbHeaderType.Items.Add("srtp"); + cmbHeaderType.Items.Add("utp"); + cmbHeaderType.Items.Add("wechat-video"); + cmbHeaderType.Items.Add("dtls"); + cmbHeaderType.Items.Add("wireguard"); + } + else + { + } + cmbHeaderType.Text = Global.None; + } + + private void btnOK_Click(object sender, EventArgs e) + { + string address = txtAddress.Text; + string port = txtPort.Text; + string id = txtId.Text; + string alterId = txtAlterId.Text; + string security = cmbSecurity.Text; + string network = cmbNetwork.Text; + string remarks = txtRemarks.Text; + + string headerType = cmbHeaderType.Text; + string requestHost = txtRequestHost.Text; + string path = txtPath.Text; + string streamSecurity = cmbStreamSecurity.Text; + string allowInsecure = cmbAllowInsecure.Text; + + if (Utils.IsNullOrEmpty(address)) + { + UI.Show(UIRes.I18N("FillServerAddress")); + return; + } + if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port)) + { + UI.Show(UIRes.I18N("FillCorrectServerPort")); + return; + } + if (Utils.IsNullOrEmpty(id)) + { + UI.Show(UIRes.I18N("FillUUID")); + return; + } + if (Utils.IsNullOrEmpty(alterId) || !Utils.IsNumberic(alterId)) + { + UI.Show(UIRes.I18N("FillCorrectAlterId")); + return; + } + + vmessItem.address = address; + vmessItem.port = Utils.ToInt(port); + vmessItem.id = id; + vmessItem.alterId = Utils.ToInt(alterId); + vmessItem.security = security; + vmessItem.network = network; + vmessItem.remarks = remarks; + + vmessItem.headerType = headerType; + vmessItem.requestHost = requestHost.Replace(" ", ""); + vmessItem.path = path.Replace(" ", ""); + vmessItem.streamSecurity = streamSecurity; + vmessItem.allowInsecure = allowInsecure; + + if (ConfigHandler.AddServer(ref config, vmessItem, EditIndex) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.Show(UIRes.I18N("OperationFailed")); + } + } + + private void btnGUID_Click(object sender, EventArgs e) + { + txtId.Text = Utils.GetGUID(); + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + + #region 导入客户端/服务端配置 + + /// + /// 导入客户端 + /// + /// + /// + private void MenuItemImportClient_Click(object sender, EventArgs e) + { + MenuItemImport(1); + } + + /// + /// 导入服务端 + /// + /// + /// + private void MenuItemImportServer_Click(object sender, EventArgs e) + { + MenuItemImport(2); + } + + private void MenuItemImport(int type) + { + ClearServer(); + + OpenFileDialog fileDialog = new OpenFileDialog(); + fileDialog.Multiselect = false; + fileDialog.Filter = "Config|*.json|All|*.*"; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + string fileName = fileDialog.FileName; + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + string msg; + VmessItem vmessItem; + if (type.Equals(1)) + { + vmessItem = V2rayConfigHandler.ImportFromClientConfig(fileName, out msg); + } + else + { + vmessItem = V2rayConfigHandler.ImportFromServerConfig(fileName, out msg); + } + if (vmessItem == null) + { + UI.Show(msg); + return; + } + + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + txtId.Text = vmessItem.id; + txtAlterId.Text = vmessItem.alterId.ToString(); + txtRemarks.Text = vmessItem.remarks; + cmbNetwork.Text = vmessItem.network; + cmbHeaderType.Text = vmessItem.headerType; + txtRequestHost.Text = vmessItem.requestHost; + txtPath.Text = vmessItem.path; + cmbStreamSecurity.Text = vmessItem.streamSecurity; + } + + /// + /// 从剪贴板导入URL + /// + /// + /// + private void MenuItemImportClipboard_Click(object sender, EventArgs e) + { + ClearServer(); + + string msg; + VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out msg); + if (vmessItem == null) + { + UI.Show(msg); + return; + } + + txtAddress.Text = vmessItem.address; + txtPort.Text = vmessItem.port.ToString(); + txtId.Text = vmessItem.id; + txtAlterId.Text = vmessItem.alterId.ToString(); + txtRemarks.Text = vmessItem.remarks; + cmbNetwork.Text = vmessItem.network; + cmbHeaderType.Text = vmessItem.headerType; + txtRequestHost.Text = vmessItem.requestHost; + txtPath.Text = vmessItem.path; + cmbStreamSecurity.Text = vmessItem.streamSecurity; + } + #endregion + + private void cmbStreamSecurity_SelectedIndexChanged(object sender, EventArgs e) + { + string security = cmbStreamSecurity.Text; + if (Utils.IsNullOrEmpty(security)) + { + panTlsMore.Hide(); + } + else + { + panTlsMore.Show(); + } + } + } +} diff --git a/v2rayN/v2rayN/Forms/AddServerForm.resx b/v2rayN/v2rayN/Forms/AddServerForm.resx new file mode 100644 index 00000000..e519eab6 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServerForm.resx @@ -0,0 +1,1392 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 396, 17 + + + 75, 23 + + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + 411, 83 + + + 75, 23 + + + 23 + + + &Generate + + + btnGUID + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + True + + + 285, 203 + + + 113, 12 + + + 22 + + + * Fill in manually + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + True + + + + NoControl + + + 526, 165 + + + 65, 12 + + + 35 + + + 3)QUIC key + + + label24 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + True + + + NoControl + + + 470, 99 + + + 89, 12 + + + 34 + + + 4)QUIC securty + + + label23 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + True + + + 205, 11 + + + 113, 12 + + + 32 + + + Default value true + + + label22 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 0 + + + True + + + 12, 11 + + + 83, 12 + + + 31 + + + allowInsecure + + + label21 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 1 + + + + + + true + + + false + + + 107, 7 + + + 91, 20 + + + 30 + + + cmbAllowInsecure + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panTlsMore + + + 2 + + + 284, 189 + + + 338, 35 + + + 33 + + + panTlsMore + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 2 + + + True + + + 469, 83 + + + 203, 12 + + + 29 + + + 3)h2 host Separated by commas (,) + + + label20 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 3 + + + 124, 125 + + + True + + + 396, 54 + + + 28 + + + txtPath + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 4 + + + True + + + 9, 125 + + + 29, 12 + + + 27 + + + Path + + + label19 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 5 + + + True + + + 526, 147 + + + 59, 12 + + + 26 + + + 2)h2 path + + + label18 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 6 + + + True + + + 469, 68 + + + 59, 12 + + + 25 + + + 2)ws host + + + label17 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 7 + + + True + + + 526, 130 + + + 59, 12 + + + 24 + + + 1)ws path + + + label16 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 8 + + + True + + + 469, 53 + + + 215, 12 + + + 23 + + + 1)http host Separated by commas (,) + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 9 + + + True + + + 9, 201 + + + 23, 12 + + + 22 + + + TLS + + + label15 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 10 + + + + + + tls + + + 124, 197 + + + 143, 20 + + + 21 + + + cmbStreamSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 11 + + + True + + + 282, 34 + + + 299, 12 + + + 20 + + + *tcp or kcp or QUIC camouflage type, default none + + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 12 + + + 158, 58 + + + True + + + 300, 53 + + + 16 + + + txtRequestHost + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 13 + + + True + + + 9, 34 + + + 95, 12 + + + 19 + + + Camouflage type + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 14 + + + True + + + 9, 62 + + + 143, 12 + + + 17 + + + Camouflage domain(host) + + + label10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 15 + + + none + + + http + + + srtp + + + utp + + + wechat-video + + + dtls + + + wireguard + + + 124, 30 + + + 143, 20 + + + 18 + + + cmbHeaderType + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 16 + + + Bottom + + + 3, 237 + + + 723, 234 + + + 21 + + + Keep the default value if it is not clear + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + True + + + 353, 175 + + + 113, 12 + + + 15 + + + *Default value tcp + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + True + + + 353, 147 + + + 119, 12 + + + 14 + + + *Recommended (auto) + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + tcp + + + kcp + + + ws + + + h2 + + + quic + + + 195, 171 + + + 143, 20 + + + 12 + + + cmbNetwork + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + True + + + 12, 175 + + + 167, 12 + + + 13 + + + Transport protocol(network) + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + + + aes-128-gcm + + + chacha20-poly1305 + + + auto + + + none + + + 195, 143 + + + 143, 20 + + + 6 + + + cmbSecurity + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + 127, 199 + + + 143, 21 + + + 11 + + + txtRemarks + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + True + + + 12, 203 + + + 95, 12 + + + 10 + + + Alias (remarks) + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 9 + + + True + + + 12, 147 + + + 173, 12 + + + 8 + + + Encryption method (security) + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 10 + + + 127, 114 + + + 143, 21 + + + 7 + + + txtAlterId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 11 + + + True + + + 12, 118 + + + 47, 12 + + + 6 + + + AlterId + + + label4 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 12 + + + 127, 85 + + + 278, 21 + + + 5 + + + txtId + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 13 + + + True + + + 12, 89 + + + 53, 12 + + + 4 + + + UUID(id) + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 14 + + + 127, 56 + + + 143, 21 + + + 3 + + + txtPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 15 + + + True + + + 12, 60 + + + 29, 12 + + + 2 + + + Port + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 16 + + + 127, 27 + + + 359, 21 + + + 1 + + + txtAddress + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 17 + + + True + + + 12, 31 + + + 47, 12 + + + 0 + + + Address + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 18 + + + Fill + + + 0, 35 + + + 729, 474 + + + 3 + + + Server + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + 303, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Bottom + + + 0, 509 + + + 729, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top + + + 0, 25 + + + 729, 10 + + + 6 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 17, 17 + + + 237, 22 + + + Import client configuration + + + 237, 22 + + + Import server configuration + + + 234, 6 + + + 237, 22 + + + Import URL from clipboard + + + 162, 21 + + + Import configuration file + + + 0, 0 + + + 729, 25 + + + 8 + + + menuServer + + + System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + True + + + 6, 12 + + + 729, 569 + + + Edit or add a [VMess] server + + + MenuItem1 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItemImportClient + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItemImportServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator1 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MenuItemImportClipboard + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + AddServerForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx new file mode 100644 index 00000000..7c5b3623 --- /dev/null +++ b/v2rayN/v2rayN/Forms/AddServerForm.zh-Hans.resx @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 取消(&C) + + + 服务器 + + + 生成(&G) + + + *手填,方便识别管理 + + + 不清楚则保持默认值 + + + + 95, 12 + + + 3)QUIC 加密密钥 + + + 95, 12 + + + 4)QUIC 加密方式 + + + 53, 12 + + + 默认true + + + 149, 12 + + + 3)h2 host中间逗号(,)隔开 + + + 65, 12 + + + 路径(path) + + + 161, 12 + + + 1)http host中间逗号(,)隔开 + + + 77, 12 + + + 底层传输安全 + + + 197, 12 + + + *tcp或kcp或QUIC伪装类型,默认none + + + 124, 58 + + + 334, 51 + + + 89, 12 + + + 伪装类型(type) + + + 89, 12 + + + 伪装域名(host) + + + 143, 12 + + + *默认tcp,选错会无法连接 + + + 113, 12 + + + *随便选,建议(auto) + + + 127, 171 + + + 211, 20 + + + 107, 12 + + + 传输协议(network) + + + 127, 143 + + + 211, 20 + + + 83, 12 + + + 别名(remarks) + + + 113, 12 + + + 加密方式(security) + + + 95, 12 + + + 额外ID(alterId) + + + 65, 12 + + + 用户ID(id) + + + 65, 12 + + + 端口(port) + + + 83, 12 + + + 地址(address) + + + 确定(&O) + + + 92, 21 + + + 导入配置文件 + + + 171, 22 + + + 导入客户端配置 + + + 171, 22 + + + 导入服务端配置 + + + 168, 6 + + + 171, 22 + + + 从剪贴板导入URL + + + 编辑或添加[VMess]服务器 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/BaseForm.Designer.cs b/v2rayN/v2rayN/Forms/BaseForm.Designer.cs new file mode 100644 index 00000000..f23103bb --- /dev/null +++ b/v2rayN/v2rayN/Forms/BaseForm.Designer.cs @@ -0,0 +1,51 @@ +namespace v2rayN.Forms +{ + partial class BaseForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BaseForm)); + this.SuspendLayout(); + // + // BaseForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 273); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "BaseForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "BaseForm"; + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/BaseForm.cs b/v2rayN/v2rayN/Forms/BaseForm.cs new file mode 100644 index 00000000..4ea789b1 --- /dev/null +++ b/v2rayN/v2rayN/Forms/BaseForm.cs @@ -0,0 +1,40 @@ +using System; +using System.Windows.Forms; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class BaseForm : Form + { + protected static Config config; + protected static System.Drawing.Icon icon; + + public BaseForm() + { + InitializeComponent(); + LoadCustomIcon(); + } + + private void LoadCustomIcon() + { + try + { + if (icon == null) + { + string file = Utils.GetPath(Global.CustomIconName); + if (!System.IO.File.Exists(file)) + { + return; + } + icon = new System.Drawing.Icon(file); + } + this.Icon = icon; + } + catch (Exception e) + { + Utils.SaveLog($"Loading custom icon failed: {e.Message}"); + } + } + + } +} diff --git a/v2rayN/v2rayN/Forms/BaseForm.resx b/v2rayN/v2rayN/Forms/BaseForm.resx new file mode 100644 index 00000000..61360d3d --- /dev/null +++ b/v2rayN/v2rayN/Forms/BaseForm.resx @@ -0,0 +1,1253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAgAAAAIAAAACAAAAAwAA + AAMAAAADAAAAAwAAAAQAAAAEAAAABAAAAAQAAAADAAAAAwAAAAMAAAADAAAAAgAAAAIAAAACAAAAAQAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAA + AAIAAAADAAAABAAAAAUAAAAGAAAACAAAAAgAAAAKAAAACgAAAAsAAAAMAAAADQAAAA0AAAANAAAADQAA + AAwAAAALAAAACgAAAAoAAAAIAAAACAAAAAYAAAAFAAAABAAAAAMAAAACAAAAAQAAAAEAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAQAAAAIAAAACAAAABAAAAAUAAAAHAAAACQAAAAwAAAAOAAAAEQAAABMAAAAVAAAAFwAA + ABgAAAAaAAAAGwAAABwAAAAcAAAAHQAAAB0AAAAcAAAAHAAAABsAAAAaAAAAGAAAABcAAAAVAAAAEwAA + ABEAAAAOAAAADAAAAAkAAAAHAAAABQAAAAQAAAACAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAMAAAAEAAAABwAAAAkAAAAMAAAAEAAA + ABMAAAAXAAAAGgAAAB4BAQAgAgEBIwMDASUDAgEmAwMBKAUEASkGAwMrCAUDKwgFAysIBQMsCAUDLAgF + AysIBQMrBgMDKwUEASkDAwEoAwIBJgMDASUCAQEjAQEAIAAAAB4AAAAaAAAAFwAAABMAAAAQAAAADAAA + AAkAAAAHAAAABAAAAAMAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAA + AAQAAAAHAAAACgAAAA4AAAASAAAAFwAAABwAAAAgAwIBJAUDAicGBAIqBQUCKwICAi0FAwMvCQcEMQgH + BjACAwQwAAECMQYFBTURDgg5GRMJPBwWCz0cFgs9GRMJPBEOCDkGBQU1AAECMQICBDAIBwYwCQcEMQUD + Ay8CAgItBQUCKwYEAioFAwInAwIBJAAAACAAAAAcAAAAFwAAABIAAAAOAAAACgAAAAcAAAAEAAAAAgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAUAAAAIAAAADQAAABIAAAAXAQAAHQIBASIDAgEmBgMDKgQD + AywAAAEtBQQEMRYRCTckHA0+OCoTSlU/G19sUCF1elomhoZjKZWOaCufkmstqphwL7Kccy+3nnQwup51 + MLqccy+3mXEvspNsLaqOaSufh2QqlHtbJ4ZtTyJ1Vj8cXzgpE0okHA0+FhEJNwUEBDEAAAEtBAMDLAYD + AyoDAgEmAgEBIgAAAB0AAAAXAAAAEgAAAA0AAAAIAAAABQAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAYAAAAKAAAADwAA + ABUAAAAcAgIAIgQCAicFBAErBAMDLgUEBDAWEQo5QjEWT2BHH2d6WiaHkGssq6B2MMWtfzTbt4Y367+M + OfXEjzv5yZM8/M2WPv7PmD7/0Zk//9KaP//Tmz//05s//9OaP//Smj//0Jg+/82WPv3KlD37xZA7+cCM + OvW4iDjrroA126F2McWRbCyre1smh2FHH2dCMRZPFhEKOQUEBDAEAwMuBQQBKwQCAicCAgAiAAAAHAAA + ABUAAAAPAAAACgAAAAYAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAABAAAAAwAAAAYAAAAKAAAAEAAAABcBAQAeAwIBJAYDAyoBAAEsBwUEMSIaDDxSPBtaelomhpRt + LbGoezPVt4Y37MSQO/nMlj3/0Zk//9WcQP/YnkH/2J5B/9ieQP/XnkD/155A/9eeQP7XnkD+155A/tee + QP7XnkD+155A/teeQP7XnkD+155A/9eeQP/YnkD/2J5B/9ieQf/WnED/0po//82WPf/FkTv5uog47Kp8 + M9WVbi6xelomh1E8GlshGQw8BwUFMgEAASwGAwMqAwIBJAEBAB4AAAAXAAAAEAAAAAoAAAAGAAAAAwAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAYAAAAKAAAAEQAAABgBAQAgBAMBJgUD + AysDAgMvGRIKOVQ+G1p+XSiKm3MvvrKDNubCjjr5zZY+/tWcQP/XnUD/2J9B/tieQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/2J5A/9ifQf7XnUD/1ZxA/8+YPv7Djzv5s4M25pxyL799XCeLUj0bWhkT + CzkDAgMvBQMDKwQDASYBAQAfAAAAGAAAABEAAAAKAAAABgAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAA + AAQAAAAJAAAADwAAABcBAQAfBAMBJgMCASsIBgQwMSQRQ2xQIXOUbS2xr4A14cOOO/nPmD7/1p1A/9ie + QP/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/tieQP/WnUD/0Jg+/8SPO/mvgTXhlG0usWtOInQwIxJDCAYEMAMCASsEAwEnAQEAHwAA + ABcAAAAPAAAACQAAAAQAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAAHAAAADQAAABQBAQAdBQQBJQUFAiwGBQQwRDMXTXxc + J4ahdjHKuog48syVPf7VnED/155B/9ieQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5B/9Wc + QP/Nlj3+uok486B2Mcp6WiaGQjIWTgYFBDAEAwIsBAMBJQEBAB0AAAAUAAAADQAAAAcAAAADAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAEAAAACgAA + ABEAAAAaAwIBIwUDAioHBgQvQDAVSoFeKIynejLTv4w6+NCYPv/XnkD/155A/teeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7XnkD/0Jk+/8CNOvimejLTfl0njT0u + FEoGBQQvBQMCKgMCASMAAAAaAAAAEQAAAAoAAAAEAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAEAAAADAAAABwAAAA0AAAAWAQAAHwQDASgDAgIuNScSRHxbJoOnejPSwY06+dKa + P//YnkD+2J5A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/2J5B/tObP//Bjjr5pXky03hZJoQzJhJEAwMCLgQDASgBAAAfAAAAFgAA + AA0AAAAHAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAgAAAAQAAAAGQQC + AiQDAQIqFBAINWlOIWuedDDBvos59dGZP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie + Qf/Smj//vYs59ZtyL8JlSh9sEw8INQMBAioEAgIkAAAAGQAAABAAAAAIAAAAAwAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAgAAAAQAAAAKAAAAEwIBAR0FAwInAQECLUg1GE2QaiyjtoU3686WPf/XnUD/2J5A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/zpc+/7SEN+yLZiqlRTMXTwEB + Ai4FAwInAgEBHQAAABMAAAAKAAAABAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAFAAAADAAAABUDAgEgBAIBKBoU + CTVxUyNxpnkyzcWQO/zVnED/2J5A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/1ZxA/8WQO/yidzHPak8hcxkTCTUEAgEoAwIBIAAAABUAAAAMAAAABQAA + AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAACAAAABgAAAA0AAAAXAwMBIgIBAis4KhNDj2ksm7iHN+7QmD7/155A/teeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5B/tCZ + Pv+2hTfviGQqnTUnEkUDAgIrAwMBIwAAABcAAAANAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAOAQEAGQQCAiQIBgMsXEQdWaB2 + Mb3Djzr51ZxA/9ieQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tacQP/Cjjr5mnAvv1U/G1sIBgMtBAICJAEB + ABkAAAAOAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAIAAAAHAAAADwEBABkFAwIlCQcDLnVWJHCvgDXZzJY9/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/LlT3/qHwz2m1QInIJBwMvBQMCJgEBABkAAAAPAAAABwAAAAIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABgAAAA8CAQAaAwIBJhIOBjJ/Xid+toY35tGZ + P//YnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ieQP7RmT7/sYI26HZX + JYARDQYzBAIBJgIBABoAAAAPAAAABgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA + AAYAAAAOAQEAGgYFASYjGgw4jGcrkLuJOO7Tmz//2J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7UnD//toY374FeKJIgGAs5BgUBJwEBABoAAAAOAAAABgAA + AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAFAAAADQIBABkBAQEkLCENOpJrLZnAjTrz1Js//9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/VnED/u4k49IdjKZwpHw07AgEBJAIBABkAAAANAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAA + AAwBAQAXBgQBJSwiDjmXby2fw4469tadQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/WnUD/vYs594tmKqEqHg07BwUBJQEB + ABcAAAAMAAAABQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAAKAQEAFgMCASImHAw2lm4umMSPO/bVnED+155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/VnED+vos59ohkKZsiGgw4AwIBIgEBABYAAAAKAAAABAAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAACQEB + ABMGBAIhFQ8IMJJrLY/Djzrz1p1A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/WnUD/vIo59INh + KZMUDggxBgQCIQEBABMAAAAJAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAQBQICHQgGAyqHYyl8wI067tWcQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/VnED/uIc38HhYJYAIBgMrBQICHQAAABAAAAAGAAAAAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAADQQD + ARoEAwEnf10mbr2LOebVnED/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/UnD//s4M26HBSInEFAwEnBAQBGgAAAA0AAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAoFAwIWAQABI2hNIFW5hzjY05o//9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/RmT//qn0021tCHFoDAQEjBAMCFgAA + AAoAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAHAwICEgAA + AB9GNBU/roA0vdCZPv7XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP7Mlj3/nXIwwTwsEkEAAAEfAwICEgAAAAcAAAACAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAA0GBAMbHRUJLaF2MJnMlT35155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Djzv6jGcrnhoT + CC8HBAMbAAAADQAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAJBgQDFgAA + ACOGYiluxpE779adQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ifQ//cq1n/2qVN/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9adQP+5hzfwc1QjcwAAACQGAwMWAAAACQAAAAMAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAABgIBARAAAAEdW0MbR7mIN83Um0D/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/2KFH/+XCiP/pypf/26dS/9eeP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tGZ + P/+nejPRTjkYSgAAAR0CAQEQAAAABgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMBAAEKBgMDGBwU + CSypfDOh0Jg+/deeQf7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Zokf/6cqX//jw5P/qzZ7/2aNL/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155B/seSPP2SayynGBEILQcDAxgBAAELAAAAAwAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAACAAAABwcEAxECAAIghWEoZciSPOvXnUD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/154//9iiR//pyZf//Pr3//n06//mw4v/2aRM/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/1p1A/reHN+1uUSFqBAICIAcEAhEAAAAHAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCAwALAAAAGE05 + Fzm6iDe/1ZtA/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f7+//jv + 4//nxY7/2aJJ/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/0Jg+/6F3McVBMBQ9AgIAGAID + AAsAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAABggGAhIHBQMgnHMvf8+YPvbXnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//Yokf/6cmX//z69//9/f7//f39//jw4v/kvX//2aJI/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/YnkH/wY4694JhKIQIBgMhCAYCEgAAAAYAAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMEBAELAQEAGFxC + G0DCjjrR151A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 + /f/9/f3//f39//bs3P/kv4L/2KFG/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Tmz//q3401Us3 + F0MCAgAYBQMBCwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAABQkHARACAgEgpXgxh9KaP/rYnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//fz8//br2f/huHX/2KFF/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/FkDv7iWQpjQQCASEJBwERAAAABQAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDAwAJAAAAFWhL + H0HGkTzS2J5B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6 + +P/9/f3//f39//39/f/9/f3//f39//Xo1P/iuXf/2KBE/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tSb + QP+tfzTWVD0ZRQAAABUDAwAJAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAABAAAABAsIAw4HBQIdpnkygNObP/nYnkH+155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//fz6//Tl + zv/fs2v/159C/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5B/sSQO/qJZCmHCQYCHgsIAw4AAAAEAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGBQEHBgYAE1Q+ + GTTFkTvI155B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJ + l//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//fz7//Pky//gtW3/159C/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/0po//6p8M85FMRQ4BwcBEwYFAQcAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAwkGBAsCAAEZnHMvatObP/LYnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//Pv4//Hfwf/er2H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/wI069H5cJnIDAgIZCQYECwAA + AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFCgQFDzUn + ESfAjTqt155B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9ii + R//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//Pv5//Hfwv/esWb/155B/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP7QmD7/n3YwtCwhDioLBQYQAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQoJAQgAAAAShmIoTM+YPt/YnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//Pn1/+/Ztv/drFz/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9adQP+2hjfkaE0gUgAA + ABIJCQEIAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEw0GCw4K + BRmygjWC1p1A+teeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + P//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7//Pn2/+/Y + tf/drV3/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/2J5B/siTPPuOaSuKDwsFGxMNBgsAAAADAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUEAAQEBAANRjQVKMiSPLrYnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7/+/fx/+3Uq//bqVX/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/0po//6h7 + M8I2JxErBgUADQUEAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDgoFBgYE + AhGOaCpK05s/5tieQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f7/+/fy/+zSqP/bqVX/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnUD/vIk56m1PIVMJBQMSDgoEBgAAAAEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIUEQMIAAAAFLSENnvXnUH5155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7/+vTs/+rOof/apk//154//9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie + QP/Ikzz6jWgrhAAAABUUEQMIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxcP + Bws+LBMhyJI8rdieQf/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3/+vTs/+rMnP/apU7/154//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5A/tKZP/+keDK0MSMPJRcPBwsAAAADAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQADAAAADIRgJznRmT/S2J9B/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/+fHm/+jJ + lv/Zo0r/154//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/1p1A/7SFNthlSh5AAAAADAABAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARsV + BgUAAAAMpXkyV9acQOvYnkH/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3/+PLm/+fGj//Zo0r/154//9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkH/wY06735cJl4AAAANGRQFBgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIxcMBwwHBRK7iTl82J5B/NeeQf7XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/fz/9+7g/+bDi//YoUb/154//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9ieQf7LlT38lGwthg8KBhQiFgsHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAEQCAcIQS4UG8iSPKLZn0H/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pz/9+7g/+S/gv/YoUf/154//9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J5A/tGZPv+leTGsMyQPHRMK + CAgAAAABAAAAAAAAAAAAAAAAAAAAAAAAAABkVw0ACwoAAgAAAAhcQxwizpg+wdmfQf/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6 + +P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/Pz/9erX/+S+gP/YoEP/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/1ZxA/7CBNchCMBQmAgEACAoKAAJLQQoAAAAAAAAAAAAAAAAAAAAAAAAA + AAAcEQsCBwAFCodiKTPUmz/c2J5B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pv/9uvZ/+K5 + dv/YoEX/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnUH/uog34GRK + HjoLBAYKGxALAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8VCgMLBgQLpXkxTNadQO7YnkH/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJ + l//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pv/8+TM/+G3c//Xn0L/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9ieQf/Cjjrwf10mVQ4IBQweFAoDAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAIBcJAwsIAg21hDZj155A9deeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/8+/r/9ObR/9+zaf/YoEP/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/8eS + PPeOaCtsDgoEDR8WCQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVDgcEAAABDL+MOXfXnkH4155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9ii + R//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/Pv/8d/C/9+yaf/Xn0H/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/y5U9+phwLoAAAAIMFQ4HBAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAASAfAQQAAAAMxpA7idieQfzXnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/8+/n/8uDF/92vYv/Xn0L/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Plz79oHYwkAAAAAwfHgEEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABKxoQBQwKBQ/JkzyX2J5B/tee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + P//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/8+/n/79m2/92t + X//XnkH/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tGZP/+leTKeDAkFEigYDwUAAAABAAAAAAAA + AAAAAAAAAAAAAAAAAAE4IxUFRC8UE82WPaTYnkH/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/8+vf/8Nu6/9ysW//Xn0H/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD+05s//6x+M6s0JBEYNiMTBgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAS8eEAZcQhwXz5g+rtie + Qf/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/7+fX/7NOq/9upV//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Um0D/sIE0tEYzFhwvHhEGAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAABKRoPBmlMIBnQmT+12J5B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/v/7+PP/7dWu/9uoVf/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/tWcQP+0gza7UzoYHioaDwYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAE5Kg4FcVMiGtGZ + PrjYnkH/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/69u//6s2d/9qmT//Xnj//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+1ZxA/7WENr5aQBkfOSsPBgAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAADwsDwV1VSIa0Zk+uNieQf/XnkD+155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/v/69vD/69Ci/9qm + UP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP7VnED/tYU2vltCGh89LRAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANCATBHNU + IhjSmj+12J5B/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/58+n/6MiU/9qkTP/Xnj//155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tWcQP+1hTa6WUAaHTUh + EwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBKRcEa04gFdGZP67YnkH/155A/teeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /v/58uj/6MiU/9mkS//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD+1ZtA/7ODNbRSPRcaPSYWBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFM0 + HgRbQhwQ0Jg+pdieQf/XnkD+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/v/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/37+H/5cGH/9miSP/Xnj//155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Tmz//sIE0q0Uy + FhVKLxoEAAAAAAAAAAAAAAAAAAAAAAAAAACCRD4AYC4xAyQXDArPlz6W2J5B/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//YoUf/6cmX//z6 + 9//9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/v/7+PT/+fLo//38+//9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/37uD/5cKI/9iiSP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/tKaP/+rfTOdHRMKDlQpKwNpNzIAAAAAAAAAAAAAAAAAAAAAACQb + CgBVPhcCAAAABs2WPYfYnkH8155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/154//9ihR//pyZf//Pr3//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f7///ft3v/pypn/9ejT//38+//9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/P/27Nv/471//9ih + Rf/Xnj//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkD/0Jg+/ah7 + Mo4AAAAHUDsWAiMaCQAAAAAAAAAAAAAAAAAAAAAAPzMNADUvCgEAAAAFyZM9ddieQfnYnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJ + l//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/96wZP/ht3P/8+TM//z7 + +v/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/P/26tj/47x9/9igRP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Nlj36pHgxfQAAAAU2MAoBPzMNAAAAAAAAAAAAAAAAAAAA + AABuUB4AVj8XARsTBQbGkDte2J5B9deeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//3+///26tn/3a5f/9igQ//htnD/8+LJ//z7+f/9/f7//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//38 + +v/159P/4rh0/9ifQ//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/8mT + PPadcy9nIBcHBlE7FgFmShsAAAAAAAAAAAAAAAAAAAAAAH1bIgBrTh0BKB0JBcCMOkbYnkHu2J5B/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9ii + R//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150+/9ef + Qv/gs2v/8d/B//z6+P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//38+//05c7/4bdy/9efQv/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkH/xZE78JduLU8rHwoFYEYaAW1QHgAAAAAAAAAAAAAA + AAAAAAAAi1M4ALluSwASABEDsYI2LNedQN3Zn0H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9efQv/fsWf/8d6///z59v/9/f7//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//z7+P/z48r/37Nq/9eeQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie + Qf/AjTnghGIoMhsGEgOPVToAckQuAAAAAAAAAAAAAAAAAAAAAAB/dAsAvasRAAARAAKacC4Y1ZxAwdmf + Qf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + P//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9ed + P//XnkD/155A/9eeQf/esGT/79m3//v49P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//z7+f/x4MP/37Np/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/1ZxA/7mHN8dwUiIbCh4AArGgEAB6bwoAAAAAAAAA + AAAAAAAAAAAAAEZHAAAADwAATT8MAolkKQ7Smj+g2Z9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9efQf/drV7/7tex//v3 + 8P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//z59v/w3sD/3a5g/9eeQf/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Smj//soI2qWhMIBBZSA8CABAAAEdIAAAAAAAAAAAAAAAAAAAAAAAAAAAAALR4PACfZzcBRTAXBs+Y + PnjZn0H92J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92u + YP/XnT//155A/9eeQP/XnkD/155A/9eeQP/cq1n/69Gl//r28P/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//v6 + 9v/v2rf/3q5h/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J9A/s6XPf2pfDOBOygVCIpZMAKVYzIAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAt25JAL9yTQEAAAAAyJI8TtieQezYn0H/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9ee + QP/bqVT/69Gl//r17P/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3+//v48//u2LT/26lW/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/YnkH+yJI87590MFQAAAABlVk8AY5WOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADixB0A/+AeAAAA + AADAjDkt151A0tmfQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq + 2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/aqFP/6cuZ//n07P/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//v49P/s0qj/3KpY/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9edQP+/jDnXlGwsMgAAAADjyBsAy7AaAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcPx4AfU8rAqF1MBHVnD+r2Z9B/9ieQP7XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/apU3/6cyb//nx5v/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3+//r27v/s0af/2qVO/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/YnkD+1JtA/7eGNrF3VyQWdksoAlM5GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdO + GQCMdxUBAAAAAtGZPnTZn0H52J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//Yokf/6cmX//z6+P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+ + ///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//apEz/5sSL//ny + 5//9/Pz//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f3+//v48v/py5r/2qdS/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ifQP7Olz76rX40fAAAAAONeBUBZU0ZAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArXY3AMqKQQAtFhICyJM9PtieQejYnkH/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yokj/58eR//fv4f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3+//nz + 6f/pyZf/2aNL/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/2J5B/8aRO+ueczBGOSAVAq53OACZaDEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACSghAAtrAHAAADAAGwgDYV1p1AutmfQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/Xnj//2KJH/+nJl//8+vj//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/v//9urZ/92uYP/XnT//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + P//Yokf/5L6B//ft3v/8/Pr//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//r17f/nxpH/2qVN/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/VnED/u4k4wIJfKBgbGAABop0GAId4 + DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+dEsAvWpTAXdSJgXSmj972Z9B/Nie + QP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeP//Yokf/6cmX//z6 + +P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YoEX/5cGF//br2f/9/fz//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//jw4//mxIz/2KJH/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/2J5B/s+YPv2xgjWDWz0cB6pgSQGkZEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAO+CbgD+iXYA//+JAMuUPTvYnkHf2J9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/154//9iiR//pyZf//Pr4//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/YoET/4bh1//Xo1P/8+/n//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//ny6P/lwof/2aNJ/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/xZA746J3MUH//4YA8oJxAd55 + ZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJMKACQVDgBtIM3Etad + QKvZn0H/155A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2KFH/+nJ + l//8+vf//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YoET/4rp5//Tn + 0P/9/Pv//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//bs3P/kvX//2KBE/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/2J5A/tObP/+6iDiwiGMrFZpcOQFrRyYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAnVxAALlxSAEAABMB0po/XtmfQfTYnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + Qf/Xn0L/159C/9efQv/Xn0L/159C/9efQv/Zo0n/6cqY//z6+P/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xn0L/37Jn//Lgxf/8+vf//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//fu + 4P/kvX7/2KFG/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkH+y5U99q6ANGUGABcCn2E+AY1T + OgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyiycAyJ0rAB4k + AAHDjzse155BydmfQf/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2qZQ/+K5dv/kvoH/5L6A/+S+gP/kvoD/5L6A/+XA + hf/v27r//Pv5//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Yn0L/4LNr//LgxP/8+/n//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//fz7//Tn0v/iuXb/2J9D/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9WdQP/AjTrNmXEuITk1AAGphSUAm3kiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKfU4AynRVAaNvNQPUmz922Z9B+tifQP7XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + P//gtGz/9OjU//r38P/69u//+vbv//r27//69u//+vbw//v59f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/v//9urZ/92uYP/XnT//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xn0H/3a5g/+/auP/8+fT//f3+//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//fz8//Xo1P/iuHT/2KBE/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yn0D+zpc9+7OENn10UCYFv25PAbRw + RQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+B + gwD/i5AA//91AMuWPSzYnkHS2Z9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/150//+C2b//37uD//f7+//39/v/9/f7//f3+//39 + /v/9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9ed + P//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/Xn0H/3a9h/+/Ztv/7+fX//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//Pv6//LiyP/fs2v/159B/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9adQP/EkDrWo3gxMf//ZAC2Wl0AqlVWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJZaPQDLZWYBjmcpBdWcP37Zn0H62J9A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnT//4LZv//fu3//9/f7//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f7///bq2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/3KtZ/+3U + rf/69/D//f3+//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//Pv5//Lhxv/fsmj/159C/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/YnkD/z5g++7eGNoRoSx4GolBQAX9L + MwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAwXFRANB5VwBGAEQBzZc+KNieQdLZn0H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9edP//gtm//9+7f//39/v/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/v//9urZ/92u + YP/XnT//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/3KpZ/+zSqf/69vD//f3+//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//Pr3//Dd + vf/er2P/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9adQP/FkDvVpnozLFoORQG3a00ArGRJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/mswA87wPAP/AWgDCjzUD1p1Ac9mf + QfjYn0D+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/150//+C2b//37t///f3+//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//3+///26tn/3a5g/9edP//XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/26hT/+rPov/69Oz//f3+//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39 + /f/9/f3//f39//39/f/9/f3//f39//39/f/9/f7//Pr2/+/bu//drV//155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xn0D+z5g++bmIN3mMaSUE/+FqAPSv + DgD/v/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD//wAA//8AAP/+agDTmkEf2J5Bv9mfQf/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnT//4LZv//fu4P/9/v7//f3+//39 + /v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//v7///br + 2f/drmD/150//9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/26hU/+rMnf/59Or//f3+//39 + /v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39/v/9/f7//f3+//39 + /v/9/f7/+/n1/+7Xs//drFz/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9WdQP/EkDvDrH00Iv//dwD//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADGdVEA1YJTAF4h + PQHVnEBW2Z9B7difQf7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeP//gtW3/9erY//z59v/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+fX//Pn1//z5 + 9f/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+vf/9OfS/92tX//XnT//155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/2qVP/+nJlv/37+H//Pn1//z59f/8+fX//Pn1//z59f/8+fX//Pn1//z5 + 9f/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+fX//Pn1//z59f/8+fX/+fPq/+zSqP/bp1P/154//9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+zZY97riHN1pbJTECtm9HAbBo + SAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+sVQD/3nIAwXpDAceROw3XnkGd2Z9B/tifQP7XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9upV//mxYz/6syb/+rM + m//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rM + nP/mw4n/2qZP/9eeP//XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Xnj//2qVO/+O9 + f//pzJr/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rMm//qzJv/6syb/+rM + m//qzJv/6syb/+rMm//qzJv/58WO/9yrW//Xnj//155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/tObP//CjjqhnnIvD7RzPgHLh0UAwIFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOfK + HgDu0xsA5aVJANKZPy7YnkHO2Z9B/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155B/9igQ//YoET/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9ig + Q//YoEP/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBE/9ifQ//XnkH/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/159C/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9ig + Q//YoEP/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9igQ//YoEP/2KBD/9igRP/YoET/159C/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/WnkD/yZM80bKCNjHVmkcA9tkcAOfK + HgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMaSNADwpkgBpXwvA9acP2HZn0Hy2J9B/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/2J5B/8+YPvO9iThliGQpBMuNPQG8ijEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA6s8bAOXPFgD//wAAzZc8C9edQJPZn0H62J9B/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9efQP7Tmz/7xJA7l6h9MQz//wAA5ccWAOrP + GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/6pWAP+wWQD//0MA0Jg/JNif + Qb/Zn0H/2J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/YnkD+1p1A/8qUPcG0hDcn//9RAP+0WwD/qlYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAwIs2AMaKPABOQBEB151AP9mfQdrZn0H/2J5A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQf/Plz7cwIw5QlxRGwHWlEAAyJE4AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP+7 + dgDXik8B151BW9mfQejZn0H/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Yn0D/0Zo/6cSPO16dYz0C/+KKAP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/gIAA/3yEAP+6egDVmj8H2J5Ac9mfQfHYn0H+155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/tSbP/LJkjx2sYA1CP/ikQD/fIQA/4CAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADAgEAAxIVAAKJbQAHOlj4O2J5AitmfQfbYn0H+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9if + QP7VnD/3ypQ9jbKAOA++bkkBwoRAAMGBQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/gEAAxYRCAP///wDOmD4U2J9Bldmf + QfrYn0H+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yn0H+155A+82XPZi3hzgW//9PAMeGQwC/gEAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADSpiwA0qoqAMabGQDUmj8Z2J5BntmfQfrYn0H+155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/2J9A/tee + QPrRmT6gwo07GvrDIgDUrCoA1qktAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD/4CcA/+seAMN8 + TwDZnkEY2Z9BltmfQffYn0H+155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9ieQP7XnkD30po/mMiTPBm6dUkA/+0eAP/gJwD//wAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/3SsA//YVAPHUHgDVm0EU2Z5Bi9mfQfLZn0H/2J5A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/Yn0D/2J5A8tOa + P4zGkD0V//8qAP/4FQD/4iwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + AAB+AIEAyZQ3AP//SADUmkAO2Z9BdNmfQejZn0H/2J5A/teeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD+2J5B/9edQOnTmj91xo88D///KgDKlTcAfgCBAP//AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6ekAAv4FAAJ5YPwHJlj4G2Z5BXNmf + QdvZn0H/2J9B/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/159A/tifQf/YnkHb1Js/XbiI + NwepYUMBwoNAAL19QQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAC/gEAAv4BAALdxQQHXnEED2J9BQNmfQcHZn0H72J9B/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9ifQf/Zn0H72J9BwdSdQEHPlz0DvXVEAb+AQAC/gEAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/qlUA/6pVAP+t + WQDBjC4A2Z5BJdmfQZTZn0Hy2Z9B/9ifQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7Yn0H/2Z9B8tmfQZTXnUAlqHoqAP+v + WQD/q1UA/6tVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAOCaRQAIAEwA155AC9ieQWLZn0HQ2Z9B/dif + Qf7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/Yn0H+2Z9B/dmfQdDYnkFi155ACwoAUwDinEUA//8AAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA/6tWAP+sVgD/k2MAx4tCA9ieQS/YnkGg2Z9B7tmfQf/Yn0D+155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+2J9B/9mfQe7YnkGg2J5BL8eLQgP/k2MA/6xWAP+r + VgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAypc1APXnDwC4eD4Bn1w2ANab + Qg/Zn0FZ2Z9BxNmfQfjZn0H/2J5B/teeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD+2J9B/9mf + QfjZn0HE2Z9BWdabQg+fXDYAuHg+AfXnDwDKlzUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMaVMQDjzRMAxopOAeGlUAHZoEEh2J5Bd9mfQdXZn0H72Z9B/9if + QP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD+2J9B/9mfQfvZn0HV2Z9BdtmgQSHhpVABxopOAePNEwDGlTEAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+q + VQD/q1gA7dAbAYdJLQDbnUUE2J9CKtmfQYLZn0HV2Z9B+tmfQf/Yn0D/155A/teeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7YnkD/2J9B/9ifQfrZn0HV2Z9Bg9if + QirgoEYEh0ktAO3QGwH/q1gA/6pVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/f4EA/3+BAP+fcgEMAIwA1pxIBNme + Qi7Zn0F72Z9BztmfQffZn0H/2J9B/tieQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ie + QP7Yn0D+2J9B/9mfQffZn0HO2Z9Be9qfQi7ZlkMFAgCRAP+ecgH/f4EA/3+BAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD/gIAA/4CqANp/XADzpFQB/9emAN6gQQTZn0Ae2Z9CY9mfQbDZn0Hj2Z9B/dif + Qf/YnkH/2J5A/9eeQP7XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD+2J5A/9ieQf/Yn0H/2Z9B/dmfQePZn0Gw2Z9CY9mfQB7eoEEE/+ezAPOm + VQHaf1wA/4CqAP+AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP9+ + hAD/foQA/6BzAY5EQwC6cUYB2Z9DEtmfQT7Zn0GB2Z9Bv9mfQezZn0H62Z9B/9ifQf/Yn0H+155A/tee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9ee + QP/XnkD/155A/9eeQP/XnkD/155A/9eeQP/XnkD/155A/9eeQP7YnkD+2J5B/9ifQf/Zn0H62Z9B7Nmf + Qb/Zn0GB2Z9BPtmfQxK6cUYBjkRDAP+gcwH/foQA/36EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAA0KMtAN+pPwD/uGIAAAAAAOGi + SATbnkMV2aBBQtmfQXnZn0Gx2Z9B1tmfQfDZn0H+2Z9B/9mfQf/YnkH/2J5A/9eeQP/YnkD+155A/tee + QP7XnkD+155A/teeQP7XnkD+155A/teeQP7XnkD+155A/teeQP7XnkD+155A/teeQP/XnkD/2J5B/9if + Qf/Zn0H/2Z9B/tmfQfDZn0HW2Z9BsdmfQXnZoEFC255DFeGiSAQAAAAA/7hiAN+pPwDQoy0A//8AAP// + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+ZbAD/iHsA/6BoAbohkgCBMUIA3aFBAdmeQBHYnkEt2Z9AUtqf + QX/Zn0Gm2Z9ByNmfQePZn0Hx2Z9B9tmfQfrZn0H+2Z9B/9ieQf/YnkH/2J5B/9ieQf/YnkH/2J5B/9ie + Qf/YnkH/2Z9B/9mfQf7Zn0H62Z9B9tmfQfHZn0Hj2Z9ByNmfQabZn0F+2Z9AUtieQS3ZnkAR3aFBAYEx + QgC6IZIA/6BoAf+IewD/mWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADSgFMA635uANaMSgD/jXgB7qBwAQAAIAD//2kA46NHBNueRAvYn0MW2Z9CLtmfQEnZn0Fj2Z9Bedie + QYzZn0Ge2Z9BrNmfQbbZn0G82Z9Bv9mfQb/Zn0G82Z9BttmfQazZn0Ge2J5BjNmfQXnZn0Fj2Z9ASdmf + Qi7Yn0MW255EC+GkSgP///8AAAAbAO6gcAH/jXgB1oxKAOt+bgDSgFMAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/p1oA/94hAP+Z + awH/rGAB/2SnAP/B6gC9f2oAqngnAcCcGgDRpzoA0ao7AdudPwfZnD8M2KBBEdmgQxTaoEIX2qBCF9mg + QxTYoEER2Zw/DNudPwfRqjsB0ac6AMCcGgCqeCcBvX9qAP/B6gD/Y6YA/6xgAf+ZagH/3iEA/6daAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD//wAA/6NgAOOUUADLkzkB951ZAP/P + MQD/mW4B9qlcAbJxQwGhWz8Bj0U8AX0yOgF9MjoBj0U8AaFbPwGycUMB9qlcAf+ZbgH/zzEA951ZAMuT + OQHjlFAA/6NgAP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////4AAAB///////////////+AAAAAAf/////////////+AAAAAA + B/////////////8AAAAAAAD////////////8AAAAAAAAP///////////4AAAAAAAAAf//////////8AA + AAAAAAAD//////////8AAAAAAAAAAP/////////+AAAAAAAAAAB/////////+AAAAAAAAAAAH/////// + //AAAAAAAAAAAA/////////AAAAAAAAAAAAD////////wAAAAAAAAAAAA////////wAAAAAAAAAAAAD/ + //////4AAAAAAAAAAAAAf//////8AAAAAAAAAAAAAD//////+AAAAAAAAAAAAAAf//////AAAAAAAAAA + AAAAD//////gAAAAAAAAAAAAAAf/////wAAAAAAAAAAAAAAD/////4AAAAAAAAAAAAAAAf////8AAAAA + AAAAAAAAAAD////+AAAAAAAAAAAAAAAAf////AAAAAAAAAAAAAAAAD////gAAAAAAAAAAAAAAAAf///4 + AAAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///gAAAAAAAAAAAAAAAA + B///wAAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAAAAAAAAf//gAAAAAAAAAAA + AAAAAAH//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//gAAAAAA + AAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAP/gA + AAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAA + AB/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAA + AAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAA + AAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAA8AA + AAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAA + AAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAA + AAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAA + AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AA + AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAA + AAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAA + AAAAAAAP8AAAAAAAAAAAAAAAAAAAD/gAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf+AAAAAAA + AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAA//QAAAAAAAAAAAAAAAAAAv/4A + AAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//gAAAAAAAAAAAAAAAAAAf/8AAAAAAAAAAAAAAAAA + AP//QAAAAAAAAAAAAAAAAAL//4AAAAAAAAAAAAAAAAAB//+AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAA + AAAAAAP//9AAAAAAAAAAAAAAAAAL///gAAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAf///QAAAAA + AAAAAAAAAAAv///4AAAAAAAAAAAAAAAAH///+AAAAAAAAAAAAAAAAB////0AAAAAAAAAAAAAAAC////+ + AAAAAAAAAAAAAAAAf////gAAAAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAD/////gAAAAAAAAAAAAAAB + /////9AAAAAAAAAAAAAAC//////gAAAAAAAAAAAAAAf/////9AAAAAAAAAAAAAAv//////gAAAAAAAAA + AAAAH//////9AAAAAAAAAAAAAL///////gAAAAAAAAAAAAB///////8AAAAAAAAAAAAA////////gAAA + AAAAAAAAAf///////8AAAAAAAAAAAAP////////wAAAAAAAAAAAP////////+AAAAAAAAAAAH/////// + //4AAAAAAAAAAH//////////AAAAAAAAAAD//////////8AAAAAAAAAD///////////gAAAAAAAAB/// + /////////AAAAAAAAD////////////4QAAAAAAh/////////////4AAAAAAH//////////////gAAAAA + H///////////////gEACAf////////////////AAAA////////////////////////////////////// + //////////////////////////////////8= + + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/ListViewFlickerFree.cs b/v2rayN/v2rayN/Forms/ListViewFlickerFree.cs new file mode 100644 index 00000000..6b7cb451 --- /dev/null +++ b/v2rayN/v2rayN/Forms/ListViewFlickerFree.cs @@ -0,0 +1,56 @@ +using System.Drawing; +using System.Windows.Forms; + +namespace v2rayN.Forms +{ + class ListViewFlickerFree : ListView + { + public ListViewFlickerFree() + { + SetStyle(ControlStyles.OptimizedDoubleBuffer + | ControlStyles.AllPaintingInWmPaint + , true); + UpdateStyles(); + } + + + public void AutoResizeColumns() + { + try + { + int count = this.Columns.Count; + int MaxWidth = 0; + Graphics graphics = this.CreateGraphics(); + Font font = this.Font; + ListView.ListViewItemCollection items = this.Items; + + string str; + int width; + + this.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); + + for (int i = 0; i < count; i++) + { + str = this.Columns[i].Text; + MaxWidth = this.Columns[i].Width; + + foreach (ListViewItem item in items) + { + str = item.SubItems[i].Text; + width = (int)graphics.MeasureString(str, font).Width; + if (width > MaxWidth) + { + MaxWidth = width; + } + } + if (i == 0) + { + this.Columns[i].Width = MaxWidth; + } + this.Columns[i].Width = MaxWidth; + } + } + catch { } + } + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs new file mode 100644 index 00000000..5f161aba --- /dev/null +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -0,0 +1,873 @@ +namespace v2rayN.Forms +{ + partial class MainForm + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.lvServers = new v2rayN.Forms.ListViewFlickerFree(); + this.cmsLv = new System.Windows.Forms.ContextMenuStrip(this.components); + this.menuAddVmessServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuAddShadowsocksServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuAddSocksServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuAddCustomServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuAddServers = new System.Windows.Forms.ToolStripMenuItem(); + this.menuScanScreen = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.menuRemoveServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuRemoveDuplicateServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuCopyServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSetDefaultServer = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.menuMoveTop = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveUp = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveDown = new System.Windows.Forms.ToolStripMenuItem(); + this.menuMoveBottom = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); + this.menuPingServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuTcpingServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuRealPingServer = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSpeedServer = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.menuExport2ClientConfig = new System.Windows.Forms.ToolStripMenuItem(); + this.menuExport2ServerConfig = new System.Windows.Forms.ToolStripMenuItem(); + this.menuExport2ShareUrl = new System.Windows.Forms.ToolStripMenuItem(); + this.menuExport2SubContent = new System.Windows.Forms.ToolStripMenuItem(); + this.qrCodeControl = new v2rayN.Forms.QRCodeControl(); + this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton(); + this.notifyMain = new System.Windows.Forms.NotifyIcon(this.components); + this.cmsMain = new System.Windows.Forms.ContextMenuStrip(this.components); + this.menuSysAgentEnabled = new System.Windows.Forms.ToolStripMenuItem(); + this.menuSysAgentMode = new System.Windows.Forms.ToolStripMenuItem(); + this.menuGlobal = new System.Windows.Forms.ToolStripMenuItem(); + this.menuGlobalPAC = new System.Windows.Forms.ToolStripMenuItem(); + this.menuKeep = new System.Windows.Forms.ToolStripMenuItem(); + this.menuKeepPAC = new System.Windows.Forms.ToolStripMenuItem(); + this.menuServers = new System.Windows.Forms.ToolStripMenuItem(); + this.menuAddServers2 = new System.Windows.Forms.ToolStripMenuItem(); + this.menuScanScreen2 = new System.Windows.Forms.ToolStripMenuItem(); + this.menuCopyPACUrl = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.menuExit = new System.Windows.Forms.ToolStripMenuItem(); + this.bgwScan = new System.ComponentModel.BackgroundWorker(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.txtMsgBox = new System.Windows.Forms.TextBox(); + this.ssMain = new System.Windows.Forms.StatusStrip(); + this.toolSslSocksPortLab = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslSocksPort = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslBlank1 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslHttpPortLab = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslHttpPort = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslBlank2 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslPacPortLab = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslPacPort = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslBlank3 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel(); + this.panel1 = new System.Windows.Forms.Panel(); + this.tsMain = new System.Windows.Forms.ToolStrip(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbSub = new System.Windows.Forms.ToolStripDropDownButton(); + this.tsbSubSetting = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbSubUpdate = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbOptionSetting = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbReload = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbCheckUpdate = new System.Windows.Forms.ToolStripDropDownButton(); + this.tsbCheckUpdateN = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbCheckUpdateCore = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbCheckUpdatePACList = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbCheckClearPACList = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbHelp = new System.Windows.Forms.ToolStripDropDownButton(); + this.tsbAbout = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbLanguageDef = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbLanguageZhHans = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbPromotion = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); + this.tsbClose = new System.Windows.Forms.ToolStripButton(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.cmsLv.SuspendLayout(); + this.cmsMain.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.ssMain.SuspendLayout(); + this.tsMain.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + resources.ApplyResources(this.splitContainer1, "splitContainer1"); + this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; + this.splitContainer1.Name = "splitContainer1"; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.lvServers); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.qrCodeControl); + this.splitContainer1.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.splitContainer1_SplitterMoved); + // + // lvServers + // + this.lvServers.ContextMenuStrip = this.cmsLv; + resources.ApplyResources(this.lvServers, "lvServers"); + this.lvServers.FullRowSelect = true; + this.lvServers.GridLines = true; + this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.lvServers.HideSelection = false; + this.lvServers.Items.AddRange(new System.Windows.Forms.ListViewItem[] { + ((System.Windows.Forms.ListViewItem)(resources.GetObject("lvServers.Items")))}); + this.lvServers.MultiSelect = false; + this.lvServers.Name = "lvServers"; + this.lvServers.UseCompatibleStateImageBehavior = false; + this.lvServers.View = System.Windows.Forms.View.Details; + this.lvServers.SelectedIndexChanged += new System.EventHandler(this.lvServers_SelectedIndexChanged); + this.lvServers.DoubleClick += new System.EventHandler(this.lvServers_DoubleClick); + this.lvServers.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvServers_KeyDown); + // + // cmsLv + // + this.cmsLv.ImageScalingSize = new System.Drawing.Size(20, 20); + this.cmsLv.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuAddVmessServer, + this.menuAddShadowsocksServer, + this.menuAddSocksServer, + this.menuAddCustomServer, + this.menuAddServers, + this.menuScanScreen, + this.toolStripSeparator1, + this.menuRemoveServer, + this.menuRemoveDuplicateServer, + this.menuCopyServer, + this.menuSetDefaultServer, + this.toolStripSeparator3, + this.menuMoveTop, + this.menuMoveUp, + this.menuMoveDown, + this.menuMoveBottom, + this.menuSelectAll, + this.toolStripSeparator9, + this.menuPingServer, + this.menuTcpingServer, + this.menuRealPingServer, + this.menuSpeedServer, + this.toolStripSeparator6, + this.menuExport2ClientConfig, + this.menuExport2ServerConfig, + this.menuExport2ShareUrl, + this.menuExport2SubContent}); + this.cmsLv.Name = "cmsLv"; + this.cmsLv.OwnerItem = this.tsbServer; + resources.ApplyResources(this.cmsLv, "cmsLv"); + // + // menuAddVmessServer + // + this.menuAddVmessServer.Name = "menuAddVmessServer"; + resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer"); + this.menuAddVmessServer.Click += new System.EventHandler(this.menuAddVmessServer_Click); + // + // menuAddShadowsocksServer + // + this.menuAddShadowsocksServer.Name = "menuAddShadowsocksServer"; + resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer"); + this.menuAddShadowsocksServer.Click += new System.EventHandler(this.menuAddShadowsocksServer_Click); + // + // menuAddSocksServer + // + this.menuAddSocksServer.Name = "menuAddSocksServer"; + resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer"); + this.menuAddSocksServer.Click += new System.EventHandler(this.menuAddSocksServer_Click); + // + // menuAddCustomServer + // + this.menuAddCustomServer.Name = "menuAddCustomServer"; + resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer"); + this.menuAddCustomServer.Click += new System.EventHandler(this.menuAddCustomServer_Click); + // + // menuAddServers + // + this.menuAddServers.Name = "menuAddServers"; + resources.ApplyResources(this.menuAddServers, "menuAddServers"); + this.menuAddServers.Click += new System.EventHandler(this.menuAddServers_Click); + // + // menuScanScreen + // + this.menuScanScreen.Name = "menuScanScreen"; + resources.ApplyResources(this.menuScanScreen, "menuScanScreen"); + this.menuScanScreen.Click += new System.EventHandler(this.menuScanScreen_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1"); + // + // menuRemoveServer + // + this.menuRemoveServer.Name = "menuRemoveServer"; + resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer"); + this.menuRemoveServer.Click += new System.EventHandler(this.menuRemoveServer_Click); + // + // menuRemoveDuplicateServer + // + this.menuRemoveDuplicateServer.Name = "menuRemoveDuplicateServer"; + resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer"); + this.menuRemoveDuplicateServer.Click += new System.EventHandler(this.menuRemoveDuplicateServer_Click); + // + // menuCopyServer + // + this.menuCopyServer.Name = "menuCopyServer"; + resources.ApplyResources(this.menuCopyServer, "menuCopyServer"); + this.menuCopyServer.Click += new System.EventHandler(this.menuCopyServer_Click); + // + // menuSetDefaultServer + // + this.menuSetDefaultServer.Name = "menuSetDefaultServer"; + resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer"); + this.menuSetDefaultServer.Click += new System.EventHandler(this.menuSetDefaultServer_Click); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3"); + // + // menuMoveTop + // + this.menuMoveTop.Name = "menuMoveTop"; + resources.ApplyResources(this.menuMoveTop, "menuMoveTop"); + this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click); + // + // menuMoveUp + // + this.menuMoveUp.Name = "menuMoveUp"; + resources.ApplyResources(this.menuMoveUp, "menuMoveUp"); + this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click); + // + // menuMoveDown + // + this.menuMoveDown.Name = "menuMoveDown"; + resources.ApplyResources(this.menuMoveDown, "menuMoveDown"); + this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click); + // + // menuMoveBottom + // + this.menuMoveBottom.Name = "menuMoveBottom"; + resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom"); + this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click); + // + // menuSelectAll + // + this.menuSelectAll.Name = "menuSelectAll"; + resources.ApplyResources(this.menuSelectAll, "menuSelectAll"); + this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click); + // + // toolStripSeparator9 + // + this.toolStripSeparator9.Name = "toolStripSeparator9"; + resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9"); + // + // menuPingServer + // + this.menuPingServer.Name = "menuPingServer"; + resources.ApplyResources(this.menuPingServer, "menuPingServer"); + this.menuPingServer.Click += new System.EventHandler(this.menuPingServer_Click); + // + // menuTcpingServer + // + this.menuTcpingServer.Name = "menuTcpingServer"; + resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer"); + this.menuTcpingServer.Click += new System.EventHandler(this.menuTcpingServer_Click); + // + // menuRealPingServer + // + this.menuRealPingServer.Name = "menuRealPingServer"; + resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer"); + this.menuRealPingServer.Click += new System.EventHandler(this.menuRealPingServer_Click); + // + // menuSpeedServer + // + this.menuSpeedServer.Name = "menuSpeedServer"; + resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); + this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click); + // + // toolStripSeparator6 + // + this.toolStripSeparator6.Name = "toolStripSeparator6"; + resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6"); + // + // menuExport2ClientConfig + // + this.menuExport2ClientConfig.Name = "menuExport2ClientConfig"; + resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig"); + this.menuExport2ClientConfig.Click += new System.EventHandler(this.menuExport2ClientConfig_Click); + // + // menuExport2ServerConfig + // + this.menuExport2ServerConfig.Name = "menuExport2ServerConfig"; + resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig"); + this.menuExport2ServerConfig.Click += new System.EventHandler(this.menuExport2ServerConfig_Click); + // + // menuExport2ShareUrl + // + this.menuExport2ShareUrl.Name = "menuExport2ShareUrl"; + resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl"); + this.menuExport2ShareUrl.Click += new System.EventHandler(this.menuExport2ShareUrl_Click); + // + // menuExport2SubContent + // + this.menuExport2SubContent.Name = "menuExport2SubContent"; + resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent"); + this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click); + // + // qrCodeControl + // + resources.ApplyResources(this.qrCodeControl, "qrCodeControl"); + this.qrCodeControl.Name = "qrCodeControl"; + // + // tsbServer + // + this.tsbServer.DropDown = this.cmsLv; + this.tsbServer.Image = global::v2rayN.Properties.Resources.server; + resources.ApplyResources(this.tsbServer, "tsbServer"); + this.tsbServer.Name = "tsbServer"; + // + // notifyMain + // + this.notifyMain.ContextMenuStrip = this.cmsMain; + resources.ApplyResources(this.notifyMain, "notifyMain"); + this.notifyMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyMain_MouseClick); + // + // cmsMain + // + this.cmsMain.ImageScalingSize = new System.Drawing.Size(20, 20); + resources.ApplyResources(this.cmsMain, "cmsMain"); + this.cmsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuSysAgentEnabled, + this.menuSysAgentMode, + this.menuServers, + this.menuAddServers2, + this.menuScanScreen2, + this.menuCopyPACUrl, + this.toolStripSeparator2, + this.menuExit}); + this.cmsMain.Name = "contextMenuStrip1"; + this.cmsMain.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.cmsMain.ShowCheckMargin = true; + this.cmsMain.ShowImageMargin = false; + // + // menuSysAgentEnabled + // + this.menuSysAgentEnabled.Name = "menuSysAgentEnabled"; + resources.ApplyResources(this.menuSysAgentEnabled, "menuSysAgentEnabled"); + this.menuSysAgentEnabled.Click += new System.EventHandler(this.menuSysAgentEnabled_Click); + // + // menuSysAgentMode + // + this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.menuGlobal, + this.menuGlobalPAC, + this.menuKeep, + this.menuKeepPAC}); + this.menuSysAgentMode.Name = "menuSysAgentMode"; + resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode"); + // + // menuGlobal + // + this.menuGlobal.Name = "menuGlobal"; + resources.ApplyResources(this.menuGlobal, "menuGlobal"); + this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click); + // + // menuGlobalPAC + // + this.menuGlobalPAC.Name = "menuGlobalPAC"; + resources.ApplyResources(this.menuGlobalPAC, "menuGlobalPAC"); + this.menuGlobalPAC.Click += new System.EventHandler(this.menuGlobalPAC_Click); + // + // menuKeep + // + this.menuKeep.Name = "menuKeep"; + resources.ApplyResources(this.menuKeep, "menuKeep"); + this.menuKeep.Click += new System.EventHandler(this.menuKeep_Click); + // + // menuKeepPAC + // + this.menuKeepPAC.Name = "menuKeepPAC"; + resources.ApplyResources(this.menuKeepPAC, "menuKeepPAC"); + this.menuKeepPAC.Click += new System.EventHandler(this.menuKeepPAC_Click); + // + // menuServers + // + this.menuServers.Name = "menuServers"; + resources.ApplyResources(this.menuServers, "menuServers"); + // + // menuAddServers2 + // + this.menuAddServers2.Name = "menuAddServers2"; + resources.ApplyResources(this.menuAddServers2, "menuAddServers2"); + this.menuAddServers2.Click += new System.EventHandler(this.menuAddServers_Click); + // + // menuScanScreen2 + // + this.menuScanScreen2.Name = "menuScanScreen2"; + resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2"); + this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click); + // + // menuCopyPACUrl + // + this.menuCopyPACUrl.Name = "menuCopyPACUrl"; + resources.ApplyResources(this.menuCopyPACUrl, "menuCopyPACUrl"); + this.menuCopyPACUrl.Click += new System.EventHandler(this.menuCopyPACUrl_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2"); + // + // menuExit + // + this.menuExit.Name = "menuExit"; + resources.ApplyResources(this.menuExit, "menuExit"); + this.menuExit.Click += new System.EventHandler(this.menuExit_Click); + // + // bgwScan + // + this.bgwScan.WorkerReportsProgress = true; + this.bgwScan.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgwScan_DoWork); + this.bgwScan.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgwScan_ProgressChanged); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.splitContainer1); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.txtMsgBox); + this.groupBox2.Controls.Add(this.ssMain); + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // txtMsgBox + // + this.txtMsgBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(41)))), ((int)(((byte)(49)))), ((int)(((byte)(52))))); + this.txtMsgBox.BorderStyle = System.Windows.Forms.BorderStyle.None; + resources.ApplyResources(this.txtMsgBox, "txtMsgBox"); + this.txtMsgBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(226)))), ((int)(((byte)(228))))); + this.txtMsgBox.Name = "txtMsgBox"; + this.txtMsgBox.ReadOnly = true; + // + // ssMain + // + this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolSslSocksPortLab, + this.toolSslSocksPort, + this.toolSslBlank1, + this.toolSslHttpPortLab, + this.toolSslHttpPort, + this.toolSslBlank2, + this.toolSslPacPortLab, + this.toolSslPacPort, + this.toolSslBlank3, + this.toolSslServerSpeed, + this.toolSslBlank4}); + resources.ApplyResources(this.ssMain, "ssMain"); + this.ssMain.Name = "ssMain"; + this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked); + // + // toolSslSocksPortLab + // + resources.ApplyResources(this.toolSslSocksPortLab, "toolSslSocksPortLab"); + this.toolSslSocksPortLab.Name = "toolSslSocksPortLab"; + // + // toolSslSocksPort + // + this.toolSslSocksPort.Name = "toolSslSocksPort"; + resources.ApplyResources(this.toolSslSocksPort, "toolSslSocksPort"); + // + // toolSslBlank1 + // + resources.ApplyResources(this.toolSslBlank1, "toolSslBlank1"); + this.toolSslBlank1.Name = "toolSslBlank1"; + this.toolSslBlank1.Spring = true; + // + // toolSslHttpPortLab + // + resources.ApplyResources(this.toolSslHttpPortLab, "toolSslHttpPortLab"); + this.toolSslHttpPortLab.Name = "toolSslHttpPortLab"; + // + // toolSslHttpPort + // + this.toolSslHttpPort.Name = "toolSslHttpPort"; + resources.ApplyResources(this.toolSslHttpPort, "toolSslHttpPort"); + // + // toolSslBlank2 + // + resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); + this.toolSslBlank2.Name = "toolSslBlank2"; + this.toolSslBlank2.Spring = true; + // + // toolSslPacPortLab + // + resources.ApplyResources(this.toolSslPacPortLab, "toolSslPacPortLab"); + this.toolSslPacPortLab.Name = "toolSslPacPortLab"; + // + // toolSslPacPort + // + this.toolSslPacPort.Name = "toolSslPacPort"; + resources.ApplyResources(this.toolSslPacPort, "toolSslPacPort"); + // + // toolSslBlank3 + // + resources.ApplyResources(this.toolSslBlank3, "toolSslBlank3"); + this.toolSslBlank3.Name = "toolSslBlank3"; + this.toolSslBlank3.Spring = true; + // + // toolSslServerSpeed + // + resources.ApplyResources(this.toolSslServerSpeed, "toolSslServerSpeed"); + this.toolSslServerSpeed.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolSslServerSpeed.Name = "toolSslServerSpeed"; + // + // toolSslBlank4 + // + this.toolSslBlank4.Name = "toolSslBlank4"; + resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4"); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // tsMain + // + this.tsMain.ImageScalingSize = new System.Drawing.Size(32, 32); + this.tsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbServer, + this.toolStripSeparator4, + this.tsbSub, + this.toolStripSeparator8, + this.tsbOptionSetting, + this.toolStripSeparator5, + this.tsbReload, + this.toolStripSeparator7, + this.tsbCheckUpdate, + this.toolStripSeparator10, + this.tsbHelp, + this.tsbPromotion, + this.toolStripSeparator11, + this.tsbClose}); + resources.ApplyResources(this.tsMain, "tsMain"); + this.tsMain.Name = "tsMain"; + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4"); + // + // tsbSub + // + this.tsbSub.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbSubSetting, + this.tsbSubUpdate}); + this.tsbSub.Image = global::v2rayN.Properties.Resources.sub; + resources.ApplyResources(this.tsbSub, "tsbSub"); + this.tsbSub.Name = "tsbSub"; + // + // tsbSubSetting + // + this.tsbSubSetting.Name = "tsbSubSetting"; + resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting"); + this.tsbSubSetting.Click += new System.EventHandler(this.tsbSubSetting_Click); + // + // tsbSubUpdate + // + this.tsbSubUpdate.Name = "tsbSubUpdate"; + resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate"); + this.tsbSubUpdate.Click += new System.EventHandler(this.tsbSubUpdate_Click); + // + // toolStripSeparator8 + // + this.toolStripSeparator8.Name = "toolStripSeparator8"; + resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8"); + // + // tsbOptionSetting + // + this.tsbOptionSetting.Image = global::v2rayN.Properties.Resources.option; + resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting"); + this.tsbOptionSetting.Name = "tsbOptionSetting"; + this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click); + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5"); + // + // tsbReload + // + resources.ApplyResources(this.tsbReload, "tsbReload"); + this.tsbReload.Name = "tsbReload"; + this.tsbReload.Click += new System.EventHandler(this.tsbReload_Click); + // + // toolStripSeparator7 + // + this.toolStripSeparator7.Name = "toolStripSeparator7"; + resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7"); + // + // tsbCheckUpdate + // + this.tsbCheckUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbCheckUpdateN, + this.tsbCheckUpdateCore, + this.tsbCheckUpdatePACList, + this.tsbCheckClearPACList}); + this.tsbCheckUpdate.Image = global::v2rayN.Properties.Resources.checkupdate; + resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate"); + this.tsbCheckUpdate.Name = "tsbCheckUpdate"; + // + // tsbCheckUpdateN + // + this.tsbCheckUpdateN.Name = "tsbCheckUpdateN"; + resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN"); + this.tsbCheckUpdateN.Click += new System.EventHandler(this.tsbCheckUpdateN_Click); + // + // tsbCheckUpdateCore + // + this.tsbCheckUpdateCore.Name = "tsbCheckUpdateCore"; + resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore"); + this.tsbCheckUpdateCore.Click += new System.EventHandler(this.tsbCheckUpdateCore_Click); + // + // tsbCheckUpdatePACList + // + this.tsbCheckUpdatePACList.Name = "tsbCheckUpdatePACList"; + resources.ApplyResources(this.tsbCheckUpdatePACList, "tsbCheckUpdatePACList"); + this.tsbCheckUpdatePACList.Click += new System.EventHandler(this.tsbCheckUpdatePACList_Click); + // + // tsbCheckClearPACList + // + this.tsbCheckClearPACList.Name = "tsbCheckClearPACList"; + resources.ApplyResources(this.tsbCheckClearPACList, "tsbCheckClearPACList"); + this.tsbCheckClearPACList.Click += new System.EventHandler(this.tsbCheckClearPACList_Click); + // + // toolStripSeparator10 + // + this.toolStripSeparator10.Name = "toolStripSeparator10"; + resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10"); + // + // tsbHelp + // + this.tsbHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.tsbAbout, + this.toolStripSeparator12, + this.tsbLanguageDef, + this.tsbLanguageZhHans}); + this.tsbHelp.Image = global::v2rayN.Properties.Resources.help; + resources.ApplyResources(this.tsbHelp, "tsbHelp"); + this.tsbHelp.Name = "tsbHelp"; + // + // tsbAbout + // + this.tsbAbout.Name = "tsbAbout"; + resources.ApplyResources(this.tsbAbout, "tsbAbout"); + this.tsbAbout.Click += new System.EventHandler(this.tsbAbout_Click); + // + // toolStripSeparator12 + // + this.toolStripSeparator12.Name = "toolStripSeparator12"; + resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12"); + // + // tsbLanguageDef + // + this.tsbLanguageDef.Name = "tsbLanguageDef"; + resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef"); + this.tsbLanguageDef.Click += new System.EventHandler(this.tsbLanguageDef_Click); + // + // tsbLanguageZhHans + // + this.tsbLanguageZhHans.Name = "tsbLanguageZhHans"; + resources.ApplyResources(this.tsbLanguageZhHans, "tsbLanguageZhHans"); + this.tsbLanguageZhHans.Click += new System.EventHandler(this.tsbLanguageZhHans_Click); + // + // tsbPromotion + // + this.tsbPromotion.ForeColor = System.Drawing.Color.Black; + this.tsbPromotion.Image = global::v2rayN.Properties.Resources.promotion; + resources.ApplyResources(this.tsbPromotion, "tsbPromotion"); + this.tsbPromotion.Name = "tsbPromotion"; + this.tsbPromotion.Click += new System.EventHandler(this.tsbPromotion_Click); + // + // toolStripSeparator11 + // + this.toolStripSeparator11.Name = "toolStripSeparator11"; + resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11"); + // + // tsbClose + // + resources.ApplyResources(this.tsbClose, "tsbClose"); + this.tsbClose.Name = "tsbClose"; + this.tsbClose.Click += new System.EventHandler(this.tsbClose_Click); + // + // MainForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox1); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.panel1); + this.Controls.Add(this.tsMain); + this.MaximizeBox = true; + this.MinimizeBox = true; + this.Name = "MainForm"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); + this.Load += new System.EventHandler(this.MainForm_Load); + this.Shown += new System.EventHandler(this.MainForm_Shown); + this.VisibleChanged += new System.EventHandler(this.MainForm_VisibleChanged); + this.Resize += new System.EventHandler(this.MainForm_Resize); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.cmsLv.ResumeLayout(false); + this.cmsMain.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.ssMain.ResumeLayout(false); + this.ssMain.PerformLayout(); + this.tsMain.ResumeLayout(false); + this.tsMain.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox txtMsgBox; + private v2rayN.Forms.ListViewFlickerFree lvServers; + private System.Windows.Forms.NotifyIcon notifyMain; + private System.Windows.Forms.ContextMenuStrip cmsMain; + private System.Windows.Forms.ToolStripMenuItem menuExit; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.ToolStripMenuItem menuServers; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ContextMenuStrip cmsLv; + private System.Windows.Forms.ToolStripMenuItem menuAddVmessServer; + private System.Windows.Forms.ToolStripMenuItem menuRemoveServer; + private System.Windows.Forms.ToolStripMenuItem menuSetDefaultServer; + private System.Windows.Forms.ToolStripMenuItem menuCopyServer; + private System.Windows.Forms.ToolStripMenuItem menuPingServer; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem menuExport2ClientConfig; + private System.Windows.Forms.ToolStripMenuItem menuExport2ServerConfig; + private System.Windows.Forms.ToolStrip tsMain; + private System.Windows.Forms.ToolStripDropDownButton tsbServer; + private System.Windows.Forms.ToolStripButton tsbOptionSetting; + private System.Windows.Forms.ToolStripButton tsbReload; + private System.Windows.Forms.ToolStripButton tsbClose; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; + private System.Windows.Forms.ToolStripMenuItem menuMoveTop; + private System.Windows.Forms.ToolStripMenuItem menuMoveUp; + private System.Windows.Forms.ToolStripMenuItem menuMoveDown; + private System.Windows.Forms.ToolStripMenuItem menuMoveBottom; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator9; + private System.Windows.Forms.ToolStripMenuItem menuSysAgentMode; + private System.Windows.Forms.ToolStripMenuItem menuGlobal; + private System.Windows.Forms.ToolStripMenuItem menuGlobalPAC; + private System.Windows.Forms.ToolStripMenuItem menuKeep; + private System.Windows.Forms.ToolStripMenuItem menuSysAgentEnabled; + private System.Windows.Forms.ToolStripMenuItem menuCopyPACUrl; + private System.Windows.Forms.ToolStripMenuItem menuAddCustomServer; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem menuAddShadowsocksServer; + private System.Windows.Forms.SplitContainer splitContainer1; + private QRCodeControl qrCodeControl; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; + private System.Windows.Forms.ToolStripDropDownButton tsbCheckUpdate; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateN; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateCore; + private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdatePACList; + private System.Windows.Forms.ToolStripMenuItem menuAddServers; + private System.Windows.Forms.ToolStripMenuItem menuExport2ShareUrl; + private System.Windows.Forms.ToolStripMenuItem menuSpeedServer; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; + private System.Windows.Forms.ToolStripDropDownButton tsbHelp; + private System.Windows.Forms.ToolStripMenuItem tsbAbout; + private System.Windows.Forms.ToolStripMenuItem menuAddServers2; + private System.ComponentModel.BackgroundWorker bgwScan; + private System.Windows.Forms.ToolStripMenuItem menuScanScreen; + private System.Windows.Forms.ToolStripMenuItem menuScanScreen2; + private System.Windows.Forms.ToolStripDropDownButton tsbSub; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; + private System.Windows.Forms.ToolStripMenuItem tsbSubSetting; + private System.Windows.Forms.ToolStripMenuItem tsbSubUpdate; + private System.Windows.Forms.ToolStripMenuItem tsbCheckClearPACList; + private System.Windows.Forms.ToolStripMenuItem menuKeepPAC; + private System.Windows.Forms.ToolStripMenuItem menuSelectAll; + private System.Windows.Forms.ToolStripMenuItem menuExport2SubContent; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; + private System.Windows.Forms.ToolStripMenuItem tsbLanguageDef; + private System.Windows.Forms.ToolStripMenuItem tsbLanguageZhHans; + private System.Windows.Forms.ToolStripButton tsbPromotion; + private System.Windows.Forms.ToolStripMenuItem menuAddSocksServer; + private System.Windows.Forms.StatusStrip ssMain; + private System.Windows.Forms.ToolStripStatusLabel toolSslSocksPort; + private System.Windows.Forms.ToolStripStatusLabel toolSslHttpPort; + private System.Windows.Forms.ToolStripStatusLabel toolSslBlank2; + private System.Windows.Forms.ToolStripStatusLabel toolSslBlank1; + private System.Windows.Forms.ToolStripStatusLabel toolSslPacPort; + private System.Windows.Forms.ToolStripStatusLabel toolSslBlank3; + private System.Windows.Forms.ToolStripStatusLabel toolSslSocksPortLab; + private System.Windows.Forms.ToolStripStatusLabel toolSslHttpPortLab; + private System.Windows.Forms.ToolStripStatusLabel toolSslPacPortLab; + private System.Windows.Forms.ToolStripStatusLabel toolSslServerSpeed; + private System.Windows.Forms.ToolStripStatusLabel toolSslBlank4; + private System.Windows.Forms.ToolStripMenuItem menuRemoveDuplicateServer; + private System.Windows.Forms.ToolStripMenuItem menuTcpingServer; + private System.Windows.Forms.ToolStripMenuItem menuRealPingServer; + } +} + diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs new file mode 100644 index 00000000..11ec3fdd --- /dev/null +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -0,0 +1,1542 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.IO.Compression; +using System.Text; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.HttpProxyHandler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class MainForm : BaseForm + { + private V2rayHandler v2rayHandler; + private PACListHandle pacListHandle; + private V2rayUpdateHandle v2rayUpdateHandle; + private List lvSelecteds = new List(); + private StatisticsHandler statistics = null; + + #region Window 事件 + + public MainForm() + { + InitializeComponent(); + this.ShowInTaskbar = false; + this.WindowState = FormWindowState.Minimized; + HideForm(); + this.Text = Utils.GetVersion(); + + Application.ApplicationExit += (sender, args) => + { + Utils.ClearTempPath(); + statistics?.Close(); + }; + } + + private void MainForm_Load(object sender, EventArgs e) + { + ConfigHandler.LoadConfig(ref config); + v2rayHandler = new V2rayHandler(); + v2rayHandler.ProcessEvent += v2rayHandler_ProcessEvent; + + if (config.enableStatistics) + { + statistics = new StatisticsHandler(config, UpdateStatisticsHandler); + } + } + + private void MainForm_VisibleChanged(object sender, EventArgs e) + { + if (statistics == null || !statistics.Enable) return; + if ((sender as Form).Visible) + { + statistics.UpdateUI = true; + } + else + { + statistics.UpdateUI = false; + } + } + + private void MainForm_Shown(object sender, EventArgs e) + { + InitServersView(); + RefreshServers(); + lvServers.AutoResizeColumns(); + + LoadV2ray(); + + HideForm(); + + } + + private void MainForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (e.CloseReason == CloseReason.UserClosing) + { + e.Cancel = true; + + statistics?.SaveToFile(); + + HideForm(); + return; + } + if (e.CloseReason == CloseReason.ApplicationExitCall) + { + ConfigHandler.SaveConfig(ref config); + statistics?.SaveToFile(); + statistics?.Close(); + } + } + + private void MainForm_Resize(object sender, EventArgs e) + { + //if (this.WindowState == FormWindowState.Minimized) + //{ + // HideForm(); + //} + //else + //{ + // //this.splitContainer1.SplitterDistance = config.uiItem.mainQRCodeWidth; + //} + } + + private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e) + { + //config.uiItem.mainQRCodeWidth = splitContainer1.SplitterDistance; + } + + private const int WM_QUERYENDSESSION = 0x0011; + protected override void WndProc(ref Message m) + { + switch (m.Msg) + { + case WM_QUERYENDSESSION: + Utils.SaveLog("Windows shutdown UnsetProxy"); + //CloseV2ray(); + ConfigHandler.ToJsonFile(config); + statistics?.SaveToFile(); + ProxySetting.UnsetProxy(); + m.Result = (IntPtr)1; + break; + default: + base.WndProc(ref m); + break; + } + } + #endregion + + #region 显示服务器 listview 和 menu + + /// + /// 刷新服务器 + /// + private void RefreshServers() + { + RefreshServersView(); + RefreshServersMenu(); + } + + /// + /// 初始化服务器列表 + /// + private void InitServersView() + { + lvServers.Items.Clear(); + + lvServers.GridLines = true; + lvServers.FullRowSelect = true; + lvServers.View = View.Details; + lvServers.Scrollable = true; + lvServers.MultiSelect = true; + lvServers.HeaderStyle = ColumnHeaderStyle.Nonclickable; + + lvServers.Columns.Add("", 30, HorizontalAlignment.Center); + lvServers.Columns.Add(UIRes.I18N("LvServiceType"), 80, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvAlias"), 100, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvAddress"), 120, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvPort"), 50, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvEncryptionMethod"), 90, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvTransportProtocol"), 70, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvSubscription"), 50, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvTestResults"), 70, HorizontalAlignment.Left); + + if (statistics != null && statistics.Enable) + { + lvServers.Columns.Add(UIRes.I18N("LvTotalUploadDataAmount"), 70, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvTotalDownloadDataAmount"), 70, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvTodayUploadDataAmount"), 70, HorizontalAlignment.Left); + lvServers.Columns.Add(UIRes.I18N("LvTodayDownloadDataAmount"), 70, HorizontalAlignment.Left); + } + } + + /// + /// 刷新服务器列表 + /// + private void RefreshServersView() + { + lvServers.Items.Clear(); + + for (int k = 0; k < config.vmess.Count; k++) + { + string def = string.Empty; + string totalUp = string.Empty, + totalDown = string.Empty, + todayUp = string.Empty, + todayDown = string.Empty; + if (config.index.Equals(k)) + { + def = "√"; + } + + VmessItem item = config.vmess[k]; + + ListViewItem lvItem = null; + if (statistics != null && statistics.Enable) + { + var index = statistics.Statistic.FindIndex(item_ => item_.address == item.address); + if (index != -1) + { + totalUp = Utils.HumanFy(statistics.Statistic[index].totalUp); + totalDown = Utils.HumanFy(statistics.Statistic[index].totalDown); + todayUp = Utils.HumanFy(statistics.Statistic[index].todayUp); + todayDown = Utils.HumanFy(statistics.Statistic[index].todayDown); + } + + lvItem = new ListViewItem(new string[] + { + def, + ((EConfigType)item.configType).ToString(), + item.remarks, + item.address, + item.port.ToString(), + //item.id, + //item.alterId.ToString(), + item.security, + item.network, + item.getSubRemarks(config), + item.testResult, + totalUp, + totalDown, + todayUp, + todayDown + }); + } + else + { + lvItem = new ListViewItem(new string[] + { + def, + ((EConfigType)item.configType).ToString(), + item.remarks, + item.address, + item.port.ToString(), + //item.id, + //item.alterId.ToString(), + item.security, + item.network, + item.getSubRemarks(config), + item.testResult + //totalUp, + //totalDown, + //todayUp, + //todayDown, + }); + } + + if (lvItem != null) lvServers.Items.Add(lvItem); + } + + //if (lvServers.Items.Count > 0) + //{ + // if (lvServers.Items.Count <= testConfigIndex) + // { + // testConfigIndex = lvServers.Items.Count - 1; + // } + // lvServers.Items[testConfigIndex].Selected = true; + // lvServers.Select(); + //} + } + + /// + /// 刷新托盘服务器菜单 + /// + private void RefreshServersMenu() + { + menuServers.DropDownItems.Clear(); + + for (int k = 0; k < config.vmess.Count; k++) + { + VmessItem item = config.vmess[k]; + string name = item.getSummary(); + + ToolStripMenuItem ts = new ToolStripMenuItem(name); + ts.Tag = k; + if (config.index.Equals(k)) + { + ts.Checked = true; + } + ts.Click += new EventHandler(ts_Click); + menuServers.DropDownItems.Add(ts); + } + } + + private void ts_Click(object sender, EventArgs e) + { + try + { + ToolStripItem ts = (ToolStripItem)sender; + int index = Utils.ToInt(ts.Tag); + SetDefaultServer(index); + } + catch + { + } + } + + private void lvServers_SelectedIndexChanged(object sender, EventArgs e) + { + int index = -1; + try + { + if (lvServers.SelectedIndices.Count > 0) + { + index = lvServers.SelectedIndices[0]; + } + } + catch + { + } + if (index < 0) + { + return; + } + qrCodeControl.showQRCode(index, config); + } + + private void DisplayToolStatus() + { + var localIP = "127.0.0.1"; + toolSslSocksPort.Text = + toolSslHttpPort.Text = + toolSslPacPort.Text = "NONE"; + + toolSslSocksPort.Text = $"{localIP}:{config.inbound[0].localPort}"; + + if (config.sysAgentEnabled) + { + toolSslHttpPort.Text = $"{localIP}:{Global.sysAgentPort}"; + if (config.listenerType == 2 || config.listenerType == 4) + { + if (PACServerHandle.IsRunning) + { + toolSslPacPort.Text = $"{HttpProxyHandle.GetPacUrl()}"; + } + else + { + toolSslPacPort.Text = UIRes.I18N("StartPacFailed"); + } + } + } + notifyMain.Icon = GetNotifyIcon(); + + } + private void ssMain_ItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + if (!Utils.IsNullOrEmpty(e.ClickedItem.Text)) + { + Utils.SetClipboardData(e.ClickedItem.Text); + } + } + + private Icon GetNotifyIcon() + { + try + { + var color = ColorTranslator.FromHtml("#3399CC"); + var index = config.sysAgentEnabled ? config.listenerType : 0; + if (index > 0) + { + color = (new Color[] { Color.Red, Color.Purple, Color.DarkGreen, Color.Orange })[index - 1]; + //color = ColorTranslator.FromHtml(new string[] { "#CC0066", "#CC6600", "#99CC99", "#666699" }[index - 1]); + } + + var width = 128; + var height = 128; + + var bitmap = new Bitmap(width, height); + var graphics = Graphics.FromImage(bitmap); + var drawBrush = new SolidBrush(color); + + graphics.FillEllipse(drawBrush, new Rectangle(0, 0, width, height)); + var zoom = 16; + graphics.DrawImage(new Bitmap(Properties.Resources.notify, width - zoom, width - zoom), zoom / 2, zoom / 2); + + bitmap.Save(Utils.GetPath("temp_icon.ico"), System.Drawing.Imaging.ImageFormat.Icon); + + Icon createdIcon = Icon.FromHandle(bitmap.GetHicon()); + + drawBrush.Dispose(); + graphics.Dispose(); + bitmap.Dispose(); + + return createdIcon; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + return this.Icon; + } + } + #endregion + + #region v2ray 操作 + + /// + /// 载入V2ray + /// + private void LoadV2ray() + { + if (Global.reloadV2ray) + { + ClearMsg(); + } + v2rayHandler.LoadV2ray(config); + Global.reloadV2ray = false; + ConfigHandler.ToJsonFile(config); + + ChangeSysAgent(config.sysAgentEnabled); + DisplayToolStatus(); + } + + /// + /// 关闭V2ray + /// + private void CloseV2ray() + { + ConfigHandler.ToJsonFile(config); + + ChangeSysAgent(false); + + v2rayHandler.V2rayStop(); + } + + #endregion + + #region 功能按钮 + + private void lvServers_DoubleClick(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + + if (config.vmess[index].configType == (int)EConfigType.Vmess) + { + var fm = new AddServerForm(); + fm.EditIndex = index; + if (fm.ShowDialog() == DialogResult.OK) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + } + else if (config.vmess[index].configType == (int)EConfigType.Shadowsocks) + { + var fm = new AddServer3Form(); + fm.EditIndex = index; + if (fm.ShowDialog() == DialogResult.OK) + { + RefreshServers(); + LoadV2ray(); + } + } + else if (config.vmess[index].configType == (int)EConfigType.Socks) + { + var fm = new AddServer4Form(); + fm.EditIndex = index; + if (fm.ShowDialog() == DialogResult.OK) + { + RefreshServers(); + LoadV2ray(); + } + } + else + { + var fm2 = new AddServer2Form(); + fm2.EditIndex = index; + if (fm2.ShowDialog() == DialogResult.OK) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + } + } + + private void lvServers_KeyDown(object sender, KeyEventArgs e) + { + if (e.Control) + { + switch (e.KeyCode) + { + case Keys.A: + menuSelectAll_Click(null, null); + break; + case Keys.P: + menuPingServer_Click(null, null); + break; + case Keys.O: + menuTcpingServer_Click(null, null); + break; + case Keys.R: + menuRealPingServer_Click(null, null); + break; + case Keys.T: + menuSpeedServer_Click(null, null); + break; + } + } + switch (e.KeyCode) + { + case Keys.Enter: + menuSetDefaultServer_Click(null, null); + break; + case Keys.Delete: + menuRemoveServer_Click(null, null); + break; + case Keys.U: + menuMoveUp_Click(null, null); + break; + case Keys.D: + menuMoveDown_Click(null, null); + break; + } + } + + private void menuAddVmessServer_Click(object sender, EventArgs e) + { + AddServerForm fm = new AddServerForm(); + fm.EditIndex = -1; + if (fm.ShowDialog() == DialogResult.OK) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + } + + private void menuRemoveServer_Click(object sender, EventArgs e) + { + + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + if (UI.ShowYesNo(UIRes.I18N("RemoveServer")) == DialogResult.No) + { + return; + } + for (int k = lvSelecteds.Count - 1; k >= 0; k--) + { + ConfigHandler.RemoveServer(ref config, lvSelecteds[k]); + } + //刷新 + RefreshServers(); + LoadV2ray(); + + } + + private void menuRemoveDuplicateServer_Click(object sender, EventArgs e) + { + List servers = null; + Utils.DedupServerList(config.vmess, out servers); + if (servers != null) + { + config.vmess = servers; + } + //刷新 + RefreshServers(); + LoadV2ray(); + } + + private void menuCopyServer_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + if (ConfigHandler.CopyServer(ref config, index) == 0) + { + //刷新 + RefreshServers(); + } + } + + private void menuSetDefaultServer_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + SetDefaultServer(index); + } + + + private void menuPingServer_Click(object sender, EventArgs e) + { + GetLvSelectedIndex(); + ClearTestResult(); + var statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, "ping", UpdateSpeedtestHandler); + } + private void menuTcpingServer_Click(object sender, EventArgs e) + { + GetLvSelectedIndex(); + ClearTestResult(); + var statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, "tcping", UpdateSpeedtestHandler); + } + + private void menuRealPingServer_Click(object sender, EventArgs e) + { + if (!config.sysAgentEnabled || config.listenerType != 1) + { + UI.Show(UIRes.I18N("NeedHttpGlobalProxy")); + return; + } + + UI.Show(UIRes.I18N("SpeedServerTips")); + + GetLvSelectedIndex(); + ClearTestResult(); + var statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, "realping", UpdateSpeedtestHandler); + } + + private void menuSpeedServer_Click(object sender, EventArgs e) + { + if (!config.sysAgentEnabled || config.listenerType != 1) + { + UI.Show(UIRes.I18N("NeedHttpGlobalProxy")); + return; + } + + UI.Show(UIRes.I18N("SpeedServerTips")); + + GetLvSelectedIndex(); + var statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, "speedtest", UpdateSpeedtestHandler); + } + + private void menuExport2ClientConfig_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + if (config.vmess[index].configType != (int)EConfigType.Vmess) + { + UI.Show(UIRes.I18N("NonVmessService")); + return; + } + + SaveFileDialog fileDialog = new SaveFileDialog(); + fileDialog.Filter = "Config|*.json"; + fileDialog.FilterIndex = 2; + fileDialog.RestoreDirectory = true; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + string fileName = fileDialog.FileName; + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + Config configCopy = Utils.DeepCopy(config); + configCopy.index = index; + string msg; + if (V2rayConfigHandler.Export2ClientConfig(configCopy, fileName, out msg) != 0) + { + UI.Show(msg); + } + else + { + UI.Show(string.Format(UIRes.I18N("SaveClientConfigurationIn"), fileName)); + } + } + + private void menuExport2ServerConfig_Click(object sender, EventArgs e) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } + if (config.vmess[index].configType != (int)EConfigType.Vmess) + { + UI.Show(UIRes.I18N("NonVmessService")); + return; + } + + SaveFileDialog fileDialog = new SaveFileDialog(); + fileDialog.Filter = "Config|*.json"; + fileDialog.FilterIndex = 2; + fileDialog.RestoreDirectory = true; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + string fileName = fileDialog.FileName; + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + Config configCopy = Utils.DeepCopy(config); + configCopy.index = index; + string msg; + if (V2rayConfigHandler.Export2ServerConfig(configCopy, fileName, out msg) != 0) + { + UI.Show(msg); + } + else + { + UI.Show(string.Format(UIRes.I18N("SaveServerConfigurationIn"), fileName)); + } + } + + private void menuExport2ShareUrl_Click(object sender, EventArgs e) + { + GetLvSelectedIndex(); + + StringBuilder sb = new StringBuilder(); + for (int k = 0; k < lvSelecteds.Count; k++) + { + string url = ConfigHandler.GetVmessQRCode(config, lvSelecteds[k]); + if (Utils.IsNullOrEmpty(url)) + { + continue; + } + sb.Append(url); + sb.AppendLine(); + } + if (sb.Length > 0) + { + Utils.SetClipboardData(sb.ToString()); + UI.Show(UIRes.I18N("BatchExportURLSuccessfully")); + } + } + + private void menuExport2SubContent_Click(object sender, EventArgs e) + { + GetLvSelectedIndex(); + + StringBuilder sb = new StringBuilder(); + for (int k = 0; k < lvSelecteds.Count; k++) + { + string url = ConfigHandler.GetVmessQRCode(config, lvSelecteds[k]); + if (Utils.IsNullOrEmpty(url)) + { + continue; + } + sb.Append(url); + sb.AppendLine(); + } + if (sb.Length > 0) + { + Utils.SetClipboardData(Utils.Base64Encode(sb.ToString())); + UI.Show(UIRes.I18N("BatchExportSubscriptionSuccessfully")); + } + } + + private void tsbOptionSetting_Click(object sender, EventArgs e) + { + OptionSettingForm fm = new OptionSettingForm(); + if (fm.ShowDialog() == DialogResult.OK) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + } + + private void tsbReload_Click(object sender, EventArgs e) + { + Global.reloadV2ray = true; + LoadV2ray(); + } + + private void tsbClose_Click(object sender, EventArgs e) + { + HideForm(); + //this.WindowState = FormWindowState.Minimized; + } + + /// + /// 设置活动服务器 + /// + /// + /// + private int SetDefaultServer(int index) + { + if (index < 0) + { + UI.Show(UIRes.I18N("PleaseSelectServer")); + return -1; + } + if (ConfigHandler.SetDefaultServer(ref config, index) == 0) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + return 0; + } + + /// + /// 取得ListView选中的行 + /// + /// + private int GetLvSelectedIndex() + { + int index = -1; + lvSelecteds.Clear(); + try + { + if (lvServers.SelectedIndices.Count <= 0) + { + UI.Show(UIRes.I18N("PleaseSelectServer")); + return index; + } + + index = lvServers.SelectedIndices[0]; + foreach (int i in lvServers.SelectedIndices) + { + lvSelecteds.Add(i); + } + return index; + } + catch + { + return index; + } + } + + private void menuAddCustomServer_Click(object sender, EventArgs e) + { + UI.Show(UIRes.I18N("CustomServerTips")); + + OpenFileDialog fileDialog = new OpenFileDialog(); + fileDialog.Multiselect = false; + fileDialog.Filter = "Config|*.json|All|*.*"; + if (fileDialog.ShowDialog() != DialogResult.OK) + { + return; + } + string fileName = fileDialog.FileName; + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + + if (ConfigHandler.AddCustomServer(ref config, fileName) == 0) + { + //刷新 + RefreshServers(); + LoadV2ray(); + UI.Show(UIRes.I18N("SuccessfullyImportedCustomServer")); + } + else + { + UI.Show(UIRes.I18N("FailedImportedCustomServer")); + } + } + + private void menuAddShadowsocksServer_Click(object sender, EventArgs e) + { + var fm = new AddServer3Form(); + fm.EditIndex = -1; + if (fm.ShowDialog() == DialogResult.OK) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + ShowForm(); + } + + private void menuAddSocksServer_Click(object sender, EventArgs e) + { + var fm = new AddServer4Form(); + fm.EditIndex = -1; + if (fm.ShowDialog() == DialogResult.OK) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + ShowForm(); + } + + private void menuAddServers_Click(object sender, EventArgs e) + { + string clipboardData = Utils.GetClipboardData(); + if (AddBatchServers(clipboardData) == 0) + { + UI.Show(UIRes.I18N("SuccessfullyImportedServerViaClipboard")); + } + } + + private void menuScanScreen_Click(object sender, EventArgs e) + { + HideForm(); + bgwScan.RunWorkerAsync(); + } + + private int AddBatchServers(string clipboardData, string subid = "") + { + if (ConfigHandler.AddBatchServers(ref config, clipboardData, subid) != 0) + { + clipboardData = Utils.Base64Decode(clipboardData); + if (ConfigHandler.AddBatchServers(ref config, clipboardData, subid) != 0) + { + return -1; + } + } + RefreshServers(); + return 0; + } + + #endregion + + + #region 提示信息 + + /// + /// 消息委托 + /// + /// + /// + void v2rayHandler_ProcessEvent(bool notify, string msg) + { + AppendText(notify, msg); + } + + delegate void AppendTextDelegate(string text); + void AppendText(bool notify, string msg) + { + try + { + AppendText(msg); + if (notify) + { + notifyMsg(msg); + } + } + catch + { + } + } + + void AppendText(string text) + { + if (this.txtMsgBox.InvokeRequired) + { + Invoke(new AppendTextDelegate(AppendText), new object[] { text }); + } + else + { + //this.txtMsgBox.AppendText(text); + ShowMsg(text); + } + } + + /// + /// 提示信息 + /// + /// + private void ShowMsg(string msg) + { + if (txtMsgBox.Lines.Length > 500) + { + ClearMsg(); + } + this.txtMsgBox.AppendText(msg); + if (!msg.EndsWith("\r\n")) + { + this.txtMsgBox.AppendText("\r\n"); + } + } + + /// + /// 清除信息 + /// + private void ClearMsg() + { + this.txtMsgBox.Clear(); + } + + /// + /// 托盘信息 + /// + /// + private void notifyMsg(string msg) + { + notifyMain.Text = msg; + } + + #endregion + + + #region 托盘事件 + + private void notifyMain_MouseClick(object sender, MouseEventArgs e) + { + if (e.Button == System.Windows.Forms.MouseButtons.Left) + { + ShowForm(); + } + } + + private void menuExit_Click(object sender, EventArgs e) + { + CloseV2ray(); + + this.Visible = false; + this.Close(); + + statistics?.Close(); + + //this.Dispose(); + //System.Environment.Exit(System.Environment.ExitCode); + Application.Exit(); + } + + + private void ShowForm() + { + this.Show(); + this.WindowState = FormWindowState.Normal; + this.Activate(); + //this.notifyIcon1.Visible = false; + this.ShowInTaskbar = true; + + SetVisibleCore(true); + } + + private void HideForm() + { + //this.WindowState = FormWindowState.Minimized; + this.Hide(); + //this.notifyMain.Icon = this.Icon; + this.notifyMain.Visible = true; + this.ShowInTaskbar = false; + + SetVisibleCore(false); + } + + #endregion + + #region 后台测速 + + private void SetTestResult(int k, string txt) + { + config.vmess[k].testResult = txt; + lvServers.Items[k].SubItems[8].Text = txt; + } + private void ClearTestResult() + { + for (int k = 0; k < config.vmess.Count; k++) + { + SetTestResult(k, ""); + } + } + private void UpdateSpeedtestHandler(int index, string msg) + { + lvServers.Invoke((MethodInvoker)delegate + { + lvServers.SuspendLayout(); + + SetTestResult(index, msg); + + lvServers.ResumeLayout(); + }); + } + + private void UpdateStatisticsHandler(ulong totalUp, ulong totalDown, ulong up, ulong down, List statistics) + { + try + { + up /= (ulong)(config.statisticsFreshRate / 1000f); + down /= (ulong)(config.statisticsFreshRate / 1000f); + toolSslServerSpeed.Text = string.Format( + "{0}/s↑ | {1}/s↓", + Utils.HumanFy(up), + Utils.HumanFy(down) + ); + + List datas = new List(); + for (int i = 0; i < config.vmess.Count; i++) + { + string totalUp_ = string.Empty, + totalDown_ = string.Empty, + todayUp_ = string.Empty, + todayDown_ = string.Empty; + var index = statistics.FindIndex(item_ => Utils.IsIdenticalServer(item_, new ServerStatistics(config.vmess[i].remarks, config.vmess[i].address, config.vmess[i].port, config.vmess[i].path, config.vmess[i].requestHost, 0, 0, 0, 0))); + if (index != -1) + { + totalUp_ = Utils.HumanFy(statistics[index].totalUp); + totalDown_ = Utils.HumanFy(statistics[index].totalDown); + todayUp_ = Utils.HumanFy(statistics[index].todayUp); + todayDown_ = Utils.HumanFy(statistics[index].todayDown); + } + + datas.Add(new string[] { totalUp_, totalDown_, todayUp_, todayDown_ }); + } + + lvServers.Invoke((MethodInvoker)delegate + { + lvServers.SuspendLayout(); + for (int i = 0; i < datas.Count; i++) + { + var indexStart = 9; + lvServers.Items[i].SubItems[indexStart++].Text = datas[i][0]; + lvServers.Items[i].SubItems[indexStart++].Text = datas[i][1]; + lvServers.Items[i].SubItems[indexStart++].Text = datas[i][2]; + lvServers.Items[i].SubItems[indexStart++].Text = datas[i][3]; + } + lvServers.ResumeLayout(); + }); + + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + #endregion + + #region 移动服务器 + + private void menuMoveTop_Click(object sender, EventArgs e) + { + MoveServer(EMove.Top); + } + + private void menuMoveUp_Click(object sender, EventArgs e) + { + MoveServer(EMove.Up); + } + + private void menuMoveDown_Click(object sender, EventArgs e) + { + MoveServer(EMove.Down); + } + + private void menuMoveBottom_Click(object sender, EventArgs e) + { + MoveServer(EMove.Bottom); + } + + private void MoveServer(EMove eMove) + { + int index = GetLvSelectedIndex(); + if (index < 0) + { + UI.Show(UIRes.I18N("PleaseSelectServer")); + return; + } + if (ConfigHandler.MoveServer(ref config, index, eMove) == 0) + { + //刷新 + RefreshServers(); + LoadV2ray(); + } + } + private void menuSelectAll_Click(object sender, EventArgs e) + { + foreach (ListViewItem item in lvServers.Items) + { + item.Selected = true; + } + } + + #endregion + + #region 系统代理相关 + + private void menuCopyPACUrl_Click(object sender, EventArgs e) + { + Utils.SetClipboardData(HttpProxyHandle.GetPacUrl()); + } + + private void menuSysAgentEnabled_Click(object sender, EventArgs e) + { + bool isChecked = !config.sysAgentEnabled; + config.sysAgentEnabled = isChecked; + ChangeSysAgent(isChecked); + } + + private void menuGlobal_Click(object sender, EventArgs e) + { + config.listenerType = 1; + ChangePACButtonStatus(config.listenerType); + } + + private void menuGlobalPAC_Click(object sender, EventArgs e) + { + config.listenerType = 2; + ChangePACButtonStatus(config.listenerType); + } + + private void menuKeep_Click(object sender, EventArgs e) + { + config.listenerType = 3; + ChangePACButtonStatus(config.listenerType); + } + + private void menuKeepPAC_Click(object sender, EventArgs e) + { + config.listenerType = 4; + ChangePACButtonStatus(config.listenerType); + } + + private void ChangePACButtonStatus(int type) + { + if (HttpProxyHandle.Update(config, false)) + { + switch (type) + { + case 1: + menuGlobal.Checked = true; + menuGlobalPAC.Checked = false; + menuKeep.Checked = false; + menuKeepPAC.Checked = false; + break; + case 2: + menuGlobal.Checked = false; + menuGlobalPAC.Checked = true; + menuKeep.Checked = false; + menuKeepPAC.Checked = false; + break; + case 3: + menuGlobal.Checked = false; + menuGlobalPAC.Checked = false; + menuKeep.Checked = true; + menuKeepPAC.Checked = false; + break; + case 4: + menuGlobal.Checked = false; + menuGlobalPAC.Checked = false; + menuKeep.Checked = false; + menuKeepPAC.Checked = true; + break; + } + } + DisplayToolStatus(); + } + + /// + /// 改变系统代理 + /// + /// + private void ChangeSysAgent(bool isChecked) + { + if (isChecked) + { + if (HttpProxyHandle.RestartHttpAgent(config, true)) + { + ChangePACButtonStatus(config.listenerType); + } + } + else + { + HttpProxyHandle.Update(config, true); + HttpProxyHandle.CloseHttpAgent(config); + } + + menuSysAgentEnabled.Checked = + menuSysAgentMode.Enabled = isChecked; + + DisplayToolStatus(); + } + #endregion + + + #region CheckUpdate + + private void tsbCheckUpdateN_Click(object sender, EventArgs e) + { + System.Diagnostics.Process.Start(Global.UpdateUrl); + } + + private void tsbCheckUpdateCore_Click(object sender, EventArgs e) + { + if (v2rayUpdateHandle == null) + { + v2rayUpdateHandle = new V2rayUpdateHandle(); + v2rayUpdateHandle.AbsoluteCompleted += (sender2, args) => + { + if (args.Success) + { + AppendText(false, UIRes.I18N("MsgParsingV2rayCoreSuccessfully")); + + string url = args.Msg; + this.Invoke((MethodInvoker)(delegate + { + + if (UI.ShowYesNo(string.Format(UIRes.I18N("DownloadYesNo"), url)) == DialogResult.No) + { + return; + } + else + { + v2rayUpdateHandle.DownloadFileAsync(config, url); + } + })); + } + else + { + AppendText(false, args.Msg); + } + }; + v2rayUpdateHandle.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + AppendText(false, UIRes.I18N("MsgDownloadV2rayCoreSuccessfully")); + AppendText(false, UIRes.I18N("MsgUnpacking")); + + try + { + CloseV2ray(); + + string fileName = v2rayUpdateHandle.DownloadFileName; + fileName = Utils.GetPath(fileName); + using (ZipArchive archive = ZipFile.OpenRead(fileName)) + { + foreach (ZipArchiveEntry entry in archive.Entries) + { + if (entry.Length == 0) + continue; + entry.ExtractToFile(Utils.GetPath(entry.Name), true); + } + } + AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfullyMore")); + + Global.reloadV2ray = true; + LoadV2ray(); + + AppendText(false, UIRes.I18N("MsgUpdateV2rayCoreSuccessfully")); + } + catch (Exception ex) + { + AppendText(false, ex.Message); + } + } + else + { + AppendText(false, args.Msg); + } + }; + v2rayUpdateHandle.Error += (sender2, args) => + { + AppendText(true, args.GetException().Message); + }; + } + + AppendText(false, UIRes.I18N("MsgStartUpdatingV2rayCore")); + v2rayUpdateHandle.AbsoluteV2rayCore(config); + } + + private void tsbCheckUpdatePACList_Click(object sender, EventArgs e) + { + if (pacListHandle == null) + { + pacListHandle = new PACListHandle(); + pacListHandle.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + AppendText(false, UIRes.I18N("MsgPACUpdateSuccessfully")); + } + else + { + AppendText(false, UIRes.I18N("MsgPACUpdateFailed")); + } + }; + pacListHandle.Error += (sender2, args) => + { + AppendText(true, args.GetException().Message); + }; + } + AppendText(false, UIRes.I18N("MsgStartUpdatingPAC")); + pacListHandle.UpdatePACFromGFWList(config); + } + + private void tsbCheckClearPACList_Click(object sender, EventArgs e) + { + try + { + File.WriteAllText(Utils.GetPath(Global.pacFILE), Utils.GetEmbedText(Global.BlankPacFileName), Encoding.UTF8); + AppendText(false, UIRes.I18N("MsgSimplifyPAC")); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + #endregion + + #region Help + + + private void tsbAbout_Click(object sender, EventArgs e) + { + System.Diagnostics.Process.Start(Global.AboutUrl); + } + + private void tsbPromotion_Click(object sender, EventArgs e) + { + System.Diagnostics.Process.Start(Global.PromotionUrl); + } + #endregion + + #region ScanScreen + + + private void bgwScan_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) + { + string ret = Utils.ScanScreen(); + bgwScan.ReportProgress(0, ret); + } + + private void bgwScan_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) + { + ShowForm(); + + string result = Convert.ToString(e.UserState); + if (Utils.IsNullOrEmpty(result)) + { + UI.Show(UIRes.I18N("NoValidQRcodeFound")); + } + else + { + if (AddBatchServers(result) == 0) + { + UI.Show(UIRes.I18N("SuccessfullyImportedServerViaScan")); + } + } + } + + #endregion + + #region 订阅 + private void tsbSubSetting_Click(object sender, EventArgs e) + { + SubSettingForm fm = new SubSettingForm(); + if (fm.ShowDialog() == DialogResult.OK) + { + RefreshServers(); + } + } + + private void tsbSubUpdate_Click(object sender, EventArgs e) + { + AppendText(false, UIRes.I18N("MsgUpdateSubscriptionStart")); + + if (config.subItem == null || config.subItem.Count <= 0) + { + AppendText(false, UIRes.I18N("MsgNoValidSubscription")); + return; + } + + for (int k = 1; k <= config.subItem.Count; k++) + { + string id = config.subItem[k - 1].id.TrimEx(); + string url = config.subItem[k - 1].url.TrimEx(); + string hashCode = $"{k}->"; + if (config.subItem[k - 1].enabled == false) + { + continue; + } + if (Utils.IsNullOrEmpty(id) || Utils.IsNullOrEmpty(url)) + { + AppendText(false, $"{hashCode}{UIRes.I18N("MsgNoValidSubscription")}"); + continue; + } + + V2rayUpdateHandle v2rayUpdateHandle3 = new V2rayUpdateHandle(); + v2rayUpdateHandle3.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + AppendText(false, $"{hashCode}{UIRes.I18N("MsgGetSubscriptionSuccessfully")}"); + var result = Utils.Base64Decode(args.Msg); + if (Utils.IsNullOrEmpty(result)) + { + AppendText(false, $"{hashCode}{UIRes.I18N("MsgSubscriptionDecodingFailed")}"); + return; + } + + ConfigHandler.RemoveServerViaSubid(ref config, id); + AppendText(false, $"{hashCode}{UIRes.I18N("MsgClearSubscription")}"); + RefreshServers(); + if (AddBatchServers(result, id) == 0) + { + } + else + { + AppendText(false, $"{hashCode}{UIRes.I18N("MsgFailedImportSubscription")}"); + } + AppendText(false, $"{hashCode}{UIRes.I18N("MsgUpdateSubscriptionEnd")}"); + } + else + { + AppendText(false, args.Msg); + } + }; + v2rayUpdateHandle3.Error += (sender2, args) => + { + AppendText(true, args.GetException().Message); + }; + + v2rayUpdateHandle3.WebDownloadString(url); + AppendText(false, $"{hashCode}{UIRes.I18N("MsgStartGettingSubscriptions")}"); + } + + + } + + #endregion + + #region Language + + private void tsbLanguageDef_Click(object sender, EventArgs e) + { + SetCurrentLanguage("en"); + } + + private void tsbLanguageZhHans_Click(object sender, EventArgs e) + { + SetCurrentLanguage("zh-Hans"); + } + private void SetCurrentLanguage(string value) + { + Utils.RegWriteValue(Global.MyRegPath, Global.MyRegKeyLanguage, value); + } + + + #endregion + + + } +} diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx new file mode 100644 index 00000000..bfd73a86 --- /dev/null +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -0,0 +1,1409 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Fill + + + + 3, 17 + + + 327, 17 + + + 447, 22 + + + Add [VMess] server + + + 447, 22 + + + Add [Shadowsocks] server + + + 447, 22 + + + Add [Socks] server + + + 447, 22 + + + Add a custom configuration server + + + 447, 22 + + + Import bulk URL from clipboard + + + 447, 22 + + + Scan QR code on the screen + + + 444, 6 + + + 447, 22 + + + Remove selected server (multiple choice) (Delete) + + + 447, 22 + + + Remove duplicate server + + + 447, 22 + + + Copy selected server + + + 447, 22 + + + Set as active server (Enter) + + + 444, 6 + + + 447, 22 + + + Up to top + + + 447, 22 + + + Upward (U) + + + 447, 22 + + + Down (D) + + + 447, 22 + + + Moves down to the bottom + + + 447, 22 + + + Select All (Ctrl+A) + + + 444, 6 + + + 447, 22 + + + Test server ping (multiple choice)(Ctrl+P) + + + 447, 22 + + + Test server tcping (multiple choice)(Ctrl+O) + + + 447, 22 + + + Test server real ping (multiple choice)(Ctrl+R) + + + 447, 22 + + + Test server speed (multiple choice)(Ctrl+T) + + + 444, 6 + + + 447, 22 + + + Export selected server for client configuration + + + 447, 22 + + + Export selected server for server configuration + + + 447, 22 + + + Batch export share URL to clipboard (multiple choice) + + + 447, 22 + + + Batch export subscription content to clipboard (multiple choice) + + + Magenta + + + 64, 53 + + + Servers + + + ImageAboveText + + + 448, 556 + + + cmsLv + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + + + 0, 0 + + + 686, 331 + + + + 1 + + + lvServers + + + v2rayN.Forms.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + splitContainer1.Panel1 + + + 0 + + + splitContainer1.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 0 + + + Fill + + + 0, 0 + + + 256, 331 + + + 0 + + + qrCodeControl + + + v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + + splitContainer1.Panel2 + + + 0 + + + splitContainer1.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainer1 + + + 1 + + + 100 + + + 946, 331 + + + 686 + + + 2 + + + splitContainer1 + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + 17, 17 + + + 137, 17 + + + NoControl + + + 264, 22 + + + Enable Http proxy + + + 547, 22 + + + Open Http proxy and automatically configure proxy server (global mode) + + + 547, 22 + + + Open PAC and automatically configure PAC (PAC mode) + + + 547, 22 + + + Only open Http proxy, do not automatically configure proxy server (direct mode) + + + 547, 22 + + + Only open PAC, do not automatically configure PAC + + + 264, 22 + + + Http proxy mode + + + 264, 22 + + + Server + + + 264, 22 + + + Import bulk URL from clipboard + + + 264, 22 + + + Scan QR code on the screen + + + 264, 22 + + + Copy local PAC URL + + + 261, 6 + + + 264, 22 + + + Exit + + + 265, 164 + + + cmsMain + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + True + + + 498, 17 + + + Fill + + + 0, 66 + + + 952, 351 + + + 2 + + + Server list + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + Fill + + + 3, 17 + + + 0 + + + True + + + Vertical + + + 946, 134 + + + 2 + + + txtMsgBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + 228, 18 + + + 微软雅黑, 8pt + + + 49, 17 + + + SOCKS5 + + + 0, 17 + + + 微软雅黑, 8pt + + + 198, 17 + + + 微软雅黑, 8pt + + + 36, 17 + + + HTTP + + + 0, 17 + + + 微软雅黑, 8pt + + + 198, 17 + + + 微软雅黑, 8pt + + + 30, 17 + + + PAC + + + 0, 17 + + + 微软雅黑, 8pt + + + 198, 17 + + + False + + + 微软雅黑, 8pt + + + No + + + 220, 17 + + + SPEED Disabled + + + MiddleRight + + + 0, 17 + + + 3, 151 + + + 946, 22 + + + 7 + + + statusStrip1 + + + ssMain + + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + Bottom + + + 0, 417 + + + 952, 176 + + + 4 + + + Information + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 3 + + + Top + + + 0, 56 + + + 952, 10 + + + 5 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + 409, 17 + + + 6, 56 + + + 197, 22 + + + Subscription settings + + + 197, 22 + + + Update subscription + + + Magenta + + + 93, 53 + + + Subscription + + + ImageAboveText + + + 6, 56 + + + Magenta + + + 52, 53 + + + Setting + + + ImageAboveText + + + 6, 56 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd + QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X + jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY + 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 + NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY + B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== + + + + BottomCenter + + + Magenta + + + 97, 53 + + + Restart service + + + ImageAboveText + + + 6, 56 + + + 338, 22 + + + Check for updates to v2rayN + + + 338, 22 + + + Check for updates to v2rayCore + + + 338, 22 + + + Check for updated PAC (requires Http proxy) + + + 338, 22 + + + Simplify PAC (please set Core route) + + + Magenta + + + 128, 53 + + + Check for updates + + + ImageAboveText + + + 6, 56 + + + 187, 22 + + + About + + + 184, 6 + + + 187, 22 + + + Language-[English] + + + 187, 22 + + + 语言-[中文简体] + + + Magenta + + + 48, 53 + + + Help + + + ImageAboveText + + + Magenta + + + 89, 53 + + + Promotion + + + ImageAboveText + + + 6, 56 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ + GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== + + + + Magenta + + + 52, 53 + + + Close + + + ImageAboveText + + + 0, 0 + + + 952, 56 + + + 6 + + + tsMain + + + System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 5 + + + True + + + 65 + + + 6, 12 + + + 952, 593 + + + 4, 4, 4, 4 + + + v2rayN + + + menuAddVmessServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddShadowsocksServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddSocksServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddCustomServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddServers + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuScanScreen + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator1 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRemoveServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRemoveDuplicateServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuCopyServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSetDefaultServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator3 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveTop + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveUp + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveDown + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveBottom + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSelectAll + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator9 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuPingServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuTcpingServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRealPingServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSpeedServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator6 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2ClientConfig + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2ServerConfig + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2ShareUrl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2SubContent + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbServer + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + notifyMain + + + System.Windows.Forms.NotifyIcon, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSysAgentEnabled + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSysAgentMode + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuGlobal + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuGlobalPAC + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuKeep + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuKeepPAC + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuServers + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddServers2 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuScanScreen2 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuCopyPACUrl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator2 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExit + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + bgwScan + + + System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslSocksPortLab + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslSocksPort + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslBlank1 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslHttpPortLab + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslHttpPort + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslBlank2 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslPacPortLab + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslPacPort + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslBlank3 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslServerSpeed + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslBlank4 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator4 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSub + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSubSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSubUpdate + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator8 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbOptionSetting + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator5 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbReload + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator7 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdate + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateN + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdatePACList + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckClearPACList + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator10 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbHelp + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbAbout + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator12 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbLanguageDef + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbLanguageZhHans + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbPromotion + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator11 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbClose + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MainForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx new file mode 100644 index 00000000..abb6629f --- /dev/null +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -0,0 +1,474 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 278, 22 + + + 添加[VMess]服务器 + + + 278, 22 + + + 添加[Shadowsocks]服务器 + + + 278, 22 + + + 添加[Socks]服务器 + + + 278, 22 + + + 添加自定义配置服务器 + + + 278, 22 + + + 从剪贴板导入批量URL + + + 278, 22 + + + 扫描屏幕上的二维码 + + + 275, 6 + + + 278, 22 + + + 移除所选服务器(多选) (Delete) + + + 278, 22 + + + 移除重复的服务器 + + + 278, 22 + + + 复制所选服务器 + + + 278, 22 + + + 设为活动服务器 (Enter) + + + 275, 6 + + + 278, 22 + + + 上移至顶 + + + 278, 22 + + + 上移 (U) + + + 278, 22 + + + 下移 (D) + + + 278, 22 + + + 下移至底 + + + 278, 22 + + + 全选 (Ctrl+A) + + + 275, 6 + + + 278, 22 + + + 测试服务器延迟Ping(多选)(Ctrl+P) + + + 278, 22 + + + 测试服务器延迟Tcping(多选)(Ctrl+O) + + + 278, 22 + + + 测试服务器真连接延迟(多选)(Ctrl+R) + + + 278, 22 + + + 测试服务器速度(多选)(Ctrl+T) + + + 275, 6 + + + 278, 22 + + + 导出所选服务器为客户端配置 + + + 278, 22 + + + 导出所选服务器为服务端配置 + + + 278, 22 + + + 批量导出分享URL至剪贴板(多选) + + + 278, 22 + + + 批量导出订阅内容至剪贴板(多选) + + + 279, 534 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + + + 73, 53 + + + 服务器 + + + 196, 164 + + + 195, 22 + + + 启用Http代理 + + + 195, 22 + + + Http代理模式 + + + 340, 22 + + + 开启Http代理,并自动配置代理服务器(全局模式) + + + 340, 22 + + + 开启PAC,并自动配置PAC(PAC模式) + + + 340, 22 + + + 仅开启Http代理,不自动配置代理服务器(直连模式) + + + 340, 22 + + + 仅开启PAC,不自动配置PAC + + + 195, 22 + + + 服务器 + + + 195, 22 + + + 从剪贴板导入批量URL + + + 195, 22 + + + 扫描屏幕上的二维码 + + + 195, 22 + + + 复制本地PAC网址 + + + 192, 6 + + + 195, 22 + + + 退出 + + + 服务器列表 + + + 信息 + + + 网速显示未启用 + + + 61, 53 + + + 订阅 + + + 124, 22 + + + 订阅设置 + + + 124, 22 + + + 更新订阅 + + + 76, 53 + + + 参数设置 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd + QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X + jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY + 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3 + NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY + B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg== + + + + 76, 53 + + + 重启服务 + + + 85, 53 + + + 检查更新 + + + 232, 22 + + + 检查更新v2rayN + + + 232, 22 + + + 检查更新v2rayCore + + + 232, 22 + + + 检查更新PAC (需要Http代理) + + + 232, 22 + + + 简化PAC (请设置Core路由) + + + 69, 53 + + + 帮助 + + + 关于 + + + 68, 53 + + + 推广 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ + GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== + + + + 关闭 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs new file mode 100644 index 00000000..d44d446a --- /dev/null +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -0,0 +1,675 @@ +namespace v2rayN.Forms +{ + partial class OptionSettingForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OptionSettingForm)); + this.btnClose = new System.Windows.Forms.Button(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.chksniffingEnabled2 = new System.Windows.Forms.CheckBox(); + this.chksniffingEnabled = new System.Windows.Forms.CheckBox(); + this.txtremoteDNS = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.chkmuxEnabled = new System.Windows.Forms.CheckBox(); + this.chkAllowIn2 = new System.Windows.Forms.CheckBox(); + this.chkudpEnabled2 = new System.Windows.Forms.CheckBox(); + this.cmbprotocol2 = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.txtlocalPort2 = new System.Windows.Forms.TextBox(); + this.cmbprotocol = new System.Windows.Forms.ComboBox(); + this.label1 = new System.Windows.Forms.Label(); + this.chkudpEnabled = new System.Windows.Forms.CheckBox(); + this.chklogEnabled = new System.Windows.Forms.CheckBox(); + this.cmbloglevel = new System.Windows.Forms.ComboBox(); + this.label5 = new System.Windows.Forms.Label(); + this.txtlocalPort = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.tabControl2 = new System.Windows.Forms.TabControl(); + this.tabPage3 = new System.Windows.Forms.TabPage(); + this.txtUseragent = new System.Windows.Forms.TextBox(); + this.tabPage4 = new System.Windows.Forms.TabPage(); + this.txtUserdirect = new System.Windows.Forms.TextBox(); + this.tabPage5 = new System.Windows.Forms.TabPage(); + this.txtUserblock = new System.Windows.Forms.TextBox(); + this.panel3 = new System.Windows.Forms.Panel(); + this.btnSetDefRountingRule = new System.Windows.Forms.Button(); + this.cmbdomainStrategy = new System.Windows.Forms.ComboBox(); + this.labRoutingTips = new System.Windows.Forms.Label(); + this.label15 = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.cmbroutingMode = new System.Windows.Forms.ComboBox(); + this.tabPage6 = new System.Windows.Forms.TabPage(); + this.chkKcpcongestion = new System.Windows.Forms.CheckBox(); + this.txtKcpwriteBufferSize = new System.Windows.Forms.TextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.txtKcpreadBufferSize = new System.Windows.Forms.TextBox(); + this.label11 = new System.Windows.Forms.Label(); + this.txtKcpdownlinkCapacity = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.txtKcpuplinkCapacity = new System.Windows.Forms.TextBox(); + this.label9 = new System.Windows.Forms.Label(); + this.txtKcptti = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.txtKcpmtu = new System.Windows.Forms.TextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.tabPage7 = new System.Windows.Forms.TabPage(); + this.cbFreshrate = new System.Windows.Forms.ComboBox(); + this.tbCacheDays = new System.Windows.Forms.TextBox(); + this.lbFreshrate = new System.Windows.Forms.Label(); + this.lbCacheDays = new System.Windows.Forms.Label(); + this.chkEnableStatistics = new System.Windows.Forms.CheckBox(); + this.chkAllowLANConn = new System.Windows.Forms.CheckBox(); + this.txturlGFWList = new System.Windows.Forms.TextBox(); + this.label13 = new System.Windows.Forms.Label(); + this.chkAutoRun = new System.Windows.Forms.CheckBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel1 = new System.Windows.Forms.Panel(); + this.configBindingSource = new System.Windows.Forms.BindingSource(this.components); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.groupBox1.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.tabControl2.SuspendLayout(); + this.tabPage3.SuspendLayout(); + this.tabPage4.SuspendLayout(); + this.tabPage5.SuspendLayout(); + this.panel3.SuspendLayout(); + this.tabPage6.SuspendLayout(); + this.tabPage7.SuspendLayout(); + this.panel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.configBindingSource)).BeginInit(); + this.SuspendLayout(); + // + // btnClose + // + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // tabControl1 + // + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Controls.Add(this.tabPage6); + this.tabControl1.Controls.Add(this.tabPage7); + resources.ApplyResources(this.tabControl1, "tabControl1"); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.groupBox1); + resources.ApplyResources(this.tabPage1, "tabPage1"); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.chksniffingEnabled2); + this.groupBox1.Controls.Add(this.chksniffingEnabled); + this.groupBox1.Controls.Add(this.txtremoteDNS); + this.groupBox1.Controls.Add(this.label14); + this.groupBox1.Controls.Add(this.chkmuxEnabled); + this.groupBox1.Controls.Add(this.chkAllowIn2); + this.groupBox1.Controls.Add(this.chkudpEnabled2); + this.groupBox1.Controls.Add(this.cmbprotocol2); + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Controls.Add(this.txtlocalPort2); + this.groupBox1.Controls.Add(this.cmbprotocol); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.chkudpEnabled); + this.groupBox1.Controls.Add(this.chklogEnabled); + this.groupBox1.Controls.Add(this.cmbloglevel); + this.groupBox1.Controls.Add(this.label5); + this.groupBox1.Controls.Add(this.txtlocalPort); + this.groupBox1.Controls.Add(this.label2); + resources.ApplyResources(this.groupBox1, "groupBox1"); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.TabStop = false; + // + // chksniffingEnabled2 + // + resources.ApplyResources(this.chksniffingEnabled2, "chksniffingEnabled2"); + this.chksniffingEnabled2.Name = "chksniffingEnabled2"; + this.chksniffingEnabled2.UseVisualStyleBackColor = true; + // + // chksniffingEnabled + // + resources.ApplyResources(this.chksniffingEnabled, "chksniffingEnabled"); + this.chksniffingEnabled.Name = "chksniffingEnabled"; + this.chksniffingEnabled.UseVisualStyleBackColor = true; + // + // txtremoteDNS + // + resources.ApplyResources(this.txtremoteDNS, "txtremoteDNS"); + this.txtremoteDNS.Name = "txtremoteDNS"; + // + // label14 + // + resources.ApplyResources(this.label14, "label14"); + this.label14.Name = "label14"; + // + // chkmuxEnabled + // + resources.ApplyResources(this.chkmuxEnabled, "chkmuxEnabled"); + this.chkmuxEnabled.Name = "chkmuxEnabled"; + this.chkmuxEnabled.UseVisualStyleBackColor = true; + // + // chkAllowIn2 + // + resources.ApplyResources(this.chkAllowIn2, "chkAllowIn2"); + this.chkAllowIn2.Name = "chkAllowIn2"; + this.chkAllowIn2.UseVisualStyleBackColor = true; + this.chkAllowIn2.CheckedChanged += new System.EventHandler(this.chkAllowIn2_CheckedChanged); + // + // chkudpEnabled2 + // + resources.ApplyResources(this.chkudpEnabled2, "chkudpEnabled2"); + this.chkudpEnabled2.Name = "chkudpEnabled2"; + this.chkudpEnabled2.UseVisualStyleBackColor = true; + // + // cmbprotocol2 + // + this.cmbprotocol2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbprotocol2.FormattingEnabled = true; + this.cmbprotocol2.Items.AddRange(new object[] { + resources.GetString("cmbprotocol2.Items"), + resources.GetString("cmbprotocol2.Items1")}); + resources.ApplyResources(this.cmbprotocol2, "cmbprotocol2"); + this.cmbprotocol2.Name = "cmbprotocol2"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // txtlocalPort2 + // + resources.ApplyResources(this.txtlocalPort2, "txtlocalPort2"); + this.txtlocalPort2.Name = "txtlocalPort2"; + // + // cmbprotocol + // + this.cmbprotocol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + resources.ApplyResources(this.cmbprotocol, "cmbprotocol"); + this.cmbprotocol.FormattingEnabled = true; + this.cmbprotocol.Items.AddRange(new object[] { + resources.GetString("cmbprotocol.Items"), + resources.GetString("cmbprotocol.Items1")}); + this.cmbprotocol.Name = "cmbprotocol"; + // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // + // chkudpEnabled + // + resources.ApplyResources(this.chkudpEnabled, "chkudpEnabled"); + this.chkudpEnabled.Name = "chkudpEnabled"; + this.chkudpEnabled.UseVisualStyleBackColor = true; + // + // chklogEnabled + // + resources.ApplyResources(this.chklogEnabled, "chklogEnabled"); + this.chklogEnabled.Name = "chklogEnabled"; + this.chklogEnabled.UseVisualStyleBackColor = true; + // + // cmbloglevel + // + this.cmbloglevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbloglevel.FormattingEnabled = true; + this.cmbloglevel.Items.AddRange(new object[] { + resources.GetString("cmbloglevel.Items"), + resources.GetString("cmbloglevel.Items1"), + resources.GetString("cmbloglevel.Items2"), + resources.GetString("cmbloglevel.Items3"), + resources.GetString("cmbloglevel.Items4")}); + resources.ApplyResources(this.cmbloglevel, "cmbloglevel"); + this.cmbloglevel.Name = "cmbloglevel"; + // + // label5 + // + resources.ApplyResources(this.label5, "label5"); + this.label5.Name = "label5"; + // + // txtlocalPort + // + resources.ApplyResources(this.txtlocalPort, "txtlocalPort"); + this.txtlocalPort.Name = "txtlocalPort"; + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // tabPage2 + // + this.tabPage2.Controls.Add(this.groupBox2); + resources.ApplyResources(this.tabPage2, "tabPage2"); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.tabControl2); + this.groupBox2.Controls.Add(this.panel3); + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // tabControl2 + // + this.tabControl2.Controls.Add(this.tabPage3); + this.tabControl2.Controls.Add(this.tabPage4); + this.tabControl2.Controls.Add(this.tabPage5); + resources.ApplyResources(this.tabControl2, "tabControl2"); + this.tabControl2.Name = "tabControl2"; + this.tabControl2.SelectedIndex = 0; + // + // tabPage3 + // + this.tabPage3.Controls.Add(this.txtUseragent); + resources.ApplyResources(this.tabPage3, "tabPage3"); + this.tabPage3.Name = "tabPage3"; + this.tabPage3.UseVisualStyleBackColor = true; + // + // txtUseragent + // + resources.ApplyResources(this.txtUseragent, "txtUseragent"); + this.txtUseragent.Name = "txtUseragent"; + // + // tabPage4 + // + this.tabPage4.Controls.Add(this.txtUserdirect); + resources.ApplyResources(this.tabPage4, "tabPage4"); + this.tabPage4.Name = "tabPage4"; + this.tabPage4.UseVisualStyleBackColor = true; + // + // txtUserdirect + // + resources.ApplyResources(this.txtUserdirect, "txtUserdirect"); + this.txtUserdirect.Name = "txtUserdirect"; + // + // tabPage5 + // + this.tabPage5.Controls.Add(this.txtUserblock); + resources.ApplyResources(this.tabPage5, "tabPage5"); + this.tabPage5.Name = "tabPage5"; + this.tabPage5.UseVisualStyleBackColor = true; + // + // txtUserblock + // + resources.ApplyResources(this.txtUserblock, "txtUserblock"); + this.txtUserblock.Name = "txtUserblock"; + // + // panel3 + // + this.panel3.Controls.Add(this.btnSetDefRountingRule); + this.panel3.Controls.Add(this.cmbdomainStrategy); + this.panel3.Controls.Add(this.labRoutingTips); + this.panel3.Controls.Add(this.label15); + this.panel3.Controls.Add(this.label12); + this.panel3.Controls.Add(this.cmbroutingMode); + resources.ApplyResources(this.panel3, "panel3"); + this.panel3.Name = "panel3"; + // + // btnSetDefRountingRule + // + resources.ApplyResources(this.btnSetDefRountingRule, "btnSetDefRountingRule"); + this.btnSetDefRountingRule.Name = "btnSetDefRountingRule"; + this.btnSetDefRountingRule.UseVisualStyleBackColor = true; + this.btnSetDefRountingRule.Click += new System.EventHandler(this.btnSetDefRountingRule_Click); + // + // cmbdomainStrategy + // + this.cmbdomainStrategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbdomainStrategy.FormattingEnabled = true; + this.cmbdomainStrategy.Items.AddRange(new object[] { + resources.GetString("cmbdomainStrategy.Items"), + resources.GetString("cmbdomainStrategy.Items1"), + resources.GetString("cmbdomainStrategy.Items2")}); + resources.ApplyResources(this.cmbdomainStrategy, "cmbdomainStrategy"); + this.cmbdomainStrategy.Name = "cmbdomainStrategy"; + // + // labRoutingTips + // + this.labRoutingTips.ForeColor = System.Drawing.Color.Brown; + resources.ApplyResources(this.labRoutingTips, "labRoutingTips"); + this.labRoutingTips.Name = "labRoutingTips"; + // + // label15 + // + resources.ApplyResources(this.label15, "label15"); + this.label15.Name = "label15"; + // + // label12 + // + resources.ApplyResources(this.label12, "label12"); + this.label12.Name = "label12"; + // + // cmbroutingMode + // + this.cmbroutingMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbroutingMode.FormattingEnabled = true; + this.cmbroutingMode.Items.AddRange(new object[] { + resources.GetString("cmbroutingMode.Items"), + resources.GetString("cmbroutingMode.Items1"), + resources.GetString("cmbroutingMode.Items2"), + resources.GetString("cmbroutingMode.Items3")}); + resources.ApplyResources(this.cmbroutingMode, "cmbroutingMode"); + this.cmbroutingMode.Name = "cmbroutingMode"; + // + // tabPage6 + // + this.tabPage6.Controls.Add(this.chkKcpcongestion); + this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize); + this.tabPage6.Controls.Add(this.label10); + this.tabPage6.Controls.Add(this.txtKcpreadBufferSize); + this.tabPage6.Controls.Add(this.label11); + this.tabPage6.Controls.Add(this.txtKcpdownlinkCapacity); + this.tabPage6.Controls.Add(this.label8); + this.tabPage6.Controls.Add(this.txtKcpuplinkCapacity); + this.tabPage6.Controls.Add(this.label9); + this.tabPage6.Controls.Add(this.txtKcptti); + this.tabPage6.Controls.Add(this.label7); + this.tabPage6.Controls.Add(this.txtKcpmtu); + this.tabPage6.Controls.Add(this.label6); + resources.ApplyResources(this.tabPage6, "tabPage6"); + this.tabPage6.Name = "tabPage6"; + this.tabPage6.UseVisualStyleBackColor = true; + // + // chkKcpcongestion + // + resources.ApplyResources(this.chkKcpcongestion, "chkKcpcongestion"); + this.chkKcpcongestion.Name = "chkKcpcongestion"; + this.chkKcpcongestion.UseVisualStyleBackColor = true; + // + // txtKcpwriteBufferSize + // + resources.ApplyResources(this.txtKcpwriteBufferSize, "txtKcpwriteBufferSize"); + this.txtKcpwriteBufferSize.Name = "txtKcpwriteBufferSize"; + // + // label10 + // + resources.ApplyResources(this.label10, "label10"); + this.label10.Name = "label10"; + // + // txtKcpreadBufferSize + // + resources.ApplyResources(this.txtKcpreadBufferSize, "txtKcpreadBufferSize"); + this.txtKcpreadBufferSize.Name = "txtKcpreadBufferSize"; + // + // label11 + // + resources.ApplyResources(this.label11, "label11"); + this.label11.Name = "label11"; + // + // txtKcpdownlinkCapacity + // + resources.ApplyResources(this.txtKcpdownlinkCapacity, "txtKcpdownlinkCapacity"); + this.txtKcpdownlinkCapacity.Name = "txtKcpdownlinkCapacity"; + // + // label8 + // + resources.ApplyResources(this.label8, "label8"); + this.label8.Name = "label8"; + // + // txtKcpuplinkCapacity + // + resources.ApplyResources(this.txtKcpuplinkCapacity, "txtKcpuplinkCapacity"); + this.txtKcpuplinkCapacity.Name = "txtKcpuplinkCapacity"; + // + // label9 + // + resources.ApplyResources(this.label9, "label9"); + this.label9.Name = "label9"; + // + // txtKcptti + // + resources.ApplyResources(this.txtKcptti, "txtKcptti"); + this.txtKcptti.Name = "txtKcptti"; + // + // label7 + // + resources.ApplyResources(this.label7, "label7"); + this.label7.Name = "label7"; + // + // txtKcpmtu + // + resources.ApplyResources(this.txtKcpmtu, "txtKcpmtu"); + this.txtKcpmtu.Name = "txtKcpmtu"; + // + // label6 + // + resources.ApplyResources(this.label6, "label6"); + this.label6.Name = "label6"; + // + // tabPage7 + // + this.tabPage7.Controls.Add(this.cbFreshrate); + this.tabPage7.Controls.Add(this.tbCacheDays); + this.tabPage7.Controls.Add(this.lbFreshrate); + this.tabPage7.Controls.Add(this.lbCacheDays); + this.tabPage7.Controls.Add(this.chkEnableStatistics); + this.tabPage7.Controls.Add(this.chkAllowLANConn); + this.tabPage7.Controls.Add(this.txturlGFWList); + this.tabPage7.Controls.Add(this.label13); + this.tabPage7.Controls.Add(this.chkAutoRun); + resources.ApplyResources(this.tabPage7, "tabPage7"); + this.tabPage7.Name = "tabPage7"; + this.tabPage7.UseVisualStyleBackColor = true; + // + // cbFreshrate + // + this.cbFreshrate.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cbFreshrate.FormattingEnabled = true; + resources.ApplyResources(this.cbFreshrate, "cbFreshrate"); + this.cbFreshrate.Name = "cbFreshrate"; + // + // tbCacheDays + // + resources.ApplyResources(this.tbCacheDays, "tbCacheDays"); + this.tbCacheDays.Name = "tbCacheDays"; + // + // lbFreshrate + // + resources.ApplyResources(this.lbFreshrate, "lbFreshrate"); + this.lbFreshrate.Name = "lbFreshrate"; + // + // lbCacheDays + // + resources.ApplyResources(this.lbCacheDays, "lbCacheDays"); + this.lbCacheDays.Name = "lbCacheDays"; + // + // chkEnableStatistics + // + resources.ApplyResources(this.chkEnableStatistics, "chkEnableStatistics"); + this.chkEnableStatistics.Name = "chkEnableStatistics"; + this.chkEnableStatistics.UseVisualStyleBackColor = true; + // + // chkAllowLANConn + // + resources.ApplyResources(this.chkAllowLANConn, "chkAllowLANConn"); + this.chkAllowLANConn.Name = "chkAllowLANConn"; + this.chkAllowLANConn.UseVisualStyleBackColor = true; + // + // txturlGFWList + // + resources.ApplyResources(this.txturlGFWList, "txturlGFWList"); + this.txturlGFWList.Name = "txturlGFWList"; + // + // label13 + // + resources.ApplyResources(this.label13, "label13"); + this.label13.Name = "label13"; + // + // chkAutoRun + // + resources.ApplyResources(this.chkAutoRun, "chkAutoRun"); + this.chkAutoRun.Name = "chkAutoRun"; + this.chkAutoRun.UseVisualStyleBackColor = true; + // + // panel2 + // + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // panel1 + // + resources.ApplyResources(this.panel1, "panel1"); + this.panel1.Name = "panel1"; + // + // configBindingSource + // + this.configBindingSource.DataSource = typeof(v2rayN.Mode.Config); + // + // OptionSettingForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.tabControl1); + this.Controls.Add(this.panel2); + this.Controls.Add(this.panel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "OptionSettingForm"; + this.Load += new System.EventHandler(this.OptionSettingForm_Load); + this.tabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.tabPage2.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.tabControl2.ResumeLayout(false); + this.tabPage3.ResumeLayout(false); + this.tabPage3.PerformLayout(); + this.tabPage4.ResumeLayout(false); + this.tabPage4.PerformLayout(); + this.tabPage5.ResumeLayout(false); + this.tabPage5.PerformLayout(); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + this.tabPage6.ResumeLayout(false); + this.tabPage6.PerformLayout(); + this.tabPage7.ResumeLayout(false); + this.tabPage7.PerformLayout(); + this.panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.configBindingSource)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.ComboBox cmbloglevel; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TextBox txtlocalPort; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.CheckBox chklogEnabled; + private System.Windows.Forms.CheckBox chkudpEnabled; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.ComboBox cmbprotocol; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cmbprotocol2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtlocalPort2; + private System.Windows.Forms.CheckBox chkudpEnabled2; + private System.Windows.Forms.CheckBox chkAllowIn2; + private System.Windows.Forms.CheckBox chkmuxEnabled; + private System.Windows.Forms.TabControl tabControl2; + private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.TabPage tabPage4; + private System.Windows.Forms.Label labRoutingTips; + private System.Windows.Forms.TextBox txtUseragent; + private System.Windows.Forms.TabPage tabPage5; + private System.Windows.Forms.TextBox txtUserdirect; + private System.Windows.Forms.TextBox txtUserblock; + private System.Windows.Forms.TabPage tabPage6; + private System.Windows.Forms.TextBox txtKcpmtu; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox txtKcptti; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.TextBox txtKcpwriteBufferSize; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.TextBox txtKcpreadBufferSize; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.TextBox txtKcpdownlinkCapacity; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.TextBox txtKcpuplinkCapacity; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.CheckBox chkKcpcongestion; + private System.Windows.Forms.TabPage tabPage7; + private System.Windows.Forms.CheckBox chkAutoRun; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.TextBox txturlGFWList; + private System.Windows.Forms.CheckBox chkAllowLANConn; + private System.Windows.Forms.TextBox txtremoteDNS; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.ComboBox cmbdomainStrategy; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.ComboBox cmbroutingMode; + private System.Windows.Forms.CheckBox chksniffingEnabled; + private System.Windows.Forms.CheckBox chksniffingEnabled2; + private System.Windows.Forms.Button btnSetDefRountingRule; + private System.Windows.Forms.CheckBox chkEnableStatistics; + private System.Windows.Forms.TextBox tbCacheDays; + private System.Windows.Forms.Label lbCacheDays; + private System.Windows.Forms.ComboBox cbFreshrate; + private System.Windows.Forms.Label lbFreshrate; + private System.Windows.Forms.BindingSource configBindingSource; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs new file mode 100644 index 00000000..afd11944 --- /dev/null +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -0,0 +1,416 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using v2rayN.Handler; + +namespace v2rayN.Forms +{ + public partial class OptionSettingForm : BaseForm + { + public OptionSettingForm() + { + InitializeComponent(); + } + + private void OptionSettingForm_Load(object sender, EventArgs e) + { + InitBase(); + + InitRouting(); + + InitKCP(); + + InitGUI(); + } + + /// + /// 初始化基础设置 + /// + private void InitBase() + { + //日志 + chklogEnabled.Checked = config.logEnabled; + cmbloglevel.Text = config.loglevel; + + //Mux + chkmuxEnabled.Checked = config.muxEnabled; + + //本地监听 + if (config.inbound.Count > 0) + { + txtlocalPort.Text = config.inbound[0].localPort.ToString(); + cmbprotocol.Text = config.inbound[0].protocol.ToString(); + chkudpEnabled.Checked = config.inbound[0].udpEnabled; + chksniffingEnabled.Checked = config.inbound[0].sniffingEnabled; + if (config.inbound.Count > 1) + { + txtlocalPort2.Text = config.inbound[1].localPort.ToString(); + cmbprotocol2.Text = config.inbound[1].protocol.ToString(); + chkudpEnabled2.Checked = config.inbound[1].udpEnabled; + chksniffingEnabled2.Checked = config.inbound[1].sniffingEnabled; + chkAllowIn2.Checked = true; + } + else + { + chkAllowIn2.Checked = false; + } + chkAllowIn2State(); + } + + //remoteDNS + txtremoteDNS.Text = config.remoteDNS; + } + + /// + /// 初始化路由设置 + /// + private void InitRouting() + { + //路由 + cmbdomainStrategy.Text = config.domainStrategy; + int routingMode = 0; + int.TryParse(config.routingMode, out routingMode); + cmbroutingMode.SelectedIndex = routingMode; + + txtUseragent.Text = Utils.List2String(config.useragent, true); + txtUserdirect.Text = Utils.List2String(config.userdirect, true); + txtUserblock.Text = Utils.List2String(config.userblock, true); + } + + /// + /// 初始化KCP设置 + /// + private void InitKCP() + { + txtKcpmtu.Text = config.kcpItem.mtu.ToString(); + txtKcptti.Text = config.kcpItem.tti.ToString(); + txtKcpuplinkCapacity.Text = config.kcpItem.uplinkCapacity.ToString(); + txtKcpdownlinkCapacity.Text = config.kcpItem.downlinkCapacity.ToString(); + txtKcpreadBufferSize.Text = config.kcpItem.readBufferSize.ToString(); + txtKcpwriteBufferSize.Text = config.kcpItem.writeBufferSize.ToString(); + chkKcpcongestion.Checked = config.kcpItem.congestion; + } + + /// + /// 初始化v2rayN GUI设置 + /// + private void InitGUI() + { + //开机自动启动 + chkAutoRun.Checked = Utils.IsAutoRun(); + + //自定义GFWList + txturlGFWList.Text = config.urlGFWList; + + chkAllowLANConn.Checked = config.allowLANConn; + + + var enableStatistics = config.enableStatistics; + chkEnableStatistics.Checked = enableStatistics; + + tbCacheDays.Text = config.CacheDays.ToString(); + + + var cbSource = new ComboItem[] + { + new ComboItem{ID = (int)Global.StatisticsFreshRate.quick, Text = UIRes.I18N("QuickFresh")}, + new ComboItem{ID = (int)Global.StatisticsFreshRate.medium, Text = UIRes.I18N("MediumFresh")}, + new ComboItem{ID = (int)Global.StatisticsFreshRate.slow, Text = UIRes.I18N("SlowFresh")}, + }; + cbFreshrate.DataSource = cbSource; + + cbFreshrate.DisplayMember = "Text"; + cbFreshrate.ValueMember = "ID"; + + switch(config.statisticsFreshRate) + { + case (int)Global.StatisticsFreshRate.quick: + cbFreshrate.SelectedItem = cbSource[0]; + break; + case (int)Global.StatisticsFreshRate.medium: + cbFreshrate.SelectedItem = cbSource[1]; + break; + case (int)Global.StatisticsFreshRate.slow: + cbFreshrate.SelectedItem = cbSource[2]; + break; + } + + } + + private void btnOK_Click(object sender, EventArgs e) + { + if (SaveBase() != 0) + { + return; + } + + if (SaveRouting() != 0) + { + return; + } + + if (SaveKCP() != 0) + { + return; + } + + if (SaveGUI() != 0) + { + return; + } + + if (ConfigHandler.SaveConfig(ref config) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.Show(UIRes.I18N("OperationFailed")); + } + } + + /// + /// 保存基础设置 + /// + /// + private int SaveBase() + { + //日志 + bool logEnabled = chklogEnabled.Checked; + string loglevel = cmbloglevel.Text.TrimEx(); + + //Mux + bool muxEnabled = chkmuxEnabled.Checked; + + //本地监听 + string localPort = txtlocalPort.Text.TrimEx(); + string protocol = cmbprotocol.Text.TrimEx(); + bool udpEnabled = chkudpEnabled.Checked; + bool sniffingEnabled = chksniffingEnabled.Checked; + if (Utils.IsNullOrEmpty(localPort) || !Utils.IsNumberic(localPort)) + { + UI.Show(UIRes.I18N("FillLocalListeningPort")); + return -1; + } + if (Utils.IsNullOrEmpty(protocol)) + { + UI.Show(UIRes.I18N("PleaseSelectProtocol")); + return -1; + } + config.inbound[0].localPort = Utils.ToInt(localPort); + config.inbound[0].protocol = protocol; + config.inbound[0].udpEnabled = udpEnabled; + config.inbound[0].sniffingEnabled = sniffingEnabled; + + //本地监听2 + string localPort2 = txtlocalPort2.Text.TrimEx(); + string protocol2 = cmbprotocol2.Text.TrimEx(); + bool udpEnabled2 = chkudpEnabled2.Checked; + bool sniffingEnabled2 = chksniffingEnabled2.Checked; + if (chkAllowIn2.Checked) + { + if (Utils.IsNullOrEmpty(localPort2) || !Utils.IsNumberic(localPort2)) + { + UI.Show(UIRes.I18N("FillLocalListeningPort")); + return -1; + } + if (Utils.IsNullOrEmpty(protocol2)) + { + UI.Show(UIRes.I18N("PleaseSelectProtocol")); + return -1; + } + if (config.inbound.Count < 2) + { + config.inbound.Add(new Mode.InItem()); + } + config.inbound[1].localPort = Utils.ToInt(localPort2); + config.inbound[1].protocol = protocol2; + config.inbound[1].udpEnabled = udpEnabled2; + config.inbound[1].sniffingEnabled = sniffingEnabled2; + } + else + { + if (config.inbound.Count > 1) + { + config.inbound.RemoveAt(1); + } + } + + //日志 + config.logEnabled = logEnabled; + config.loglevel = loglevel; + + //Mux + config.muxEnabled = muxEnabled; + + //remoteDNS + config.remoteDNS = txtremoteDNS.Text.TrimEx(); + + return 0; + } + + /// + /// 保存路由设置 + /// + /// + private int SaveRouting() + { + //路由 + string domainStrategy = cmbdomainStrategy.Text; + string routingMode = cmbroutingMode.SelectedIndex.ToString(); + + string useragent = txtUseragent.Text.TrimEx(); + string userdirect = txtUserdirect.Text.TrimEx(); + string userblock = txtUserblock.Text.TrimEx(); + + config.domainStrategy = domainStrategy; + config.routingMode = routingMode; + + config.useragent = Utils.String2List(useragent); + config.userdirect = Utils.String2List(userdirect); + config.userblock = Utils.String2List(userblock); + + return 0; + } + + /// + /// 保存KCP设置 + /// + /// + private int SaveKCP() + { + string mtu = txtKcpmtu.Text.TrimEx(); + string tti = txtKcptti.Text.TrimEx(); + string uplinkCapacity = txtKcpuplinkCapacity.Text.TrimEx(); + string downlinkCapacity = txtKcpdownlinkCapacity.Text.TrimEx(); + string readBufferSize = txtKcpreadBufferSize.Text.TrimEx(); + string writeBufferSize = txtKcpwriteBufferSize.Text.TrimEx(); + bool congestion = chkKcpcongestion.Checked; + + if (Utils.IsNullOrEmpty(mtu) || !Utils.IsNumberic(mtu) + || Utils.IsNullOrEmpty(tti) || !Utils.IsNumberic(tti) + || Utils.IsNullOrEmpty(uplinkCapacity) || !Utils.IsNumberic(uplinkCapacity) + || Utils.IsNullOrEmpty(downlinkCapacity) || !Utils.IsNumberic(downlinkCapacity) + || Utils.IsNullOrEmpty(readBufferSize) || !Utils.IsNumberic(readBufferSize) + || Utils.IsNullOrEmpty(writeBufferSize) || !Utils.IsNumberic(writeBufferSize)) + { + UI.Show(UIRes.I18N("FillKcpParameters")); + return -1; + } + config.kcpItem.mtu = Utils.ToInt(mtu); + config.kcpItem.tti = Utils.ToInt(tti); + config.kcpItem.uplinkCapacity = Utils.ToInt(uplinkCapacity); + config.kcpItem.downlinkCapacity = Utils.ToInt(downlinkCapacity); + config.kcpItem.readBufferSize = Utils.ToInt(readBufferSize); + config.kcpItem.writeBufferSize = Utils.ToInt(writeBufferSize); + config.kcpItem.congestion = congestion; + + return 0; + } + + /// + /// 保存GUI设置 + /// + /// + private int SaveGUI() + { + //开机自动启动 + Utils.SetAutoRun(chkAutoRun.Checked); + + //自定义GFWList + config.urlGFWList = txturlGFWList.Text.TrimEx(); + + config.allowLANConn = chkAllowLANConn.Checked; + + var lastEnableStatistics = config.enableStatistics; + config.enableStatistics = chkEnableStatistics.Checked; + + uint days = 0; + var valid = uint.TryParse(tbCacheDays.Text, out days); + if (!valid) + days = 7; + config.CacheDays = days; + + config.statisticsFreshRate = (int)cbFreshrate.SelectedValue; + + //if(lastEnableStatistics != config.enableStatistics) + //{ + // /// https://stackoverflow.com/questions/779405/how-do-i-restart-my-c-sharp-winform-application + // // Shut down the current app instance. + // Application.Exit(); + + // // Restart the app passing "/restart [processId]" as cmd line args + // Process.Start(Application.ExecutablePath, "/restart " + Process.GetCurrentProcess().Id); + //} + return 0; + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void chkAllowIn2_CheckedChanged(object sender, EventArgs e) + { + chkAllowIn2State(); + } + private void chkAllowIn2State() + { + bool blAllow2 = chkAllowIn2.Checked; + txtlocalPort2.Enabled = + cmbprotocol2.Enabled = + chkudpEnabled2.Enabled = blAllow2; + } + + private void btnSetDefRountingRule_Click(object sender, EventArgs e) + { + var lstUrl = new List(); + lstUrl.Add(Global.CustomRoutingListUrl + "proxy"); + lstUrl.Add(Global.CustomRoutingListUrl + "direct"); + lstUrl.Add(Global.CustomRoutingListUrl + "block"); + + var lstTxt = new List(); + lstTxt.Add(txtUseragent); + lstTxt.Add(txtUserdirect); + lstTxt.Add(txtUserblock); + + for (int k = 0; k < lstUrl.Count; k++) + { + var txt = lstTxt[k]; + V2rayUpdateHandle v2rayUpdateHandle3 = new V2rayUpdateHandle(); + v2rayUpdateHandle3.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + var result = args.Msg; + if (Utils.IsNullOrEmpty(result)) + { + return; + } + txt.Text = result; + } + else + { + AppendText(false, args.Msg); + } + }; + v2rayUpdateHandle3.Error += (sender2, args) => + { + AppendText(true, args.GetException().Message); + }; + + v2rayUpdateHandle3.WebDownloadString(lstUrl[k]); + } + } + void AppendText(bool notify, string text) + { + labRoutingTips.Text = text; + } + } + + class ComboItem + { + public int ID { get; set; } + public string Text { get; set; } + } +} diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx new file mode 100644 index 00000000..7e395cbd --- /dev/null +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -0,0 +1,1869 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 355, 16 + + + 75, 23 + + + + 7 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + True + + + + NoControl + + + 468, 60 + + + 120, 16 + + + 32 + + + Turn on Sniffing + + + False + + + chksniffingEnabled2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 0 + + + True + + + NoControl + + + 468, 27 + + + 120, 16 + + + 31 + + + Turn on Sniffing + + + chksniffingEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 1 + + + 33, 192 + + + 402, 21 + + + 30 + + + txtremoteDNS + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 2 + + + True + + + 33, 168 + + + 281, 12 + + + 29 + + + Custom DNS (multiple, separated by commas (,)) + + + label14 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 3 + + + True + + + 15, 93 + + + 174, 16 + + + 20 + + + Turn on Mux Multiplexing + + + chkmuxEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 4 + + + True + + + 15, 63 + + + 120, 16 + + + 19 + + + listening port 2 + + + False + + + chkAllowIn2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 5 + + + True + + + 369, 62 + + + 84, 16 + + + 18 + + + Enable UDP + + + False + + + chkudpEnabled2 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 6 + + + socks + + + http + + + 257, 60 + + + 97, 20 + + + 17 + + + False + + + cmbprotocol2 + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 7 + + + True + + + 206, 64 + + + 53, 12 + + + 16 + + + protocol + + + False + + + label3 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 8 + + + 124, 60 + + + 78, 21 + + + 14 + + + False + + + txtlocalPort2 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 9 + + + False + + + socks + + + http + + + 257, 25 + + + 97, 20 + + + 12 + + + cmbprotocol + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 10 + + + True + + + 206, 29 + + + 53, 12 + + + 11 + + + protocol + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 11 + + + True + + + 369, 27 + + + 84, 16 + + + 10 + + + Enable UDP + + + chkudpEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 12 + + + True + + + 15, 124 + + + 126, 16 + + + 9 + + + Record local logs + + + chklogEnabled + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 13 + + + debug + + + info + + + warning + + + error + + + none + + + 257, 122 + + + 97, 20 + + + 6 + + + cmbloglevel + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 14 + + + True + + + 193, 126 + + + 59, 12 + + + 8 + + + Log level + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 15 + + + 124, 25 + + + 78, 21 + + + 3 + + + txtlocalPort + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 16 + + + True + + + 33, 29 + + + 89, 12 + + + 2 + + + Listening port + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox1 + + + 17 + + + Fill + + + 3, 3 + + + 624, 573 + + + 6 + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage1 + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 630, 579 + + + 0 + + + Core: basic settings + + + tabPage1 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 0 + + + Fill + + + 3, 3 + + + True + + + Vertical + + + 604, 414 + + + 0 + + + txtUseragent + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage3 + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 610, 420 + + + 0 + + + Proxy's Domain or IP + + + tabPage3 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl2 + + + 0 + + + Fill + + + 3, 3 + + + True + + + Vertical + + + 604, 414 + + + 1 + + + txtUserdirect + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage4 + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 610, 420 + + + 1 + + + Directly connected Domain or IP + + + tabPage4 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl2 + + + 1 + + + Fill + + + 3, 3 + + + True + + + Vertical + + + 604, 414 + + + 1 + + + txtUserblock + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage5 + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 610, 420 + + + 2 + + + Blocked Domain or IP + + + tabPage5 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl2 + + + 2 + + + Fill + + + 3, 124 + + + 618, 446 + + + 12 + + + tabControl2 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 0 + + + 356, 43 + + + 229, 23 + + + 18 + + + Set default custom routing rules + + + btnSetDefRountingRule + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 0 + + + AsIs + + + IPIfNonMatch + + + IPOnDemand + + + 123, 13 + + + 209, 20 + + + 16 + + + cmbdomainStrategy + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 1 + + + 5, 83 + + + 598, 16 + + + 13 + + + *Set the rules, separated by commas (,); support Domain (pure string / regular / subdomain) and IP + + + labRoutingTips + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 2 + + + True + + + NoControl + + + 13, 17 + + + 95, 12 + + + 17 + + + Domain strategy + + + label15 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 3 + + + True + + + NoControl + + + 13, 50 + + + 77, 12 + + + 15 + + + Routing mode + + + label12 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 4 + + + Global + + + Bypassing the LAN address + + + Bypass mainland address + + + Bypassing LAN and mainland address + + + 123, 46 + + + 209, 20 + + + 14 + + + cmbroutingMode + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel3 + + + 5 + + + Top + + + 3, 17 + + + 618, 107 + + + 19 + + + panel3 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + groupBox2 + + + 1 + + + Fill + + + 3, 3 + + + 624, 573 + + + 12 + + + groupBox2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 630, 579 + + + 1 + + + Core: Routing settings + + + tabPage2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 1 + + + True + + + 20, 143 + + + 84, 16 + + + 20 + + + congestion + + + chkKcpcongestion + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 0 + + + 345, 100 + + + 94, 21 + + + 15 + + + txtKcpwriteBufferSize + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 1 + + + True + + + 236, 104 + + + 95, 12 + + + 14 + + + writeBufferSize + + + label10 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 2 + + + 111, 100 + + + 94, 21 + + + 13 + + + txtKcpreadBufferSize + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 3 + + + True + + + 18, 104 + + + 89, 12 + + + 12 + + + readBufferSize + + + label11 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 4 + + + 345, 62 + + + 94, 21 + + + 11 + + + txtKcpdownlinkCapacity + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 5 + + + True + + + 236, 66 + + + 101, 12 + + + 10 + + + downlinkCapacity + + + label8 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 6 + + + 111, 62 + + + 94, 21 + + + 9 + + + txtKcpuplinkCapacity + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 7 + + + True + + + 18, 66 + + + 89, 12 + + + 8 + + + uplinkCapacity + + + label9 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 8 + + + 345, 24 + + + 94, 21 + + + 7 + + + txtKcptti + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 9 + + + True + + + 236, 28 + + + 23, 12 + + + 6 + + + tti + + + label7 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 10 + + + 111, 24 + + + 94, 21 + + + 5 + + + txtKcpmtu + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 11 + + + True + + + 18, 28 + + + 23, 12 + + + 4 + + + mtu + + + label6 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage6 + + + 12 + + + 4, 22 + + + 3, 3, 3, 3 + + + 630, 579 + + + 2 + + + Core: KCP settings + + + tabPage6 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 2 + + + 161, 82 + + + 58, 20 + + + 32 + + + cbFreshrate + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 0 + + + 516, 109 + + + 60, 21 + + + 31 + + + tbCacheDays + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 1 + + + True + + + NoControl + + + 30, 90 + + + 125, 12 + + + 30 + + + Statistics freshrate + + + lbFreshrate + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 2 + + + True + + + 30, 118 + + + 455, 12 + + + 30 + + + Cache days(between 0 to 30, 0 disable cache indivitual days statistic data) + + + lbCacheDays + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 3 + + + True + + + NoControl + + + 15, 60 + + + 558, 16 + + + 29 + + + Enable Statistics(Realtime net speed and traffic data amount. Need restart v2rayN client) + + + chkEnableStatistics + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 4 + + + True + + + 15, 38 + + + 204, 16 + + + 29 + + + Allow connections from the LAN + + + chkAllowLANConn + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 5 + + + 32, 205 + + + 544, 21 + + + 28 + + + txturlGFWList + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 6 + + + True + + + 30, 176 + + + 431, 12 + + + 27 + + + Custom GFWList address (please fill in the blank without customization) + + + label13 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 7 + + + True + + + 15, 16 + + + 132, 16 + + + 23 + + + Boot automatically + + + chkAutoRun + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage7 + + + 8 + + + 4, 22 + + + 3, 3, 3, 3 + + + 630, 579 + + + 3 + + + v2rayN settings + + + tabPage7 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 3 + + + Fill + + + 0, 10 + + + 638, 605 + + + 10 + + + tabControl1 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + 267, 16 + + + 75, 23 + + + 8 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + Bottom + + + 0, 615 + + + 638, 60 + + + 11 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top + + + 0, 0 + + + 638, 10 + + + 9 + + + panel1 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + 17, 17 + + + True + + + 6, 12 + + + 638, 675 + + + 4, 4, 4, 4 + + + Settings + + + configBindingSource + + + System.Windows.Forms.BindingSource, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + OptionSettingForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx new file mode 100644 index 00000000..cef4cd5a --- /dev/null +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -0,0 +1,300 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 取消(&C) + + + + 96, 16 + + + 开启流量探测 + + + 96, 16 + + + 开启流量探测 + + + 191, 12 + + + 自定义DNS(可多个,用逗号(,)隔开) + + + 开启Mux多路复用(默认开启) + + + 102, 16 + + + 本地监听端口2 + + + 66, 16 + + + 开启UDP + + + 29, 12 + + + 协议 + + + 29, 12 + + + 协议 + + + 66, 16 + + + 开启UDP + + + 156, 16 + + + 记录本地日志(默认关闭) + + + 53, 12 + + + 日志等级 + + + 77, 12 + + + 本地监听端口 + + + Core:基础设置 + + + 代理的Domain或IP + + + 直连的Domain或IP + + + 阻止的Domain或IP + + + + NoControl + + + 381, 43 + + + 201, 23 + + + 一键设置默认自定义路由规则 + + + 232, 20 + + + + True + + + 383, 12 + + + *设置的规则,用逗号(,)隔开;支持Domain(纯字符串/正则/子域名)和IP + + + 53, 12 + + + 域名策略 + + + 53, 12 + + + 路由模式 + + + 全局 + + + 绕过局域网地址 + + + 绕过大陆地址 + + + 绕过局域网及大陆地址 + + + 232, 20 + + + Core:路由设置 + + + Core:KCP设置 + + + 144, 16 + + + 允许来自局域网的连接 + + + 227, 12 + + + 自定义GFWList地址(不需自定义请填空白) + + + 180, 16 + + + 开机自动启动(可能会不成功) + + + v2rayN设置 + + + 确定(&O) + + + 参数设置 + + + 启用统计(实时网速显示和使用流量显示,需要重启v2rayN客户端) + + + 缓存天数(0-30, 0关闭缓存单独每天的数据使用情况) + + + 统计刷新频率 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.Designer.cs b/v2rayN/v2rayN/Forms/QRCodeControl.Designer.cs new file mode 100644 index 00000000..5d0a2624 --- /dev/null +++ b/v2rayN/v2rayN/Forms/QRCodeControl.Designer.cs @@ -0,0 +1,78 @@ +namespace v2rayN.Forms +{ + partial class QRCodeControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(QRCodeControl)); + this.txtUrl = new System.Windows.Forms.TextBox(); + this.picQRCode = new System.Windows.Forms.PictureBox(); + this.chkShow = new System.Windows.Forms.CheckBox(); + ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).BeginInit(); + this.SuspendLayout(); + // + // txtUrl + // + resources.ApplyResources(this.txtUrl, "txtUrl"); + this.txtUrl.Name = "txtUrl"; + this.txtUrl.ReadOnly = true; + // + // picQRCode + // + resources.ApplyResources(this.picQRCode, "picQRCode"); + this.picQRCode.Name = "picQRCode"; + this.picQRCode.TabStop = false; + // + // chkShow + // + resources.ApplyResources(this.chkShow, "chkShow"); + this.chkShow.Name = "chkShow"; + this.chkShow.UseVisualStyleBackColor = true; + this.chkShow.CheckedChanged += new System.EventHandler(this.chkShow_CheckedChanged); + // + // QRCodeControl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.picQRCode); + this.Controls.Add(this.txtUrl); + this.Controls.Add(this.chkShow); + this.Name = "QRCodeControl"; + this.Load += new System.EventHandler(this.QRCodeControl_Load); + ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox txtUrl; + private System.Windows.Forms.PictureBox picQRCode; + private System.Windows.Forms.CheckBox chkShow; + } +} diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.cs b/v2rayN/v2rayN/Forms/QRCodeControl.cs new file mode 100644 index 00000000..ea5e7fda --- /dev/null +++ b/v2rayN/v2rayN/Forms/QRCodeControl.cs @@ -0,0 +1,47 @@ +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class QRCodeControl : UserControl + { + public QRCodeControl() + { + InitializeComponent(); + } + private void QRCodeControl_Load(object sender, System.EventArgs e) + { + chkShow_CheckedChanged(null, null); + txtUrl.MouseUp += txtUrl_MouseUp; + } + + void txtUrl_MouseUp(object sender, MouseEventArgs e) + { + txtUrl.SelectAll(); + } + + public void showQRCode(int Index, Config config) + { + if (Index >= 0) + { + string url = ConfigHandler.GetVmessQRCode(config, Index); + if (Utils.IsNullOrEmpty(url)) + { + picQRCode.Image = null; + txtUrl.Text = string.Empty; + return; + } + picQRCode.Image = QRCodeHelper.GetQRCode(url); + txtUrl.Text = url; + } + } + + private void chkShow_CheckedChanged(object sender, System.EventArgs e) + { + picQRCode.Visible = + txtUrl.Visible = chkShow.Checked; + } + + } +} diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.resx b/v2rayN/v2rayN/Forms/QRCodeControl.resx new file mode 100644 index 00000000..ef0c4f04 --- /dev/null +++ b/v2rayN/v2rayN/Forms/QRCodeControl.resx @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + + 356, 441 + + + 0, 0 + + + + 0 + + + Show shared content + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 356, 16 + + + QRCodeControl + + + 356, 355 + + + 0, 371 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Bottom + + + 24 + + + Top + + + Fill + + + True + + + Zoom + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + $this + + + 0, 16 + + + $this + + + chkShow + + + $this + + + txtUrl + + + 2 + + + picQRCode + + + 356, 70 + + + 25 + + + 6, 12 + + + True + + + True + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/QRCodeControl.zh-Hans.resx new file mode 100644 index 00000000..991ed0d0 --- /dev/null +++ b/v2rayN/v2rayN/Forms/QRCodeControl.zh-Hans.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 显示分享内容 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/QRCodeForm.Designer.cs b/v2rayN/v2rayN/Forms/QRCodeForm.Designer.cs new file mode 100644 index 00000000..733adb47 --- /dev/null +++ b/v2rayN/v2rayN/Forms/QRCodeForm.Designer.cs @@ -0,0 +1,94 @@ +namespace v2rayN.Forms +{ + partial class QRCodeForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.picQRCode = new System.Windows.Forms.PictureBox(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.txtUrl = new System.Windows.Forms.TextBox(); + ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).BeginInit(); + this.groupBox1.SuspendLayout(); + this.SuspendLayout(); + // + // picQRCode + // + this.picQRCode.Dock = System.Windows.Forms.DockStyle.Fill; + this.picQRCode.Location = new System.Drawing.Point(0, 0); + this.picQRCode.Name = "picQRCode"; + this.picQRCode.Size = new System.Drawing.Size(482, 483); + this.picQRCode.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.picQRCode.TabIndex = 23; + this.picQRCode.TabStop = false; + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.txtUrl); + this.groupBox1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.groupBox1.Location = new System.Drawing.Point(0, 483); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(482, 90); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "URL"; + // + // txtUrl + // + this.txtUrl.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtUrl.Location = new System.Drawing.Point(3, 17); + this.txtUrl.Multiline = true; + this.txtUrl.Name = "txtUrl"; + this.txtUrl.ReadOnly = true; + this.txtUrl.Size = new System.Drawing.Size(476, 70); + this.txtUrl.TabIndex = 0; + // + // QRCodeForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(482, 573); + this.Controls.Add(this.picQRCode); + this.Controls.Add(this.groupBox1); + this.Name = "QRCodeForm"; + this.Text = "服务器配置二维码和URL"; + this.Load += new System.EventHandler(this.QRCodeForm_Load); + this.Shown += new System.EventHandler(this.QRCodeForm_Shown); + ((System.ComponentModel.ISupportInitialize)(this.picQRCode)).EndInit(); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox txtUrl; + private System.Windows.Forms.PictureBox picQRCode; + + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/QRCodeForm.cs b/v2rayN/v2rayN/Forms/QRCodeForm.cs new file mode 100644 index 00000000..d170b173 --- /dev/null +++ b/v2rayN/v2rayN/Forms/QRCodeForm.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class QRCodeForm : BaseForm + { + public int Index { get; set; } + + public QRCodeForm() + { + InitializeComponent(); + } + + private void QRCodeForm_Load(object sender, EventArgs e) + { + txtUrl.MouseUp += txtUrl_MouseUp; + } + + void txtUrl_MouseUp(object sender, MouseEventArgs e) + { + txtUrl.SelectAll(); + } + + private void QRCodeForm_Shown(object sender, EventArgs e) + { + if (Index >= 0) + { + VmessQRCode vmessQRCode = null; + if (ConfigHandler.GetVmessQRCode(config, Index, ref vmessQRCode) != 0) + { + return; + } + string url = Utils.ToJson(vmessQRCode); + url = Utils.Base64Encode(url); + url = string.Format("{0}{1}", Global.vmessProtocol, url); + picQRCode.Image = QRCodeHelper.GetQRCode(url); + txtUrl.Text = url; + } + } + + } +} diff --git a/v2rayN/v2rayN/Forms/QRCodeForm.resx b/v2rayN/v2rayN/Forms/QRCodeForm.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/v2rayN/v2rayN/Forms/QRCodeForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs new file mode 100644 index 00000000..30fcadf5 --- /dev/null +++ b/v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs @@ -0,0 +1,113 @@ +namespace v2rayN.Forms +{ + partial class SubSettingControl + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SubSettingControl)); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.chkEnabled = new System.Windows.Forms.CheckBox(); + this.btnRemove = new System.Windows.Forms.Button(); + this.txtUrl = new System.Windows.Forms.TextBox(); + this.txtRemarks = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.groupBox2.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox2 + // + resources.ApplyResources(this.groupBox2, "groupBox2"); + this.groupBox2.Controls.Add(this.chkEnabled); + this.groupBox2.Controls.Add(this.btnRemove); + this.groupBox2.Controls.Add(this.txtUrl); + this.groupBox2.Controls.Add(this.txtRemarks); + this.groupBox2.Controls.Add(this.label2); + this.groupBox2.Controls.Add(this.label3); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.TabStop = false; + // + // chkEnabled + // + resources.ApplyResources(this.chkEnabled, "chkEnabled"); + this.chkEnabled.Name = "chkEnabled"; + this.chkEnabled.UseVisualStyleBackColor = true; + this.chkEnabled.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // btnRemove + // + resources.ApplyResources(this.btnRemove, "btnRemove"); + this.btnRemove.Name = "btnRemove"; + this.btnRemove.UseVisualStyleBackColor = true; + this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click); + // + // txtUrl + // + resources.ApplyResources(this.txtUrl, "txtUrl"); + this.txtUrl.Name = "txtUrl"; + this.txtUrl.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // txtRemarks + // + resources.ApplyResources(this.txtRemarks, "txtRemarks"); + this.txtRemarks.Name = "txtRemarks"; + this.txtRemarks.Leave += new System.EventHandler(this.txtRemarks_Leave); + // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // + // SubSettingControl + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox2); + this.Name = "SubSettingControl"; + this.Load += new System.EventHandler(this.SubSettingControl_Load); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox txtUrl; + private System.Windows.Forms.TextBox txtRemarks; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button btnRemove; + private System.Windows.Forms.CheckBox chkEnabled; + } +} diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.cs b/v2rayN/v2rayN/Forms/SubSettingControl.cs new file mode 100644 index 00000000..a4ee2189 --- /dev/null +++ b/v2rayN/v2rayN/Forms/SubSettingControl.cs @@ -0,0 +1,62 @@ +using System; +using System.Windows.Forms; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public delegate void ChangeEventHandler(object sender, EventArgs e); + public partial class SubSettingControl : UserControl + { + public event ChangeEventHandler OnButtonClicked; + + + public SubItem subItem { get; set; } + + public SubSettingControl() + { + InitializeComponent(); + } + + private void SubSettingControl_Load(object sender, EventArgs e) + { + BindingSub(); + } + + private void BindingSub() + { + if (subItem != null) + { + txtRemarks.Text = subItem.remarks.ToString(); + txtUrl.Text = subItem.url.ToString(); + chkEnabled.Checked = subItem.enabled; + } + } + private void EndBindingSub() + { + if (subItem != null) + { + subItem.remarks = txtRemarks.Text.TrimEx(); + subItem.url = txtUrl.Text.TrimEx(); + subItem.enabled = chkEnabled.Checked; + } + } + private void txtRemarks_Leave(object sender, EventArgs e) + { + EndBindingSub(); + } + + private void btnRemove_Click(object sender, EventArgs e) + { + if (subItem != null) + { + subItem.remarks = string.Empty; + subItem.url = string.Empty; + } + + if (OnButtonClicked != null) + { + OnButtonClicked(sender, e); + } + } + } +} diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.resx b/v2rayN/v2rayN/Forms/SubSettingControl.resx new file mode 100644 index 00000000..af5f03e9 --- /dev/null +++ b/v2rayN/v2rayN/Forms/SubSettingControl.resx @@ -0,0 +1,330 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + NoControl + + + groupBox2 + + + + 60, 16 + + + txtUrl + + + &Remove + + + 484, 21 + + + + 24 + + + 432, 46 + + + SubSettingControl + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + groupBox2 + + + 83, 12 + + + groupBox2 + + + 6, 12 + + + label3 + + + 127, 21 + + + True + + + 0 + + + 12, 55 + + + 127, 55 + + + 10 + + + Bottom + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 2 + + + groupBox2 + + + 4 + + + 47, 12 + + + Subscription details + + + 0, 9 + + + Enable + + + chkEnabled + + + 3 + + + NoControl + + + Address (url) + + + 25 + + + 23 + + + groupBox2 + + + groupBox2 + + + 406, 23 + + + True + + + True + + + btnRemove + + + NoControl + + + label2 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 584, 110 + + + NoControl + + + 584, 119 + + + 11 + + + Remarks + + + 0 + + + 12, 25 + + + 75, 23 + + + groupBox2 + + + 265, 21 + + + 10 + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 1 + + + $this + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 0 + + + txtRemarks + + + 5 + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + zh-Hans + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx new file mode 100644 index 00000000..12e6dbd4 --- /dev/null +++ b/v2rayN/v2rayN/Forms/SubSettingControl.zh-Hans.resx @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + 48, 16 + + + 启用 + + + 移除 + + + 29, 12 + + + 备注 + + + 65, 12 + + + 地址 (url) + + + 订阅详情 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/SubSettingForm.Designer.cs new file mode 100644 index 00000000..489693c8 --- /dev/null +++ b/v2rayN/v2rayN/Forms/SubSettingForm.Designer.cs @@ -0,0 +1,97 @@ +namespace v2rayN.Forms +{ + partial class SubSettingForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SubSettingForm)); + this.btnClose = new System.Windows.Forms.Button(); + this.panCon = new System.Windows.Forms.Panel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.btnAdd = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // btnClose + // + this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; + resources.ApplyResources(this.btnClose, "btnClose"); + this.btnClose.Name = "btnClose"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // panCon + // + resources.ApplyResources(this.panCon, "panCon"); + this.panCon.Name = "panCon"; + // + // panel2 + // + this.panel2.Controls.Add(this.btnAdd); + this.panel2.Controls.Add(this.btnClose); + this.panel2.Controls.Add(this.btnOK); + resources.ApplyResources(this.panel2, "panel2"); + this.panel2.Name = "panel2"; + // + // btnAdd + // + resources.ApplyResources(this.btnAdd, "btnAdd"); + this.btnAdd.Name = "btnAdd"; + this.btnAdd.UseVisualStyleBackColor = true; + this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); + // + // btnOK + // + resources.ApplyResources(this.btnOK, "btnOK"); + this.btnOK.Name = "btnOK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // SubSettingForm + // + resources.ApplyResources(this, "$this"); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnClose; + this.Controls.Add(this.panCon); + this.Controls.Add(this.panel2); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Name = "SubSettingForm"; + this.Load += new System.EventHandler(this.SubSettingForm_Load); + this.panel2.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Button btnAdd; + private System.Windows.Forms.Panel panCon; + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.cs b/v2rayN/v2rayN/Forms/SubSettingForm.cs new file mode 100644 index 00000000..14b5fbf6 --- /dev/null +++ b/v2rayN/v2rayN/Forms/SubSettingForm.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using v2rayN.Handler; +using v2rayN.Mode; + +namespace v2rayN.Forms +{ + public partial class SubSettingForm : BaseForm + { + List lstControls = new List(); + + public SubSettingForm() + { + InitializeComponent(); + } + + private void SubSettingForm_Load(object sender, EventArgs e) + { + if (config.subItem == null) + { + config.subItem = new List(); + } + + RefreshSubsView(); + } + + /// + /// 刷新列表 + /// + private void RefreshSubsView() + { + panCon.Controls.Clear(); + lstControls.Clear(); + + for (int k = config.subItem.Count - 1; k >= 0; k--) + { + var item = config.subItem[k]; + if (Utils.IsNullOrEmpty(item.remarks) + && Utils.IsNullOrEmpty(item.url)) + { + if (!Utils.IsNullOrEmpty(item.id)) + { + ConfigHandler.RemoveServerViaSubid(ref config, item.id); + } + config.subItem.RemoveAt(k); + } + } + + for (int k = 0; k < config.subItem.Count; k++) + { + var item = config.subItem[k]; + SubSettingControl control = new SubSettingControl(); + control.OnButtonClicked += Control_OnButtonClicked; + control.subItem = item; + control.Dock = DockStyle.Top; + + panCon.Controls.Add(control); + panCon.Controls.SetChildIndex(control, 0); + + lstControls.Add(control); + } + } + + private void Control_OnButtonClicked(object sender, EventArgs e) + { + RefreshSubsView(); + } + + private void btnOK_Click(object sender, EventArgs e) + { + if (config.subItem.Count <= 0) + { + AddSub(); + } + + if (ConfigHandler.SaveSubItem(ref config) == 0) + { + this.DialogResult = DialogResult.OK; + } + else + { + UI.Show(UIRes.I18N("OperationFailed")); + } + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + + private void btnAdd_Click(object sender, EventArgs e) + { + AddSub(); + + RefreshSubsView(); + } + + + private void AddSub() + { + var subItem = new SubItem(); + subItem.id = string.Empty; + subItem.remarks = "remarks"; + subItem.url = "url"; + config.subItem.Add(subItem); + } + } +} diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.resx b/v2rayN/v2rayN/Forms/SubSettingForm.resx new file mode 100644 index 00000000..05d3db7b --- /dev/null +++ b/v2rayN/v2rayN/Forms/SubSettingForm.resx @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + NoControl + + + + 448, 17 + + + 75, 23 + + + + 4 + + + &Cancel + + + btnClose + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 1 + + + True + + + Fill + + + 0, 0 + + + 581, 569 + + + 10 + + + panCon + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + NoControl + + + 47, 17 + + + 75, 23 + + + 6 + + + &Add + + + btnAdd + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 0 + + + NoControl + + + 355, 17 + + + 75, 23 + + + 5 + + + &OK + + + btnOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + panel2 + + + 2 + + + Bottom + + + 0, 569 + + + 581, 60 + + + 7 + + + panel2 + + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + True + + + 6, 12 + + + 581, 629 + + + Subscription settings + + + SubSettingForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/SubSettingForm.zh-Hans.resx new file mode 100644 index 00000000..628dd5ab --- /dev/null +++ b/v2rayN/v2rayN/Forms/SubSettingForm.zh-Hans.resx @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 取消(&C) + + + 添加(&A) + + + 确定(&O) + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + + + 订阅设置 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs new file mode 100644 index 00000000..2027cc78 --- /dev/null +++ b/v2rayN/v2rayN/Global.cs @@ -0,0 +1,204 @@ + +namespace v2rayN +{ + class Global + { + #region 常量 + + /// + /// 更新链接 + /// + public const string UpdateUrl = @"https://github.com/2dust/v2rayN/releases"; + /// + /// 关于链接 + /// + public const string AboutUrl = @"https://github.com/2dust/v2rayN"; + + /// + /// SpeedTestUrl + /// + public const string SpeedTestUrl = @"http://speedtest-sfo2.digitalocean.com/10mb.test"; + public const string SpeedPingTestUrl = @"https://www.google.com/generate_204"; + + /// + /// CustomRoutingListUrl + /// + public const string CustomRoutingListUrl = @"https://raw.githubusercontent.com/2dust/v2rayCustomRoutingList/master/"; + + /// + /// PromotionUrl + /// + public const string PromotionUrl = @"https://1.2345345.xyz/ads.html"; + + /// + /// 本软件配置文件名 + /// + public const string ConfigFileName = "guiNConfig.json"; + + /// + /// v2ray配置文件名 + /// + public const string v2rayConfigFileName = "config.json"; + + /// + /// v2ray客户端配置样例文件名 + /// + public const string v2raySampleClient = "v2rayN.Sample.SampleClientConfig.txt"; + /// + /// v2ray服务端配置样例文件名 + /// + public const string v2raySampleServer = "v2rayN.Sample.SampleServerConfig.txt"; + /// + /// v2ray配置Httprequest文件名 + /// + public const string v2raySampleHttprequestFileName = "v2rayN.Sample.SampleHttprequest.txt"; + /// + /// v2ray配置Httpresponse文件名 + /// + public const string v2raySampleHttpresponseFileName = "v2rayN.Sample.SampleHttpresponse.txt"; + /// + /// 空白的pac文件 + /// + public const string BlankPacFileName = "v2rayN.Sample.BlankPac.txt"; + + + /// + /// 默认加密方式 + /// + public const string DefaultSecurity = "auto"; + + /// + /// 默认传输协议 + /// + public const string DefaultNetwork = "tcp"; + + /// + /// Tcp伪装http + /// + public const string TcpHeaderHttp = "http"; + + /// + /// None值 + /// + public const string None = "none"; + + /// + /// 代理 tag值 + /// + public const string agentTag = "proxy"; + + /// + /// 直连 tag值 + /// + public const string directTag = "direct"; + + /// + /// 阻止 tag值 + /// + public const string blockTag = "block"; + + /// + /// + /// + public const string StreamSecurity = "tls"; + + /// + /// vmess + /// + public const string vmessProtocol = "vmess://"; + /// + /// shadowsocks + /// + public const string ssProtocol = "ss://"; + /// + /// socks + /// + public const string socksProtocol = "socks://"; + /// + /// http + /// + public const string httpProtocol = "http://"; + /// + /// https + /// + public const string httpsProtocol = "https://"; + + /// + /// pac + /// + public const string pacFILE = "pac.txt"; + + /// + /// email + /// + public const string userEMail = "t@t.tt"; + + /// + /// MyRegPath + /// + public const string MyRegPath = "Software\\v2rayNGUI"; + + /// + /// Language + /// + public const string MyRegKeyLanguage = "CurrentLanguage"; + /// + /// Icon + /// + public const string CustomIconName = "v2rayN.ico"; + + + public const string InboundAPITagName = "api"; + public const string InboundProxyTagName = "proxy"; + public const string Loopback = "127.0.0.1"; + public const string InboundAPIProtocal = "dokodemo-door"; + + public enum StatisticsFreshRate + { + quick = 1000, + medium = 2000, + slow = 3000 + } + public const string StatisticLogDirectory = "Statistics"; + public const string StatisticLogOverall = "overall.txt"; + + #endregion + + #region 全局变量 + + /// + /// 是否需要重启服务V2ray + /// + public static bool reloadV2ray { get; set; } + + /// + /// 是否开启全局代理(http) + /// + public static bool sysAgent { get; set; } + + /// + /// socks端口号 + /// + public static int socksPort { get; set; } + + /// + /// 全局代理端口(http) + /// + public static int sysAgentPort { get; set; } + + /// + /// PAC监听端口号 + /// + public static int pacPort { get; set; } + + /// + /// + /// + public static int statePort { get; set; } + + #endregion + + + + } +} diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs new file mode 100644 index 00000000..ba87e466 --- /dev/null +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -0,0 +1,853 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using v2rayN.Mode; + +namespace v2rayN.Handler +{ + /// + /// 本软件配置文件处理类 + /// + class ConfigHandler + { + private static string configRes = Global.ConfigFileName; + + /// + /// 载入配置文件 + /// + /// + /// + public static int LoadConfig(ref Config config) + { + //载入配置文件 + string result = Utils.LoadResource(Utils.GetPath(configRes)); + if (!Utils.IsNullOrEmpty(result)) + { + //转成Json + config = Utils.FromJson(result); + } + if (config == null) + { + config = new Config(); + config.index = -1; + config.logEnabled = false; + config.loglevel = "warning"; + config.vmess = new List(); + + //Mux + config.muxEnabled = true; + + ////默认监听端口 + //config.pacPort = 8888; + + // 默认缓存七天 + config.CacheDays = 7; + + // 默认不开启统计 + config.enableStatistics = false; + + // 默认中等刷新率 + config.statisticsFreshRate = (int)Global.StatisticsFreshRate.medium; + } + + //本地监听 + if (config.inbound == null) + { + config.inbound = new List(); + InItem inItem = new InItem(); + inItem.protocol = "socks"; + inItem.localPort = 10808; + inItem.udpEnabled = true; + inItem.sniffingEnabled = true; + + config.inbound.Add(inItem); + + //inItem = new InItem(); + //inItem.protocol = "http"; + //inItem.localPort = 1081; + //inItem.udpEnabled = true; + + //config.inbound.Add(inItem); + } + else + { + //http协议不由core提供,只保留socks + if (config.inbound.Count > 0) + { + config.inbound[0].protocol = "socks"; + } + } + //路由规则 + if (Utils.IsNullOrEmpty(config.domainStrategy)) + { + config.domainStrategy = "IPIfNonMatch"; + } + if (Utils.IsNullOrEmpty(config.routingMode)) + { + config.routingMode = "0"; + } + if (config.useragent == null) + { + config.useragent = new List(); + } + if (config.userdirect == null) + { + config.userdirect = new List(); + } + if (config.userblock == null) + { + config.userblock = new List(); + } + //kcp + if (config.kcpItem == null) + { + config.kcpItem = new KcpItem(); + config.kcpItem.mtu = 1350; + config.kcpItem.tti = 50; + config.kcpItem.uplinkCapacity = 12; + config.kcpItem.downlinkCapacity = 100; + config.kcpItem.readBufferSize = 2; + config.kcpItem.writeBufferSize = 2; + config.kcpItem.congestion = false; + } + if (config.uiItem == null) + { + config.uiItem = new UIItem(); + } + //// 如果是用户升级,首次会有端口号为0的情况,不可用,这里处理 + //if (config.pacPort == 0) + //{ + // config.pacPort = 8888; + //} + + if (config.subItem == null) + { + config.subItem = new List(); + } + + if (config == null + || config.index < 0 + || config.vmess.Count <= 0 + || config.index > config.vmess.Count - 1 + ) + { + Global.reloadV2ray = false; + } + else + { + Global.reloadV2ray = true; + + //版本升级 + for (int i = 0; i < config.vmess.Count; i++) + { + VmessItem vmessItem = config.vmess[i]; + UpgradeServerVersion(ref vmessItem); + } + } + + return 0; + } + + /// + /// 添加服务器或编辑 + /// + /// + /// + /// + /// + public static int AddServer(ref Config config, VmessItem vmessItem, int index) + { + vmessItem.configVersion = 2; + vmessItem.configType = (int)EConfigType.Vmess; + + vmessItem.address = vmessItem.address.TrimEx(); + vmessItem.id = vmessItem.id.TrimEx(); + vmessItem.security = vmessItem.security.TrimEx(); + vmessItem.network = vmessItem.network.TrimEx(); + vmessItem.headerType = vmessItem.headerType.TrimEx(); + vmessItem.requestHost = vmessItem.requestHost.TrimEx(); + vmessItem.path = vmessItem.path.TrimEx(); + vmessItem.streamSecurity = vmessItem.streamSecurity.TrimEx(); + + if (index >= 0) + { + //修改 + config.vmess[index] = vmessItem; + if (config.index.Equals(index)) + { + Global.reloadV2ray = true; + } + } + else + { + //添加 + config.vmess.Add(vmessItem); + if (config.vmess.Count == 1) + { + config.index = 0; + Global.reloadV2ray = true; + } + } + + ToJsonFile(config); + + return 0; + } + + /// + /// 移除服务器 + /// + /// + /// + /// + public static int RemoveServer(ref Config config, int index) + { + if (index < 0 || index > config.vmess.Count - 1) + { + return -1; + } + + //删除 + config.vmess.RemoveAt(index); + + + //移除的是活动的 + if (config.index.Equals(index)) + { + if (config.vmess.Count > 0) + { + config.index = 0; + } + else + { + config.index = -1; + } + Global.reloadV2ray = true; + } + else if (index < config.index)//移除活动之前的 + { + config.index--; + Global.reloadV2ray = true; + } + + ToJsonFile(config); + + return 0; + } + + /// + /// 复制服务器 + /// + /// + /// + /// + public static int CopyServer(ref Config config, int index) + { + if (index < 0 || index > config.vmess.Count - 1) + { + return -1; + } + + VmessItem vmessItem = new VmessItem(); + vmessItem.configVersion = config.vmess[index].configVersion; + vmessItem.configType = config.vmess[index].configType; + vmessItem.address = config.vmess[index].address; + vmessItem.port = config.vmess[index].port; + vmessItem.id = config.vmess[index].id; + vmessItem.alterId = config.vmess[index].alterId; + vmessItem.security = config.vmess[index].security; + vmessItem.network = config.vmess[index].network; + vmessItem.headerType = config.vmess[index].headerType; + vmessItem.requestHost = config.vmess[index].requestHost; + vmessItem.path = config.vmess[index].path; + vmessItem.streamSecurity = config.vmess[index].streamSecurity; + vmessItem.remarks = string.Format("{0}-clone", config.vmess[index].remarks); + + config.vmess.Add(vmessItem); + + ToJsonFile(config); + + return 0; + } + + /// + /// 设置活动服务器 + /// + /// + /// + /// + public static int SetDefaultServer(ref Config config, int index) + { + if (index < 0 || index > config.vmess.Count - 1) + { + return -1; + } + + ////和现在相同 + //if (config.index.Equals(index)) + //{ + // return -1; + //} + config.index = index; + Global.reloadV2ray = true; + + ToJsonFile(config); + + return 0; + } + + /// + /// 保参数 + /// + /// + /// + public static int SaveConfig(ref Config config) + { + Global.reloadV2ray = true; + + ToJsonFile(config); + + return 0; + } + + /// + /// 存储文件 + /// + /// + public static void ToJsonFile(Config config) + { + Utils.ToJsonFile(config, Utils.GetPath(configRes)); + } + + /// + /// 取得服务器QRCode配置 + /// + /// + /// + /// + public static string GetVmessQRCode(Config config, int index) + { + try + { + string url = string.Empty; + + VmessItem vmessItem = config.vmess[index]; + if (vmessItem.configType == (int)EConfigType.Vmess) + { + VmessQRCode vmessQRCode = new VmessQRCode(); + vmessQRCode.v = vmessItem.configVersion.ToString(); + vmessQRCode.ps = vmessItem.remarks.TrimEx(); //备注也许很长 ; + vmessQRCode.add = vmessItem.address; + vmessQRCode.port = vmessItem.port.ToString(); + vmessQRCode.id = vmessItem.id; + vmessQRCode.aid = vmessItem.alterId.ToString(); + vmessQRCode.net = vmessItem.network; + vmessQRCode.type = vmessItem.headerType; + vmessQRCode.host = vmessItem.requestHost; + vmessQRCode.path = vmessItem.path; + vmessQRCode.tls = vmessItem.streamSecurity; + + url = Utils.ToJson(vmessQRCode); + url = Utils.Base64Encode(url); + url = string.Format("{0}{1}", Global.vmessProtocol, url); + + } + else if (vmessItem.configType == (int)EConfigType.Shadowsocks) + { + var remark = string.Empty; + if (!Utils.IsNullOrEmpty(vmessItem.remarks)) + { + remark = "#" + WebUtility.UrlEncode(vmessItem.remarks); + } + url = string.Format("{0}:{1}@{2}:{3}", + vmessItem.security, + vmessItem.id, + vmessItem.address, + vmessItem.port); + url = Utils.Base64Encode(url); + url = string.Format("{0}{1}{2}", Global.ssProtocol, url, remark); + } + else if (vmessItem.configType == (int)EConfigType.Socks) + { + var remark = string.Empty; + if (!Utils.IsNullOrEmpty(vmessItem.remarks)) + { + remark = "#" + WebUtility.UrlEncode(vmessItem.remarks); + } + url = string.Format("{0}:{1}@{2}:{3}", + vmessItem.security, + vmessItem.id, + vmessItem.address, + vmessItem.port); + url = Utils.Base64Encode(url); + url = string.Format("{0}{1}{2}", Global.socksProtocol, url, remark); + } + else + { + } + return url; + } + catch + { + return ""; + } + } + + /// + /// 移动服务器 + /// + /// + /// + /// + /// + public static int MoveServer(ref Config config, int index, EMove eMove) + { + int count = config.vmess.Count; + if (index < 0 || index > config.vmess.Count - 1) + { + return -1; + } + switch (eMove) + { + case EMove.Top: + { + if (index == 0) + { + return 0; + } + VmessItem vmess = Utils.DeepCopy(config.vmess[index]); + config.vmess.RemoveAt(index); + config.vmess.Insert(0, vmess); + if (index < config.index) + { + // + } + else if (config.index == index) + { + config.index = 0; + } + else + { + config.index++; + } + break; + } + case EMove.Up: + { + if (index == 0) + { + return 0; + } + VmessItem vmess = Utils.DeepCopy(config.vmess[index]); + config.vmess.RemoveAt(index); + config.vmess.Insert(index - 1, vmess); + if (index == config.index + 1) + { + config.index++; + } + else if (config.index == index) + { + config.index--; + } + break; + } + + case EMove.Down: + { + if (index == count - 1) + { + return 0; + } + VmessItem vmess = Utils.DeepCopy(config.vmess[index]); + config.vmess.RemoveAt(index); + config.vmess.Insert(index + 1, vmess); + if (index == config.index - 1) + { + config.index--; + } + else if (config.index == index) + { + config.index++; + } + break; + } + case EMove.Bottom: + { + if (index == count - 1) + { + return 0; + } + VmessItem vmess = Utils.DeepCopy(config.vmess[index]); + config.vmess.RemoveAt(index); + config.vmess.Add(vmess); + if (index < config.index) + { + config.index--; + } + else if (config.index == index) + { + config.index = count - 1; + } + else + { + // + } + break; + } + + } + Global.reloadV2ray = true; + + ToJsonFile(config); + + return 0; + } + + /// + /// 添加自定义服务器 + /// + /// + /// + /// + public static int AddCustomServer(ref Config config, string fileName) + { + string newFileName = string.Empty; + newFileName = string.Format("{0}.json", Utils.GetGUID()); + newFileName = Path.Combine(Utils.GetTempPath(), newFileName); + + try + { + File.Copy(fileName, newFileName); + } + catch + { + return -1; + } + + VmessItem vmessItem = new VmessItem(); + vmessItem.address = newFileName; + vmessItem.configType = (int)EConfigType.Custom; + vmessItem.remarks = string.Format("import custom@{0}", DateTime.Now.ToShortDateString()); + + config.vmess.Add(vmessItem); + if (config.vmess.Count == 1) + { + config.index = 0; + Global.reloadV2ray = true; + } + + ToJsonFile(config); + + return 0; + } + + /// + /// 添加服务器或编辑 + /// + /// + /// + /// + /// + public static int EditCustomServer(ref Config config, VmessItem vmessItem, int index) + { + //修改 + config.vmess[index] = vmessItem; + if (config.index.Equals(index)) + { + Global.reloadV2ray = true; + } + + ToJsonFile(config); + + return 0; + } + + /// + /// 添加服务器或编辑 + /// + /// + /// + /// + /// + public static int AddShadowsocksServer(ref Config config, VmessItem vmessItem, int index) + { + vmessItem.configVersion = 2; + vmessItem.configType = (int)EConfigType.Shadowsocks; + + vmessItem.address = vmessItem.address.TrimEx(); + vmessItem.id = vmessItem.id.TrimEx(); + vmessItem.security = vmessItem.security.TrimEx(); + + if (index >= 0) + { + //修改 + config.vmess[index] = vmessItem; + if (config.index.Equals(index)) + { + Global.reloadV2ray = true; + } + } + else + { + //添加 + config.vmess.Add(vmessItem); + if (config.vmess.Count == 1) + { + config.index = 0; + Global.reloadV2ray = true; + } + } + + ToJsonFile(config); + + return 0; + } + + /// + /// 添加服务器或编辑 + /// + /// + /// + /// + /// + public static int AddSocksServer(ref Config config, VmessItem vmessItem, int index) + { + vmessItem.configVersion = 2; + vmessItem.configType = (int)EConfigType.Socks; + + vmessItem.address = vmessItem.address.TrimEx(); + + if (index >= 0) + { + //修改 + config.vmess[index] = vmessItem; + if (config.index.Equals(index)) + { + Global.reloadV2ray = true; + } + } + else + { + //添加 + config.vmess.Add(vmessItem); + if (config.vmess.Count == 1) + { + config.index = 0; + Global.reloadV2ray = true; + } + } + + ToJsonFile(config); + + return 0; + } + + /// + /// 配置文件版本升级 + /// + /// + /// + public static int UpgradeServerVersion(ref VmessItem vmessItem) + { + try + { + if (vmessItem == null + || vmessItem.configVersion == 2) + { + return 0; + } + if (vmessItem.configType == (int)EConfigType.Vmess) + { + string path = ""; + string host = ""; + string[] arrParameter; + switch (vmessItem.network) + { + case "kcp": + break; + case "ws": + //*ws(path+host),它们中间分号(;)隔开 + arrParameter = vmessItem.requestHost.Replace(" ", "").Split(';'); + if (arrParameter.Length > 0) + { + path = arrParameter[0]; + } + if (arrParameter.Length > 1) + { + path = arrParameter[0]; + host = arrParameter[1]; + } + vmessItem.path = path; + vmessItem.requestHost = host; + break; + case "h2": + //*h2 path + arrParameter = vmessItem.requestHost.Replace(" ", "").Split(';'); + if (arrParameter.Length > 0) + { + path = arrParameter[0]; + } + if (arrParameter.Length > 1) + { + path = arrParameter[0]; + host = arrParameter[1]; + } + vmessItem.path = path; + vmessItem.requestHost = host; + break; + default: + break; + } + } + vmessItem.configVersion = 2; + } + catch + { + } + return 0; + } + + /// + /// 批量添加服务器 + /// + /// + /// + /// + /// + public static int AddBatchServers(ref Config config, string clipboardData, string subid = "") + { + if (Utils.IsNullOrEmpty(clipboardData)) + { + return -1; + } + //if (clipboardData.IndexOf("vmess") >= 0 && clipboardData.IndexOf("vmess") == clipboardData.LastIndexOf("vmess")) + //{ + // clipboardData = clipboardData.Replace("\r\n", "").Replace("\n", ""); + //} + int countServers = 0; + + //string[] arrData = clipboardData.Split(new string[] { "\r\n" }, StringSplitOptions.None); + string[] arrData = clipboardData.Split(Environment.NewLine.ToCharArray()); + foreach (string str in arrData) + { + string msg; + //maybe sub + if (str.StartsWith(Global.httpsProtocol) || str.StartsWith(Global.httpProtocol)) + { + if (AddSubItem(ref config, str) == 0) + { + countServers++; + } + continue; + } + VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(str, out msg); + if (vmessItem == null) + { + continue; + } + vmessItem.subid = subid; + if (vmessItem.configType == (int)EConfigType.Vmess) + { + if (AddServer(ref config, vmessItem, -1) == 0) + { + countServers++; + } + } + else if (vmessItem.configType == (int)EConfigType.Shadowsocks) + { + if (AddShadowsocksServer(ref config, vmessItem, -1) == 0) + { + countServers++; + } + } + else if (vmessItem.configType == (int)EConfigType.Socks) + { + if (AddSocksServer(ref config, vmessItem, -1) == 0) + { + countServers++; + } + } + } + if (countServers > 0) + { + return 0; + } + return -1; + } + + /// + /// add sub + /// + /// + /// + /// + public static int AddSubItem(ref Config config, string url) + { + //already exists + foreach (var sub in config.subItem) + { + if (url == sub.url) + { + return 0; + } + } + + var subItem = new SubItem(); + subItem.id = string.Empty; + subItem.remarks = "import sub"; + subItem.url = url; + config.subItem.Add(subItem); + + return SaveSubItem(ref config); + } + + /// + /// save sub + /// + /// + /// + public static int SaveSubItem(ref Config config) + { + if (config.subItem == null || config.subItem.Count <= 0) + { + return -1; + } + + foreach (SubItem sub in config.subItem) + { + if (Utils.IsNullOrEmpty(sub.id)) + { + sub.id = Utils.GetGUID(); + } + } + + ToJsonFile(config); + return 0; + } + + /// + /// 移除服务器 + /// + /// + /// + /// + public static int RemoveServerViaSubid(ref Config config, string subid) + { + if (Utils.IsNullOrEmpty(subid) || config.vmess.Count <= 0) + { + return -1; + } + for (int k = config.vmess.Count - 1; k >= 0; k--) + { + if (config.vmess[k].subid.Equals(subid)) + { + config.vmess.RemoveAt(k); + } + } + + ToJsonFile(config); + return 0; + } + } +} diff --git a/v2rayN/v2rayN/Handler/ProxySetting.cs b/v2rayN/v2rayN/Handler/ProxySetting.cs new file mode 100644 index 00000000..ec43bce1 --- /dev/null +++ b/v2rayN/v2rayN/Handler/ProxySetting.cs @@ -0,0 +1,190 @@ +using System; +using Microsoft.Win32; +using System.Runtime.InteropServices; + +namespace v2rayN.Handler +{ + /// + /// 设置系统代理类 + /// + class ProxySetting + { + public static bool UnsetProxy() + { + return SetProxy(null, null); + } + public static bool SetProxy(string strProxy) + { + return SetProxy(strProxy, null); + } + + public static bool SetProxy(string strProxy, string exceptions) + { + InternetPerConnOptionList list = new InternetPerConnOptionList(); + + int optionCount = string.IsNullOrEmpty(strProxy) ? 1 : (string.IsNullOrEmpty(exceptions) ? 2 : 3); + InternetConnectionOption[] options = new InternetConnectionOption[optionCount]; + // USE a proxy server ... + options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; + options[0].m_Value.m_Int = (int)((optionCount < 2) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY)); + // use THIS proxy server + if (optionCount > 1) + { + options[1].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; + options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(strProxy); + // except for these addresses ... + if (optionCount > 2) + { + options[2].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS; + options[2].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(exceptions); + } + } + + // default stuff + list.dwSize = Marshal.SizeOf(list); + list.szConnection = IntPtr.Zero; + list.dwOptionCount = options.Length; + list.dwOptionError = 0; + + + int optSize = Marshal.SizeOf(typeof(InternetConnectionOption)); + // make a pointer out of all that ... + IntPtr optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length); + // copy the array over into that spot in memory ... + for (int i = 0; i < options.Length; ++i) + { + IntPtr opt = new IntPtr(optionsPtr.ToInt32() + (i * optSize)); + Marshal.StructureToPtr(options[i], opt, false); + } + + list.options = optionsPtr; + + // and then make a pointer out of the whole list + IntPtr ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize); + Marshal.StructureToPtr(list, ipcoListPtr, false); + + // and finally, call the API method! + int returnvalue = NativeMethods.InternetSetOption(IntPtr.Zero, + InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, + ipcoListPtr, list.dwSize) ? -1 : 0; + if (returnvalue == 0) + { // get the error codes, they might be helpful + returnvalue = Marshal.GetLastWin32Error(); + } + // FREE the data ASAP + Marshal.FreeCoTaskMem(optionsPtr); + Marshal.FreeCoTaskMem(ipcoListPtr); + if (returnvalue > 0) + { // throw the error codes, they might be helpful + //throw new Win32Exception(Marshal.GetLastWin32Error()); + } + + return (returnvalue < 0); + } + + + #region WinInet structures + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct InternetPerConnOptionList + { + public int dwSize; // size of the INTERNET_PER_CONN_OPTION_LIST struct + public IntPtr szConnection; // connection name to set/query options + public int dwOptionCount; // number of options to set/query + public int dwOptionError; // on error, which option failed + //[MarshalAs(UnmanagedType.)] + public IntPtr options; + }; + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct InternetConnectionOption + { + static readonly int Size; + public PerConnOption m_Option; + public InternetConnectionOptionValue m_Value; + static InternetConnectionOption() + { + InternetConnectionOption.Size = Marshal.SizeOf(typeof(InternetConnectionOption)); + } + + // Nested Types + [StructLayout(LayoutKind.Explicit)] + public struct InternetConnectionOptionValue + { + // Fields + [FieldOffset(0)] + public System.Runtime.InteropServices.ComTypes.FILETIME m_FileTime; + [FieldOffset(0)] + public int m_Int; + [FieldOffset(0)] + public IntPtr m_StringPtr; + } + } + #endregion + + #region WinInet enums + // + // options manifests for Internet{Query|Set}Option + // + public enum InternetOption : uint + { + INTERNET_OPTION_PER_CONNECTION_OPTION = 75 + } + + // + // Options used in INTERNET_PER_CONN_OPTON struct + // + public enum PerConnOption + { + INTERNET_PER_CONN_FLAGS = 1, // Sets or retrieves the connection type. The Value member will contain one or more of the values from PerConnFlags + INTERNET_PER_CONN_PROXY_SERVER = 2, // Sets or retrieves a string containing the proxy servers. + INTERNET_PER_CONN_PROXY_BYPASS = 3, // Sets or retrieves a string containing the URLs that do not use the proxy server. + INTERNET_PER_CONN_AUTOCONFIG_URL = 4//, // Sets or retrieves a string containing the URL to the automatic configuration script. + + } + + // + // PER_CONN_FLAGS + // + [Flags] + public enum PerConnFlags + { + PROXY_TYPE_DIRECT = 0x00000001, // direct to net + PROXY_TYPE_PROXY = 0x00000002, // via named proxy + PROXY_TYPE_AUTO_PROXY_URL = 0x00000004, // autoproxy URL + PROXY_TYPE_AUTO_DETECT = 0x00000008 // use autoproxy detection + } + #endregion + + internal static class NativeMethods + { + [DllImport("WinInet.dll", SetLastError = true, CharSet = CharSet.Auto)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool InternetSetOption(IntPtr hInternet, InternetOption dwOption, IntPtr lpBuffer, int dwBufferLength); + } + + //判断是否使用代理 + public static bool UsedProxy() + { + RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true); + if (rk.GetValue("ProxyEnable").ToString() == "1") + { + rk.Close(); + return true; + } + else + { + rk.Close(); + return false; + } + } + //获得代理的IP和端口 + public static string GetProxyProxyServer() + { + RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true); + string ProxyServer = rk.GetValue("ProxyServer").ToString(); + rk.Close(); + return ProxyServer; + + } + } +} diff --git a/v2rayN/v2rayN/Handler/QRCodeHelper.cs b/v2rayN/v2rayN/Handler/QRCodeHelper.cs new file mode 100644 index 00000000..e5433dec --- /dev/null +++ b/v2rayN/v2rayN/Handler/QRCodeHelper.cs @@ -0,0 +1,41 @@ +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using ZXing; +using ZXing.QrCode; + +namespace v2rayN.Handler +{ + /// + /// 含有QR码的描述类和包装编码和渲染 + /// + public class QRCodeHelper + { + public static Image GetQRCode(string strContent) + { + Image img = null; + try + { + QrCodeEncodingOptions options = new QrCodeEncodingOptions(); + options.CharacterSet = "UTF-8"; + options.DisableECI = true; // Extended Channel Interpretation (ECI) 主要用于特殊的字符集。并不是所有的扫描器都支持这种编码。 + options.ErrorCorrection = ZXing.QrCode.Internal.ErrorCorrectionLevel.M; // 纠错级别 + options.Width = 500; + options.Height = 500; + options.Margin = 1; + // options.Hints,更多属性,也可以在这里添加。 + + BarcodeWriter writer = new BarcodeWriter(); + writer.Format = BarcodeFormat.QR_CODE; + writer.Options = options; + Bitmap bmp = writer.Write(strContent); + img = (Image)bmp; + return img; + } + catch + { + return img; + } + } + } +} diff --git a/v2rayN/v2rayN/Handler/RoutingRuleHandler.cs b/v2rayN/v2rayN/Handler/RoutingRuleHandler.cs new file mode 100644 index 00000000..57d4f564 --- /dev/null +++ b/v2rayN/v2rayN/Handler/RoutingRuleHandler.cs @@ -0,0 +1,53 @@ +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace v2rayN.Handler +{ + /// + /// 路由规则文件处理类 + /// + class RoutingRuleHandler + { + /// + /// Parse Pac to v2ray rule + /// + /// + /// + public static List ParsePac(string filePath) + { + string result = Utils.LoadResource(filePath); + if (Utils.IsNullOrEmpty(result)) + { + return null; + } + + //取得rule + string pattern = @"(?is)(?<=\[)(.*)(?=\])"; + Regex rgx = new Regex(pattern); + result = rgx.Match(result).Value; + int index = result.IndexOf("];"); + result = result.Substring(0, index); + if (Utils.IsNullOrEmpty(result)) + { + return null; + } + + string[] arrPac = result.Split(','); + List lstPac = new List(); + foreach (string str in arrPac) + { + //处理有效值 + if (Utils.IsNullOrEmpty(str) + || str.Length <= 3) + { + continue; + } + string value = str.Replace("\",", "").Replace("\"", "").Replace(",", "").Replace("\r\n", "").Replace(" ", ""); + lstPac.Add(value); + } + + return lstPac; + } + + } +} diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs new file mode 100644 index 00000000..f96dd00d --- /dev/null +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -0,0 +1,305 @@ +using Grpc.Core; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using v2rayN.Mode; + +namespace v2rayN.Handler +{ + class SpeedtestHandler + { + private V2rayUpdateHandle v2rayUpdateHandle2; + private Config _config; + private V2rayHandler _v2rayHandler; + private List _selecteds; + private Thread _workThread; + Action _updateFunc; + + private int testCounter = 0; + private int ItemIndex + { + get + { + return _selecteds[testCounter - 1]; + } + } + + public SpeedtestHandler(ref Config config, ref V2rayHandler v2rayHandler, List selecteds, string actionType, Action update) + { + _config = config; + _v2rayHandler = v2rayHandler; + _selecteds = selecteds; + _updateFunc = update; + + if (actionType == "ping") + { + _workThread = new Thread(new ThreadStart(RunPing)); + _workThread.Start(); + } + if (actionType == "tcping") + { + _workThread = new Thread(new ThreadStart(RunTcping)); + _workThread.Start(); + } + else if (actionType == "realping") + { + _workThread = new Thread(new ThreadStart(RunRealPing)); + _workThread.Start(); + } + else if (actionType == "speedtest") + { + RunSpeedTest(); + } + } + + public void Close() + { + try + { + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + public void RunPing() + { + try + { + for (int k = 0; k < _selecteds.Count; k++) + { + int index = _selecteds[k]; + if (_config.vmess[index].configType == (int)EConfigType.Custom) + { + continue; + } + try + { + long time = Utils.Ping(_config.vmess[index].address); + _updateFunc(index, string.Format("{0}ms", time)); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + Thread.Sleep(1); + + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + public void RunTcping() + { + try + { + for (int k = 0; k < _selecteds.Count; k++) + { + int index = _selecteds[k]; + if (_config.vmess[index].configType == (int)EConfigType.Custom) + { + continue; + } + try + { + var time = GetTcpingTime(_config.vmess[index].address, _config.vmess[index].port); + _updateFunc(index, string.Format("{0}ms", time)); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + Thread.Sleep(1); + + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + public void RunRealPing() + { + try + { + for (int k = 0; k < _selecteds.Count; k++) + { + int index = _selecteds[k]; + if (_config.vmess[index].configType == (int)EConfigType.Custom) + { + continue; + } + try + { + if (ConfigHandler.SetDefaultServer(ref _config, index) == 0) + { + _v2rayHandler.LoadV2ray(_config); + } + else + { + return; + } + Thread.Sleep(1000 * 5); + + int responseTime = -1; + var status = GetRealPingTime(Global.SpeedPingTestUrl, out responseTime); + if (!Utils.IsNullOrEmpty(status)) + { + _updateFunc(index, string.Format("{0}", status)); + } + else + { + _updateFunc(index, string.Format("{0}ms", responseTime)); + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + Thread.Sleep(1); + + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + private void RunSpeedTest() + { + if (_config.vmess.Count <= 0) + { + return; + } + + string url = Global.SpeedTestUrl; + testCounter = 0; + if (v2rayUpdateHandle2 == null) + { + v2rayUpdateHandle2 = new V2rayUpdateHandle(); + v2rayUpdateHandle2.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + _updateFunc(ItemIndex, args.Msg); + if (ServerSpeedTestSub(testCounter, url) != 0) + { + return; + } + } + else + { + _updateFunc(ItemIndex, args.Msg); + } + }; + v2rayUpdateHandle2.Error += (sender2, args) => + { + _updateFunc(ItemIndex, args.GetException().Message); + if (ServerSpeedTestSub(testCounter, url) != 0) + { + return; + } + }; + } + if (ServerSpeedTestSub(testCounter, url) != 0) + { + return; + } + } + + private int ServerSpeedTestSub(int index, string url) + { + if (index >= _selecteds.Count) + { + return -1; + } + + if (ConfigHandler.SetDefaultServer(ref _config, _selecteds[index]) == 0) + { + _v2rayHandler.LoadV2ray(_config); + + testCounter++; + + v2rayUpdateHandle2.DownloadFileAsync(_config, url); + + return 0; + } + else + { + return -1; + } + } + + private int GetTcpingTime(string url, int port) + { + var responseTime = -1; + + try + { + IPHostEntry ipHostInfo = System.Net.Dns.Resolve(url); + IPAddress ipAddress = ipHostInfo.AddressList[0]; + + var timer = new Stopwatch(); + timer.Start(); + + Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + clientSocket.Connect(new IPEndPoint(ipAddress, port)); + timer.Stop(); + responseTime = timer.Elapsed.Milliseconds; + clientSocket.Close(); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + return responseTime; + } + + private string GetRealPingTime(string url, out int responseTime) + { + string msg = string.Empty; + responseTime = -1; + + try + { + HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); + myHttpWebRequest.Timeout = 5000; + + var timer = new Stopwatch(); + timer.Start(); + + HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); + if (myHttpWebResponse.StatusCode != HttpStatusCode.OK + && myHttpWebResponse.StatusCode != HttpStatusCode.NoContent) + { + msg = myHttpWebResponse.StatusDescription; + } + timer.Stop(); + responseTime = timer.Elapsed.Milliseconds; + + myHttpWebResponse.Close(); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + msg = ex.Message; + } + return msg; + + } + + + } +} diff --git a/v2rayN/v2rayN/Handler/StatisticsHandler.cs b/v2rayN/v2rayN/Handler/StatisticsHandler.cs new file mode 100644 index 00000000..766d4021 --- /dev/null +++ b/v2rayN/v2rayN/Handler/StatisticsHandler.cs @@ -0,0 +1,446 @@ +using Grpc.Core; +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using v2rayN.Mode; +using v2rayN.Protos.Statistics; + +namespace v2rayN.Handler +{ + class StatisticsHandler + { + private Mode.Config config_; + + private Channel channel_; + private StatsService.StatsServiceClient client_; + private Thread workThread_; + + Action> updateFunc_; + + private bool enabled_; + public bool Enable + { + get + { + return enabled_; + } + set + { + enabled_ = value; + } + } + + public bool UpdateUI; + + public ulong TotalUp + { + get; private set; + } + + public ulong TotalDown + { + get; private set; + } + + public List Statistic + { + get; set; + } + + public ulong Up + { + get; private set; + } + + public ulong Down + { + get; private set; + } + + private string logPath_; + + private bool exitFlag_; // true to close workThread_ + + public StatisticsHandler(Mode.Config config, Action> update) + { + config_ = config; + enabled_ = config.enableStatistics; + UpdateUI = false; + updateFunc_ = update; + logPath_ = Utils.GetPath(Global.StatisticLogDirectory); + Statistic = new List(); + exitFlag_ = false; + + DeleteExpiredLog(); + foreach (var server in config.vmess) + { + var statistic = new ServerStatistics(server.remarks, server.address, server.port, server.path, server.requestHost, 0, 0, 0, 0); + Statistic.Add(statistic); + } + + LoadFromFile(); + + GrpcInit(); + + workThread_ = new Thread(new ThreadStart(Run)); + workThread_.Start(); + } + + private void GrpcInit() + { + if (channel_ == null) + { + Global.statePort = GetFreePort(); + + channel_ = new Channel($"127.0.0.1:{Global.statePort}", ChannelCredentials.Insecure); + channel_.ConnectAsync(); + client_ = new StatsService.StatsServiceClient(channel_); + } + } + + public void Close() + { + try + { + + exitFlag_ = true; + channel_.ShutdownAsync(); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + public void Run() + { + while (!exitFlag_) + { + try + { + if (enabled_ && channel_.State == ChannelState.Ready) + { + QueryStatsResponse res = null; + try + { + res = client_.QueryStats(new QueryStatsRequest() { Pattern = "", Reset = true }); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + + if (res != null) + { + var addr = config_.address(); + var port = config_.port(); + var path = config_.path(); + var cur = Statistic.FindIndex(item => item.address == addr && item.port == port && item.path == path); + ulong up = 0, + down = 0; + + //TODO: parse output + ParseOutput(res.Stat, out up, out down); + + Up = up; + Down = down; + + TotalUp += up; + TotalDown += down; + + if (cur != -1) + { + Statistic[cur].todayUp += up; + Statistic[cur].todayDown += down; + Statistic[cur].totalUp += up; + Statistic[cur].totalDown += down; + } + + if (UpdateUI) + updateFunc_(TotalUp, TotalDown, Up, Down, Statistic); + } + } + Thread.Sleep(config_.statisticsFreshRate); + channel_.ConnectAsync(); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + } + + public void ParseOutput(Google.Protobuf.Collections.RepeatedField source, out ulong up, out ulong down) + { + + up = 0; down = 0; + try + { + + foreach (var stat in source) + { + var name = stat.Name; + var value = stat.Value; + var nStr = name.Split(">>>".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); + var type = ""; + + name = name.Trim(); + + name = nStr[1]; + type = nStr[3]; + + if (name == Global.InboundProxyTagName) + { + if (type == "uplink") + { + up = (ulong)value; + } + else if (type == "downlink") + { + down = (ulong)value; + } + } + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + public void SaveToFile() + { + if (!Directory.Exists(logPath_)) + { + Directory.CreateDirectory(logPath_); + } + + // 总流量统计文件 + var overallPath = Path.Combine(logPath_, Global.StatisticLogOverall); + if (!File.Exists(overallPath)) + { + File.Create(overallPath); + } + try + { + using (var overallWriter = new StreamWriter(overallPath)) + { + double up_amount, down_amount; + string up_unit, down_unit; + + Utils.ToHumanReadable(TotalUp, out up_amount, out up_unit); + Utils.ToHumanReadable(TotalDown, out down_amount, out down_unit); + + overallWriter.WriteLine($"LastUpdate {DateTime.Now.ToString("yyyy-MM-dd")} {DateTime.Now.ToLongTimeString()}"); + overallWriter.WriteLine($"UP {string.Format("{0:f2}", up_amount)}{up_unit} {TotalUp}"); + overallWriter.WriteLine($"DOWN {string.Format("{0:f2}", down_amount)}{down_unit} {TotalDown}"); + foreach (var s in Statistic) + { + overallWriter.WriteLine($"* {s.name} {s.address} {s.port} {s.path} {s.host} {s.totalUp} {s.totalDown}"); + } + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + + // 当天流量记录文件 + var dailyPath = Path.Combine(logPath_, $"{DateTime.Now.ToString("yyyy-MM-dd")}.txt"); + if (!File.Exists(dailyPath)) + { + File.Create(dailyPath); + } + try + { + using (var dailyWriter = new StreamWriter(dailyPath)) + { + dailyWriter.WriteLine($"LastUpdate {DateTime.Now.ToString("yyyy-MM-dd")} {DateTime.Now.ToLongTimeString()}"); + foreach (var s in Statistic) + { + dailyWriter.WriteLine($"* {s.name} {s.address} {s.port} {s.path} {s.host} {s.todayUp} {s.todayDown}"); + } + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + public void LoadFromFile() + { + if (!Directory.Exists(logPath_)) return; + + // 总流量统计文件 + /// + /// 文件结构 + /// LastUpdate [date] [time] + /// UP [readable string] [amount] + /// DOWN [readable string] [amount] + /// 每行每个数据空格分隔 + + try + { + Utils.SaveLog(logPath_ + Global.StatisticLogOverall); + var overallPath = Path.Combine(logPath_, Global.StatisticLogOverall); + if (File.Exists(overallPath)) + { + using (var overallReader = new StreamReader(overallPath)) + { + while (!overallReader.EndOfStream) + { + var line = overallReader.ReadLine(); + if (line.StartsWith("LastUpdate")) + { + + } + else if (line.StartsWith("UP")) + { + var datas = line.Split(' '); + if (datas.Length < 3) return; + TotalUp = ulong.Parse(datas[2]); + } + else if (line.StartsWith("DOWN")) + { + var datas = line.Split(' '); + if (datas.Length < 3) return; + TotalDown = ulong.Parse(datas[2]); + } + else if (line.StartsWith("*")) + { + var datas = line.Split(' '); + if (datas.Length < 8) return; + var name = datas[1]; + var address = datas[2]; + var port = int.Parse(datas[3]); + var path = datas[4]; + var host = datas[5]; + var totalUp = ulong.Parse(datas[6]); + var totalDown = ulong.Parse(datas[7]); + + var temp = new ServerStatistics(name, address, port, path, host, 0, 0, 0, 0); + var index = Statistic.FindIndex(item => Utils.IsIdenticalServer(item, temp)); + if (index != -1) + { + Statistic[index].totalUp = totalUp; + Statistic[index].totalDown = totalDown; + } + else + { + var s = new Mode.ServerStatistics(name, address, port, path, host, totalUp, totalDown, 0, 0); + Statistic.Add(s); + } + } + } + + } + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + + try + { + Utils.SaveLog(logPath_ + $"{DateTime.Now.ToString("yyyy-MM-dd")}.txt"); + var dailyPath = Path.Combine(logPath_, $"{DateTime.Now.ToString("yyyy-MM-dd")}.txt"); + if (File.Exists(dailyPath)) + { + + using (var dailyReader = new StreamReader(dailyPath)) + { + while (!dailyReader.EndOfStream) + { + var line = dailyReader.ReadLine(); + if (line.StartsWith("LastUpdate")) + { + + } + else if (line.StartsWith("*")) + { + var datas = line.Split(' '); + if (datas.Length < 8) return; + var name = datas[1]; + var address = datas[2]; + var port = int.Parse(datas[3]); + var path = datas[4]; + var host = datas[5]; + var todayUp = ulong.Parse(datas[6]); + var todayDown = ulong.Parse(datas[7]); + + var temp = new ServerStatistics(name, address, port, path, host, 0, 0, 0, 0); + var index = Statistic.FindIndex(item => Utils.IsIdenticalServer(item, temp)); + if (index != -1) + { + Statistic[index].todayUp = todayUp; + Statistic[index].todayDown = todayDown; + } + else + { + var s = new Mode.ServerStatistics(name, address, port, path, host, 0, 0, todayUp, todayDown); + Statistic.Add(s); + } + } + } + } + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + + private void DeleteExpiredLog() + { + try + { + if (!Directory.Exists(logPath_)) return; + var dirInfo = new DirectoryInfo(logPath_); + var files = dirInfo.GetFiles(); + foreach (var file in files) + { + if (file.Name == "overall.txt") continue; + var name = file.Name.Split('.')[0]; + var ft = DateTime.Parse(name); + var ct = DateTime.Now; + var dur = ct - ft; + if (dur.Days > config_.CacheDays) + { + file.Delete(); + } + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + private int GetFreePort() + { + int defaultPort = 28123; + try + { + // TCP stack please do me a favor + TcpListener l = new TcpListener(IPAddress.Loopback, 0); + l.Start(); + var port = ((IPEndPoint)l.LocalEndpoint).Port; + l.Stop(); + return port; + } + catch (Exception ex) + { + // in case access denied + Utils.SaveLog(ex.Message, ex); + return defaultPort; + } + } + } +} diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs new file mode 100644 index 00000000..712e8350 --- /dev/null +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -0,0 +1,1369 @@ +using System; +using System.Collections.Generic; +using System.IO; +using v2rayN.Mode; +using System.Net; +using System.Text; +using System.Linq; + +namespace v2rayN.Handler +{ + /// + /// v2ray配置文件处理类 + /// + class V2rayConfigHandler + { + private static string SampleClient = Global.v2raySampleClient; + private static string SampleServer = Global.v2raySampleServer; + + #region 生成客户端配置 + + /// + /// 生成v2ray的客户端配置文件 + /// + /// + /// + /// + /// + public static int GenerateClientConfig(Config config, string fileName, bool blExport, out string msg) + { + msg = string.Empty; + + try + { + //检查GUI设置 + if (config == null + || config.index < 0 + || config.vmess.Count <= 0 + || config.index > config.vmess.Count - 1 + ) + { + msg = UIRes.I18N("CheckServerSettings"); + return -1; + } + + msg = UIRes.I18N("InitialConfiguration"); + if (config.configType() == (int)EConfigType.Custom) + { + return GenerateClientCustomConfig(config, fileName, out msg); + } + + //取得默认配置 + string result = Utils.GetEmbedText(SampleClient); + if (Utils.IsNullOrEmpty(result)) + { + msg = UIRes.I18N("FailedGetDefaultConfiguration"); + return -1; + } + + //转成Json + V2rayConfig v2rayConfig = Utils.FromJson(result); + if (v2rayConfig == null) + { + msg = UIRes.I18N("FailedGenDefaultConfiguration"); + return -1; + } + + //开始修改配置 + log(config, ref v2rayConfig, blExport); + + //本地端口 + inbound(config, ref v2rayConfig); + + //路由 + routing(config, ref v2rayConfig); + + //outbound + outbound(config, ref v2rayConfig); + + //dns + dns(config, ref v2rayConfig); + + // TODO: 统计配置 + statistic(config, ref v2rayConfig); + + Utils.ToJsonFile(v2rayConfig, fileName); + + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary()); + } + catch + { + msg = UIRes.I18N("FailedGenDefaultConfiguration"); + return -1; + } + return 0; + } + + /// + /// 日志 + /// + /// + /// + /// + private static int log(Config config, ref V2rayConfig v2rayConfig, bool blExport) + { + try + { + if (blExport) + { + if (config.logEnabled) + { + v2rayConfig.log.loglevel = config.loglevel; + } + else + { + v2rayConfig.log.loglevel = config.loglevel; + v2rayConfig.log.access = ""; + v2rayConfig.log.error = ""; + } + } + else + { + if (config.logEnabled) + { + v2rayConfig.log.loglevel = config.loglevel; + v2rayConfig.log.access = Utils.GetPath(v2rayConfig.log.access); + v2rayConfig.log.error = Utils.GetPath(v2rayConfig.log.error); + } + else + { + v2rayConfig.log.loglevel = config.loglevel; + v2rayConfig.log.access = ""; + v2rayConfig.log.error = ""; + } + } + } + catch + { + } + return 0; + } + + /// + /// 本地端口 + /// + /// + /// + /// + private static int inbound(Config config, ref V2rayConfig v2rayConfig) + { + try + { + var inbound = v2rayConfig.inbounds[0]; + //端口 + inbound.port = config.inbound[0].localPort; + inbound.protocol = config.inbound[0].protocol; + if (config.allowLANConn) + { + inbound.listen = "0.0.0.0"; + } + else + { + inbound.listen = "127.0.0.1"; + } + //开启udp + inbound.settings.udp = config.inbound[0].udpEnabled; + inbound.sniffing.enabled = config.inbound[0].sniffingEnabled; + } + catch + { + } + return 0; + } + + /// + /// 路由 + /// + /// + /// + /// + private static int routing(Config config, ref V2rayConfig v2rayConfig) + { + try + { + if (v2rayConfig.routing != null + && v2rayConfig.routing.rules != null) + { + v2rayConfig.routing.domainStrategy = config.domainStrategy; + + //自定义 + //需代理 + routingUserRule(config.useragent, Global.agentTag, ref v2rayConfig); + //直连 + routingUserRule(config.userdirect, Global.directTag, ref v2rayConfig); + //阻止 + routingUserRule(config.userblock, Global.blockTag, ref v2rayConfig); + + + switch (config.routingMode) + { + case "0": + break; + case "1": + routingGeo("ip", "private", Global.directTag, ref v2rayConfig); + break; + case "2": + routingGeo("", "cn", Global.directTag, ref v2rayConfig); + break; + case "3": + routingGeo("ip", "private", Global.directTag, ref v2rayConfig); + routingGeo("", "cn", Global.directTag, ref v2rayConfig); + break; + } + + } + } + catch + { + } + return 0; + } + private static int routingUserRule(List userRule, string tag, ref V2rayConfig v2rayConfig) + { + try + { + if (userRule != null + && userRule.Count > 0) + { + //Domain + RulesItem rulesDomain = new RulesItem(); + rulesDomain.type = "field"; + rulesDomain.outboundTag = tag; + rulesDomain.domain = new List(); + + //IP + RulesItem rulesIP = new RulesItem(); + rulesIP.type = "field"; + rulesIP.outboundTag = tag; + rulesIP.ip = new List(); + + for (int k = 0; k < userRule.Count; k++) + { + string url = userRule[k].TrimEx(); + if (Utils.IsNullOrEmpty(url)) + { + continue; + } + if (Utils.IsIP(url) || url.StartsWith("geoip:")) + { + rulesIP.ip.Add(url); + } + else if (Utils.IsDomain(url) + || url.StartsWith("geosite:") + || url.StartsWith("regexp:") + || url.StartsWith("domain:") + || url.StartsWith("full:")) + { + rulesDomain.domain.Add(url); + } + } + if (rulesDomain.domain.Count > 0) + { + v2rayConfig.routing.rules.Add(rulesDomain); + } + if (rulesIP.ip.Count > 0) + { + v2rayConfig.routing.rules.Add(rulesIP); + } + } + } + catch + { + } + return 0; + } + + + private static int routingGeo(string ipOrDomain, string code, string tag, ref V2rayConfig v2rayConfig) + { + try + { + if (!Utils.IsNullOrEmpty(code)) + { + //IP + if (ipOrDomain == "ip" || ipOrDomain == "") + { + RulesItem rulesItem = new RulesItem(); + rulesItem.type = "field"; + rulesItem.outboundTag = Global.directTag; + rulesItem.ip = new List(); + rulesItem.ip.Add($"geoip:{code}"); + + v2rayConfig.routing.rules.Add(rulesItem); + } + + if (ipOrDomain == "domain" || ipOrDomain == "") + { + RulesItem rulesItem = new RulesItem(); + rulesItem.type = "field"; + rulesItem.outboundTag = Global.directTag; + rulesItem.domain = new List(); + rulesItem.domain.Add($"geosite:{code}"); + v2rayConfig.routing.rules.Add(rulesItem); + } + } + } + catch + { + } + return 0; + } + + /// + /// vmess协议服务器配置 + /// + /// + /// + /// + private static int outbound(Config config, ref V2rayConfig v2rayConfig) + { + try + { + var outbound = v2rayConfig.outbounds[0]; + if (config.configType() == (int)EConfigType.Vmess) + { + VnextItem vnextItem; + if (outbound.settings.vnext.Count <= 0) + { + vnextItem = new VnextItem(); + outbound.settings.vnext.Add(vnextItem); + } + else + { + vnextItem = outbound.settings.vnext[0]; + } + //远程服务器地址和端口 + vnextItem.address = config.address(); + vnextItem.port = config.port(); + + UsersItem usersItem; + if (vnextItem.users.Count <= 0) + { + usersItem = new UsersItem(); + vnextItem.users.Add(usersItem); + } + else + { + usersItem = vnextItem.users[0]; + } + //远程服务器用户ID + usersItem.id = config.id(); + usersItem.alterId = config.alterId(); + usersItem.email = Global.userEMail; + usersItem.security = config.security(); + + //Mux + outbound.mux.enabled = config.muxEnabled; + + //远程服务器底层传输配置 + StreamSettings streamSettings = outbound.streamSettings; + boundStreamSettings(config, "out", ref streamSettings); + + outbound.protocol = "vmess"; + outbound.settings.servers = null; + } + else if (config.configType() == (int)EConfigType.Shadowsocks) + { + ServersItem serversItem; + if (outbound.settings.servers.Count <= 0) + { + serversItem = new ServersItem(); + outbound.settings.servers.Add(serversItem); + } + else + { + serversItem = outbound.settings.servers[0]; + } + //远程服务器地址和端口 + serversItem.address = config.address(); + serversItem.port = config.port(); + serversItem.password = config.id(); + serversItem.method = config.security(); + + serversItem.ota = false; + serversItem.level = 1; + + outbound.mux.enabled = false; + + outbound.protocol = "shadowsocks"; + outbound.settings.vnext = null; + } + else if (config.configType() == (int)EConfigType.Socks) + { + ServersItem serversItem; + if (outbound.settings.servers.Count <= 0) + { + serversItem = new ServersItem(); + outbound.settings.servers.Add(serversItem); + } + else + { + serversItem = outbound.settings.servers[0]; + } + //远程服务器地址和端口 + serversItem.address = config.address(); + serversItem.port = config.port(); + + if (!Utils.IsNullOrEmpty(config.security()) + && !Utils.IsNullOrEmpty(config.id())) + { + var socksUsersItem = new SocksUsersItem(); + socksUsersItem.user = config.security(); + socksUsersItem.pass = config.id(); + socksUsersItem.level = 1; + + serversItem.users = new List() { socksUsersItem }; + } + + outbound.mux.enabled = false; + + outbound.protocol = "socks"; + outbound.settings.vnext = null; + } + } + catch + { + } + return 0; + } + + /// + /// vmess协议远程服务器底层传输配置 + /// + /// + /// + /// + /// + private static int boundStreamSettings(Config config, string iobound, ref StreamSettings streamSettings) + { + try + { + //远程服务器底层传输配置 + streamSettings.network = config.network(); + var host = config.requestHost(); + + //if tls + if (config.streamSecurity() == Global.StreamSecurity) + { + streamSettings.security = config.streamSecurity(); + + TlsSettings tlsSettings = new TlsSettings(); + tlsSettings.allowInsecure = config.allowInsecure(); + if (!string.IsNullOrWhiteSpace(host)) + { + tlsSettings.serverName = host; + } + streamSettings.tlsSettings = tlsSettings; + } + + //streamSettings + switch (config.network()) + { + //kcp基本配置暂时是默认值,用户能自己设置伪装类型 + case "kcp": + KcpSettings kcpSettings = new KcpSettings(); + kcpSettings.mtu = config.kcpItem.mtu; + kcpSettings.tti = config.kcpItem.tti; + if (iobound.Equals("out")) + { + kcpSettings.uplinkCapacity = config.kcpItem.uplinkCapacity; + kcpSettings.downlinkCapacity = config.kcpItem.downlinkCapacity; + } + else if (iobound.Equals("in")) + { + kcpSettings.uplinkCapacity = config.kcpItem.downlinkCapacity; ; + kcpSettings.downlinkCapacity = config.kcpItem.downlinkCapacity; + } + else + { + kcpSettings.uplinkCapacity = config.kcpItem.uplinkCapacity; + kcpSettings.downlinkCapacity = config.kcpItem.downlinkCapacity; + } + + kcpSettings.congestion = config.kcpItem.congestion; + kcpSettings.readBufferSize = config.kcpItem.readBufferSize; + kcpSettings.writeBufferSize = config.kcpItem.writeBufferSize; + kcpSettings.header = new Header(); + kcpSettings.header.type = config.headerType(); + streamSettings.kcpSettings = kcpSettings; + break; + //ws + case "ws": + WsSettings wsSettings = new WsSettings(); + wsSettings.connectionReuse = true; + + string path = config.path(); + if (!string.IsNullOrWhiteSpace(host)) + { + wsSettings.headers = new Headers(); + wsSettings.headers.Host = host; + } + if (!string.IsNullOrWhiteSpace(path)) + { + wsSettings.path = path; + } + streamSettings.wsSettings = wsSettings; + + //TlsSettings tlsSettings = new TlsSettings(); + //tlsSettings.allowInsecure = config.allowInsecure(); + //if (!string.IsNullOrWhiteSpace(host)) + //{ + // tlsSettings.serverName = host; + //} + //streamSettings.tlsSettings = tlsSettings; + break; + //h2 + case "h2": + HttpSettings httpSettings = new HttpSettings(); + + if (!string.IsNullOrWhiteSpace(host)) + { + httpSettings.host = Utils.String2List(host); + } + httpSettings.path = config.path(); + + streamSettings.httpSettings = httpSettings; + + //TlsSettings tlsSettings2 = new TlsSettings(); + //tlsSettings2.allowInsecure = config.allowInsecure(); + //streamSettings.tlsSettings = tlsSettings2; + break; + //quic + case "quic": + QuicSettings quicsettings = new QuicSettings(); + quicsettings.security = host; + quicsettings.key = config.path(); + quicsettings.header = new Header(); + quicsettings.header.type = config.headerType(); + + streamSettings.quicSettings = quicsettings; + break; + default: + //tcp带http伪装 + if (config.headerType().Equals(Global.TcpHeaderHttp)) + { + TcpSettings tcpSettings = new TcpSettings(); + tcpSettings.connectionReuse = true; + tcpSettings.header = new Header(); + tcpSettings.header.type = config.headerType(); + + if (iobound.Equals("out")) + { + //request填入自定义Host + string request = Utils.GetEmbedText(Global.v2raySampleHttprequestFileName); + string[] arrHost = host.Split(','); + string host2 = string.Join("\",\"", arrHost); + request = request.Replace("$requestHost$", string.Format("\"{0}\"", host2)); + //request = request.Replace("$requestHost$", string.Format("\"{0}\"", config.requestHost())); + + //填入自定义Path + string pathHttp = @"/"; + if (!Utils.IsNullOrEmpty(config.path())) + { + string[] arrPath = config.path().Split(','); + pathHttp = string.Join("\",\"", arrPath); + } + request = request.Replace("$requestPath$", string.Format("\"{0}\"", pathHttp)); + tcpSettings.header.request = Utils.FromJson(request); + } + else if (iobound.Equals("in")) + { + //string response = Utils.GetEmbedText(Global.v2raySampleHttpresponseFileName); + //tcpSettings.header.response = Utils.FromJson(response); + } + + streamSettings.tcpSettings = tcpSettings; + } + break; + } + } + catch + { + } + return 0; + } + + /// + /// remoteDNS + /// + /// + /// + /// + private static int dns(Config config, ref V2rayConfig v2rayConfig) + { + try + { + if (string.IsNullOrWhiteSpace(config.remoteDNS)) + { + return 0; + } + List servers = new List(); + + string[] arrDNS = config.remoteDNS.Split(','); + foreach (string str in arrDNS) + { + //if (Utils.IsIP(str)) + //{ + servers.Add(str); + //} + } + //servers.Add("localhost"); + v2rayConfig.dns = new Mode.Dns(); + v2rayConfig.dns.servers = servers; + } + catch + { + } + return 0; + } + + public static int statistic(Config config, ref V2rayConfig v2rayConfig) + { + if (config.enableStatistics) + { + var tag = Global.InboundAPITagName; + var apiObj = new Mode.API(); + var policyObj = new Mode.Policy(); + var policySystemSetting = new Mode.SystemPolicy(); + + string[] services = { "StatsService" }; + + v2rayConfig.stats = new Stats(); + + apiObj.tag = tag; + apiObj.services = services.ToList(); + v2rayConfig.api = apiObj; + + policySystemSetting.statsInboundDownlink = true; + policySystemSetting.statsInboundUplink = true; + policyObj.system = policySystemSetting; + v2rayConfig.policy = policyObj; + + if (!v2rayConfig.inbounds.Exists(item => { return item.tag == tag; })) + { + var apiInbound = new Mode.Inbounds(); + var apiInboundSettings = new Mode.Inboundsettings(); + apiInbound.tag = tag; + apiInbound.listen = Global.Loopback; + apiInbound.port = Global.statePort; + apiInbound.protocol = Global.InboundAPIProtocal; + apiInboundSettings.address = Global.Loopback; + apiInbound.settings = apiInboundSettings; + v2rayConfig.inbounds.Add(apiInbound); + } + + if (!v2rayConfig.routing.rules.Exists(item => { return item.outboundTag == tag; })) + { + var apiRoutingRule = new Mode.RulesItem(); + apiRoutingRule.inboundTag = tag; + apiRoutingRule.outboundTag = tag; + apiRoutingRule.type = "field"; + v2rayConfig.routing.rules.Add(apiRoutingRule); + } + } + return 0; + } + + /// + /// 生成v2ray的客户端配置文件(自定义配置) + /// + /// + /// + /// + /// + public static int GenerateClientCustomConfig(Config config, string fileName, out string msg) + { + msg = string.Empty; + + try + { + //检查GUI设置 + if (config == null + || config.index < 0 + || config.vmess.Count <= 0 + || config.index > config.vmess.Count - 1 + ) + { + msg = UIRes.I18N("CheckServerSettings"); + return -1; + } + + string addressFileName = config.address(); + if (File.Exists(fileName)) + { + File.Delete(fileName); + } + File.Copy(addressFileName, fileName); + + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary()); + } + catch + { + msg = UIRes.I18N("FailedGenDefaultConfiguration"); + return -1; + } + return 0; + } + + #endregion + + #region 生成服务端端配置 + + /// + /// 生成v2ray的客户端配置文件 + /// + /// + /// + /// + /// + public static int GenerateServerConfig(Config config, string fileName, out string msg) + { + msg = string.Empty; + + try + { + //检查GUI设置 + if (config == null + || config.index < 0 + || config.vmess.Count <= 0 + || config.index > config.vmess.Count - 1 + ) + { + msg = UIRes.I18N("CheckServerSettings"); + return -1; + } + + msg = UIRes.I18N("InitialConfiguration"); + + //取得默认配置 + string result = Utils.GetEmbedText(SampleServer); + if (Utils.IsNullOrEmpty(result)) + { + msg = UIRes.I18N("FailedGetDefaultConfiguration"); + return -1; + } + + //转成Json + V2rayConfig v2rayConfig = Utils.FromJson(result); + if (v2rayConfig == null) + { + msg = UIRes.I18N("FailedGenDefaultConfiguration"); + return -1; + } + + ////开始修改配置 + log(config, ref v2rayConfig, true); + + //vmess协议服务器配置 + ServerInbound(config, ref v2rayConfig); + + //传出设置 + ServerOutbound(config, ref v2rayConfig); + + Utils.ToJsonFile(v2rayConfig, fileName); + + msg = string.Format(UIRes.I18N("SuccessfulConfiguration"), config.getSummary()); + } + catch + { + msg = UIRes.I18N("FailedGenDefaultConfiguration"); + return -1; + } + return 0; + } + + /// + /// vmess协议服务器配置 + /// + /// + /// + /// + private static int ServerInbound(Config config, ref V2rayConfig v2rayConfig) + { + try + { + var inbound = v2rayConfig.inbounds[0]; + UsersItem usersItem; + if (inbound.settings.clients.Count <= 0) + { + usersItem = new UsersItem(); + inbound.settings.clients.Add(usersItem); + } + else + { + usersItem = inbound.settings.clients[0]; + } + //远程服务器端口 + inbound.port = config.port(); + + //远程服务器用户ID + usersItem.id = config.id(); + usersItem.alterId = config.alterId(); + usersItem.email = Global.userEMail; + + //远程服务器底层传输配置 + StreamSettings streamSettings = inbound.streamSettings; + boundStreamSettings(config, "in", ref streamSettings); + } + catch + { + } + return 0; + } + + /// + /// 传出设置 + /// + /// + /// + /// + private static int ServerOutbound(Config config, ref V2rayConfig v2rayConfig) + { + try + { + if (v2rayConfig.outbounds[0] != null) + { + v2rayConfig.outbounds[0].settings = null; + } + } + catch + { + } + return 0; + } + #endregion + + #region 导入(导出)客户端/服务端配置 + + /// + /// 导入v2ray客户端配置 + /// + /// + /// + /// + public static VmessItem ImportFromClientConfig(string fileName, out string msg) + { + msg = string.Empty; + VmessItem vmessItem = new VmessItem(); + + try + { + //载入配置文件 + string result = Utils.LoadResource(fileName); + if (Utils.IsNullOrEmpty(result)) + { + msg = UIRes.I18N("FailedReadConfiguration"); + return null; + } + + //转成Json + V2rayConfig v2rayConfig = Utils.FromJson(result); + if (v2rayConfig == null) + { + msg = UIRes.I18N("FailedConversionConfiguration"); + return null; + } + + if (v2rayConfig.outbounds == null + || v2rayConfig.outbounds.Count <= 0) + { + msg = UIRes.I18N("IncorrectClientConfiguration"); + return null; + } + + var outbound = v2rayConfig.outbounds[0]; + if (outbound == null + || Utils.IsNullOrEmpty(outbound.protocol) + || outbound.protocol != "vmess" + || outbound.settings == null + || outbound.settings.vnext == null + || outbound.settings.vnext.Count <= 0 + || outbound.settings.vnext[0].users == null + || outbound.settings.vnext[0].users.Count <= 0) + { + msg = UIRes.I18N("IncorrectClientConfiguration"); + return null; + } + + vmessItem.security = Global.DefaultSecurity; + vmessItem.network = Global.DefaultNetwork; + vmessItem.headerType = Global.None; + vmessItem.address = outbound.settings.vnext[0].address; + vmessItem.port = outbound.settings.vnext[0].port; + vmessItem.id = outbound.settings.vnext[0].users[0].id; + vmessItem.alterId = outbound.settings.vnext[0].users[0].alterId; + vmessItem.remarks = string.Format("import@{0}", DateTime.Now.ToShortDateString()); + + //tcp or kcp + if (outbound.streamSettings != null + && outbound.streamSettings.network != null + && !Utils.IsNullOrEmpty(outbound.streamSettings.network)) + { + vmessItem.network = outbound.streamSettings.network; + } + + //tcp伪装http + if (outbound.streamSettings != null + && outbound.streamSettings.tcpSettings != null + && outbound.streamSettings.tcpSettings.header != null + && !Utils.IsNullOrEmpty(outbound.streamSettings.tcpSettings.header.type)) + { + if (outbound.streamSettings.tcpSettings.header.type.Equals(Global.TcpHeaderHttp)) + { + vmessItem.headerType = outbound.streamSettings.tcpSettings.header.type; + string request = Convert.ToString(outbound.streamSettings.tcpSettings.header.request); + if (!Utils.IsNullOrEmpty(request)) + { + V2rayTcpRequest v2rayTcpRequest = Utils.FromJson(request); + if (v2rayTcpRequest != null + && v2rayTcpRequest.headers != null + && v2rayTcpRequest.headers.Host != null + && v2rayTcpRequest.headers.Host.Count > 0) + { + vmessItem.requestHost = v2rayTcpRequest.headers.Host[0]; + } + } + } + } + //kcp伪装 + if (outbound.streamSettings != null + && outbound.streamSettings.kcpSettings != null + && outbound.streamSettings.kcpSettings.header != null + && !Utils.IsNullOrEmpty(outbound.streamSettings.kcpSettings.header.type)) + { + vmessItem.headerType = outbound.streamSettings.kcpSettings.header.type; + } + + //ws + if (outbound.streamSettings != null + && outbound.streamSettings.wsSettings != null) + { + if (!Utils.IsNullOrEmpty(outbound.streamSettings.wsSettings.path)) + { + vmessItem.path = outbound.streamSettings.wsSettings.path; + } + if (outbound.streamSettings.wsSettings.headers != null + && !Utils.IsNullOrEmpty(outbound.streamSettings.wsSettings.headers.Host)) + { + vmessItem.requestHost = outbound.streamSettings.wsSettings.headers.Host; + } + } + + //h2 + if (outbound.streamSettings != null + && outbound.streamSettings.httpSettings != null) + { + if (!Utils.IsNullOrEmpty(outbound.streamSettings.httpSettings.path)) + { + vmessItem.path = outbound.streamSettings.httpSettings.path; + } + if (outbound.streamSettings.httpSettings.host != null + && outbound.streamSettings.httpSettings.host.Count > 0) + { + vmessItem.requestHost = Utils.List2String(outbound.streamSettings.httpSettings.host); + } + } + + //tls + if (outbound.streamSettings != null + && outbound.streamSettings.security != null + && outbound.streamSettings.security == Global.StreamSecurity) + { + vmessItem.streamSecurity = Global.StreamSecurity; + } + } + catch + { + msg = UIRes.I18N("IncorrectClientConfiguration"); + return null; + } + + return vmessItem; + } + + /// + /// 导入v2ray服务端配置 + /// + /// + /// + /// + public static VmessItem ImportFromServerConfig(string fileName, out string msg) + { + msg = string.Empty; + VmessItem vmessItem = new VmessItem(); + + try + { + //载入配置文件 + string result = Utils.LoadResource(fileName); + if (Utils.IsNullOrEmpty(result)) + { + msg = UIRes.I18N("FailedReadConfiguration"); + return null; + } + + //转成Json + V2rayConfig v2rayConfig = Utils.FromJson(result); + if (v2rayConfig == null) + { + msg = UIRes.I18N("FailedConversionConfiguration"); + return null; + } + + if (v2rayConfig.inbounds == null + || v2rayConfig.inbounds.Count <= 0) + { + msg = UIRes.I18N("IncorrectServerConfiguration"); + return null; + } + + var inbound = v2rayConfig.inbounds[0]; + if (inbound == null + || Utils.IsNullOrEmpty(inbound.protocol) + || inbound.protocol != "vmess" + || inbound.settings == null + || inbound.settings.clients == null + || inbound.settings.clients.Count <= 0) + { + msg = UIRes.I18N("IncorrectServerConfiguration"); + return null; + } + + vmessItem.security = Global.DefaultSecurity; + vmessItem.network = Global.DefaultNetwork; + vmessItem.headerType = Global.None; + vmessItem.address = string.Empty; + vmessItem.port = inbound.port; + vmessItem.id = inbound.settings.clients[0].id; + vmessItem.alterId = inbound.settings.clients[0].alterId; + + vmessItem.remarks = string.Format("import@{0}", DateTime.Now.ToShortDateString()); + + //tcp or kcp + if (inbound.streamSettings != null + && inbound.streamSettings.network != null + && !Utils.IsNullOrEmpty(inbound.streamSettings.network)) + { + vmessItem.network = inbound.streamSettings.network; + } + + //tcp伪装http + if (inbound.streamSettings != null + && inbound.streamSettings.tcpSettings != null + && inbound.streamSettings.tcpSettings.header != null + && !Utils.IsNullOrEmpty(inbound.streamSettings.tcpSettings.header.type)) + { + if (inbound.streamSettings.tcpSettings.header.type.Equals(Global.TcpHeaderHttp)) + { + vmessItem.headerType = inbound.streamSettings.tcpSettings.header.type; + string request = Convert.ToString(inbound.streamSettings.tcpSettings.header.request); + if (!Utils.IsNullOrEmpty(request)) + { + V2rayTcpRequest v2rayTcpRequest = Utils.FromJson(request); + if (v2rayTcpRequest != null + && v2rayTcpRequest.headers != null + && v2rayTcpRequest.headers.Host != null + && v2rayTcpRequest.headers.Host.Count > 0) + { + vmessItem.requestHost = v2rayTcpRequest.headers.Host[0]; + } + } + } + } + //kcp伪装 + //if (v2rayConfig.outbound.streamSettings != null + // && v2rayConfig.outbound.streamSettings.kcpSettings != null + // && v2rayConfig.outbound.streamSettings.kcpSettings.header != null + // && !Utils.IsNullOrEmpty(v2rayConfig.outbound.streamSettings.kcpSettings.header.type)) + //{ + // cmbHeaderType.Text = v2rayConfig.outbound.streamSettings.kcpSettings.header.type; + //} + + //ws + if (inbound.streamSettings != null + && inbound.streamSettings.wsSettings != null) + { + if (!Utils.IsNullOrEmpty(inbound.streamSettings.wsSettings.path)) + { + vmessItem.path = inbound.streamSettings.wsSettings.path; + } + if (inbound.streamSettings.wsSettings.headers != null + && !Utils.IsNullOrEmpty(inbound.streamSettings.wsSettings.headers.Host)) + { + vmessItem.requestHost = inbound.streamSettings.wsSettings.headers.Host; + } + } + + //h2 + if (inbound.streamSettings != null + && inbound.streamSettings.httpSettings != null) + { + if (!Utils.IsNullOrEmpty(inbound.streamSettings.httpSettings.path)) + { + vmessItem.path = inbound.streamSettings.httpSettings.path; + } + if (inbound.streamSettings.httpSettings.host != null + && inbound.streamSettings.httpSettings.host.Count > 0) + { + vmessItem.requestHost = Utils.List2String(inbound.streamSettings.httpSettings.host); + } + } + + //tls + if (inbound.streamSettings != null + && inbound.streamSettings.security != null + && inbound.streamSettings.security == Global.StreamSecurity) + { + vmessItem.streamSecurity = Global.StreamSecurity; + } + } + catch + { + msg = UIRes.I18N("IncorrectClientConfiguration"); + return null; + } + return vmessItem; + } + + /// + /// 从剪贴板导入URL + /// + /// + /// + /// + public static VmessItem ImportFromClipboardConfig(string clipboardData, out string msg) + { + msg = string.Empty; + VmessItem vmessItem = new VmessItem(); + + try + { + //载入配置文件 + string result = clipboardData.TrimEx();// Utils.GetClipboardData(); + if (Utils.IsNullOrEmpty(result)) + { + msg = UIRes.I18N("FailedReadConfiguration"); + return null; + } + + if (result.StartsWith(Global.vmessProtocol)) + { + int indexSplit = result.IndexOf("?"); + if (indexSplit > 0) + { + vmessItem = ResolveVmess4Kitsunebi(result); + } + else + { + vmessItem.configType = (int)EConfigType.Vmess; + result = result.Substring(Global.vmessProtocol.Length); + result = Utils.Base64Decode(result); + + //转成Json + VmessQRCode vmessQRCode = Utils.FromJson(result); + if (vmessQRCode == null) + { + msg = UIRes.I18N("FailedConversionConfiguration"); + return null; + } + vmessItem.security = Global.DefaultSecurity; + vmessItem.network = Global.DefaultNetwork; + vmessItem.headerType = Global.None; + + + vmessItem.configVersion = Utils.ToInt(vmessQRCode.v); + vmessItem.remarks = Utils.ToString(vmessQRCode.ps); + vmessItem.address = Utils.ToString(vmessQRCode.add); + vmessItem.port = Utils.ToInt(vmessQRCode.port); + vmessItem.id = Utils.ToString(vmessQRCode.id); + vmessItem.alterId = Utils.ToInt(vmessQRCode.aid); + + if (!Utils.IsNullOrEmpty(vmessQRCode.net)) + { + vmessItem.network = vmessQRCode.net; + } + if (!Utils.IsNullOrEmpty(vmessQRCode.type)) + { + vmessItem.headerType = vmessQRCode.type; + } + + vmessItem.requestHost = Utils.ToString(vmessQRCode.host); + vmessItem.path = Utils.ToString(vmessQRCode.path); + vmessItem.streamSecurity = Utils.ToString(vmessQRCode.tls); + } + + ConfigHandler.UpgradeServerVersion(ref vmessItem); + } + else if (result.StartsWith(Global.ssProtocol)) + { + msg = UIRes.I18N("ConfigurationFormatIncorrect"); + + vmessItem.configType = (int)EConfigType.Shadowsocks; + result = result.Substring(Global.ssProtocol.Length); + //remark + int indexRemark = result.IndexOf("#"); + if (indexRemark > 0) + { + try + { + vmessItem.remarks = WebUtility.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); + } + catch { } + result = result.Substring(0, indexRemark); + } + //part decode + int indexS = result.IndexOf("@"); + if (indexS > 0) + { + result = Utils.Base64Decode(result.Substring(0, indexS)) + result.Substring(indexS, result.Length - indexS); + } + else + { + result = Utils.Base64Decode(result); + } + + string[] arr1 = result.Split('@'); + if (arr1.Length != 2) + { + return null; + } + string[] arr21 = arr1[0].Split(':'); + //string[] arr22 = arr1[1].Split(':'); + int indexPort = arr1[1].LastIndexOf(":"); + if (arr21.Length != 2 || indexPort < 0) + { + return null; + } + vmessItem.address = arr1[1].Substring(0, indexPort); + vmessItem.port = Utils.ToInt(arr1[1].Substring(indexPort + 1, arr1[1].Length - (indexPort + 1))); + vmessItem.security = arr21[0]; + vmessItem.id = arr21[1]; + } + else if (result.StartsWith(Global.socksProtocol)) + { + msg = UIRes.I18N("ConfigurationFormatIncorrect"); + + vmessItem.configType = (int)EConfigType.Socks; + result = result.Substring(Global.socksProtocol.Length); + //remark + int indexRemark = result.IndexOf("#"); + if (indexRemark > 0) + { + try + { + vmessItem.remarks = WebUtility.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); + } + catch { } + result = result.Substring(0, indexRemark); + } + //part decode + int indexS = result.IndexOf("@"); + if (indexS > 0) + { + } + else + { + result = Utils.Base64Decode(result); + } + + string[] arr1 = result.Split('@'); + if (arr1.Length != 2) + { + return null; + } + string[] arr21 = arr1[0].Split(':'); + //string[] arr22 = arr1[1].Split(':'); + int indexPort = arr1[1].LastIndexOf(":"); + if (arr21.Length != 2 || indexPort < 0) + { + return null; + } + vmessItem.address = arr1[1].Substring(0, indexPort); + vmessItem.port = Utils.ToInt(arr1[1].Substring(indexPort + 1, arr1[1].Length - (indexPort + 1))); + vmessItem.security = arr21[0]; + vmessItem.id = arr21[1]; + } + else + { + msg = UIRes.I18N("NonvmessOrssProtocol"); + return null; + } + } + catch + { + msg = UIRes.I18N("Incorrectconfiguration"); + return null; + } + + return vmessItem; + } + + + /// + /// 导出为客户端配置 + /// + /// + /// + /// + /// + public static int Export2ClientConfig(Config config, string fileName, out string msg) + { + msg = string.Empty; + return GenerateClientConfig(config, fileName, true, out msg); + } + + /// + /// 导出为服务端配置 + /// + /// + /// + /// + /// + public static int Export2ServerConfig(Config config, string fileName, out string msg) + { + msg = string.Empty; + return GenerateServerConfig(config, fileName, out msg); + } + + private static VmessItem ResolveVmess4Kitsunebi(string result) + { + VmessItem vmessItem = new VmessItem(); + + vmessItem.configType = (int)EConfigType.Vmess; + result = result.Substring(Global.vmessProtocol.Length); + int indexSplit = result.IndexOf("?"); + if (indexSplit > 0) + { + result = result.Substring(0, indexSplit); + } + result = Utils.Base64Decode(result); + + string[] arr1 = result.Split('@'); + if (arr1.Length != 2) + { + return null; + } + string[] arr21 = arr1[0].Split(':'); + string[] arr22 = arr1[1].Split(':'); + if (arr21.Length != 2 || arr21.Length != 2) + { + return null; + } + + vmessItem.address = arr22[0]; + vmessItem.port = Utils.ToInt(arr22[1]); + vmessItem.security = arr21[0]; + vmessItem.id = arr21[1]; + + vmessItem.network = Global.DefaultNetwork; + vmessItem.headerType = Global.None; + vmessItem.remarks = "Alien"; + vmessItem.alterId = 0; + + return vmessItem; + } + + #endregion + + } +} diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs new file mode 100644 index 00000000..244892c8 --- /dev/null +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -0,0 +1,165 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using v2rayN.Mode; + +namespace v2rayN.Handler +{ + + /// + /// 消息委托 + /// + /// 是否显示在托盘区 + /// 内容 + public delegate void ProcessDelegate(bool notify, string msg); + + /// + /// v2ray进程处理类 + /// + class V2rayHandler + { + private static string v2rayConfigRes = Global.v2rayConfigFileName; + private List lstV2ray; + public event ProcessDelegate ProcessEvent; + private int processId = 0; + + public V2rayHandler() + { + lstV2ray = new List(); + lstV2ray.Add("wv2ray"); + lstV2ray.Add("v2ray"); + } + + /// + /// 载入V2ray + /// + public void LoadV2ray(Config config) + { + if (Global.reloadV2ray) + { + string msg = string.Empty; + string fileName = Utils.GetPath(v2rayConfigRes); + if (V2rayConfigHandler.GenerateClientConfig(config, fileName, false, out msg) != 0) + { + ShowMsg(false, msg); + } + else + { + ShowMsg(true, msg); + V2rayRestart(); + } + } + } + + /// + /// V2ray重启 + /// + private void V2rayRestart() + { + V2rayStop(); + V2rayStart(); + } + + /// + /// V2ray停止 + /// + public void V2rayStop() + { + try + { + bool blExist = true; + if (processId > 0) + { + Process p1 = Process.GetProcessById(processId); + if (p1 != null) + { + p1.Kill(); + blExist = false; + } + } + if (blExist) + { + foreach (string vName in lstV2ray) + { + Process[] killPro = Process.GetProcessesByName(vName); + foreach (Process p in killPro) + { + p.Kill(); + } + } + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + /// + /// V2ray启动 + /// + private void V2rayStart() + { + ShowMsg(false, string.Format(UIRes.I18N("StartService"), DateTime.Now.ToString())); + + try + { + //查找v2ray文件是否存在 + string fileName = string.Empty; + for (int k = 0; k < lstV2ray.Count; k++) + { + string vName = string.Format("{0}.exe", lstV2ray[k]); + vName = Utils.GetPath(vName); + if (File.Exists(vName)) + { + fileName = vName; + break; + } + } + if (Utils.IsNullOrEmpty(fileName)) + { + string msg = string.Format(UIRes.I18N("NotFoundCore"), @"https://github.com/v2ray/v2ray-core/releases"); + ShowMsg(true, msg); + return; + } + + Process p = new Process(); + p.StartInfo.FileName = fileName; + p.StartInfo.UseShellExecute = false; + p.StartInfo.RedirectStandardOutput = true; + p.StartInfo.CreateNoWindow = true; + p.OutputDataReceived += new DataReceivedEventHandler((sender, e) => + { + if (!String.IsNullOrEmpty(e.Data)) + { + string msg = e.Data + Environment.NewLine; + ShowMsg(false, msg); + } + }); + p.Start(); + p.BeginOutputReadLine(); + processId = p.Id; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + string msg = ex.Message; + ShowMsg(true, msg); + } + } + + /// + /// 消息委托 + /// + /// + /// + private void ShowMsg(bool notify, string msg) + { + if (ProcessEvent != null) + { + ProcessEvent(notify, msg); + } + } + } +} diff --git a/v2rayN/v2rayN/Handler/V2rayUpdateHandle.cs b/v2rayN/v2rayN/Handler/V2rayUpdateHandle.cs new file mode 100644 index 00000000..2de80f26 --- /dev/null +++ b/v2rayN/v2rayN/Handler/V2rayUpdateHandle.cs @@ -0,0 +1,221 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Text; +using Newtonsoft.Json; +using v2rayN.Mode; +using v2rayN.Properties; +using v2rayN.HttpProxyHandler; +using System.Diagnostics; + +namespace v2rayN.Handler +{ + /// + ///Update V2ray Core + /// + class V2rayUpdateHandle + { + public event EventHandler AbsoluteCompleted; + + public event EventHandler UpdateCompleted; + + public event ErrorEventHandler Error; + + public string DownloadFileName + { + get + { + return "v2ray-windows.zip"; + } + } + + public class ResultEventArgs : EventArgs + { + public bool Success; + public string Msg; + + public ResultEventArgs(bool success, string msg) + { + this.Success = success; + this.Msg = msg; + } + } + + private string latestUrl = "https://github.com/v2ray/v2ray-core/releases/latest"; + private const string coreURL = "https://github.com/v2ray/v2ray-core/releases/download/{0}/v2ray-windows-{1}.zip"; + private int progressPercentage = -1; + private bool blFirst = true; + private long totalBytesToReceive = 0; + private DateTime totalDatetime = new DateTime(); + + + public void AbsoluteV2rayCore(Config config) + { + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2 + ServicePointManager.DefaultConnectionLimit = 256; + WebRequest request = WebRequest.Create(latestUrl); + request.BeginGetResponse(new AsyncCallback(OnResponseV2rayCore), request); + } + + private void OnResponseV2rayCore(IAsyncResult ar) + { + try + { + HttpWebRequest request = (HttpWebRequest)ar.AsyncState; + HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(ar); + string redirectUrl = response.ResponseUri.AbsoluteUri; + string version = redirectUrl.Substring(redirectUrl.LastIndexOf("/", StringComparison.Ordinal) + 1); + + string osBit = string.Empty; + if (Environment.Is64BitProcess) + { + osBit = "64"; + } + else + { + osBit = "32"; + } + string url = string.Format(coreURL, version, osBit); + if (AbsoluteCompleted != null) + { + AbsoluteCompleted(this, new ResultEventArgs(true, url)); + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + + if (Error != null) + Error(this, new ErrorEventArgs(ex)); + } + } + + + public void DownloadFileAsync(Config config, string url) + { + try + { + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2 + ServicePointManager.DefaultConnectionLimit = 256; + if (UpdateCompleted != null) + { + UpdateCompleted(this, new ResultEventArgs(false, url)); + } + + progressPercentage = -1; + + WebClientEx ws = new WebClientEx(); + ws.DownloadFileCompleted += ws_DownloadFileCompleted; + ws.DownloadProgressChanged += ws_DownloadProgressChanged; + ws.DownloadFileAsync(new Uri(url), Utils.GetPath(DownloadFileName)); + blFirst = true; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + + if (Error != null) + Error(this, new ErrorEventArgs(ex)); + } + } + + void ws_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) + { + if (blFirst) + { + totalBytesToReceive = e.TotalBytesToReceive - e.BytesReceived; + totalDatetime = DateTime.Now; + blFirst = false; + } + if (UpdateCompleted != null) + { + if (progressPercentage != e.ProgressPercentage && e.ProgressPercentage % 10 == 0) + { + progressPercentage = e.ProgressPercentage; + string msg = string.Format("...{0}%", e.ProgressPercentage); + UpdateCompleted(this, new ResultEventArgs(false, msg)); + } + } + } + + void ws_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) + { + try + { + if (e.Error == null + || Utils.IsNullOrEmpty(e.Error.ToString())) + { + if (UpdateCompleted != null) + { + TimeSpan ts = (DateTime.Now - totalDatetime); + string speed = string.Format("{0} M/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.##")); + UpdateCompleted(this, new ResultEventArgs(true, speed)); + } + } + else + { + throw e.Error; + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + + if (Error != null) + Error(this, new ErrorEventArgs(ex)); + } + } + + /// + /// DownloadString + /// + /// + public void WebDownloadString(string url) + { + string source = string.Empty; + try + { + ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2 + ServicePointManager.DefaultConnectionLimit = 256; + + WebClientEx ws = new WebClientEx(); + ws.DownloadStringCompleted += Ws_DownloadStringCompleted; + ws.DownloadStringAsync(new Uri(url)); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + private void Ws_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) + { + try + { + if (e.Error == null + || Utils.IsNullOrEmpty(e.Error.ToString())) + { + string source = e.Result; + if (UpdateCompleted != null) + { + UpdateCompleted(this, new ResultEventArgs(true, source)); + } + } + else + { + throw e.Error; + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + + if (Error != null) + Error(this, new ErrorEventArgs(ex)); + } + } + + + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs new file mode 100644 index 00000000..fd11820b --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs @@ -0,0 +1,177 @@ +using System; +using v2rayN.Mode; + +namespace v2rayN.HttpProxyHandler +{ + /// + /// 系统代理(http)总处理 + /// 启动privoxy提供http协议 + /// 使用SysProxy设置IE系统代理或者PAC模式 + /// + class HttpProxyHandle + { + private static string GetTimestamp(DateTime value) + { + return value.ToString("MMddHHmmssfff"); + } + + public static void ReSetPACProxy(Config config) + { + if (config.listenerType == 2) + { + //SysProxyHandle.SetIEProxy(false, false, null, null); + //PACServerHandle.Stop(); + } + Update(config, false); + } + + public static bool Update(Config config, bool forceDisable) + { + int type = config.listenerType; + + if (forceDisable) + { + type = 0; + } + + try + { + if (type != 0) + { + var port = Global.sysAgentPort; + if (port <= 0) + { + return false; + } + if (type == 1) + { + PACServerHandle.Stop(); + PACFileWatcherHandle.StopWatch(); + SysProxyHandle.SetIEProxy(true, true, "127.0.0.1:" + port, null); + } + else if (type == 2) + { + string pacUrl = GetPacUrl(); + SysProxyHandle.SetIEProxy(true, false, null, pacUrl); + PACServerHandle.Stop(); + PACServerHandle.Init(config); + PACFileWatcherHandle.StartWatch(config); + } + else if (type == 3) + { + PACServerHandle.Stop(); + PACFileWatcherHandle.StopWatch(); + SysProxyHandle.SetIEProxy(false, false, null, null); + } + else if (type == 4) + { + string pacUrl = GetPacUrl(); + SysProxyHandle.SetIEProxy(false, false, null, null); + PACServerHandle.Stop(); + PACServerHandle.Init(config); + PACFileWatcherHandle.StartWatch(config); + } + } + else + { + SysProxyHandle.SetIEProxy(false, false, null, null); + PACServerHandle.Stop(); + PACFileWatcherHandle.StopWatch(); + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + return true; + } + + /// + /// 启用系统代理(http) + /// + /// + public static void StartHttpAgent(Config config) + { + try + { + int localPort = config.GetLocalPort("socks"); + if (localPort > 0) + { + PrivoxyHandler.Instance.Start(localPort, config); + if (PrivoxyHandler.Instance.RunningPort > 0) + { + Global.sysAgent = true; + Global.socksPort = localPort; + Global.sysAgentPort = PrivoxyHandler.Instance.RunningPort; + Global.pacPort = Global.sysAgentPort + 1; + } + } + } + catch + { + } + } + + /// + /// 关闭系统代理 + /// + /// + public static void CloseHttpAgent(Config config) + { + try + { + ////开启全局代理则关闭 + //if (Global.sysAgent) + //{ + PrivoxyHandler.Instance.Stop(); + + Global.sysAgent = false; + Global.socksPort = 0; + Global.sysAgentPort = 0; + Global.pacPort = 0; + //} + } + catch + { + } + } + + /// + /// 重启系统代理(http) + /// + /// + /// + public static bool RestartHttpAgent(Config config, bool forced) + { + bool isRestart = false; + //强制重启或者socks端口变化 + if (forced) + { + isRestart = true; + } + else + { + int localPort = config.GetLocalPort("socks"); + if (localPort != Global.socksPort) + { + isRestart = true; + } + } + if (isRestart) + { + CloseHttpAgent(config); + StartHttpAgent(config); + return true; + } + return false; + } + + public static string GetPacUrl() + { + string pacUrl = string.Format("http://127.0.0.1:{0}/pac/?t={1}", Global.pacPort, + GetTimestamp(DateTime.Now)); + + return pacUrl; + } + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpWebServer.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpWebServer.cs new file mode 100644 index 00000000..906f26d9 --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/HttpWebServer.cs @@ -0,0 +1,100 @@ +using System; +using System.Net; +using System.Text; +using System.Threading; + +namespace v2rayN.HttpProxyHandler +{ + public class HttpWebServer + { + private HttpListener _listener; + private Func _responderMethod; + + public HttpWebServer(string[] prefixes, Func method) + { + try + { + _listener = new HttpListener(); + + if (!HttpListener.IsSupported) + throw new NotSupportedException( + "Needs Windows XP SP2, Server 2003 or later."); + + // URI prefixes are required, for example + // "http://localhost:8080/index/". + if (prefixes == null || prefixes.Length == 0) + throw new ArgumentException("prefixes"); + + // A responder method is required + if (method == null) + throw new ArgumentException("method"); + + foreach (string s in prefixes) + _listener.Prefixes.Add(s); + + _responderMethod = method; + _listener.Start(); + + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + throw; + } + } + + public HttpWebServer(Func method, params string[] prefixes) + : this(prefixes, method) { } + + public void Run() + { + ThreadPool.QueueUserWorkItem((o) => + { + Utils.SaveLog("Webserver running..."); + try + { + while (_listener.IsListening) + { + ThreadPool.QueueUserWorkItem((c) => + { + var ctx = c as HttpListenerContext; + try + { + string address = ctx.Request.LocalEndPoint.Address.ToString(); + string rstr = _responderMethod(address); + byte[] buf = Encoding.UTF8.GetBytes(rstr); + ctx.Response.StatusCode = 200; + ctx.Response.ContentType = "application/x-ns-proxy-autoconfig"; + ctx.Response.ContentLength64 = buf.Length; + ctx.Response.OutputStream.Write(buf, 0, buf.Length); + } + catch + { + } // suppress any exceptions + finally + { + // always close the stream + ctx.Response.OutputStream.Close(); + } + }, _listener.GetContext()); + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } // suppress any exceptions + }); + } + + public void Stop() + { + if (_listener != null) + { + _listener.Stop(); + _listener.Close(); + _listener = null; + } + } + + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpWebServerB.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpWebServerB.cs new file mode 100644 index 00000000..78cbb0fc --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/HttpWebServerB.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; + +namespace v2rayN.HttpProxyHandler +{ + public class HttpWebServerB + { + private TcpListener listener; + private int port; + private Func _responderMethod; + + public HttpWebServerB(int port, Func method) + { + this.port = port; + this._responderMethod = method; + + Thread thread = new Thread(StartListen); + thread.IsBackground = true; + thread.Start(); + } + + public void Stop() + { + if (listener != null) + { + listener.Stop(); + listener = null; + } + } + + private void StartListen() + { + listener = new TcpListener(IPAddress.Any, port); + listener.Start(); + Utils.SaveLog("WebserverB running..."); + + while (true) + { + TcpClient socket = listener.AcceptTcpClient(); + Thread thread = new Thread(new ParameterizedThreadStart(ProcessThread)); + thread.Start(socket); + Thread.Sleep(1); + } + } + private void ProcessThread(object obj) + { + try + { + var socket = obj as TcpClient; + + var inputStream = new BufferedStream(socket.GetStream()); + var outputStream = new StreamWriter(new BufferedStream(socket.GetStream())); + if (inputStream.CanRead) + { + var data = ReadStream(inputStream); + + if (data.Contains("/pac/")) + { + if (_responderMethod != null) + { + var address = ((IPEndPoint)socket.Client.LocalEndPoint).Address.ToString(); + string pac = _responderMethod(address); + + if (inputStream.CanWrite) + { + WriteStream(outputStream, pac); + } + } + } + } + + outputStream.BaseStream.Flush(); + inputStream = null; + outputStream = null; + socket.Close(); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + private string ReadStream(Stream inputStream) + { + int nextchar; + string data = ""; + while (true) + { + nextchar = inputStream.ReadByte(); + if (nextchar == '\n') + { + break; + } + if (nextchar == '\r') + { + continue; + } + if (nextchar == -1) + { + Thread.Sleep(1); + continue; + }; + data += Convert.ToChar(nextchar); + } + return data; + } + + private void WriteStream(StreamWriter outputStream, string pac) + { + var content_type = "application/x-ns-proxy-autoconfig"; + outputStream.WriteLine("HTTP/1.1 200 OK"); + outputStream.WriteLine(String.Format("Content-Type:{0}", content_type)); + outputStream.WriteLine("Connection: close"); + outputStream.WriteLine(""); + outputStream.WriteLine(pac); + outputStream.Flush(); + } + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/PACFileWatcherHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/PACFileWatcherHandle.cs new file mode 100644 index 00000000..08043d73 --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/PACFileWatcherHandle.cs @@ -0,0 +1,45 @@ +using System.IO; +using System.Windows.Forms; +using v2rayN.Mode; + +namespace v2rayN.HttpProxyHandler +{ + /// + /// 提供PAC功能支持 + /// + class PACFileWatcherHandle + { + private static FileSystemWatcher fileSystemWatcher; + + private static long fileSize; + + public static void StartWatch(Config config) + { + if (fileSystemWatcher == null) + { + fileSystemWatcher = new FileSystemWatcher(Utils.StartupPath()); + fileSystemWatcher.Filter = "pac.txt"; + fileSystemWatcher.NotifyFilter = NotifyFilters.Size; + fileSystemWatcher.Changed += (sender, args) => + { + var fileInfo = new FileInfo(args.FullPath); + if (fileSize != fileInfo.Length) + { + fileSize = fileInfo.Length; + HttpProxyHandle.ReSetPACProxy(config); + } + + }; + } + fileSystemWatcher.EnableRaisingEvents = true; + } + + public static void StopWatch() + { + if (fileSystemWatcher != null) + { + fileSystemWatcher.EnableRaisingEvents = false; + } + } + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/PACListHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/PACListHandle.cs new file mode 100644 index 00000000..2d021a3b --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/PACListHandle.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Text; +using Newtonsoft.Json; +using v2rayN.Mode; +using v2rayN.Properties; + +namespace v2rayN.HttpProxyHandler +{ + /// + /// 提供PAC功能支持 + /// + class PACListHandle + { + public event EventHandler UpdateCompleted; + + public event ErrorEventHandler Error; + + public class ResultEventArgs : EventArgs + { + public bool Success; + + public ResultEventArgs(bool success) + { + this.Success = success; + } + } + + private const string GFWLIST_URL = "https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"; + + private static readonly IEnumerable IgnoredLineBegins = new[] { '!', '[' }; + + public void UpdatePACFromGFWList(Config config) + { + string url = GFWLIST_URL; + if (!Utils.IsNullOrEmpty(config.urlGFWList)) + { + url = config.urlGFWList; + } + + //默认用户已开启系统代理 + //var httpProxy = config.inbound.FirstOrDefault(x => x.protocol=="http"); + //if (httpProxy == null) + //{ + // throw new Exception("未发现HTTP代理,无法设置代理更新"); + //} + WebClient http = new WebClient(); + //http.Headers.Add("Connection", "Close"); + //http.Proxy = new WebProxy(IPAddress.Loopback.ToString(), httpProxy.localPort); + http.DownloadStringCompleted += http_DownloadStringCompleted; + http.DownloadStringAsync(new Uri(url)); + } + + private void http_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) + { + try + { + File.WriteAllText(Utils.GetTempPath("gfwlist.txt"), e.Result, Encoding.UTF8); + List lines = ParseResult(e.Result); + string abpContent = Utils.UnGzip(Resources.abp_js); + abpContent = abpContent.Replace("__RULES__", JsonConvert.SerializeObject(lines, Formatting.Indented)); + File.WriteAllText(Utils.GetPath(Global.pacFILE), abpContent, Encoding.UTF8); + if (UpdateCompleted != null) UpdateCompleted(this, new ResultEventArgs(true)); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + + if (Error != null) Error(this, new ErrorEventArgs(ex)); + } + } + + public static List ParseResult(string response) + { + byte[] bytes = Convert.FromBase64String(response); + string content = Encoding.UTF8.GetString(bytes); + List valid_lines = new List(); + using (var sr = new StringReader(content)) + { + foreach (var line in sr.NonWhiteSpaceLines()) + { + if (line.BeginWithAny(IgnoredLineBegins)) + continue; + valid_lines.Add(line); + } + } + return valid_lines; + } + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs new file mode 100644 index 00000000..01561103 --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/PACServerHandle.cs @@ -0,0 +1,188 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using v2rayN.Mode; +using v2rayN.Properties; +using v2rayN.Tool; + +namespace v2rayN.HttpProxyHandler +{ + /// + /// 提供PAC功能支持 + /// + class PACServerHandle + { + private static int pacPort = 0; + private static HttpWebServer server; + private static HttpWebServerB serverB; + + public static bool IsRunning + { + get + { + return (pacPort > 0); + } + } + + public static void Init(Config config) + { + //if (InitServer("*")) + //{ + // pacPort = Global.pacPort; + //} + if (InitServer("127.0.0.1")) + { + pacPort = Global.pacPort; + } + else if (InitServerB("127.0.0.1")) + { + pacPort = Global.pacPort; + } + else + { + Utils.SaveLog("Webserver init failed "); + pacPort = 0; + } + } + + private static bool InitServer(string address) + { + try + { + if (pacPort != Global.pacPort) + { + if (server != null) + { + server.Stop(); + server = null; + } + + if (server == null) + { + string prefixes = string.Format("http://{0}:{1}/pac/", address, Global.pacPort); + Utils.SaveLog("Webserver prefixes " + prefixes); + + server = new HttpWebServer(SendResponse, prefixes); + server.Run(); + + //pacPort = Global.pacPort; + } + } + Utils.SaveLog("Webserver at " + address); + } + catch (Exception ex) + { + Utils.SaveLog("Webserver InitServer " + ex.Message); + return false; + } + return true; + } + + public static bool InitServerB(string address) + { + try + { + if (pacPort != Global.pacPort) + { + if (serverB != null) + { + serverB.Stop(); + serverB = null; + } + + if (serverB == null) + { + serverB = new HttpWebServerB(Global.pacPort, SendResponse); + //pacPort = Global.pacPort; + } + } + Utils.SaveLog("WebserverB at " + address); + } + catch (Exception ex) + { + Utils.SaveLog("WebserverB InitServer " + ex.Message); + return false; + } + return true; + } + + public static string SendResponse(string address) + { + try + { + var pac = GetPacList(address); + return pac; + } + catch (Exception ex) + { + Utils.SaveLog("Webserver SendResponse " + ex.Message); + return ex.Message; + } + } + + public static void Stop() + { + //try + //{ + // if (server != null) + // { + // server.Stop(); + // server = null; + // } + //} + //catch (Exception ex) + //{ + // Utils.SaveLog("Webserver Stop " + ex.Message); + //} + + //try + //{ + // if (httpWebServer == null) + // { + // return; + // } + // foreach (var key in httpWebServer.Keys) + // { + // Utils.SaveLog("Webserver Stop " + key.ToString()); + // ((HttpWebServer)httpWebServer[key]).Stop(); + // } + // httpWebServer.Clear(); + //} + //catch (Exception ex) + //{ + // Utils.SaveLog("Webserver Stop " + ex.Message); + //} + } + + + private static string GetPacList(string address) + { + var port = Global.sysAgentPort; + if (port <= 0) + { + return "No port"; + } + try + { + List lstProxy = new List(); + lstProxy.Add(string.Format("PROXY {0}:{1};", address, port)); + var proxy = string.Join("", lstProxy.ToArray()); + + string strPacfile = Utils.GetPath(Global.pacFILE); + if (!File.Exists(strPacfile)) + { + FileManager.UncompressFile(strPacfile, Resources.pac_txt); + } + var pac = File.ReadAllText(strPacfile, Encoding.UTF8); + pac = pac.Replace("__PROXY__", proxy); + return pac; + } + catch + { + } + return "No pac content"; + } + + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs b/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs new file mode 100644 index 00000000..169ed1df --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs @@ -0,0 +1,215 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using v2rayN.Mode; +using v2rayN.Properties; +using v2rayN.Tool; + +namespace v2rayN.HttpProxyHandler +{ + /// + /// Privoxy处理类,提供http协议代理 + /// + class PrivoxyHandler + { + /// + /// 单例 + /// + private static PrivoxyHandler instance; + + private static int _uid; + private static string _uniqueConfigFile; + private static Job _privoxyJob; + private Process _process; + private int _runningPort; + private bool _isRunning; + + static PrivoxyHandler() + { + try + { + _uid = Application.StartupPath.GetHashCode(); // Currently we use ss's StartupPath to identify different Privoxy instance. + _uniqueConfigFile = string.Format("privoxy_{0}.conf", _uid); + _privoxyJob = new Job(); + + FileManager.UncompressFile(Utils.GetTempPath("v2ray_privoxy.exe"), Resources.privoxy_exe); + FileManager.UncompressFile(Utils.GetTempPath("mgwz.dll"), Resources.mgwz_dll); + } + catch (IOException ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + private PrivoxyHandler() + { + + } + + /// + /// 单例 + /// + public static PrivoxyHandler Instance + { + get + { + if (instance == null) + { + instance = new PrivoxyHandler(); + } + return instance; + } + } + + public int RunningPort + { + get + { + return _runningPort; + } + } + + public bool IsRunning + { + get + { + return _isRunning; + } + } + + public void Start(int localPort, Config config) + { + if (_process == null) + { + Process[] existingPrivoxy = Process.GetProcessesByName("v2ray_privoxy"); + foreach (Process p in existingPrivoxy.Where(IsChildProcess)) + { + KillProcess(p); + } + string privoxyConfig = Resources.privoxy_conf; + _runningPort = GetFreePort(localPort); + privoxyConfig = privoxyConfig.Replace("__SOCKS_PORT__", localPort.ToString()); + privoxyConfig = privoxyConfig.Replace("__PRIVOXY_BIND_PORT__", _runningPort.ToString()); + if (config.allowLANConn) + { + privoxyConfig = privoxyConfig.Replace("__PRIVOXY_BIND_IP__", "0.0.0.0"); + } + else + { + privoxyConfig = privoxyConfig.Replace("__PRIVOXY_BIND_IP__", "127.0.0.1"); + } + FileManager.ByteArrayToFile(Utils.GetTempPath(_uniqueConfigFile), Encoding.UTF8.GetBytes(privoxyConfig)); + + _process = new Process + { + // Configure the process using the StartInfo properties. + StartInfo = + { + FileName = "v2ray_privoxy.exe", + Arguments = _uniqueConfigFile, + WorkingDirectory = Utils.GetTempPath(), + WindowStyle = ProcessWindowStyle.Hidden, + UseShellExecute = true, + CreateNoWindow = true + } + }; + _process.Start(); + + /* + * Add this process to job obj associated with this ss process, so that + * when ss exit unexpectedly, this process will be forced killed by system. + */ + _privoxyJob.AddProcess(_process.Handle); + _isRunning = true; + } + } + + public void Stop() + { + if (_process != null) + { + KillProcess(_process); + _process.Dispose(); + _process = null; + _isRunning = false; + } + } + + private static void KillProcess(Process p) + { + try + { + p.CloseMainWindow(); + p.WaitForExit(100); + if (!p.HasExited) + { + p.Kill(); + p.WaitForExit(); + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + /* + * We won't like to kill other ss instances' v2ray_privoxy.exe. + * This function will check whether the given process is created + * by this process by checking the module path or command line. + * + * Since it's required to put ss in different dirs to run muti instances, + * different instance will create their unique "privoxy_UID.conf" where + * UID is hash of ss's location. + */ + + private static bool IsChildProcess(Process process) + { + try + { + /* + * Under PortableMode, we could identify it by the path of v2ray_privoxy.exe. + */ + var path = process.MainModule.FileName; + + return Utils.GetTempPath("v2ray_privoxy.exe").Equals(path); + + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + /* + * Sometimes Process.GetProcessesByName will return some processes that + * are already dead, and that will cause exceptions here. + * We could simply ignore those exceptions. + */ + //Logging.LogUsefulException(ex); + return false; + } + } + + private int GetFreePort(int localPort) + { + int defaultPort = 8123; + try + { + //// TCP stack please do me a favor + //TcpListener l = new TcpListener(IPAddress.Loopback, 0); + //l.Start(); + //var port = ((IPEndPoint)l.LocalEndpoint).Port; + //l.Stop(); + //return port; + return localPort + 1; + } + catch (Exception ex) + { + // in case access denied + Utils.SaveLog(ex.Message, ex); + return defaultPort; + } + } + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/ProxySetting.cs b/v2rayN/v2rayN/HttpProxyHandler/ProxySetting.cs new file mode 100644 index 00000000..638a1131 --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/ProxySetting.cs @@ -0,0 +1,187 @@ +using Microsoft.Win32; +using System; +using System.Runtime.InteropServices; + +namespace v2rayN.HttpProxyHandler +{ + class ProxySetting + { + public static bool UnsetProxy() + { + return SetProxy(null, null); + } + public static bool SetProxy(string strProxy) + { + return SetProxy(strProxy, null); + } + + public static bool SetProxy(string strProxy, string exceptions) + { + InternetPerConnOptionList list = new InternetPerConnOptionList(); + + int optionCount = Utils.IsNullOrEmpty(strProxy) ? 1 : (Utils.IsNullOrEmpty(exceptions) ? 2 : 3); + InternetConnectionOption[] options = new InternetConnectionOption[optionCount]; + // USE a proxy server ... + options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; + options[0].m_Value.m_Int = (int)((optionCount < 2) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY)); + // use THIS proxy server + if (optionCount > 1) + { + options[1].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; + options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(strProxy); + // except for these addresses ... + if (optionCount > 2) + { + options[2].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS; + options[2].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(exceptions); + } + } + + // default stuff + list.dwSize = Marshal.SizeOf(list); + list.szConnection = IntPtr.Zero; + list.dwOptionCount = options.Length; + list.dwOptionError = 0; + + + int optSize = Marshal.SizeOf(typeof(InternetConnectionOption)); + // make a pointer out of all that ... + IntPtr optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length); + // copy the array over into that spot in memory ... + for (int i = 0; i < options.Length; ++i) + { + IntPtr opt = new IntPtr(optionsPtr.ToInt32() + (i * optSize)); + Marshal.StructureToPtr(options[i], opt, false); + } + + list.options = optionsPtr; + + // and then make a pointer out of the whole list + IntPtr ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize); + Marshal.StructureToPtr(list, ipcoListPtr, false); + + // and finally, call the API method! + int returnvalue = NativeMethods.InternetSetOption(IntPtr.Zero, + InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, + ipcoListPtr, list.dwSize) ? -1 : 0; + if (returnvalue == 0) + { // get the error codes, they might be helpful + returnvalue = Marshal.GetLastWin32Error(); + } + // FREE the data ASAP + Marshal.FreeCoTaskMem(optionsPtr); + Marshal.FreeCoTaskMem(ipcoListPtr); + if (returnvalue > 0) + { // throw the error codes, they might be helpful + //throw new Win32Exception(Marshal.GetLastWin32Error()); + } + + return (returnvalue < 0); + } + + + #region WinInet structures + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct InternetPerConnOptionList + { + public int dwSize; // size of the INTERNET_PER_CONN_OPTION_LIST struct + public IntPtr szConnection; // connection name to set/query options + public int dwOptionCount; // number of options to set/query + public int dwOptionError; // on error, which option failed + //[MarshalAs(UnmanagedType.)] + public IntPtr options; + }; + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct InternetConnectionOption + { + static readonly int Size; + public PerConnOption m_Option; + public InternetConnectionOptionValue m_Value; + static InternetConnectionOption() + { + InternetConnectionOption.Size = Marshal.SizeOf(typeof(InternetConnectionOption)); + } + + // Nested Types + [StructLayout(LayoutKind.Explicit)] + public struct InternetConnectionOptionValue + { + // Fields + [FieldOffset(0)] + public System.Runtime.InteropServices.ComTypes.FILETIME m_FileTime; + [FieldOffset(0)] + public int m_Int; + [FieldOffset(0)] + public IntPtr m_StringPtr; + } + } + #endregion + + #region WinInet enums + // + // options manifests for Internet{Query|Set}Option + // + public enum InternetOption : uint + { + INTERNET_OPTION_PER_CONNECTION_OPTION = 75 + } + + // + // Options used in INTERNET_PER_CONN_OPTON struct + // + public enum PerConnOption + { + INTERNET_PER_CONN_FLAGS = 1, // Sets or retrieves the connection type. The Value member will contain one or more of the values from PerConnFlags + INTERNET_PER_CONN_PROXY_SERVER = 2, // Sets or retrieves a string containing the proxy servers. + INTERNET_PER_CONN_PROXY_BYPASS = 3, // Sets or retrieves a string containing the URLs that do not use the proxy server. + INTERNET_PER_CONN_AUTOCONFIG_URL = 4//, // Sets or retrieves a string containing the URL to the automatic configuration script. + + } + + // + // PER_CONN_FLAGS + // + [Flags] + public enum PerConnFlags + { + PROXY_TYPE_DIRECT = 0x00000001, // direct to net + PROXY_TYPE_PROXY = 0x00000002, // via named proxy + PROXY_TYPE_AUTO_PROXY_URL = 0x00000004, // autoproxy URL + PROXY_TYPE_AUTO_DETECT = 0x00000008 // use autoproxy detection + } + #endregion + + internal static class NativeMethods + { + [DllImport("WinInet.dll", SetLastError = true, CharSet = CharSet.Auto)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool InternetSetOption(IntPtr hInternet, InternetOption dwOption, IntPtr lpBuffer, int dwBufferLength); + } + + //判断是否使用代理 + public static bool UsedProxy() + { + RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true); + if (rk.GetValue("ProxyEnable").ToString() == "1") + { + rk.Close(); + return true; + } + else + { + rk.Close(); + return false; + } + } + //获得代理的IP和端口 + public static string GetProxyProxyServer() + { + RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true); + string ProxyServer = rk.GetValue("ProxyServer").ToString(); + rk.Close(); + return ProxyServer; + + } + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs new file mode 100644 index 00000000..a2397740 --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/SysProxyHandle.cs @@ -0,0 +1,182 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Text; +using Newtonsoft.Json; +using v2rayN.Mode; +using v2rayN.Properties; +using v2rayN.Tool; + +namespace v2rayN.HttpProxyHandler +{ + class SysProxyHandle + { + private const string _userWininetConfigFile = "user-wininet.json"; + + private static string _queryStr; + + // In general, this won't change + // format: + // + // + // + // + private static SysproxyConfig _userSettings = null; + + enum RET_ERRORS : int + { + RET_NO_ERROR = 0, + INVALID_FORMAT = 1, + NO_PERMISSION = 2, + SYSCALL_FAILED = 3, + NO_MEMORY = 4, + INVAILD_OPTION_COUNT = 5, + }; + + static SysProxyHandle() + { + try + { + FileManager.UncompressFile(Utils.GetTempPath("sysproxy.exe"), + Environment.Is64BitOperatingSystem ? Resources.sysproxy64_exe : Resources.sysproxy_exe); + } + catch (IOException ex) + { + Utils.SaveLog(ex.Message, ex); + + } + } + + public static void SetIEProxy(bool enable, bool global, string proxyServer, string pacURL) + { + Read(); + + if (!_userSettings.UserSettingsRecorded) + { + // record user settings + ExecSysproxy("query"); + ParseQueryStr(_queryStr); + } + + string arguments; + if (enable) + { + arguments = global + ? string.Format( + //"global {0} ;localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;172.32.*;192.168.*", + "global {0} ;localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;172.32.*", + proxyServer) + : string.Format("pac {0}", pacURL); + } + else + { + // restore user settings + var flags = _userSettings.Flags; + var proxy_server = _userSettings.ProxyServer ?? "-"; + var bypass_list = _userSettings.BypassList ?? "-"; + var pac_url = _userSettings.PacUrl ?? "-"; + arguments = string.Format("set {0} {1} {2} {3}", flags, proxy_server, bypass_list, pac_url); + + // have to get new settings + _userSettings.UserSettingsRecorded = false; + } + + Save(); + ExecSysproxy(arguments); + } + + private static void ExecSysproxy(string arguments) + { + using (var process = new Process()) + { + // Configure the process using the StartInfo properties. + process.StartInfo.FileName = Utils.GetTempPath("sysproxy.exe"); + process.StartInfo.Arguments = arguments; + process.StartInfo.WorkingDirectory = Utils.GetTempPath(); + process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; + process.StartInfo.UseShellExecute = false; + process.StartInfo.RedirectStandardError = true; + process.StartInfo.RedirectStandardOutput = true; + + // Need to provide encoding info, or output/error strings we got will be wrong. + process.StartInfo.StandardOutputEncoding = Encoding.Unicode; + process.StartInfo.StandardErrorEncoding = Encoding.Unicode; + + process.StartInfo.CreateNoWindow = true; + process.Start(); + + var stderr = process.StandardError.ReadToEnd(); + var stdout = process.StandardOutput.ReadToEnd(); + + process.WaitForExit(); + + var exitCode = process.ExitCode; + if (exitCode != (int)RET_ERRORS.RET_NO_ERROR) + { + throw new Exception(stderr); + } + + if (arguments == "query") + { + if (stdout.IsNullOrWhiteSpace() || stdout.IsNullOrEmpty()) + { + // we cannot get user settings + throw new Exception("failed to query wininet settings"); + } + _queryStr = stdout; + } + } + } + + private static void Save() + { + try + { + using (StreamWriter sw = new StreamWriter(File.Open(Utils.GetPath(_userWininetConfigFile), FileMode.Create))) + { + string jsonString = JsonConvert.SerializeObject(_userSettings, Formatting.Indented); + sw.Write(jsonString); + sw.Flush(); + } + } + catch (IOException ex) + { + Utils.SaveLog(ex.Message, ex); + } + } + + private static void Read() + { + try + { + string configContent = File.ReadAllText(Utils.GetPath(_userWininetConfigFile)); + _userSettings = JsonConvert.DeserializeObject(configContent); + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + // Suppress all exceptions. finally block will initialize new user config settings. + } + finally + { + if (_userSettings == null) _userSettings = new SysproxyConfig(); + } + } + + private static void ParseQueryStr(string str) + { + string[] userSettingsArr = str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); + _userSettings.Flags = userSettingsArr[0]; + + // handle output from WinINET + if (userSettingsArr[1] == "(null)") _userSettings.ProxyServer = null; + else _userSettings.ProxyServer = userSettingsArr[1]; + if (userSettingsArr[2] == "(null)") _userSettings.BypassList = null; + else _userSettings.BypassList = userSettingsArr[2]; + if (userSettingsArr[3] == "(null)") _userSettings.PacUrl = null; + else _userSettings.PacUrl = userSettingsArr[3]; + + _userSettings.UserSettingsRecorded = true; + } + } +} diff --git a/v2rayN/v2rayN/HttpProxyHandler/WebClientEx.cs b/v2rayN/v2rayN/HttpProxyHandler/WebClientEx.cs new file mode 100644 index 00000000..2ce644d5 --- /dev/null +++ b/v2rayN/v2rayN/HttpProxyHandler/WebClientEx.cs @@ -0,0 +1,22 @@ +using System; +using System.Net; + +namespace v2rayN.HttpProxyHandler +{ + class WebClientEx : WebClient + { + public int Timeout { get; set; } + public WebClientEx(int timeout = 3000) + { + Timeout = timeout; + } + + + protected override WebRequest GetWebRequest(Uri address) + { + var request = base.GetWebRequest(address); + request.Timeout = Timeout; + return request; + } + } +} diff --git a/v2rayN/v2rayN/LIB/Google.Protobuf.dll b/v2rayN/v2rayN/LIB/Google.Protobuf.dll new file mode 100644 index 00000000..596878f0 Binary files /dev/null and b/v2rayN/v2rayN/LIB/Google.Protobuf.dll differ diff --git a/v2rayN/v2rayN/LIB/Grpc.Core.Api.dll b/v2rayN/v2rayN/LIB/Grpc.Core.Api.dll new file mode 100644 index 00000000..c2dfadc2 Binary files /dev/null and b/v2rayN/v2rayN/LIB/Grpc.Core.Api.dll differ diff --git a/v2rayN/v2rayN/LIB/Grpc.Core.dll b/v2rayN/v2rayN/LIB/Grpc.Core.dll new file mode 100644 index 00000000..9413b6e5 Binary files /dev/null and b/v2rayN/v2rayN/LIB/Grpc.Core.dll differ diff --git a/v2rayN/v2rayN/LIB/Newtonsoft.Json.dll b/v2rayN/v2rayN/LIB/Newtonsoft.Json.dll new file mode 100644 index 00000000..71ae7e6c Binary files /dev/null and b/v2rayN/v2rayN/LIB/Newtonsoft.Json.dll differ diff --git a/v2rayN/v2rayN/LIB/System.Buffers.dll b/v2rayN/v2rayN/LIB/System.Buffers.dll new file mode 100644 index 00000000..b6d9c778 Binary files /dev/null and b/v2rayN/v2rayN/LIB/System.Buffers.dll differ diff --git a/v2rayN/v2rayN/LIB/System.Memory.dll b/v2rayN/v2rayN/LIB/System.Memory.dll new file mode 100644 index 00000000..bdfc501e Binary files /dev/null and b/v2rayN/v2rayN/LIB/System.Memory.dll differ diff --git a/v2rayN/v2rayN/LIB/System.Runtime.CompilerServices.Unsafe.dll b/v2rayN/v2rayN/LIB/System.Runtime.CompilerServices.Unsafe.dll new file mode 100644 index 00000000..31562392 Binary files /dev/null and b/v2rayN/v2rayN/LIB/System.Runtime.CompilerServices.Unsafe.dll differ diff --git a/v2rayN/v2rayN/LIB/grpc_csharp_ext.x64.dll b/v2rayN/v2rayN/LIB/grpc_csharp_ext.x64.dll new file mode 100644 index 00000000..8c10df69 Binary files /dev/null and b/v2rayN/v2rayN/LIB/grpc_csharp_ext.x64.dll differ diff --git a/v2rayN/v2rayN/LIB/grpc_csharp_ext.x86.dll b/v2rayN/v2rayN/LIB/grpc_csharp_ext.x86.dll new file mode 100644 index 00000000..dd3876df Binary files /dev/null and b/v2rayN/v2rayN/LIB/grpc_csharp_ext.x86.dll differ diff --git a/v2rayN/v2rayN/LIB/netstandard.dll b/v2rayN/v2rayN/LIB/netstandard.dll new file mode 100644 index 00000000..1f1ab22c Binary files /dev/null and b/v2rayN/v2rayN/LIB/netstandard.dll differ diff --git a/v2rayN/v2rayN/LIB/zxing.dll b/v2rayN/v2rayN/LIB/zxing.dll new file mode 100644 index 00000000..7b99de64 Binary files /dev/null and b/v2rayN/v2rayN/LIB/zxing.dll differ diff --git a/v2rayN/v2rayN/LIB/zxing.presentation.dll b/v2rayN/v2rayN/LIB/zxing.presentation.dll new file mode 100644 index 00000000..8ad3f9bf Binary files /dev/null and b/v2rayN/v2rayN/LIB/zxing.presentation.dll differ diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs new file mode 100644 index 00000000..47b21e78 --- /dev/null +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -0,0 +1,519 @@ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace v2rayN.Mode +{ + /// + /// 本软件配置文件实体类 + /// + [Serializable] + public class Config + { + /// + /// 本地监听 + /// + public List inbound { get; set; } + + /// + /// 允许日志 + /// + public bool logEnabled { get; set; } + + /// + /// 日志等级 + /// + public string loglevel { get; set; } + + /// + /// 活动配置序号 + /// + public int index { get; set; } + + /// + /// vmess服务器信息 + /// + public List vmess { get; set; } + + /// + /// 允许Mux多路复用 + /// + public bool muxEnabled { get; set; } + + /// + /// 域名解析策略 + /// + public string domainStrategy { get; set; } + + /// + /// 路由模式 + /// + public string routingMode { get; set; } + + /// + /// 用户自定义需代理的网址或ip + /// + public List useragent { get; set; } + + /// + /// 用户自定义直连的网址或ip + /// + public List userdirect { get; set; } + + /// + /// 用户自定义阻止的网址或ip + /// + public List userblock { get; set; } + + /// + /// KcpItem + /// + public KcpItem kcpItem { get; set; } + + + /// + /// 启用Http代理 + /// + public bool sysAgentEnabled { get; set; } + + /// + /// 监听状态 0-不改变 1-全局 2-PAC + /// + public int listenerType { get; set; } + + /// + /// 自定义GFWList url + /// + public string urlGFWList { get; set; } + + /// + /// 允许来自局域网的连接 + /// + public bool allowLANConn { get; set; } + + /// + /// 启用实时网速和流量统计 + /// + public bool enableStatistics { get; set; } + + /// + /// 视图刷新率 + /// + public int statisticsFreshRate { get; set; } + + /// + /// 统计数据缓存天数 [0, 30] + /// * 0 关闭单独每天使用流量的缓存 + /// * 无论如何不会关闭总流量的缓存 + /// + private uint cacheDays; + public uint CacheDays { + get { return cacheDays; } + set + { + if (value < 0) cacheDays = 0; + else if (value > 30) cacheDays = 30; + else cacheDays = value; + } + } + + /// + /// 自定义远程DNS + /// + public string remoteDNS { get; set; } + /// + /// 订阅 + /// + public List subItem { get; set; } + /// + /// UI + /// + public UIItem uiItem { get; set; } + + #region 函数 + + public string address() + { + if (index < 0) + { + return string.Empty; + } + return vmess[index].address.TrimEx(); + } + + public int port() + { + if (index < 0) + { + return 10808; + } + return vmess[index].port; + } + + public string id() + { + if (index < 0) + { + return string.Empty; + } + return vmess[index].id.TrimEx(); + } + + public int alterId() + { + if (index < 0) + { + return 0; + } + return vmess[index].alterId; + } + + public string security() + { + if (index < 0) + { + return string.Empty; + } + return vmess[index].security.TrimEx(); + } + + public string remarks() + { + if (index < 0) + { + return string.Empty; + } + return vmess[index].remarks.TrimEx(); + } + public string network() + { + if (index < 0 || Utils.IsNullOrEmpty(vmess[index].network)) + { + return Global.DefaultNetwork; + } + return vmess[index].network.TrimEx(); + } + public string headerType() + { + if (index < 0 || Utils.IsNullOrEmpty(vmess[index].headerType)) + { + return Global.None; + } + return vmess[index].headerType.Replace(" ", "").TrimEx(); + } + public string requestHost() + { + if (index < 0 || Utils.IsNullOrEmpty(vmess[index].requestHost)) + { + return string.Empty; + } + return vmess[index].requestHost.Replace(" ", "").TrimEx(); + } + public string path() + { + if (index < 0 || Utils.IsNullOrEmpty(vmess[index].path)) + { + return string.Empty; + } + return vmess[index].path.Replace(" ", "").TrimEx(); + } + public string streamSecurity() + { + if (index < 0 || Utils.IsNullOrEmpty(vmess[index].streamSecurity)) + { + return string.Empty; + } + return vmess[index].streamSecurity; + } + public bool allowInsecure() + { + if (index < 0 || Utils.IsNullOrEmpty(vmess[index].allowInsecure)) + { + return true; + } + return Convert.ToBoolean(vmess[index].allowInsecure); + } + + public int GetLocalPort(string protocol) + { + int localPort = 0; + foreach (InItem inItem in inbound) + { + if (inItem.protocol.Equals(protocol)) + { + localPort = inItem.localPort; + break; + } + } + return localPort; + } + + public int configType() + { + if (index < 0) + { + return 0; + } + return vmess[index].configType; + } + + public string getSummary() + { + if (index < 0) + { + return string.Empty; + } + return vmess[index].getSummary(); + } + + #endregion + + } + + [Serializable] + public class VmessItem + { + public VmessItem() + { + configVersion = 1; + address = string.Empty; + port = 0; + id = string.Empty; + alterId = 0; + security = string.Empty; + network = string.Empty; + remarks = string.Empty; + headerType = string.Empty; + requestHost = string.Empty; + path = string.Empty; + streamSecurity = string.Empty; + allowInsecure = string.Empty; + configType = (int)EConfigType.Vmess; + testResult = string.Empty; + subid = string.Empty; + } + + public string getSummary() + { + string summary = string.Empty; + summary = string.Format("{0}-", ((EConfigType)configType).ToString()); + string[] arrAddr = address.Split('.'); + string addr = string.Empty; + if (arrAddr.Length > 2) + { + addr = $"{arrAddr[0]}***{arrAddr[arrAddr.Length - 1]}"; + } + else if (arrAddr.Length > 1) + { + addr = $"***{arrAddr[arrAddr.Length - 1]}"; + } + else + { + addr = address; + } + if (configType == (int)EConfigType.Vmess) + { + summary += string.Format("{0}({1}:{2})", remarks, addr, port); + } + else if (configType == (int)EConfigType.Shadowsocks) + { + summary += string.Format("{0}({1}:{2})", remarks, addr, port); + } + else if (configType == (int)EConfigType.Socks) + { + summary += string.Format("{0}({1}:{2})", remarks, addr, port); + } + else + { + summary += string.Format("{0}", remarks); + } + return summary; + } + public string getSubRemarks(Config config) + { + string subRemarks = string.Empty; + if (Utils.IsNullOrEmpty(subid)) + { + return subRemarks; + } + foreach (SubItem sub in config.subItem) + { + if (sub.id.EndsWith(subid)) + { + return sub.remarks; + } + } + if (subid.Length <= 4) + { + return subid; + } + return subid.Substring(0, 4); + } + /// + /// 版本(现在=2) + /// + public int configVersion { get; set; } + + /// + /// 远程服务器地址 + /// + public string address { get; set; } + /// + /// 远程服务器端口 + /// + public int port { get; set; } + /// + /// 远程服务器ID + /// + public string id { get; set; } + /// + /// 远程服务器额外ID + /// + public int alterId { get; set; } + /// + /// 本地安全策略 + /// + public string security { get; set; } + /// + /// tcp,kcp,ws + /// + public string network { get; set; } + /// + /// 备注或别名 + /// + public string remarks { get; set; } + + /// + /// 伪装类型 + /// + public string headerType { get; set; } + + /// + /// 伪装的域名 + /// + public string requestHost { get; set; } + + /// + /// ws h2 path + /// + public string path { get; set; } + + /// + /// 底层传输安全 + /// + public string streamSecurity { get; set; } + + /// + /// 是否允许不安全连接(用于客户端) + /// + public string allowInsecure { get; set; } + + + /// + /// config type(1=normal,2=custom) + /// + public int configType { get; set; } + + /// + /// + /// + public string testResult { get; set; } + + /// + /// SubItem id + /// + public string subid { get; set; } + } + + [Serializable] + public class InItem + { + /// + /// 本地监听端口 + /// + public int localPort { get; set; } + + /// + /// 协议,默认为socks + /// + public string protocol { get; set; } + + /// + /// 允许udp + /// + public bool udpEnabled { get; set; } + + /// + /// 开启流量探测 + /// + public bool sniffingEnabled { get; set; } = true; + } + + [Serializable] + public class KcpItem + { + /// + /// + /// + public int mtu { get; set; } + /// + /// + /// + public int tti { get; set; } + /// + /// + /// + public int uplinkCapacity { get; set; } + /// + /// + /// + public int downlinkCapacity { get; set; } + /// + /// + /// + public bool congestion { get; set; } + /// + /// + /// + public int readBufferSize { get; set; } + /// + /// + /// + public int writeBufferSize { get; set; } + } + + + [Serializable] + public class SubItem + { + /// + /// + /// + public string id { get; set; } + + /// + /// 备注 + /// + public string remarks { get; set; } + + /// + /// url + /// + public string url { get; set; } + + /// + /// enable + /// + public bool enabled { get; set; } = true; + } + + [Serializable] + public class UIItem + { + /// + /// + /// + public int mainQRCodeWidth { get; set; } = 600; + + } +} diff --git a/v2rayN/v2rayN/Mode/EConfigType.cs b/v2rayN/v2rayN/Mode/EConfigType.cs new file mode 100644 index 00000000..733c8556 --- /dev/null +++ b/v2rayN/v2rayN/Mode/EConfigType.cs @@ -0,0 +1,11 @@ + +namespace v2rayN.Mode +{ + public enum EConfigType + { + Vmess = 1, + Custom = 2, + Shadowsocks = 3, + Socks = 4 + } +} diff --git a/v2rayN/v2rayN/Mode/EMove.cs b/v2rayN/v2rayN/Mode/EMove.cs new file mode 100644 index 00000000..7f67d5b1 --- /dev/null +++ b/v2rayN/v2rayN/Mode/EMove.cs @@ -0,0 +1,11 @@ + +namespace v2rayN.Mode +{ + public enum EMove + { + Top = 1, + Up = 2, + Down = 3, + Bottom = 4 + } +} diff --git a/v2rayN/v2rayN/Mode/ServerStatistics.cs b/v2rayN/v2rayN/Mode/ServerStatistics.cs new file mode 100644 index 00000000..27d3673c --- /dev/null +++ b/v2rayN/v2rayN/Mode/ServerStatistics.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace v2rayN.Mode +{ + class ServerStatistics + { + public string name; + public string address; + public int port; + public string path; + public string host; + public ulong totalUp; + public ulong totalDown; + public ulong todayUp; + public ulong todayDown; + + public ServerStatistics() { } + public ServerStatistics(string name, string addr, int port, string path, string host, ulong totalUp, ulong totalDown, ulong todayUp, ulong todayDown) + { + this.name = name; + this.address = addr; + this.port = port; + this.path = path; + this.host = host; + this.totalUp = totalUp; + this.totalDown = totalDown; + this.todayUp = todayUp; + this.todayDown = todayDown; + } + } +} diff --git a/v2rayN/v2rayN/Mode/SysproxyConfig.cs b/v2rayN/v2rayN/Mode/SysproxyConfig.cs new file mode 100644 index 00000000..8b0d0097 --- /dev/null +++ b/v2rayN/v2rayN/Mode/SysproxyConfig.cs @@ -0,0 +1,21 @@ + +namespace v2rayN.Mode +{ + class SysproxyConfig + { + public bool UserSettingsRecorded; + public string Flags; + public string ProxyServer; + public string BypassList; + public string PacUrl; + + public SysproxyConfig() + { + UserSettingsRecorded = false; + Flags = "1"; + ProxyServer = ""; + BypassList = ""; + PacUrl = ""; + } + } +} diff --git a/v2rayN/v2rayN/Mode/V2rayConfig.cs b/v2rayN/v2rayN/Mode/V2rayConfig.cs new file mode 100644 index 00000000..3a25ac0d --- /dev/null +++ b/v2rayN/v2rayN/Mode/V2rayConfig.cs @@ -0,0 +1,515 @@ +using System.Collections.Generic; + +namespace v2rayN.Mode +{ + /// + /// v2ray配置文件实体类 + /// 例子SampleConfig.txt + /// + public class V2rayConfig + { + /// + /// 日志配置 + /// + public Log log { get; set; } + /// + /// 传入连接配置 + /// + public List inbounds { get; set; } + /// + /// 传出连接配置 + /// + public List outbounds { get; set; } + + /// + /// 统计需要, 空对象 + /// + public Stats stats { get; set; } + + /// + public API api { get; set; } + + /// + public Policy policy; + + /// + /// DNS 配置 + /// + public Dns dns { get; set; } + /// + /// 路由配置 + /// + public Routing routing { get; set; } + } + + public class Stats { }; + + public class API + { + public string tag { get; set; } + public List services { get; set; } + } + + public class Policy + { + public SystemPolicy system; + } + + public class SystemPolicy + { + public bool statsInboundUplink; + public bool statsInboundDownlink; + } + + public class Log + { + /// + /// + /// + public string access { get; set; } + /// + /// + /// + public string error { get; set; } + /// + /// + /// + public string loglevel { get; set; } + } + + public class Inbounds + { + public string tag { get; set; } + /// + /// + /// + public int port { get; set; } + /// + /// + /// + public string listen { get; set; } + /// + /// + /// + public string protocol { get; set; } + /// + /// + /// + public Sniffing sniffing { get; set; } + /// + /// + /// + public Inboundsettings settings { get; set; } + + /// + /// + /// + public StreamSettings streamSettings { get; set; } + + } + + public class Inboundsettings + { + /// + /// + /// + public string auth { get; set; } + /// + /// + /// + public bool udp { get; set; } + /// + /// + /// + public string ip { get; set; } + + /// + /// api 使用 + /// + public string address { get; set; } + + /// + /// + /// + public List clients { get; set; } + } + + public class UsersItem + { + /// + /// + /// + public string id { get; set; } + /// + /// + /// + public int alterId { get; set; } + /// + /// + /// + public string email { get; set; } + /// + /// + /// + public string security { get; set; } + } + public class Sniffing + { + /// + /// + /// + public bool enabled { get; set; } + /// + /// + /// + public List destOverride { get; set; } + } + + public class Outbounds + { + /// + /// 默认值agentout + /// + public string tag { get; set; } + /// + /// + /// + public string protocol { get; set; } + /// + /// + /// + public Outboundsettings settings { get; set; } + /// + /// + /// + public StreamSettings streamSettings { get; set; } + /// + /// + /// + public Mux mux { get; set; } + } + + public class Outboundsettings + { + /// + /// + /// + public List vnext { get; set; } + /// + /// + /// + public List servers { get; set; } + + /// + /// + /// + public Response response { get; set; } + } + + public class VnextItem + { + /// + /// + /// + public string address { get; set; } + /// + /// + /// + public int port { get; set; } + /// + /// + /// + public List users { get; set; } + } + public class ServersItem + { + /// + /// + /// + public string email { get; set; } + /// + /// + /// + public string address { get; set; } + /// + /// + /// + public string method { get; set; } + /// + /// + /// + public bool ota { get; set; } + /// + /// + /// + public string password { get; set; } + /// + /// + /// + public int port { get; set; } + /// + /// + /// + public int level { get; set; } + + /// + /// + /// + public List users { get; set; } + } + + public class SocksUsersItem + { + /// + /// + /// + public string user { get; set; } + /// + /// + /// + public string pass { get; set; } + /// + /// + /// + public int level { get; set; } + } + + + public class Mux + { + /// + /// + /// + public bool enabled { get; set; } + } + + public class Response + { + /// + /// + /// + public string type { get; set; } + } + + public class Dns + { + /// + /// + /// + public List servers { get; set; } + } + + public class RulesItem + { + /// + /// + /// + public string type { get; set; } + /// + /// + /// + public string port { get; set; } + + public string inboundTag { get; set; } + /// + /// + /// + public string outboundTag { get; set; } + + /// + /// + /// + public List ip { get; set; } + + /// + /// + /// + public List domain { get; set; } + } + + public class Routing + { + /// + /// + /// + public string domainStrategy { get; set; } + /// + /// + /// + public List rules { get; set; } + } + + public class StreamSettings + { + /// + /// + /// + public string network { get; set; } + /// + /// + /// + public string security { get; set; } + + /// + /// + /// + public TlsSettings tlsSettings { get; set; } + + /// + /// Tcp传输额外设置 + /// + public TcpSettings tcpSettings { get; set; } + /// + /// Kcp传输额外设置 + /// + public KcpSettings kcpSettings { get; set; } + /// + /// ws传输额外设置 + /// + public WsSettings wsSettings { get; set; } + /// + /// h2传输额外设置 + /// + public HttpSettings httpSettings { get; set; } + + /// + /// QUIC + /// + public QuicSettings quicSettings { get; set; } + + } + + public class TlsSettings + { + /// + /// 是否允许不安全连接(用于客户端) + /// + public bool allowInsecure { get; set; } + + /// + /// + /// + public string serverName { get; set; } + } + + public class TcpSettings + { + /// + /// 是否重用 TCP 连接 + /// + public bool connectionReuse { get; set; } + /// + /// 数据包头部伪装设置 + /// + public Header header { get; set; } + } + + public class Header + { + /// + /// 伪装 + /// + public string type { get; set; } + /// + /// 结构复杂,直接存起来 + /// + public object request { get; set; } + /// + /// 结构复杂,直接存起来 + /// + public object response { get; set; } + } + + public class KcpSettings + { + /// + /// + /// + public int mtu { get; set; } + /// + /// + /// + public int tti { get; set; } + /// + /// + /// + public int uplinkCapacity { get; set; } + /// + /// + /// + public int downlinkCapacity { get; set; } + /// + /// + /// + public bool congestion { get; set; } + /// + /// + /// + public int readBufferSize { get; set; } + /// + /// + /// + public int writeBufferSize { get; set; } + /// + /// + /// + public Header header { get; set; } + } + + public class WsSettings + { + /// + /// + /// + public bool connectionReuse { get; set; } + + /// + /// + /// + public string path { get; set; } + + /// + /// + /// + public Headers headers { get; set; } + } + public class Headers + { + /// + /// + /// + public string Host { get; set; } + } + + public class HttpSettings + { + /// + /// + /// + public string path { get; set; } + + /// + /// + /// + public List host { get; set; } + + } + + public class QuicSettings + { + /// + /// + /// + public string security { get; set; } + /// + /// + /// + public string key { get; set; } + + /// + /// + /// + public Header header { get; set; } + } + +} diff --git a/v2rayN/v2rayN/Mode/V2rayTcpRequest.cs b/v2rayN/v2rayN/Mode/V2rayTcpRequest.cs new file mode 100644 index 00000000..4a4e863d --- /dev/null +++ b/v2rayN/v2rayN/Mode/V2rayTcpRequest.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; + +namespace v2rayN.Mode +{ + /// + /// Tcp伪装http的Request,只要Host + /// + public class V2rayTcpRequest + { + /// + /// + /// + public RequestHeaders headers { get; set; } + } + + public class RequestHeaders + { + /// + /// + /// + public List Host { get; set; } + } + + +} diff --git a/v2rayN/v2rayN/Mode/VmessQRCode.cs b/v2rayN/v2rayN/Mode/VmessQRCode.cs new file mode 100644 index 00000000..0a9cc8ab --- /dev/null +++ b/v2rayN/v2rayN/Mode/VmessQRCode.cs @@ -0,0 +1,53 @@ +using System; + +namespace v2rayN.Mode +{ + [Serializable] + class VmessQRCode + { + /// + /// 版本 + /// + public string v { get; set; } = string.Empty; + /// + /// 备注 + /// + public string ps { get; set; } = string.Empty; + /// + /// 远程服务器地址 + /// + public string add { get; set; } = string.Empty; + /// + /// 远程服务器端口 + /// + public string port { get; set; } = string.Empty; + /// + /// 远程服务器ID + /// + public string id { get; set; } = string.Empty; + /// + /// 远程服务器额外ID + /// + public string aid { get; set; } = string.Empty; + /// + /// 传输协议tcp,kcp,ws + /// + public string net { get; set; } = string.Empty; + /// + /// 伪装类型 + /// + public string type { get; set; } = string.Empty; + /// + /// 伪装的域名 + /// + public string host { get; set; } = string.Empty; + /// + /// path + /// + public string path { get; set; } = string.Empty; + /// + /// 底层传输安全 + /// + public string tls { get; set; } = string.Empty; + } +} diff --git a/v2rayN/v2rayN/Program.cs b/v2rayN/v2rayN/Program.cs new file mode 100644 index 00000000..0f32d796 --- /dev/null +++ b/v2rayN/v2rayN/Program.cs @@ -0,0 +1,104 @@ +using System; +using System.Diagnostics; +using System.Reflection; +using System.Windows.Forms; +using v2rayN.Forms; + +namespace v2rayN +{ + static class Program + { + [System.Runtime.InteropServices.DllImport("user32.dll")] + private static extern bool SetProcessDPIAware(); + + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + if (Environment.OSVersion.Version.Major >= 6) + { + SetProcessDPIAware(); + } + + Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); + Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); + AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); + + AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; + + + Process instance = RunningInstance(); + if (instance == null) + { + Utils.SaveLog("v2rayN start up"); + + //设置语言环境 + string lang = Utils.RegReadValue(Global.MyRegPath, Global.MyRegKeyLanguage, "zh-Hans"); + System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang); + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } + else + { + UI.Show($"v2rayN is already running(v2rayN已经运行)"); + } + } + + private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) + { + try + { + string resourceName = "v2rayN.LIB." + new AssemblyName(args.Name).Name + ".dll"; + using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) + { + if (stream == null) + { + return null; + } + byte[] assemblyData = new byte[stream.Length]; + stream.Read(assemblyData, 0, assemblyData.Length); + return Assembly.Load(assemblyData); + } + } + catch + { + return null; + } + } + + /// + /// 获取正在运行的实例,没有运行的实例返回null; + /// + public static Process RunningInstance() + { + Process current = Process.GetCurrentProcess(); + Process[] processes = Process.GetProcessesByName(current.ProcessName); + foreach (Process process in processes) + { + if (process.Id != current.Id) + { + if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == process.MainModule.FileName) + { + return process; + } + } + } + return null; + } + + static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) + { + Utils.SaveLog("Application_ThreadException", e.Exception); + } + + static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + Utils.SaveLog("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject); + } + + } +} diff --git a/v2rayN/v2rayN/Properties/AssemblyInfo.cs b/v2rayN/v2rayN/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..789bb76b --- /dev/null +++ b/v2rayN/v2rayN/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过以下 +// 特性集控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("v2rayN")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("v2rayN")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 使此程序集中的类型 +// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, +// 则将该类型上的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("72d9f089-5e7a-4c5f-be0a-8a211536b483")] + +// 程序集的版本信息由下面四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: +//[assembly: AssemblyVersion("1.0.*")] +//[assembly: AssemblyVersion("1.0.0")] +[assembly: AssemblyFileVersion("2.43")] diff --git a/v2rayN/v2rayN/Properties/Resources.Designer.cs b/v2rayN/v2rayN/Properties/Resources.Designer.cs new file mode 100644 index 00000000..3935f663 --- /dev/null +++ b/v2rayN/v2rayN/Properties/Resources.Designer.cs @@ -0,0 +1,239 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace v2rayN.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("v2rayN.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性 + /// 重写当前线程的 CurrentUICulture 属性。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap about { + get { + object obj = ResourceManager.GetObject("about", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] abp_js { + get { + object obj = ResourceManager.GetObject("abp_js", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap checkupdate { + get { + object obj = ResourceManager.GetObject("checkupdate", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap help { + get { + object obj = ResourceManager.GetObject("help", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] mgwz_dll { + get { + object obj = ResourceManager.GetObject("mgwz_dll", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap minimize { + get { + object obj = ResourceManager.GetObject("minimize", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap notify { + get { + object obj = ResourceManager.GetObject("notify", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap option { + get { + object obj = ResourceManager.GetObject("option", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] pac_txt { + get { + object obj = ResourceManager.GetObject("pac_txt", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找类似 listen-address __PRIVOXY_BIND_IP__:__PRIVOXY_BIND_PORT__ + ///toggle 0 + ///logfile v2ray_privoxy.log + ///show-on-task-bar 0 + ///activity-animation 0 + ///forward-socks5 / 127.0.0.1:__SOCKS_PORT__ . + ///hide-console + /// 的本地化字符串。 + /// + internal static string privoxy_conf { + get { + return ResourceManager.GetString("privoxy_conf", resourceCulture); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] privoxy_exe { + get { + object obj = ResourceManager.GetObject("privoxy_exe", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap promotion { + get { + object obj = ResourceManager.GetObject("promotion", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap restart { + get { + object obj = ResourceManager.GetObject("restart", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap server { + get { + object obj = ResourceManager.GetObject("server", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap sub { + get { + object obj = ResourceManager.GetObject("sub", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] sysproxy_exe { + get { + object obj = ResourceManager.GetObject("sysproxy_exe", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// 查找 System.Byte[] 类型的本地化资源。 + /// + internal static byte[] sysproxy64_exe { + get { + object obj = ResourceManager.GetObject("sysproxy64_exe", resourceCulture); + return ((byte[])(obj)); + } + } + } +} diff --git a/v2rayN/v2rayN/Properties/Resources.resx b/v2rayN/v2rayN/Properties/Resources.resx new file mode 100644 index 00000000..f69a06b9 --- /dev/null +++ b/v2rayN/v2rayN/Properties/Resources.resx @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\about.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\abp.js.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\resources\checkupdate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\mgwz.dll.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\minimize.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\notify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\option.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\pac.txt.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\resources\privoxy_conf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312 + + + ..\resources\privoxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\resources\promotion.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\restart.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\server.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\sub.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\sysproxy64.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\sysproxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Properties/Settings.Designer.cs b/v2rayN/v2rayN/Properties/Settings.Designer.cs new file mode 100644 index 00000000..62dd9b42 --- /dev/null +++ b/v2rayN/v2rayN/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace v2rayN.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/v2rayN/v2rayN/Properties/Settings.settings b/v2rayN/v2rayN/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/v2rayN/v2rayN/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/v2rayN/v2rayN/Protos/Statistics.proto b/v2rayN/v2rayN/Protos/Statistics.proto new file mode 100644 index 00000000..1dd4f2b0 --- /dev/null +++ b/v2rayN/v2rayN/Protos/Statistics.proto @@ -0,0 +1,53 @@ +syntax = "proto3"; + +package v2ray.core.app.stats.command; +option csharp_namespace = "v2rayN.Protos.Statistics"; + +message GetStatsRequest { + // Name of the stat counter. + string name = 1; + // Whether or not to reset the counter to fetching its value. + bool reset = 2; +} + +message Stat { + string name = 1; + int64 value = 2; +} + +message GetStatsResponse { + Stat stat = 1; +} + +message QueryStatsRequest { + string pattern = 1; + bool reset = 2; +} + +message QueryStatsResponse { + repeated Stat stat = 1; +} + +message SysStatsRequest { +} + +message SysStatsResponse { + uint32 NumGoroutine = 1; + uint32 NumGC = 2; + uint64 Alloc = 3; + uint64 TotalAlloc = 4; + uint64 Sys = 5; + uint64 Mallocs = 6; + uint64 Frees = 7; + uint64 LiveObjects = 8; + uint64 PauseTotalNs = 9; + uint32 Uptime = 10; +} + +service StatsService { + rpc GetStats(GetStatsRequest) returns (GetStatsResponse) {} + rpc QueryStats(QueryStatsRequest) returns (QueryStatsResponse) {} + rpc GetSysStats(SysStatsRequest) returns (SysStatsResponse) {} +} + +message Config {} diff --git a/v2rayN/v2rayN/Resources/about.png b/v2rayN/v2rayN/Resources/about.png new file mode 100644 index 00000000..48fa6b1b Binary files /dev/null and b/v2rayN/v2rayN/Resources/about.png differ diff --git a/v2rayN/v2rayN/Resources/abp.js.gz b/v2rayN/v2rayN/Resources/abp.js.gz new file mode 100644 index 00000000..0577c7f5 Binary files /dev/null and b/v2rayN/v2rayN/Resources/abp.js.gz differ diff --git a/v2rayN/v2rayN/Resources/checkupdate.png b/v2rayN/v2rayN/Resources/checkupdate.png new file mode 100644 index 00000000..bc1fade1 Binary files /dev/null and b/v2rayN/v2rayN/Resources/checkupdate.png differ diff --git a/v2rayN/v2rayN/Resources/help.png b/v2rayN/v2rayN/Resources/help.png new file mode 100644 index 00000000..03691a42 Binary files /dev/null and b/v2rayN/v2rayN/Resources/help.png differ diff --git a/v2rayN/v2rayN/Resources/mgwz.dll.gz b/v2rayN/v2rayN/Resources/mgwz.dll.gz new file mode 100644 index 00000000..40a33e5d Binary files /dev/null and b/v2rayN/v2rayN/Resources/mgwz.dll.gz differ diff --git a/v2rayN/v2rayN/Resources/minimize.png b/v2rayN/v2rayN/Resources/minimize.png new file mode 100644 index 00000000..82ee86e4 Binary files /dev/null and b/v2rayN/v2rayN/Resources/minimize.png differ diff --git a/v2rayN/v2rayN/Resources/notify.png b/v2rayN/v2rayN/Resources/notify.png new file mode 100644 index 00000000..4752fe64 Binary files /dev/null and b/v2rayN/v2rayN/Resources/notify.png differ diff --git a/v2rayN/v2rayN/Resources/option.png b/v2rayN/v2rayN/Resources/option.png new file mode 100644 index 00000000..a0973e58 Binary files /dev/null and b/v2rayN/v2rayN/Resources/option.png differ diff --git a/v2rayN/v2rayN/Resources/pac.txt b/v2rayN/v2rayN/Resources/pac.txt new file mode 100644 index 00000000..4bed057c --- /dev/null +++ b/v2rayN/v2rayN/Resources/pac.txt @@ -0,0 +1,8046 @@ +// Generated by gfwlist2pac in precise mode +// https://github.com/clowwindy/gfwlist2pac + +var proxy = "__PROXY__"; + +var rules = [ + "|http://85.17.73.31/", + "||agnesb.fr", + "||akiba-web.com", + "||altrec.com", + "||angela-merkel.de", + "||angola.org", + "||apartmentratings.com", + "||apartments.com", + "||arena.taipei", + "||asianspiss.com", + "||assimp.org", + "||athenaeizou.com", + "||azubu.tv", + "||bankmobilevibe.com", + "||banorte.com", + "||bash-hackers.org", + "||beeg.com", + "||global.bing.com", + "||bloombergview.com", + "||booktopia.com.au", + "||boysmaster.com", + "||bynet.co.il", + "||carfax.com", + ".casinobellini.com", + "||casinobellini.com", + "||centauro.com.br", + "||chobit.cc", + "||clearsurance.com", + "||images.comico.tw", + "||static.comico.tw", + "||counter.social", + "||costco.com", + "||crossfire.co.kr", + "||d2pass.com", + "||darpa.mil", + "||dawangidc.com", + "||deezer.com", + "||desipro.de", + "||dingchin.com.tw", + "||discordapp.com", + "||discordapp.net", + "||dish.com", + "|http://img.dlsite.jp/", + "||dm530.net", + "share.dmhy.org", + "@@|https://share.dmhy.org", + "||dmm.co.jp", + "|http://www.dmm.com/netgame", + "||dnvod.tv", + "||dvdpac.com", + "||eesti.ee", + "||esurance.com", + ".expekt.com", + "||expekt.com", + ".extmatrix.com", + "||extmatrix.com", + "||fakku.net", + "||fastpic.ru", + "||filesor.com", + "||financetwitter.com", + "||flipboard.com", + "||flitto.com", + "||fnac.be", + "||fnac.com", + "||funkyimg.com", + "||fxnetworks.com", + "||g-area.org", + "||gettyimages.com", + "||getuploader.com", + "|https://raw.githubusercontent.com/programthink/zhao", + "||glass8.eu", + "||glype.com", + "||go141.com", + "||guo.media", + "||hautelook.com", + "||hautelookcdn.com", + "||wego.here.com", + "||gamer-cds.cdn.hinet.net", + "||gamer2-cds.cdn.hinet.net", + "||hmvdigital.ca", + "||hmvdigital.com", + "||homedepot.com", + "||hoovers.com", + "||hulu.com", + "||huluim.com", + "|http://secure.hustler.com", + "|http://hustlercash.com", + "|http://www.hustlercash.com", + "||hybrid-analysis.com", + "||cdn*.i-scmp.com", + "||ilovelongtoes.com", + "|http://imgmega.com/*.gif.html", + "|http://imgmega.com/*.jpg.html", + "|http://imgmega.com/*.jpeg.html", + "|http://imgmega.com/*.png.html", + "||imlive.com", + "||tw.iqiyi.com", + "||javhub.net", + "||javhuge.com", + ".javlibrary.com", + "||javlibrary.com", + "||jcpenney.com", + "||jims.net", + "||jukujo-club.com", + "||juliepost.com", + "||kawaiikawaii.jp", + "||kendatire.com", + "||khatrimaza.org", + "||kkbox.com", + "||leisurepro.com", + "||lifemiles.com", + "||longtoes.com", + "||lovetvshow.com", + "|http://www.m-sport.co.uk", + "||macgamestore.com", + "||madonna-av.com", + "||mangafox.com", + "||mangafox.me", + "||manta.com", + "||matome-plus.com", + "||matome-plus.net", + "||mattwilcox.net", + "||metarthunter.com", + "||mfxmedia.com", + "||mojim.com", + "||kb.monitorware.com", + "||monster.com", + "||moodyz.com", + "||moonbingo.com", + "||mos.ru", + "||msha.gov", + "||muzu.tv", + "||mvg.jp", + ".mybet.com", + "||mybet.com", + "||nationwide.com", + "|http://www.nbc.com/live", + "||neo-miracle.com", + "||netflix.com", + "||nflximg.com", + "||nflximg.net", + "||nflxext.com", + "||nflxso.net", + "||nflxvideo.net", + "||nic.gov", + "|http://mo.nightlife141.com", + "||nordstrom.com", + "||nordstromimage.com", + "||nordstromrack.com", + "||nottinghampost.com", + "||npsboost.com", + "||ntdtv.cz", + "||s1.nudezz.com", + "||nusatrip.com", + "||nuuvem.com", + "||omni7.jp", + "||onapp.com", + "||ontrac.com", + "@@|http://blog.ontrac.com", + "||pandora.com", + ".pandora.tv", + "||parkansky.com", + "||phmsociety.org", + "|http://*.pimg.tw/", + "||pure18.com", + "||pytorch.org", + "||qq.co.za", + "||r18.com", + "|http://radiko.jp", + "||ramcity.com.au", + "||rd.com", + "||rdio.com", + "|https://riseup.net", + "||sadistic-v.com", + "||isc.sans.edu", + "|http://cdn*.search.xxx/", + "||shiksha.com", + "||slacker.com", + "||sm-miracle.com", + "||soylentnews.org", + "||spotify.com", + "||spreadshirt.es", + "||springboardplatform.com", + "||sprite.org", + "@@|http://store.sprite.org", + "||superokayama.com", + "||superpages.com", + "||swagbucks.com", + "||switch1.jp", + "||tapanwap.com", + "||gsp.target.com", + "||login.target.com", + "||rcam.target.com", + "||thinkgeek.com", + "||thebodyshop-usa.com", + "||tma.co.jp", + "||tracfone.com", + "||tryheart.jp", + "||turntable.fm", + "||twerkingbutt.com", + "||ulop.net", + "||uukanshu.com", + "||vegasred.com", + "||vevo.com", + "||vip-enterprise.com", + "|http://viu.tv/ch/", + "|http://viu.tv/encore/", + "||vmpsoft.com", + "|http://ecsm.vs.com/", + "||wanz-factory.com", + "||ssl.webpack.de", + "||wheretowatch.com", + "||wingamestore.com", + "||wizcrafts.net", + "||vod.wwe.com", + "||xfinity.com", + "||youwin.com", + "||ytn.co.kr", + "||zattoo.com", + "||zim.vn", + "||zozotown.com", + "14.102.250.18", + "14.102.250.19", + "50.7.31.230:8898", + "174.142.105.153", + "69.65.19.160", + "||xn--4gq171p.com", + "||xn--czq75pvv1aj5c.org", + "||xn--i2ru8q2qg.com", + "||xn--oiq.cc", + "||xn--p8j9a0d9c9a.xn--q9jyb4c", + "||abebooks.com", + "|https://*.s3.amazonaws.com", + "||s3-ap-southeast-2.amazonaws.com", + "||43110.cf", + "||9gag.com", + "||agro.hk", + "||share.america.gov", + "||apkmirror.com", + "||arte.tv", + "||artstation.com", + "||bangdream.space", + "||behance.net", + "||bird.so", + "||zh.bitterwinter.org", + "||bnn.co", + "||businessinsider.com", + "||boomssr.com", + "||bwgyhw.com", + "||castbox.fm", + "||chinatimes.com", + "||clyp.it", + "||cmcn.org", + "||cmx.im", + "||dailyview.tw", + "||daum.net", + "||depositphotos.com", + "||disconnect.me", + "||doubibackup.com", + "||doubmirror.cf", + "||encyclopedia.com", + "||fangeqiang.com", + "||cloud.feedly.com", + "||flyzy2005.com", + "||foreignpolicy.com", + "||free-ss.site", + "||blog.fuckgfw233.org", + "||g0v.social", + "||globalvoices.org", + "||glorystar.me", + "||goregrish.com", + "||hbo.com", + "||spaces.hightail.com", + "||hkgalden.com", + "||hkgolden.com", + "||hudson.org", + "||ipfs.io", + "||japantimes.co.jp", + "||jiji.com", + "||jintian.net", + "||jinx.com", + "||joinmastodon.org", + "||liangzhichuanmei.com", + "||lighti.me", + "||lihkg.com", + "||line-scdn.net", + "||i.lithium.com", + "||cloud.mail.ru", + "||cdn-images.mailchimp.com", + "||mastodon.cloud", + "||mastodon.host", + "||mastodon.social", + "||matters.news", + "||me.me", + "||metart.com", + "||mohu.club", + "||mohu.ml", + "||motiyun.com", + "||msa-it.org", + "||dictionary.goo.ne.jp", + "||go.nesnode.com", + "||international-news.newsmagazine.asia", + "||nikkei.com", + "||niu.moe", + "||nofile.io", + "||now.com", + "||sukebei.nyaa.si", + "||openvpn.org", + "||onejav.com", + "||paste.ee", + "||my.pcloud.com", + "||picacomic.com", + "||pincong.rocks", + "||pixiv.net", + "||potato.im", + "||premproxy.com", + "||prism-break.org", + "||protonvpn.com", + "||api.pureapk.com", + "||quora.com", + "||quoracdn.net", + "||cdn.seatguru.com", + "||secure.raxcdn.com", + "||redd.it", + "||reddit.com", + ".redditlist.com", + "|http://redditlist.com", + "||redditmedia.com", + "||redditstatic.com", + "||rixcloud.com", + "||rixcloud.us", + "||rsdlmonitor.com", + "||shadowsocks.be", + "||shadowsocks9.com", + "||tn1.shemalez.com", + "||tn2.shemalez.com", + "||tn3.shemalez.com", + "||static.shemalez.com", + "||six-degrees.io", + "||softfamous.com", + "||softsmirror.cf", + "||sosreader.com", + "||sspanel.net", + "||sulian.me", + "||supchina.com", + "||teddysun.com", + "||textnow.me", + "||tineye.com", + "||top10vpn.com", + "||tubepornclassic.com", + "||uku.im", + "||unseen.is", + "||cn.uptodown.com", + "||uraban.me", + "||vrsmash.com", + "||vultryhw.com", + "||scache.vzw.com", + "||scache1.vzw.com", + "||scache2.vzw.com", + "||ss7.vzw.com", + "||ssr.tools", + "||steemit.com", + "||taiwanjustice.net", + "||tinc-vpn.org", + "||wenzhao.ca", + "||whatsonweibo.com", + "||wire.com", + "||blog.workflow.is", + "||xm.com", + "||xuehua.us", + "||yes-news.com", + "||you-get.org", + "||zzcloud.me", + "||aex.com", + "||allcoin.com", + "||adcex.com", + "||bcex.ca", + "||bibox.com", + "||big.one", + "||binance.com", + "||bit-z.com", + "||bitcoinworld.com", + "||bitfinex.com", + "||bithumb.com", + "||bitinka.com.ar", + "||bitmex.com", + "||btc98.com", + "||btcbank.bank", + "||btctrade.im", + "||c2cx.com", + "||chaoex.com", + "||cobinhood.com", + "||coin2co.in", + "||coinbene.com", + ".coinegg.com", + "||coinegg.com", + "||coinex.com", + "||coingi.com", + "||coinrail.co.kr", + "||cointiger.com", + "||cointobe.com", + "||coinut.com", + "||discoins.com", + "||dragonex.io", + "||ebtcbank.com", + "||etherdelta.com", + "||exmo.com", + "||exrates.me", + "||exx.com", + "||fatbtc.com", + "||gate.io", + "||gatecoin.com", + "||hbg.com", + "||hitbtc.com", + "||huobi.com", + "||huobi.pro", + "||huobipro.com", + "||bx.in.th", + "||jex.com", + "||kex.com", + "||kspcoin.com", + "||kucoin.com", + "||lbank.info", + "||livecoin.net", + "||localbitcoins.com", + "||mercatox.com", + "||oex.com", + "||okex.com", + "||otcbtc.com", + "||rightbtc.com", + "||topbtc.com", + "||xbtce.com", + "||yobit.net", + "||zb.com", + "||read01.com", + "||kknews.cc", + "china-mmm.jp.net", + ".lsxszzg.com", + ".china-mmm.net", + "||china-mmm.net", + "china-mmm.sa.com", + ".allowed.org", + ".now.im", + "||amazon.co.jp", + ".amazon.com/Dalai-Lama", + "amazon.com/Prisoner-State-Secret-Journal-Premier", + "s3-ap-northeast-1.amazonaws.com", + "||aolchannels.aol.com", + "video.aol.ca/video-detail", + "video.aol.co.uk/video-detail", + "video.aol.com", + "||video.aol.com", + "||search.aol.com", + "www.aolnews.com", + ".avmo.pw", + ".avmoo.com", + "|http://avmoo.com", + ".avmoo.net", + "|http://avmoo.net", + "||avmoo.pw", + ".javmoo.xyz", + "|http://javmoo.xyz", + ".javtag.com", + "|http://javtag.com", + ".javzoo.com", + "|http://javzoo.com", + ".tellme.pw", + ".bbc.com", + "||bbc.com", + ".bbc.co.uk", + "||bbc.co.uk", + "||bbci.co.uk", + ".bbcchinese.com", + "||bbcchinese.com", + "|http://bbc.in", + ".1dumb.com", + ".25u.com", + ".2waky.com", + ".3-a.net", + ".4dq.com", + ".4mydomain.com", + ".4pu.com", + ".acmetoy.com", + ".almostmy.com", + ".americanunfinished.com", + ".authorizeddns.net", + ".authorizeddns.org", + ".authorizeddns.us", + ".bigmoney.biz", + ".changeip.name", + ".changeip.net", + ".changeip.org", + ".cleansite.biz", + ".cleansite.info", + ".cleansite.us", + ".compress.to", + ".ddns.info", + ".ddns.me.uk", + ".ddns.mobi", + ".ddns.ms", + ".ddns.name", + ".ddns.us", + ".dhcp.biz", + ".dns-dns.com", + ".dns-stuff.com", + ".dns04.com", + ".dns05.com", + ".dns1.us", + ".dns2.us", + ".dnset.com", + ".dnsrd.com", + ".dsmtp.com", + ".dumb1.com", + ".dynamic-dns.net", + ".dynamicdns.biz", + ".dynamicdns.co.uk", + ".dynamicdns.me.uk", + ".dynamicdns.org.uk", + ".dyndns.pro", + ".dynssl.com", + ".edns.biz", + ".epac.to", + ".esmtp.biz", + ".ezua.com", + ".faqserv.com", + ".fartit.com", + ".freeddns.com", + ".freetcp.com", + ".freewww.biz", + ".freewww.info", + ".ftp1.biz", + ".ftpserver.biz", + ".gettrials.com", + ".got-game.org", + ".gr8domain.biz", + ".gr8name.biz", + ".https443.net", + ".https443.org", + ".ikwb.com", + ".instanthq.com", + ".iownyour.biz", + ".iownyour.org", + ".isasecret.com", + ".itemdb.com", + ".itsaol.com", + ".jetos.com", + ".jkub.com", + ".jungleheart.com", + ".justdied.com", + ".lflink.com", + ".lflinkup.com", + ".lflinkup.net", + ".lflinkup.org", + ".longmusic.com", + ".mefound.com", + ".moneyhome.biz", + ".mrbasic.com", + ".mrbonus.com", + ".mrface.com", + ".mrslove.com", + ".my03.com", + ".mydad.info", + ".myddns.com", + ".myftp.info", + ".myftp.name", + ".mylftv.com", + ".mymom.info", + ".mynetav.net", + ".mynetav.org", + ".mynumber.org", + ".mypicture.info", + ".mypop3.net", + ".mypop3.org", + ".mysecondarydns.com", + ".mywww.biz", + ".myz.info", + ".ninth.biz", + ".ns01.biz", + ".ns01.info", + ".ns01.us", + ".ns02.biz", + ".ns02.info", + ".ns02.us", + ".ns1.name", + ".ns2.name", + ".ns3.name", + ".ocry.com", + ".onedumb.com", + ".onmypc.biz", + ".onmypc.info", + ".onmypc.net", + ".onmypc.org", + ".onmypc.us", + ".organiccrap.com", + ".otzo.com", + ".ourhobby.com", + ".pcanywhere.net", + ".port25.biz", + ".proxydns.com", + ".qhigh.com", + ".qpoe.com", + ".rebatesrule.net", + ".sellclassics.com", + ".sendsmtp.com", + ".serveuser.com", + ".serveusers.com", + ".sexidude.com", + ".sexxxy.biz", + ".sixth.biz", + ".squirly.info", + ".ssl443.org", + ".toh.info", + ".toythieves.com", + ".trickip.net", + ".trickip.org", + ".vizvaz.com", + ".wha.la", + ".wikaba.com", + ".www1.biz", + ".wwwhost.biz", + "@@|http://xx.wwwhost.biz", + ".x24hr.com", + ".xxuz.com", + ".xxxy.biz", + ".xxxy.info", + ".ygto.com", + ".youdontcare.com", + ".yourtrap.com", + ".zyns.com", + ".zzux.com", + "d1b183sg0nvnuh.cloudfront.net", + "|https://d1b183sg0nvnuh.cloudfront.net", + "d1c37gjwa26taa.cloudfront.net", + "|https://d1c37gjwa26taa.cloudfront.net", + "d3c33hcgiwev3.cloudfront.net", + "|https://d3c33hcgiwev3.cloudfront.net", + "||d3rhr7kgmtrq1v.cloudfront.net", + ".3d-game.com", + ".4irc.com", + ".b0ne.com", + ".chatnook.com", + ".darktech.org", + ".deaftone.com", + ".dtdns.net", + ".effers.com", + ".etowns.net", + ".etowns.org", + ".flnet.org", + ".gotgeeks.com", + ".scieron.com", + ".slyip.com", + ".slyip.net", + ".suroot.com", + ".blogdns.org", + ".dyndns.org", + ".dyndns-ip.com", + ".dyndns-pics.com", + ".from-sd.com", + ".from-pr.com", + ".is-a-hunter.com", + ".dynu.com", + ".dynu.net", + ".freeddns.org", + "cdninstagram.com", + "||cdninstagram.com", + "||facebook.br", + ".facebook.com", + "||facebook.com", + "@@||v6.facebook.com", + "||facebook.design", + "||connect.facebook.net", + "||facebook.hu", + "||facebook.in", + "||facebook.nl", + "||facebook.se", + "||facebookmail.com", + "||fb.com", + "||fb.me", + "||fbcdn.net", + "||fbsbx.com", + "||fbaddins.com", + "||fbworkmail.com", + ".instagram.com", + "||instagram.com", + "||m.me", + "||messenger.com", + "||oculus.com", + "||oculuscdn.com", + "||rocksdb.org", + "@@||ip6.static.sl-reverse.com", + "||thefacebook.com", + "||whatsapp.com", + "||whatsapp.net", + "|https://www.ftchinese.com", + ".ftchinese.com/channel/video", + ".ftchinese.com/premium/001081066", + ".ftchinese.com/story/00102753", + ".ftchinese.com/story/001026616", + ".ftchinese.com/story/001026749", + ".ftchinese.com/story/001026807", + ".ftchinese.com/story/001026808", + ".ftchinese.com/story/001026834", + ".ftchinese.com/story/001026880", + ".ftchinese.com/story/001027429", + ".ftchinese.com/story/001030341", + ".ftchinese.com/story/001030502", + ".ftchinese.com/story/001030803", + ".ftchinese.com/story/001031317", + ".ftchinese.com/story/001032617", + ".ftchinese.com/story/001032636", + ".ftchinese.com/story/001032692", + ".ftchinese.com/story/001032762", + ".ftchinese.com/story/001033138", + ".ftchinese.com/story/001034917", + ".ftchinese.com/story/001034926", + ".ftchinese.com/story/001034927", + ".ftchinese.com/story/001034928", + ".ftchinese.com/story/001034952", + ".ftchinese.com/story/001035890", + ".ftchinese.com/story/001035972", + ".ftchinese.com/story/001035993", + ".ftchinese.com/story/001036417", + ".ftchinese.com/story/001037090", + ".ftchinese.com/story/001037091", + ".ftchinese.com/story/001038178", + ".ftchinese.com/story/001038199", + ".ftchinese.com/story/001038220", + ".ftchinese.com/story/001038819", + ".ftchinese.com/story/001038862", + ".ftchinese.com/story/001039067", + ".ftchinese.com/story/001039178", + ".ftchinese.com/story/001039211", + ".ftchinese.com/story/001039271", + ".ftchinese.com/story/001039295", + ".ftchinese.com/story/001039369", + ".ftchinese.com/story/001039482", + ".ftchinese.com/story/001039534", + ".ftchinese.com/story/001039555", + ".ftchinese.com/story/001039576", + ".ftchinese.com/story/001039712", + ".ftchinese.com/story/001039779", + ".ftchinese.com/story/001039809", + ".ftchinese.com/story/001040134", + ".ftchinese.com/story/001040835", + ".ftchinese.com/story/001040890", + ".ftchinese.com/story/001040918", + ".ftchinese.com/story/001040992", + ".ftchinese.com/story/001041209", + ".ftchinese.com/story/001042100", + ".ftchinese.com/story/001042252", + ".ftchinese.com/story/001042272", + ".ftchinese.com/story/001042280", + ".ftchinese.com/story/001043029", + ".ftchinese.com/story/001043066", + ".ftchinese.com/story/001043096", + ".ftchinese.com/story/001043124", + ".ftchinese.com/story/001043152", + ".ftchinese.com/story/001043189", + ".ftchinese.com/story/001043428", + ".ftchinese.com/story/001043439", + ".ftchinese.com/story/001043534", + ".ftchinese.com/story/001043675", + ".ftchinese.com/story/001043680", + ".ftchinese.com/story/001043702", + ".ftchinese.com/story/001043849", + ".ftchinese.com/story/001044099", + ".ftchinese.com/story/001044776", + ".ftchinese.com/story/001044871", + ".ftchinese.com/story/001044897", + ".ftchinese.com/story/001045114", + ".ftchinese.com/story/001045139", + ".ftchinese.com/story/001045186", + ".ftchinese.com/story/001045755", + ".ftchinese.com/story/001046087", + ".ftchinese.com/story/001046105", + ".ftchinese.com/story/001046118", + ".ftchinese.com/story/001046132", + ".ftchinese.com/story/001046517", + ".ftchinese.com/story/001046822", + ".ftchinese.com/story/001046866", + ".ftchinese.com/story/001046942", + ".ftchinese.com/story/001047180", + ".ftchinese.com/story/001047206", + ".ftchinese.com/story/001047304", + ".ftchinese.com/story/001047317", + ".ftchinese.com/story/001047345", + ".ftchinese.com/story/001047358", + ".ftchinese.com/story/001047375", + ".ftchinese.com/story/001047381", + ".ftchinese.com/story/001047413", + ".ftchinese.com/story/001047456", + ".ftchinese.com/story/001047491", + ".ftchinese.com/story/001047545", + ".ftchinese.com/story/001047558", + ".ftchinese.com/story/001047568", + ".ftchinese.com/story/001047627", + ".ftchinese.com/story/001048293", + ".ftchinese.com/story/001048343", + ".ftchinese.com/story/001048710", + ".ftchinese.com/story/001049289", + ".ftchinese.com/story/001049360", + ".ftchinese.com/story/001049896", + ".ftchinese.com/story/001050152", + ".ftchinese.com/story/001051027", + ".ftchinese.com/story/001051161", + ".ftchinese.com/story/001051372", + ".ftchinese.com/story/001051479", + ".ftchinese.com/story/001052138", + ".ftchinese.com/story/001052161", + ".ftchinese.com/story/001052525", + ".ftchinese.com/story/001052549", + ".ftchinese.com/story/001052701", + ".ftchinese.com/story/001052965", + ".ftchinese.com/story/001053149", + ".ftchinese.com/story/001053150", + ".ftchinese.com/story/001053200", + ".ftchinese.com/story/001053425", + ".ftchinese.com/story/001053496", + ".ftchinese.com/story/001053526", + ".ftchinese.com/story/001053557", + ".ftchinese.com/story/001053906", + ".ftchinese.com/story/001054049", + ".ftchinese.com/story/001054103", + ".ftchinese.com/story/001054109", + ".ftchinese.com/story/001054119", + ".ftchinese.com/story/001054123", + ".ftchinese.com/story/001054139", + ".ftchinese.com/story/001054166", + ".ftchinese.com/story/001054168", + ".ftchinese.com/story/001054190", + ".ftchinese.com/story/001054437", + ".ftchinese.com/story/001054526", + ".ftchinese.com/story/001054607", + ".ftchinese.com/story/001054644", + ".ftchinese.com/story/001054786", + ".ftchinese.com/story/001054843", + ".ftchinese.com/story/001054925", + ".ftchinese.com/story/001054940", + ".ftchinese.com/story/001055051", + ".ftchinese.com/story/001055063", + ".ftchinese.com/story/001055069", + ".ftchinese.com/story/001055136", + ".ftchinese.com/story/001055170", + ".ftchinese.com/story/001055202", + ".ftchinese.com/story/001055242", + ".ftchinese.com/story/001055263", + ".ftchinese.com/story/001055274", + ".ftchinese.com/story/001055299", + ".ftchinese.com/story/001055480", + ".ftchinese.com/story/001055551", + ".ftchinese.com/story/001055559", + ".ftchinese.com/story/001055566", + ".ftchinese.com/story/001055840", + ".ftchinese.com/story/001056099", + ".ftchinese.com/story/001056108", + ".ftchinese.com/story/001056131", + ".ftchinese.com/story/001056375", + ".ftchinese.com/story/001056491", + ".ftchinese.com/story/001056529", + ".ftchinese.com/story/001056534", + ".ftchinese.com/story/001056538", + ".ftchinese.com/story/001056541", + ".ftchinese.com/story/001056554", + ".ftchinese.com/story/001056557", + ".ftchinese.com/story/001056560", + ".ftchinese.com/story/001056567", + ".ftchinese.com/story/001056574", + ".ftchinese.com/story/001056588", + ".ftchinese.com/story/001056594", + ".ftchinese.com/story/001056596", + ".ftchinese.com/story/001056684", + ".ftchinese.com/story/001056832", + ".ftchinese.com/story/001056833", + ".ftchinese.com/story/001056851", + ".ftchinese.com/story/001056874", + ".ftchinese.com/story/001056896", + ".ftchinese.com/story/001056927", + ".ftchinese.com/story/001057011", + ".ftchinese.com/story/001057018", + ".ftchinese.com/story/001057044", + ".ftchinese.com/story/001057162", + ".ftchinese.com/story/001057500", + ".ftchinese.com/story/001057504", + ".ftchinese.com/story/001057509", + ".ftchinese.com/story/001057518", + ".ftchinese.com/story/001057532", + ".ftchinese.com/story/001057533", + ".ftchinese.com/story/001057556", + ".ftchinese.com/story/001057580", + ".ftchinese.com/story/001057638", + ".ftchinese.com/story/001057644", + ".ftchinese.com/story/001057817", + ".ftchinese.com/story/001057875", + ".ftchinese.com/story/001058009", + ".ftchinese.com/story/001058056", + ".ftchinese.com/story/001058224", + ".ftchinese.com/story/001058257", + ".ftchinese.com/story/001058295", + ".ftchinese.com/story/001058328", + ".ftchinese.com/story/001058339", + ".ftchinese.com/story/001058344", + ".ftchinese.com/story/001058352", + ".ftchinese.com/story/001058413", + ".ftchinese.com/story/001058421", + ".ftchinese.com/story/001058440", + ".ftchinese.com/story/001058458", + ".ftchinese.com/story/001058468", + ".ftchinese.com/story/001058561", + ".ftchinese.com/story/001058566", + ".ftchinese.com/story/001058567", + ".ftchinese.com/story/001058585", + ".ftchinese.com/story/001058628", + ".ftchinese.com/story/001058656", + ".ftchinese.com/story/001058665", + ".ftchinese.com/story/001058678", + ".ftchinese.com/story/001058691", + ".ftchinese.com/story/001058721", + ".ftchinese.com/story/001058728", + ".ftchinese.com/story/001059464", + ".ftchinese.com/story/001059484", + ".ftchinese.com/story/001059537", + ".ftchinese.com/story/001059538", + ".ftchinese.com/story/001059551", + ".ftchinese.com/story/001059818", + ".ftchinese.com/story/001059914", + ".ftchinese.com/story/001059920", + ".ftchinese.com/story/001059957", + ".ftchinese.com/story/001060088", + ".ftchinese.com/story/001060156", + ".ftchinese.com/story/001060157", + ".ftchinese.com/story/001060160", + ".ftchinese.com/story/001060181", + ".ftchinese.com/story/001060185", + ".ftchinese.com/story/001060493", + ".ftchinese.com/story/001060495", + ".ftchinese.com/story/001060590", + ".ftchinese.com/story/001060846", + ".ftchinese.com/story/001060847", + ".ftchinese.com/story/001060875", + ".ftchinese.com/story/001060921", + ".ftchinese.com/story/001060946", + ".ftchinese.com/story/001061120", + ".ftchinese.com/story/001061474", + ".ftchinese.com/story/001061524", + ".ftchinese.com/story/001061642", + ".ftchinese.com/story/001062017", + ".ftchinese.com/story/001062020", + ".ftchinese.com/story/001062028", + ".ftchinese.com/story/001062092", + ".ftchinese.com/story/001062096", + ".ftchinese.com/story/001062147", + ".ftchinese.com/story/001062176", + ".ftchinese.com/story/001062188", + ".ftchinese.com/story/001062254", + ".ftchinese.com/story/001062374", + ".ftchinese.com/story/001062482", + ".ftchinese.com/story/001062496", + ".ftchinese.com/story/001062501", + ".ftchinese.com/story/001062508", + ".ftchinese.com/story/001062519", + ".ftchinese.com/story/001062554", + ".ftchinese.com/story/001062741", + ".ftchinese.com/story/001062794", + ".ftchinese.com/story/001063160", + ".ftchinese.com/story/001063359", + ".ftchinese.com/story/001063512", + ".ftchinese.com/story/001063668", + ".ftchinese.com/story/001063692", + ".ftchinese.com/story/001063763", + ".ftchinese.com/story/001063764", + ".ftchinese.com/story/001063826", + ".ftchinese.com/story/001064127", + ".ftchinese.com/story/001064312", + ".ftchinese.com/story/001064705", + ".ftchinese.com/story/001064807", + ".ftchinese.com/story/001065120", + ".ftchinese.com/story/001065168", + ".ftchinese.com/story/001065249", + ".ftchinese.com/story/001065287", + ".ftchinese.com/story/001065335", + ".ftchinese.com/story/001065337", + ".ftchinese.com/story/001065541", + ".ftchinese.com/story/001065715", + ".ftchinese.com/story/001065735", + ".ftchinese.com/story/001065756", + ".ftchinese.com/story/001065802", + ".ftchinese.com/story/001066112", + ".ftchinese.com/story/001066136", + ".ftchinese.com/story/001066140", + ".ftchinese.com/story/001066465", + ".ftchinese.com/story/001066881", + ".ftchinese.com/story/001066950", + ".ftchinese.com/story/001066959", + ".ftchinese.com/story/001067435", + "www.ftchinese.com/story/001067479", + ".ftchinese.com/story/001067528", + ".ftchinese.com/story/001067545", + ".ftchinese.com/story/001067572", + ".ftchinese.com/story/001067648", + ".ftchinese.com/story/001067650", + ".ftchinese.com/story/001067680", + ".ftchinese.com/story/001067692", + ".ftchinese.com/story/001067871", + ".ftchinese.com/story/001067923", + ".ftchinese.com/story/001068062", + ".ftchinese.com/story/001068248", + ".ftchinese.com/story/001068278", + ".ftchinese.com/story/001068379", + ".ftchinese.com/story/001068483", + ".ftchinese.com/story/001068506", + ".ftchinese.com/story/001068547", + ".ftchinese.com/story/001068616", + ".ftchinese.com/story/001068622", + ".ftchinese.com/story/001068707", + ".ftchinese.com/story/001069146", + ".ftchinese.com/story/001069373", + ".ftchinese.com/story/001069516", + ".ftchinese.com/story/001069517", + ".ftchinese.com/story/001069687", + ".ftchinese.com/story/001069741", + ".ftchinese.com/story/001069861", + ".ftchinese.com/story/001069952", + ".ftchinese.com/story/001070053", + ".ftchinese.com/story/001070177", + ".ftchinese.com/story/001070307", + ".ftchinese.com/story/001070809", + ".ftchinese.com/story/001070990", + ".ftchinese.com/story/001071042", + ".ftchinese.com/story/001071044", + ".ftchinese.com/story/001071106", + ".ftchinese.com/story/001071166", + ".ftchinese.com/story/001071181", + "ftchinese.com/story/001071200", + ".ftchinese.com/story/001071208", + ".ftchinese.com/story/001071238", + ".ftchinese.com/story/001071683", + ".ftchinese.com/story/001072271", + ".ftchinese.com/story/001072348", + ".ftchinese.com/story/001072677", + ".ftchinese.com/story/001072726", + ".ftchinese.com/story/001072794", + ".ftchinese.com/story/001072853", + ".ftchinese.com/story/001072895", + ".ftchinese.com/story/001072993", + ".ftchinese.com/story/001073043", + ".ftchinese.com/story/001073103", + ".ftchinese.com/story/001073157", + ".ftchinese.com/story/001073216", + ".ftchinese.com/story/001073246", + ".ftchinese.com/story/001073305", + ".ftchinese.com/story/001073307", + ".ftchinese.com/story/001073408", + ".ftchinese.com/story/001073537", + ".ftchinese.com/story/001073672", + ".ftchinese.com/story/001073849", + ".ftchinese.com/story/001073906", + ".ftchinese.com/story/001074089", + ".ftchinese.com/story/001074110", + ".ftchinese.com/story/001074128", + ".ftchinese.com/story/001074157", + ".ftchinese.com/story/001074246", + ".ftchinese.com/story/001074307", + ".ftchinese.com/story/001074347", + ".ftchinese.com/story/001074423", + ".ftchinese.com/story/001074454", + ".ftchinese.com/story/001074467", + ".ftchinese.com/story/001074493", + ".ftchinese.com/story/001074550", + ".ftchinese.com/story/001074562", + ".ftchinese.com/story/001074653", + ".ftchinese.com/story/001074693", + ".ftchinese.com/story/001074699", + ".ftchinese.com/story/001074712", + ".ftchinese.com/story/001074713", + ".ftchinese.com/story/001074768", + ".ftchinese.com/story/001074782", + ".ftchinese.com/story/001074794", + ".ftchinese.com/story/001074822", + ".ftchinese.com/story/001074874", + ".ftchinese.com/story/001074891", + ".ftchinese.com/story/001074918", + ".ftchinese.com/story/001075081", + ".ftchinese.com/story/001075134", + ".ftchinese.com/story/001075142", + ".ftchinese.com/story/001075216", + ".ftchinese.com/story/001075230", + ".ftchinese.com/story/001075238", + ".ftchinese.com/story/001075262", + ".ftchinese.com/story/001075269", + ".ftchinese.com/story/001075491", + ".ftchinese.com/story/001075500", + ".ftchinese.com/story/001075650", + ".ftchinese.com/story/001075678", + ".ftchinese.com/story/001075703", + ".ftchinese.com/story/001075739", + ".ftchinese.com/story/001076066", + ".ftchinese.com/story/001076142", + ".ftchinese.com/story/001076459", + ".ftchinese.com/story/001076470", + ".ftchinese.com/story/001076538", + ".ftchinese.com/story/001076573", + ".ftchinese.com/story/001076901", + ".ftchinese.com/story/001077067", + ".ftchinese.com/story/001077084", + ".ftchinese.com/story/001077235", + ".ftchinese.com/story/001077344", + ".ftchinese.com/story/001077390", + ".ftchinese.com/story/001077392", + ".ftchinese.com/story/001077465", + ".ftchinese.com/story/001077468", + ".ftchinese.com/story/001077492", + ".ftchinese.com/story/001077745", + ".ftchinese.com/story/001077768", + ".ftchinese.com/story/001077804", + ".ftchinese.com/story/001077852", + ".ftchinese.com/story/001078646", + ".ftchinese.com/story/001078928", + ".ftchinese.com/story/001078967", + ".ftchinese.com/story/001079559", + ".ftchinese.com/story/001079641", + ".ftchinese.com/story/001079909", + ".ftchinese.com/story/001079934", + ".ftchinese.com/story/001079992", + ".ftchinese.com/story/001080054", + ".ftchinese.com/story/001080109", + ".ftchinese.com/story/001080169", + ".ftchinese.com/story/001080226", + ".ftchinese.com/story/001080429", + ".ftchinese.com/story/001080471", + ".ftchinese.com/story/001080550", + ".ftchinese.com/story/001080581", + ".ftchinese.com/story/001080647", + ".ftchinese.com/story/001080778", + ".ftchinese.com/story/001080892", + ".ftchinese.com/story/001080915", + ".ftchinese.com/story/001080935", + ".ftchinese.com/story/001081059", + ".ftchinese.com/story/001081127", + ".ftchinese.com/tag/%E5%8D%81%E5%85%AB%E5%B1%8A%E4%B8%89%E4%B8%AD%E5%85%A8%E4%BC%9A", + ".ftchinese.com/tag/%E6%B8%A9%E5%AE%B6%E5%AE%9D", + ".ftchinese.com/tag/%E8%96%84%E7%86%99%E6%9D%A5", + ".ftchinese.com/video/1437", + ".ftchinese.com/video/1882", + ".ftchinese.com/video/2446", + ".ftchinese.com/video/2601", + ".ftchinese.com/comments", + "||1e100.net", + "||466453.com", + "||abc.xyz", + "||about.google", + "||admob.com", + "||adsense.com", + "||agoogleaday.com", + "||ai.google", + "||ampproject.org", + "@@|https://www.ampproject.org", + "@@|https://cdn.ampproject.org", + "||android.com", + "||androidify.com", + "||androidtv.com", + "||api.ai", + ".appspot.com", + "||appspot.com", + "||autodraw.com", + "||blog.google", + "||blogblog.com", + "blogspot.com", + "/^https?:\\/\\/[^\\/]+blogspot\\.(.*)/", + ".blogspot.hk", + ".blogspot.jp", + ".blogspot.tw", + "||certificate-transparency.org", + "||chrome.com", + "||chromecast.com", + "||chromeexperiments.com", + "||chromercise.com", + "||chromestatus.com", + "||chromium.org", + "||com.google", + "||crbug.com", + "||creativelab5.com", + "||crisisresponse.google", + "||crrev.com", + "||data-vocabulary.org", + "||debug.com", + "||deepmind.com", + "||deja.com", + "||design.google", + "||digisfera.com", + "||dns.google", + "||domains.google", + "||duck.com", + "||environment.google", + "||feedburner.com", + "||firebaseio.com", + "||g.co", + "||gcr.io", + "||get.app", + "||get.dev", + "||get.how", + "||get.page", + "||getmdl.io", + "||getoutline.org", + "||ggpht.com", + "||gmail.com", + "||gmodules.com", + "||godoc.org", + "||golang.org", + "||goo.gl", + ".google.ae", + ".google.as", + ".google.am", + ".google.at", + ".google.az", + ".google.ba", + ".google.be", + ".google.bg", + ".google.ca", + ".google.cd", + ".google.ci", + ".google.co.id", + ".google.co.jp", + ".google.co.kr", + ".google.co.ma", + ".google.co.uk", + ".google.com", + ".google.de", + "||google.dev", + ".google.dj", + ".google.dk", + ".google.es", + ".google.fi", + ".google.fm", + ".google.fr", + ".google.gg", + ".google.gl", + ".google.gr", + ".google.ie", + ".google.is", + ".google.it", + ".google.jo", + ".google.kz", + ".google.lv", + ".google.mn", + ".google.ms", + ".google.nl", + ".google.nu", + ".google.no", + ".google.ro", + ".google.ru", + ".google.rw", + ".google.sc", + ".google.sh", + ".google.sk", + ".google.sm", + ".google.sn", + ".google.tk", + ".google.tm", + ".google.to", + ".google.tt", + ".google.vu", + ".google.ws", + "/^https?:\\/\\/([^\\/]+\\.)*google\\.(ac|ad|ae|af|al|am|as|at|az|ba|be|bf|bg|bi|bj|bs|bt|by|ca|cat|cd|cf|cg|ch|ci|cl|cm|co.ao|co.bw|co.ck|co.cr|co.id|co.il|co.in|co.jp|co.ke|co.kr|co.ls|co.ma|com|com.af|com.ag|com.ai|com.ar|com.au|com.bd|com.bh|com.bn|com.bo|com.br|com.bz|com.co|com.cu|com.cy|com.do|com.ec|com.eg|com.et|com.fj|com.gh|com.gi|com.gt|com.hk|com.jm|com.kh|com.kw|com.lb|com.ly|com.mm|com.mt|com.mx|com.my|com.na|com.nf|com.ng|com.ni|com.np|com.om|com.pa|com.pe|com.pg|com.ph|com.pk|com.pr|com.py|com.qa|com.sa|com.sb|com.sg|com.sl|com.sv|com.tj|com.tr|com.tw|com.ua|com.uy|com.vc|com.vn|co.mz|co.nz|co.th|co.tz|co.ug|co.uk|co.uz|co.ve|co.vi|co.za|co.zm|co.zw|cv|cz|de|dj|dk|dm|dz|ee|es|eu|fi|fm|fr|ga|ge|gg|gl|gm|gp|gr|gy|hk|hn|hr|ht|hu|ie|im|iq|is|it|it.ao|je|jo|kg|ki|kz|la|li|lk|lt|lu|lv|md|me|mg|mk|ml|mn|ms|mu|mv|mw|mx|ne|nl|no|nr|nu|org|pl|pn|ps|pt|ro|rs|ru|rw|sc|se|sh|si|sk|sm|sn|so|sr|st|td|tg|tk|tl|tm|tn|to|tt|us|vg|vn|vu|ws)\\/.*/", + "||googleapis.cn", + "||googleapis.com", + "||googleapps.com", + "||googleartproject.com", + "||googleblog.com", + "||googlebot.com", + "||googlechinawebmaster.com", + "||googlecode.com", + "||googlecommerce.com", + "||googledomains.com", + "||googlearth.com", + "||googleearth.com", + "||googledrive.com", + "||googlegroups.com", + "||googlehosted.com", + "||googleideas.com", + "||googleinsidesearch.com", + "||googlelabs.com", + "||googlemail.com", + "||googlemashups.com", + "||googlepagecreator.com", + "||googleplay.com", + "||googleplus.com", + "||googlescholar.com", + "||googlesource.com", + "||googleusercontent.com", + ".googlevideo.com", + "||googlevideo.com", + "||googleweblight.com", + "||googlezip.net", + "||groups.google.cn", + "||grow.google", + "||gstatic.com", + "||gvt0.com", + "||gvt1.com", + "@@||redirector.gvt1.com", + "||gvt3.com", + "||gwtproject.org", + "||html5rocks.com", + "||iam.soy", + "||igoogle.com", + "||itasoftware.com", + "||lers.google", + "||like.com", + "||madewithcode.com", + "||material.io", + "||nic.google", + "||on2.com", + "||panoramio.com", + "||picasaweb.com", + "||pki.goog", + "||plus.codes", + "||polymer-project.org", + "||pride.google", + "||questvisual.com", + "||admin.recaptcha.net", + "||api.recaptcha.net", + "||api-secure.recaptcha.net", + "||api-verify.recaptcha.net", + "||redhotlabs.com", + "||registry.google", + "||safety.google", + "||savethedate.foo", + "||schema.org", + "||shattered.io", + "|http://sipml5.org/", + "||stories.google", + "||sustainability.google", + "||synergyse.com", + "||teachparentstech.org", + "||tensorflow.org", + "||tfhub.dev", + "||thinkwithgoogle.com", + "||tiltbrush.com", + "||urchin.com", + "||waveprotocol.org", + "||waymo.com", + "||web.dev", + "||webmproject.org", + "||webrtc.org", + "||whatbrowser.org", + "||widevine.com", + "||withgoogle.com", + "||withyoutube.com", + "||x.company", + "||xn--ngstr-lra8j.com", + "||youtu.be", + ".youtube.com", + "||youtube.com", + "||youtube-nocookie.com", + "||youtubeeducation.com", + "||youtubegaming.com", + "||yt.be", + "||ytimg.com", + "||zynamics.com", + "||naughtyamerica.com", + "static01.nyt.com", + "||nyt.com", + "nytchina.com", + "nytcn.me", + "||nytcn.me", + "||nytco.com", + "|http://nyti.ms/", + ".nytimes.com", + "||nytimes.com", + "||nytimg.com", + "userapi.nytlog.com", + "cn.nytstyle.com", + "||nytstyle.com", + ".steamcommunity.com", + "||steamcommunity.com", + "|http://store.steampowered.com/app/333600", + "||t.me", + "||updates.tdesktop.com", + "||telegram.dog", + "||telegram.me", + "||telegram.org", + ".telegramdownload.com", + "||telesco.pe", + "||jtvnw.net", + "||ttvnw.net", + "||twitch.tv", + "||twitchcdn.net", + "||periscope.tv", + ".pscp.tv", + "||pscp.tv", + ".t.co", + "||t.co", + ".tweetdeck.com", + "||tweetdeck.com", + "||twimg.com", + ".twitpic.com", + "||twitpic.com", + ".twitter.com", + "||twitter.com", + "||twitter.jp", + "||vine.co", + "||gov.taipei", + ".gov.tw", + "|https://aiss.anws.gov.tw", + "||archives.gov.tw", + "||tacc.cwb.gov.tw", + "||data.gov.tw", + "||epa.gov.tw", + "||fa.gov.tw", + "||fda.gov.tw", + "||hpa.gov.tw", + "||immigration.gov.tw", + "||itaiwan.gov.tw", + "||mjib.gov.tw", + "||moeaic.gov.tw", + "||mofa.gov.tw", + "||mol.gov.tw", + "||mvdis.gov.tw", + "||nat.gov.tw", + "||nhi.gov.tw", + "||npa.gov.tw", + "||nsc.gov.tw", + "||ntbk.gov.tw", + "||ntbna.gov.tw", + "||ntbt.gov.tw", + "||ntsna.gov.tw", + "||pcc.gov.tw", + "||stat.gov.tw", + "||taipei.gov.tw", + "||taiwanjobs.gov.tw", + "||thb.gov.tw", + "||tipo.gov.tw", + "||wda.gov.tw", + "||teco-hk.org", + "||teco-mo.org", + "@@||aftygh.gov.tw", + "@@||aide.gov.tw", + "@@||tpde.aide.gov.tw", + "@@||arte.gov.tw", + "@@||chukuang.gov.tw", + "@@||cwb.gov.tw", + "@@||cycab.gov.tw", + "@@||dbnsa.gov.tw", + "@@||df.gov.tw", + "@@||eastcoast-nsa.gov.tw", + "@@||erv-nsa.gov.tw", + "@@||grb.gov.tw", + "@@||gysd.nyc.gov.tw", + "@@||hchcc.gov.tw", + "@@||hsinchu-cc.gov.tw", + "@@||iner.gov.tw", + "@@||klsio.gov.tw", + "@@||kmseh.gov.tw", + "@@||lungtanhr.gov.tw", + "@@||maolin-nsa.gov.tw", + "@@||matsu-news.gov.tw", + "@@||matsu-nsa.gov.tw", + "@@||matsucc.gov.tw", + "@@||moe.gov.tw", + "@@||mvdis.gov.tw", + "@@||nankan.gov.tw", + "@@||ncree.gov.tw", + "@@||necoast-nsa.gov.tw", + "@@||siraya-nsa.gov.tw", + "@@||cromotc.nat.gov.tw", + "@@||tax.nat.gov.tw", + "@@||necoast-nsa.gov.tw", + "@@||ner.gov.tw", + "@@||nmmba.gov.tw", + "@@||nmp.gov.tw", + "@@||nmvttc.gov.tw", + "@@||northguan-nsa.gov.tw", + "@@||npm.gov.tw", + "@@||nstm.gov.tw", + "@@||ntdmh.gov.tw", + "@@||ntl.gov.tw", + "@@||ntsec.gov.tw", + "@@||ntuh.gov.tw", + "@@||nvri.gov.tw", + "@@||penghu-nsa.gov.tw", + "@@||post.gov.tw", + "@@||siraya-nsa.gov.tw", + "@@||stdtime.gov.tw", + "@@||sunmoonlake.gov.tw", + "@@||taitung-house.gov.tw", + "@@||taoyuan.gov.tw", + "@@||tphcc.gov.tw", + "@@||trimt-nsa.gov.tw", + "@@||vghtpe.gov.tw", + "@@||vghks.gov.tw", + "@@||vghtc.gov.tw", + "@@||wanfang.gov.tw", + "@@||yatsen.gov.tw", + "@@||yda.gov.tw", + "||kinmen.org.tw", + ".v2ex.com", + "@@|http://v2ex.com", + "@@|http://cdn.v2ex.com", + "@@|http://cn.v2ex.com", + "@@|http://hk.v2ex.com", + "@@|http://i.v2ex.com", + "@@|http://lax.v2ex.com", + "@@|http://neue.v2ex.com", + "@@|http://pagespeed.v2ex.com", + "@@|http://static.v2ex.com", + "@@|http://workspace.v2ex.com", + "@@|http://www.v2ex.com", + "||data.flurry.com", + "page.bid.yahoo.com", + "tw.bid.yahoo.com", + "|https://tw.bid.yahoo.com", + "blogs.yahoo.co.jp", + "||search.yahoo.co.jp", + "buy.yahoo.com.tw/gdsale", + "hk.yahoo.com", + "hk.knowledge.yahoo.com", + "tw.money.yahoo.com", + "hk.myblog.yahoo.com", + "news.yahoo.com/china-blocks-bbc", + "||hk.news.yahoo.com", + "hk.rd.yahoo.com", + "hk.search.yahoo.com/search", + "hk.video.news.yahoo.com/video", + "meme.yahoo.com", + "tw.answers.yahoo.com", + "|https://tw.answers.yahoo.com", + "||tw.knowledge.yahoo.com", + "||tw.mall.yahoo.com", + "tw.yahoo.com", + "||tw.mobi.yahoo.com", + "tw.myblog.yahoo.com", + "||tw.news.yahoo.com", + "pulse.yahoo.com", + "||search.yahoo.com", + "upcoming.yahoo.com", + "video.yahoo.com", + "||yahoo.com.hk", + "||duckduckgo-owned-server.yahoo.net", + ".030buy.com", + ".0rz.tw", + "|http://0rz.tw", + "1-apple.com.tw", + "||1-apple.com.tw", + ".10.tt", + ".100ke.org", + ".1000giri.net", + "||1000giri.net", + ".10conditionsoflove.com", + "||10musume.com", + "123rf.com", + ".12bet.com", + "||12bet.com", + ".12vpn.com", + ".12vpn.net", + "||12vpn.com", + "||12vpn.net", + ".138.com", + "141hongkong.com/forum", + "||141jj.com", + ".141tube.com", + ".1688.com.au", + ".173ng.com", + "||173ng.com", + ".177pic.info", + ".17t17p.com", + "||18board.com", + "||18board.info", + "18onlygirls.com", + ".18p2p.com", + ".18virginsex.com", + ".1949er.org", + "zhao.1984.city", + "||zhao.1984.city", + "1984bbs.com", + "||1984bbs.com", + ".1984bbs.org", + "||1984bbs.org", + ".1991way.com", + "||1991way.com", + ".1998cdp.org", + ".1bao.org", + "|http://1bao.org", + ".1eew.com", + ".1mobile.com", + "|http://*.1mobile.tw", + "||1pondo.tv", + ".2-hand.info", + ".2000fun.com/bbs", + ".2008xianzhang.info", + "||2008xianzhang.info", + "||2017.hk", + "21andy.com/blog", + ".21pron.com", + "21sextury.com", + ".228.net.tw", + "||233abc.com", + "||24hrs.ca", + "24smile.org", + "2lipstube.com", + ".2shared.com", + "30boxes.com", + ".315lz.com", + "||32red.com", + "||36rain.com", + ".3a5a.com", + "3arabtv.com", + ".3boys2girls.com", + ".3proxy.ru", + ".3ren.ca", + ".3tui.net", + "||4bluestones.biz", + ".4chan.com", + ".4everproxy.com", + "||4everproxy.com", + "||4rbtv.com", + "||4shared.com", + "taiwannation.50webs.com", + "||51.ca", + "||51jav.org", + ".51luoben.com", + "||51luoben.com", + ".5278.cc", + ".5299.tv", + "5aimiku.com", + "5i01.com", + ".5isotoi5.org", + ".5maodang.com", + "||63i.com", + ".64museum.org", + "64tianwang.com", + "64wiki.com", + ".66.ca", + "666kb.com", + "6park.com", + "||6park.com", + "||6parker.com", + "||7capture.com", + ".7cow.com", + ".8-d.com", + "|http://8-d.com", + "85cc.net", + ".85cc.us", + "|http://85cc.us", + "|http://85st.com", + ".881903.com/page/zh-tw/", + "||881903.com", + ".888.com", + ".888poker.com", + "89.64.charter.constitutionalism.solutions", + "89-64.org", + "||89-64.org", + ".8news.com.tw", + ".8z1.net", + "||8z1.net", + ".9001700.com", + "|http://908taiwan.org/", + "||91porn.com", + "||91vps.club", + ".92ccav.com", + ".991.com", + "|http://991.com", + ".99btgc01.com", + "||99btgc01.com", + ".99cn.info", + "|http://99cn.info", + "||9bis.com", + "||9bis.net", + ".tibet.a.se", + "|http://tibet.a.se", + "||a-normal-day.com", + "a5.com.ru", + "|http://aamacau.com", + ".abc.com", + ".abc.net.au", + "||abc.net.au", + ".abchinese.com", + "abclite.net", + "|https://www.abclite.net", + ".ablwang.com", + ".aboluowang.com", + "||aboluowang.com", + ".aboutgfw.com", + ".abs.edu", + ".accim.org", + ".aceros-de-hispania.com", + ".acevpn.com", + "||acevpn.com", + ".acg18.me", + "|http://acg18.me", + "||acgkj.com", + ".acmedia365.com", + ".acnw.com.au", + "actfortibet.org", + "actimes.com.au", + "activpn.com", + "||activpn.com", + "||aculo.us", + "||addictedtocoffee.de", + ".adelaidebbs.com/bbs", + ".adpl.org.hk", + "|http://adpl.org.hk", + ".adult-sex-games.com", + "||adult-sex-games.com", + "adultfriendfinder.com", + "adultkeep.net/peepshow/members/main.htm", + "||advanscene.com", + "||advertfan.com", + ".ae.org", + "||aenhancers.com", + "||af.mil", + ".afantibbs.com", + "|http://afantibbs.com", + ".ai-kan.net", + "||ai-kan.net", + "ai-wen.net", + ".aiph.net", + "||aiph.net", + ".airasia.com", + "||airconsole.com", + "|http://download.aircrack-ng.org", + ".airvpn.org", + "||airvpn.org", + ".aisex.com", + "||ait.org.tw", + "aiweiwei.com", + ".aiweiweiblog.com", + "||aiweiweiblog.com", + "||www.ajsands.com", + "a248.e.akamai.net", + "||a248.e.akamai.net", + "rfalive1.akacast.akamaistream.net", + "voa-11.akacast.akamaistream.net", + "||abematv.akamaized.net", + "||linear-abematv.akamaized.net", + "||vod-abematv.akamaized.net", + "|https://fbcdn*.akamaihd.net/", + "rthklive2-lh.akamaihd.net", + ".akademiye.org/ug", + "|http://akademiye.org/ug", + "||akiba-online.com", + "||akow.org", + ".al-islam.com", + "||al-qimmah.net", + "||alabout.com", + ".alanhou.com", + "|http://alanhou.com", + ".alarab.qa", + "||alasbarricadas.org", + "alexlur.org", + "||alforattv.net", + ".alhayat.com", + ".alicejapan.co.jp", + "aliengu.com", + "||alkasir.com", + "||allconnected.co", + ".alldrawnsex.com", + "||alldrawnsex.com", + ".allervpn.com", + "||allfinegirls.com", + ".allgirlmassage.com", + "allgirlsallowed.org", + ".allgravure.com", + "alliance.org.hk", + ".allinfa.com", + "||allinfa.com", + ".alljackpotscasino.com", + "||allmovie.com", + "||almasdarnews.com", + ".alphaporno.com", + "||alternate-tools.com", + "alternativeto.net/software", + "alvinalexander.com", + "alwaysdata.com", + "||alwaysdata.com", + "||alwaysdata.net", + ".alwaysvpn.com", + "||alwaysvpn.com", + "||am730.com.hk", + "ameblo.jp", + "||ameblo.jp", + "www1.american.edu/ted/ice/tibet", + "||americangreencard.com", + "|http://www.americorps.gov", + "||amiblockedornot.com", + ".amigobbs.net", + ".amitabhafoundation.us", + "|http://amitabhafoundation.us", + ".amnesty.org", + "||amnesty.org", + "||amnesty.org.hk", + ".amnesty.tw", + ".amnestyusa.org", + "||amnestyusa.org", + ".amnyemachen.org", + ".amoiist.com", + ".amtb-taipei.org", + "androidplus.co/apk", + ".andygod.com", + "|http://andygod.com", + "annatam.com/chinese", + "||anchorfree.com", + "||ancsconf.org", + "||andfaraway.net", + "||android-x86.org", + "angelfire.com/hi/hayashi", + "||angularjs.org", + "animecrazy.net", + ".animeshippuuden.com", + "aniscartujo.com", + "||aniscartujo.com", + "||anobii.com", + "anonymise.us", + ".anonymitynetwork.com", + ".anonymizer.com", + ".anonymouse.org", + "||anonymouse.org", + "anontext.com", + ".anpopo.com", + ".answering-islam.org", + "|http://www.antd.org", + "||anthonycalzadilla.com", + ".anti1984.com", + "antichristendom.com", + ".antiwave.net", + "|http://antiwave.net", + ".anyporn.com", + ".anysex.com", + "|http://anysex.com", + "||aobo.com.au", + ".aofriend.com", + "|http://aofriend.com", + ".aofriend.com.au", + ".aojiao.org", + "||aomiwang.com", + "video.ap.org", + ".apetube.com", + "||apiary.io", + ".apigee.com", + "||apigee.com", + "apk-dl.com", + "apkdler.com/apk/view", + ".apkmonk.com/app", + "||apkplz.com", + "apkpure.com", + "||apkpure.com", + ".aplusvpn.com", + ".appdownloader.net/Android", + ".appledaily.com", + "||appledaily.com", + "appledaily.com.hk", + "||appledaily.com.hk", + "appledaily.com.tw", + "||appledaily.com.tw", + ".appshopper.com", + "|http://appshopper.com", + "||appsocks.net", + "||appsto.re", + ".aptoide.com", + "||aptoide.com", + "||archives.gov", + ".archive.fo", + "||archive.fo", + ".archive.is", + "||archive.is", + ".archive.li", + "||archive.li", + "||archive.org", + "archive.today", + "|https://archive.today", + ".arctosia.com", + "|http://arctosia.com", + "||areca-backup.org", + ".arethusa.su", + "||arethusa.su", + "||arlingtoncemetery.mil", + "||army.mil", + ".art4tibet1998.org", + "artofpeacefoundation.org", + "artsy.net", + "||asacp.org", + "asdfg.jp/dabr", + "asg.to", + ".asia-gaming.com", + ".asiaharvest.org", + "||asiaharvest.org", + "asianews.it", + "|http://japanfirst.asianfreeforum.com/", + "||asiansexdiary.com", + "||asianwomensfilm.de", + ".asiatgp.com", + ".asiatoday.us", + "||askstudent.com", + ".askynz.net", + "||askynz.net", + "||assembla.com", + "||astrill.com", + "||atc.org.au", + ".atchinese.com", + "|http://atchinese.com", + "atgfw.org", + ".atlaspost.com", + "||atlaspost.com", + "||atdmt.com", + ".atlanta168.com/forum", + ".atnext.com", + "||atnext.com", + "ice.audionow.com", + ".av.com", + "||av.movie", + ".av-e-body.com", + "avaaz.org", + "||avaaz.org", + ".avbody.tv", + ".avcity.tv", + ".avcool.com", + ".avdb.in", + "||avdb.in", + ".avdb.tv", + "||avdb.tv", + ".avfantasy.com", + ".avgle.com", + "||avgle.com", + "||avidemux.org", + "||avoision.com", + ".avyahoo.com", + "||axureformac.com", + ".azerbaycan.tv", + "azerimix.com", + "boxun*.azurewebsites.net", + "||boxun*.azurewebsites.net", + "forum.baby-kingdom.com", + "babynet.com.hk", + "backchina.com", + "||backchina.com", + ".backpackers.com.tw/forum", + "backtotiananmen.com", + ".badiucao.com", + "||badiucao.com", + ".badjojo.com", + "badoo.com", + "|http://*2.bahamut.com.tw", + "||baidu.jp", + ".baijie.org", + "|http://baijie.org", + "||bailandaily.com", + "||baixing.me", + "||bakgeekhome.tk", + ".banana-vpn.com", + "||banana-vpn.com", + ".band.us", + ".bandwagonhost.com", + "||bandwagonhost.com", + ".bangbrosnetwork.com", + ".bangchen.net", + "|http://bangchen.net", + "||bangyoulater.com", + "bannedbook.org", + "||bannedbook.org", + ".bannednews.org", + ".baramangaonline.com", + "|http://baramangaonline.com", + ".barenakedislam.com", + "||barnabu.co.uk", + "||barton.de", + "bartvpn.com", + ".bastillepost.com", + "bayvoice.net", + "||bayvoice.net", + "dajusha.baywords.com", + "||bbchat.tv", + "||bb-chat.tv", + ".bbg.gov", + ".bbkz.com/forum", + ".bbnradio.org", + "bbs-tw.com", + ".bbsdigest.com/thread", + "||bbsfeed.com", + "bbsland.com", + ".bbsmo.com", + ".bbsone.com", + "bbtoystore.com", + ".bcast.co.nz", + ".bcc.com.tw/board", + ".bcchinese.net", + ".bcmorning.com", + "bdsmvideos.net", + ".beaconevents.com", + ".bebo.com", + "||bebo.com", + ".beevpn.com", + "||beevpn.com", + ".behindkink.com", + "||beijing1989.com", + "beijingspring.com", + "||beijingspring.com", + ".beijingzx.org", + "|http://beijingzx.org", + ".belamionline.com", + ".bell.wiki", + "|http://bell.wiki", + "bemywife.cc", + "beric.me", + ".berlintwitterwall.com", + "||berlintwitterwall.com", + ".berm.co.nz", + ".bestforchina.org", + "||bestforchina.org", + ".bestgore.com", + ".bestpornstardb.com", + "||bestvpn.com", + ".bestvpnanalysis.com", + ".bestvpnserver.com", + ".bestvpnservice.com", + ".bestvpnusa.com", + "||bet365.com", + ".betfair.com", + "||betternet.co", + ".bettervpn.com", + "||bettervpn.com", + ".bettween.com", + "||bettween.com", + "||betvictor.com", + ".bewww.net", + ".beyondfirewall.com", + "||bfnn.org", + "||bfsh.hk", + ".bgvpn.com", + "||bgvpn.com", + ".bianlei.com", + "@@||bianlei.com", + "biantailajiao.com", + "biantailajiao.in", + ".biblesforamerica.org", + "|http://biblesforamerica.org", + ".bic2011.org", + "bigfools.com", + "||bigjapanesesex.com", + ".bignews.org", + "||bignews.org", + ".bigsound.org", + ".biliworld.com", + "|http://biliworld.com", + "|http://billypan.com/wiki", + ".binux.me", + "ai.binwang.me/couplet", + "bipic.net", + ".bit.do", + "|http://bit.do", + ".bit.ly", + "|http://bit.ly", + "||bitcointalk.org", + ".bitshare.com", + "||bitshare.com", + "bitsnoop.com", + ".bitvise.com", + "||bitvise.com", + "bizhat.com", + "||bl-doujinsouko.com", + ".bjnewlife.org", + ".bjs.org", + "bjzc.org", + "||bjzc.org", + ".blacklogic.com", + ".blackvpn.com", + "||blackvpn.com", + "blewpass.com", + "tor.blingblingsquad.net", + ".blinkx.com", + "||blinkx.com", + "blinw.com", + ".blip.tv", + "||blip.tv/", + ".blockcn.com", + "||blockcn.com", + "||blockless.com", + "||blog.de", + ".blog.jp", + "|http://blog.jp", + "@@||jpush.cn", + ".blogcatalog.com", + "||blogcatalog.com", + "||blogcity.me", + ".blogger.com", + "||blogger.com", + "blogimg.jp", + "||blog.kangye.org", + ".bloglines.com", + "||bloglines.com", + "||bloglovin.com", + "rconversation.blogs.com", + "blogtd.net", + ".blogtd.org", + "|http://blogtd.org", + "||bloodshed.net", + ".bloomberg.cn", + "||bloomberg.cn", + ".bloomberg.com", + "||bloomberg.com", + "bloomberg.de", + "||bloomberg.de", + "||assets.bwbx.io", + "||bloomfortune.com", + "blueangellive.com", + ".bmfinn.com", + ".bnews.co", + "||bnews.co", + "||bnrmetal.com", + "boardreader.com/thread", + "||boardreader.com", + ".bod.asia", + "|http://bod.asia", + ".bodog88.com", + ".bolehvpn.net", + "||bolehvpn.net", + "bonbonme.com", + ".bonbonsex.com", + ".bonfoundation.org", + ".bongacams.com", + "||boobstagram.com", + "||book.com.tw", + "bookepub.com", + "||books.com.tw", + "||botanwang.com", + ".bot.nu", + ".bowenpress.com", + "||bowenpress.com", + "||app.box.com", + "dl.box.net", + "||dl.box.net", + ".boxpn.com", + "||boxpn.com", + "boxun.com", + "||boxun.com", + ".boxun.tv", + "||boxun.tv", + "boxunblog.com", + "||boxunblog.com", + ".boxunclub.com", + "boyangu.com", + ".boyfriendtv.com", + ".boysfood.com", + "||br.st", + ".brainyquote.com/quotes/authors/d/dalai_lama", + "||brandonhutchinson.com", + "||braumeister.org", + ".bravotube.net", + "||bravotube.net", + ".brazzers.com", + "||brazzers.com", + ".break.com", + "||break.com", + "breakgfw.com", + "||breakgfw.com", + "breaking911.com", + ".breakingtweets.com", + "||breakingtweets.com", + "||breakwall.net", + "briian.com/6511/freegate", + ".briefdream.com/%E7%B4%A0%E6%A3%BA", + "brizzly.com", + "||brizzly.com", + "||brkmd.com", + "broadbook.com", + ".broadpressinc.com", + "||broadpressinc.com", + "bbs.brockbbs.com", + "brucewang.net", + ".brutaltgp.com", + "||brutaltgp.com", + ".bt2mag.com", + "||bt95.com", + ".btaia.com", + ".btbtav.com", + "|http://btdigg.org", + ".btku.me", + "||btku.me", + "||btku.org", + ".btspread.com", + ".btsynckeys.com", + ".budaedu.org", + "||budaedu.org", + ".buddhanet.com.tw/zfrop/tibet", + ".buddhistchannel.tv", + ".buffered.com", + "|http://buffered.com", + ".bullog.org", + "||bullog.org", + ".bullogger.com", + "||bullogger.com", + "bunbunhk.com", + ".busayari.com", + "|http://busayari.com", + ".businessinsider.com/bing-could-be-censoring-search-results-2014", + ".businessinsider.com/china-banks-preparing-for-debt-implosion-2014", + ".businessinsider.com/hong-kong-activists-defy-police-tear-gas-as-protests-continue-overnight-2014", + ".businessinsider.com/internet-outages-reported-in-north-korea-2014", + ".businessinsider.com/iphone-6-is-approved-for-sale-in-china-2014", + ".businessinsider.com/nfl-announcers-surface-tablets-2014", + ".businessinsider.com/panama-papers", + ".businessinsider.com/umbrella-man-hong-kong-2014", + "|http://www.businessinsider.com.au/*", + ".businesstoday.com.tw", + "||businesstoday.com.tw", + ".businessweek.com", + ".busu.org/news", + "|http://busu.org/news", + "busytrade.com", + ".buugaa.com", + ".buzzhand.com", + ".buzzhand.net", + ".buzzorange.com", + "||buzzorange.com", + "||bvpn.com", + "||bwh1.net", + "bwsj.hk", + "||bx.tl", + ".c-spanvideo.org", + "||c-spanvideo.org", + "||c-est-simple.com", + ".c100tibet.org", + "||cablegatesearch.net", + ".cachinese.com", + ".cacnw.com", + "|http://cacnw.com", + ".cactusvpn.com", + "||cactusvpn.com", + ".cafepress.com", + ".cahr.org.tw", + ".calameo.com/books", + "cn.calameo.com", + "|http://cn.calameo.com", + ".calgarychinese.ca", + ".calgarychinese.com", + ".calgarychinese.net", + "|http://blog.calibre-ebook.com", + "|http://google.calstate.edu", + "falun.caltech.edu", + ".its.caltech.edu/~falun/", + ".cam4.com", + ".cam4.jp", + ".cam4.sg", + ".camfrog.com", + "||camfrog.com", + "||cams.com", + ".cams.org.sg", + "canadameet.com", + ".canalporno.com", + "|http://bbs.cantonese.asia/", + ".canyu.org", + "||canyu.org", + ".cao.im", + ".caobian.info", + "||caobian.info", + "caochangqing.com", + "||caochangqing.com", + ".cap.org.hk", + "||cap.org.hk", + ".carabinasypistolas.com", + "cardinalkungfoundation.org", + "carmotorshow.com", + "ss.carryzhou.com", + ".cartoonmovement.com", + "||cartoonmovement.com", + ".casadeltibetbcn.org", + ".casatibet.org.mx", + "|http://casatibet.org.mx", + "cari.com.my", + "||caribbeancom.com", + ".casinoking.com", + ".casinoriva.com", + "||catch22.net", + ".catchgod.com", + "|http://catchgod.com", + "||catfightpayperview.xxx", + ".catholic.org.hk", + "||catholic.org.hk", + "catholic.org.tw", + "||catholic.org.tw", + ".cathvoice.org.tw", + "||cattt.com", + ".cbc.ca", + "||cbc.ca", + ".cbsnews.com/video", + ".cbtc.org.hk", + "||cccat.cc", + "||cccat.co", + ".ccdtr.org", + "||ccdtr.org", + ".cchere.com", + "||cchere.com", + ".ccim.org", + ".cclife.ca", + "cclife.org", + "cclifefl.org", + ".ccthere.com", + "||ccthere.com", + "||ccthere.net", + ".cctmweb.net", + ".cctongbao.com/article/2078732", + "ccue.ca", + "ccue.com", + ".ccvoice.ca", + ".ccw.org.tw", + ".cgdepot.org", + "|http://cgdepot.org", + "||cdbook.org", + ".cdcparty.com", + ".cdef.org", + "||cdef.org", + "||cdig.info", + "cdjp.org", + "||cdjp.org", + ".cdn-apple.com", + "||cdn-apple.com", + ".cdnews.com.tw", + "cdp1989.org", + "cdp1998.org", + "||cdp1998.org", + "cdp2006.org", + "||cdp2006.org", + ".cdpa.url.tw", + "cdpeu.org", + "cdpusa.org", + "cdpweb.org", + "||cdpweb.org", + "cdpwu.org", + "||cdpwu.org", + "||cdw.com", + ".cecc.gov", + "||cecc.gov", + "||cellulo.info", + "||cenews.eu", + "||centerforhumanreprod.com", + "||centralnation.com", + ".centurys.net", + "|http://centurys.net", + ".cfhks.org.hk", + ".cfos.de", + ".cftfc.com", + ".cgst.edu", + ".change.org", + "||change.org", + ".changp.com", + "||changp.com", + ".changsa.net", + "|http://changsa.net", + ".channel8news.sg/news8", + ".chapm25.com", + ".chaturbate.com", + ".chuang-yen.org", + "chengmingmag.com", + ".chenguangcheng.com", + "||chenguangcheng.com", + ".chenpokong.com", + ".chenpokong.net", + "|http://chenpokong.net", + "||cherrysave.com", + ".chhongbi.org", + "chicagoncmtv.com", + "|http://chicagoncmtv.com", + ".china-week.com", + "china101.com", + "||china101.com", + "||china18.org", + "||china21.com", + "china21.org", + "||china21.org", + ".china5000.us", + "chinaaffairs.org", + "||chinaaffairs.org", + "||chinaaid.me", + "chinaaid.us", + "chinaaid.org", + "chinaaid.net", + "chinacomments.org", + "||chinacomments.org", + ".chinachange.org", + "||chinachange.org", + "chinachannel.hk", + "||chinachannel.hk", + ".chinacitynews.be", + ".chinadialogue.net", + ".chinadigitaltimes.net", + "||chinadigitaltimes.net", + ".chinaelections.org", + "||chinaelections.org", + ".chinaeweekly.com", + "||chinaeweekly.com", + "||chinafreepress.org", + ".chinagate.com", + "chinageeks.org", + "chinagfw.org", + "||chinagfw.org", + ".chinagonet.com", + ".chinagreenparty.org", + "||chinagreenparty.org", + ".chinahorizon.org", + "||chinahorizon.org", + ".chinahush.com", + ".chinainperspective.com", + "||chinainterimgov.org", + "chinalaborwatch.org", + "chinalawtranslate.com", + ".chinapost.com.tw/taiwan/national/national-news", + "chinaxchina.com/howto", + "chinalawandpolicy.com", + ".chinamule.com", + "||chinamule.com", + "chinamz.org", + ".chinanewscenter.com", + "|https://chinanewscenter.com", + ".chinapress.com.my", + "||chinapress.com.my", + ".china-review.com.ua", + "|http://china-review.com.ua", + ".chinarightsia.org", + "chinasmile.net/forums", + "chinasocialdemocraticparty.com", + "||chinasocialdemocraticparty.com", + "chinasoul.org", + "||chinasoul.org", + ".chinasucks.net", + "||chinatopsex.com", + ".chinatown.com.au", + "chinatweeps.com", + "chinaway.org", + ".chinaworker.info", + "||chinaworker.info", + "chinayouth.org.hk", + "chinayuanmin.org", + "||chinayuanmin.org", + ".chinese-hermit.net", + "chinese-leaders.org", + "chinese-memorial.org", + ".chinesedaily.com", + "||chinesedailynews.com", + ".chinesedemocracy.com", + "||chinesedemocracy.com", + "||chinesegay.org", + ".chinesen.de", + "||chinesen.de", + ".chinesenews.net.au/", + ".chinesepen.org", + ".chinesetalks.net/ch", + "||chineseupress.com", + ".chingcheong.com", + "||chingcheong.com", + ".chinman.net", + "|http://chinman.net", + "chithu.org", + "|http://chn.chosun.com", + "cnnews.chosun.com/client/news/viw.asp?cate=C01&mcate", + ".chrdnet.com", + "|http://chrdnet.com", + ".christianfreedom.org", + "|http://christianfreedom.org", + "christianstudy.com", + "||christianstudy.com", + "christusrex.org/www1/sdc", + ".chubold.com", + "chubun.com", + "chuizi.net", + "christiantimes.org.hk", + ".chrlawyers.hk", + "|http://chrlawyers.hk", + ".churchinhongkong.org/b5/index.php", + "|http://churchinhongkong.org/b5/index.php", + ".chushigangdrug.ch", + ".cienen.com", + ".cineastentreff.de", + ".cipfg.org", + "||circlethebayfortibet.org", + "||cirosantilli.com", + ".citizencn.com", + "||citizencn.com", + "|http://citizenlab.org", + "|http://www.citizenlab.org", + "||citizenscommission.hk", + ".citizenlab.org", + "citizensradio.org", + ".city365.ca", + "|http://city365.ca", + "city9x.com", + "||citypopulation.de", + ".citytalk.tw/event", + ".civicparty.hk", + "||civicparty.hk", + ".civildisobediencemovement.org", + "civilhrfront.org", + "||civilhrfront.org", + ".civiliangunner.com", + ".civilmedia.tw", + "||civilmedia.tw", + "psiphon.civisec.org", + "||vpn.cjb.net", + ".ck101.com", + "||ck101.com", + ".clarionproject.org/news/islamic-state-isis-isil-propaganda", + "||classicalguitarblog.net", + ".clb.org.hk", + "clearharmony.net", + "clearwisdom.net", + "clinica-tibet.ru", + ".clipfish.de", + "cloakpoint.com", + "||club1069.com", + "cmi.org.tw", + "|http://www.cmoinc.org", + "cmp.hku.hk", + "hkupop.hku.hk", + "||cmule.com", + "||cmule.org", + "||cms.gov", + "|http://vpn.cmu.edu", + "|http://vpn.sv.cmu.edu", + ".cn6.eu", + ".cna.com.tw", + "||cna.com.tw", + ".cnabc.com", + ".cnd.org", + "||cnd.org", + "download.cnet.com", + ".cnex.org.cn", + ".cnineu.com", + "wiki.cnitter.com", + ".cnn.com/video", + ".cnpolitics.org", + "||cnpolitics.org", + ".cn-proxy.com", + "|http://cn-proxy.com", + ".cnproxy.com", + "blog.cnyes.com", + "news.cnyes.com", + "||coat.co.jp", + ".cochina.co", + "||cochina.co", + "||cochina.org", + ".code1984.com/64", + "|http://goagent.codeplex.com", + "||codeshare.io", + "||codeskulptor.org", + "|http://tosh.comedycentral.com", + "comefromchina.com", + "||comefromchina.com", + ".comic-mega.me", + "commandarms.com", + "||commentshk.com", + ".communistcrimes.org", + "||communistcrimes.org", + "||communitychoicecu.com", + "||compileheart.com", + "||conoha.jp", + ".contactmagazine.net", + ".convio.net", + ".coobay.com", + "|http://www.cool18.com/bbs*/", + ".coolaler.com", + "||coolaler.com", + "coolder.com", + "||coolder.com", + "||coolloud.org.tw", + ".coolncute.com", + "||coolstuffinc.com", + "corumcollege.com", + ".cos-moe.com", + "|http://cos-moe.com", + ".cosplayjav.pl", + "|http://cosplayjav.pl", + ".cotweet.com", + "||cotweet.com", + ".coursehero.com", + "||coursehero.com", + "cpj.org", + "||cpj.org", + ".cq99.us", + "|http://cq99.us", + "crackle.com", + "||crackle.com", + ".crazys.cc", + ".crazyshit.com", + "||crchina.org", + "crd-net.org", + "creaders.net", + "||creaders.net", + ".creadersnet.com", + "||cristyli.com", + ".crocotube.com", + "|http://crocotube.com", + ".crossthewall.net", + "||crossthewall.net", + ".crossvpn.net", + "||crossvpn.net", + "||crucial.com", + "csdparty.com", + "||csdparty.com", + "||csuchen.de", + ".csw.org.uk", + ".ct.org.tw", + "||ct.org.tw", + ".ctao.org", + ".ctfriend.net", + ".ctitv.com.tw", + "cts.com.tw", + "|http://library.usc.cuhk.edu.hk/", + "|http://mjlsh.usc.cuhk.edu.hk/", + ".cuhkacs.org/~benng", + ".cuihua.org", + "||cuihua.org", + ".cuiweiping.net", + "||cuiweiping.net", + "||culture.tw", + ".cumlouder.com", + "||cumlouder.com", + "||curvefish.com", + ".cusu.hk", + "||cusu.hk", + ".cutscenes.net", + ".cw.com.tw", + "||cw.com.tw", + "|http://forum.cyberctm.com", + "cyberghostvpn.com", + "||cyberghostvpn.com", + "||cynscribe.com", + "cytode.us", + "||ifan.cz.cc", + "||mike.cz.cc", + "||nic.cz.cc", + ".d-fukyu.com", + "|http://d-fukyu.com", + "cl.d0z.net", + ".d100.net", + "||d100.net", + ".d2bay.com", + "|http://d2bay.com", + ".dabr.co.uk", + "||dabr.co.uk", + "dabr.eu", + "dabr.mobi", + "||dabr.mobi", + "||dabr.me", + "dadazim.com", + "||dadazim.com", + ".dadi360.com", + ".dafabet.com", + "dafagood.com", + "dafahao.com", + ".dafoh.org", + ".daftporn.com", + ".dagelijksestandaard.nl", + ".daidostup.ru", + "|http://daidostup.ru", + ".dailidaili.com", + "||dailidaili.com", + ".dailymotion.com", + "||dailymotion.com", + "daiphapinfo.net", + ".dajiyuan.com", + "||dajiyuan.de", + "dajiyuan.eu", + "dalailama.com", + ".dalailama.mn", + "|http://dalailama.mn", + ".dalailama.ru", + "||dalailama.ru", + "dalailama80.org", + ".dalailama-archives.org", + ".dalailamacenter.org", + "|http://dalailamacenter.org", + "dalailamafellows.org", + ".dalailamafilm.com", + ".dalailamafoundation.org", + ".dalailamahindi.com", + ".dalailamainaustralia.org", + ".dalailamajapanese.com", + ".dalailamaprotesters.info", + ".dalailamaquotes.org", + ".dalailamatrust.org", + ".dalailamavisit.org.nz", + ".dalailamaworld.com", + "||dalailamaworld.com", + "dalianmeng.org", + "||dalianmeng.org", + ".daliulian.org", + "||daliulian.org", + ".danke4china.net", + "||danke4china.net", + ".danwei.org", + "daolan.net", + ".daozhongxing.org", + "darktoy.net", + "||dastrassi.org", + "blog.daum.net/_blog", + ".david-kilgour.com", + "|http://david-kilgour.com", + "daxa.cn", + "||daxa.cn", + "cn.dayabook.com", + ".daylife.com/topic/dalai_lama", + "||db.tt", + ".dbc.hk/main", + "||dcard.tw", + "dcmilitary.com", + ".ddc.com.tw", + ".ddhw.info", + "||de-sci.org", + ".de-sci.org", + "packages.debian.org/zh-cn/lenny/gpass", + "||decodet.co", + ".definebabe.com", + "||delcamp.net", + "delicious.com/GFWbookmark", + ".democrats.org", + "||democrats.org", + "||desc.se", + "||dessci.com", + ".destroy-china.jp", + "||deutsche-welle.de", + "||devio.us", + "||devpn.com", + "||dfas.mil", + "dfn.org", + "dharmakara.net", + ".dharamsalanet.com", + ".diaoyuislands.org", + "||diaoyuislands.org", + ".difangwenge.org", + "|http://digiland.tw/", + "||digitalnomadsproject.org", + ".diigo.com", + "||diigo.com", + "||dilber.se", + "||furl.net", + ".dipity.com", + "||directcreative.com", + ".discuss.com.hk", + "||discuss.com.hk", + ".discuss4u.com", + "disp.cc", + ".disqus.com", + "||disqus.com", + ".dit-inc.us", + "||dit-inc.us", + ".dizhidizhi.com", + "||dizhuzhishang.com", + "djangosnippets.org", + ".djorz.com", + "||djorz.com", + "||dl-laby.jp", + "||dlsite.com", + "||dlyoutube.com", + "||dmcdn.net", + ".dnscrypt.org", + "||dnscrypt.org", + "||dns2go.com", + "||dnssec.net", + "doctorvoice.org", + ".dogfartnetwork.com/tour", + "gloryhole.com", + ".dojin.com", + ".dok-forum.net", + "||dolc.de", + "||dolf.org.hk", + "||dollf.com", + ".domain.club.tw", + ".domaintoday.com.au", + "chinese.donga.com", + "dongtaiwang.com", + "||dongtaiwang.com", + ".dongtaiwang.net", + "||dongtaiwang.net", + ".dongyangjing.com", + "|http://danbooru.donmai.us", + ".dontfilter.us", + "||dontmovetochina.com", + ".dorjeshugden.com", + ".dotplane.com", + "||dotplane.com", + "||dotsub.com", + ".dotvpn.com", + "||dotvpn.com", + ".doub.io", + "||doub.io", + "||dougscripts.com", + "||douhokanko.net", + "||doujincafe.com", + "dowei.org", + "dphk.org", + "dpp.org.tw", + "||dpp.org.tw", + "||dpr.info", + "||dragonsprings.org", + ".dreamamateurs.com", + ".drepung.org", + "||drgan.net", + ".drmingxia.org", + "|http://drmingxia.org", + "||dropbooks.tv", + "||dropbox.com", + "||api.dropboxapi.com", + "||notify.dropboxapi.com", + "||dropboxusercontent.com", + "drsunacademy.com", + ".drtuber.com", + ".dscn.info", + "|http://dscn.info", + ".dstk.dk", + "|http://dstk.dk", + "||dtiblog.com", + "||dtic.mil", + ".dtwang.org", + ".duanzhihu.com", + ".duckdns.org", + "|http://duckdns.org", + ".duckduckgo.com", + "||duckduckgo.com", + ".duckload.com/download", + "||duckmylife.com", + ".duga.jp", + "|http://duga.jp", + ".duihua.org", + "||duihua.org", + "||duihuahrjournal.org", + ".dunyabulteni.net", + ".duoweitimes.com", + "||duoweitimes.com", + "duping.net", + "||duplicati.com", + "dupola.com", + "dupola.net", + ".dushi.ca", + "||dvorak.org", + ".dw.com", + "||dw.com", + "||dw.de", + ".dw-world.com", + "||dw-world.com", + ".dw-world.de", + "|http://dw-world.de", + "www.dwheeler.com", + "dwnews.com", + "||dwnews.com", + "dwnews.net", + "||dwnews.net", + "xys.dxiong.com", + "||dynawebinc.com", + "||dysfz.cc", + ".dzze.com", + "||e-classical.com.tw", + "||e-gold.com", + ".e-gold.com", + ".e-hentai.org", + "||e-hentai.org", + ".e-hentaidb.com", + "|http://e-hentaidb.com", + "e-info.org.tw", + ".e-traderland.net/board", + ".e-zone.com.hk/discuz", + "|http://e-zone.com.hk/discuz", + ".e123.hk", + "||e123.hk", + ".earlytibet.com", + "|http://earlytibet.com", + ".earthcam.com", + ".earthvpn.com", + "||earthvpn.com", + "eastern-ark.com", + ".easternlightning.org", + ".eastturkestan.com", + "|http://www.eastturkistan.net/", + ".eastturkistan-gov.org", + ".eastturkistancc.org", + ".eastturkistangovernmentinexile.us", + "||eastturkistangovernmentinexile.us", + ".easyca.ca", + ".easypic.com", + ".ebony-beauty.com", + "ebookbrowse.com", + "ebookee.com", + "||ecfa.org.tw", + "ushuarencity.echainhost.com", + "||ecimg.tw", + "ecministry.net", + ".economist.com", + "bbs.ecstart.com", + "edgecastcdn.net", + "||edgecastcdn.net", + "/twimg\\.edgesuite\\.net\\/\\/?appledaily/", + "edicypages.com", + ".edmontonchina.cn", + ".edmontonservice.com", + "edoors.com", + ".edubridge.com", + "||edubridge.com", + ".edupro.org", + "||eevpn.com", + "efcc.org.hk", + ".efukt.com", + "|http://efukt.com", + "||eic-av.com", + "||eireinikotaerukai.com", + ".eisbb.com", + ".eksisozluk.com", + "||eksisozluk.com", + "electionsmeter.com", + "||elgoog.im", + ".ellawine.org", + ".elpais.com", + "||elpais.com", + ".eltondisney.com", + ".emaga.com/info/3407", + "emilylau.org.hk", + ".emanna.com/chineseTraditional", + "bitc.bme.emory.edu/~lzhou/blogs", + ".empfil.com", + ".emule-ed2k.com", + "|http://emule-ed2k.com", + ".emulefans.com", + "|http://emulefans.com", + ".emuparadise.me", + ".enanyang.my", + "||enewstree.com", + ".enfal.de", + "chinese.engadget.com", + "||engagedaily.org", + "englishforeveryone.org", + "||englishfromengland.co.uk", + "englishpen.org", + ".enlighten.org.tw", + "||entermap.com", + ".entnt.com", + "|http://entnt.com", + ".episcopalchurch.org", + ".epochhk.com", + "|http://epochhk.com", + "epochtimes-bg.com", + "||epochtimes-bg.com", + "epochtimes-romania.com", + "||epochtimes-romania.com", + "epochtimes.co.il", + "||epochtimes.co.il", + "epochtimes.co.kr", + "||epochtimes.co.kr", + "epochtimes.com", + "||epochtimes.com", + ".epochtimes.cz", + "epochtimes.de", + "epochtimes.fr", + ".epochtimes.ie", + ".epochtimes.it", + "epochtimes.jp", + "epochtimes.ru", + "epochtimes.se", + "epochtimestr.com", + ".epochweek.com", + "||epochweek.com", + "||epochweekly.com", + ".eporner.com", + ".equinenow.com", + "erabaru.net", + ".eracom.com.tw", + ".eraysoft.com.tr", + ".erepublik.com", + ".erights.net", + "||erights.net", + ".erktv.com", + "|http://erktv.com", + "||ernestmandel.org", + "||erodaizensyu.com", + "||erodoujinlog.com", + "||erodoujinworld.com", + "||eromanga-kingdom.com", + "||eromangadouzin.com", + ".eromon.net", + "|http://eromon.net", + ".eroprofile.com", + ".eroticsaloon.net", + ".eslite.com", + "||eslite.com", + "wiki.esu.im/%E8%9B%A4%E8%9B%A4%E8%AF%AD%E5%BD%95", + ".etaa.org.au", + ".etadult.com", + "etaiwannews.com", + "||etizer.org", + "||etokki.com", + ".ettoday.net/news/20151216/614081", + "etvonline.hk", + ".eu.org", + "||eu.org", + ".eucasino.com", + ".eulam.com", + ".eurekavpt.com", + "||eurekavpt.com", + ".euronews.com", + "||euronews.com", + "eeas.europa.eu/delegations/china/press_corner/all_news/news/2015/20150716_zh", + "eeas.europa.eu/statements-eeas/2015/151022", + ".evschool.net", + "|http://evschool.net", + "||exblog.jp", + "||blog.exblog.co.jp", + "@@||www.exblog.jp", + ".exchristian.hk", + "||exchristian.hk", + "|http://blog.excite.co.jp", + "||exmormon.org", + "||expatshield.com", + ".expecthim.com", + "||expecthim.com", + "experts-univers.com", + "||exploader.net", + ".expressvpn.com", + "||expressvpn.com", + ".extremetube.com", + "eyevio.jp", + "||eyevio.jp", + ".eyny.com", + "||eyny.com", + ".ezpc.tk/category/soft", + ".ezpeer.com", + "||facebookquotes4u.com", + ".faceless.me", + "||faceless.me", + "|http://facesoftibetanselfimmolators.info", + "||facesofnyfw.com", + ".faith100.org", + "|http://faith100.org", + ".faithfuleye.com", + "||faiththedog.info", + ".fakku.net", + ".falsefire.com", + "||falsefire.com", + "falun-co.org", + "falunart.org", + "||falunasia.info", + "|http://falunau.org", + ".falunaz.net", + "falundafa.org", + "falundafa-dc.org", + "||falundafa-florida.org", + "||falundafa-nc.org", + "||falundafa-pa.net", + "||falundafa-sacramento.org", + "falun-ny.net", + "||falundafaindia.org", + "falundafamuseum.org", + ".falungong.club", + ".falungong.de", + "falungong.org.uk", + "||falunhr.org", + "faluninfo.de", + "faluninfo.net", + ".falunpilipinas.net", + "||falunworld.net", + "familyfed.org", + ".fangeming.com", + "||fanglizhi.info", + "||fangong.org", + "fangongheike.com", + ".fanqiang.tk", + "fanqianghou.com", + "||fanqianghou.com", + ".fanqiangzhe.com", + "||fanqiangzhe.com", + "fapdu.com", + "faproxy.com", + ".fawanghuihui.org", + "fanqiangyakexi.net", + "fail.hk", + "||famunion.com", + ".fan-qiang.com", + ".fangbinxing.com", + "||fangbinxing.com", + "fangeming.com", + ".fangmincn.org", + "||fangmincn.org", + ".fanhaodang.com", + "||fanswong.com", + ".fanyue.info", + ".farwestchina.com", + "en.favotter.net", + "nytimes.map.fastly.net", + "||nytimes.map.fastly.net", + "||fast.wistia.com", + "||fastssh.com", + "||faststone.org", + "favstar.fm", + "||favstar.fm", + "faydao.com/weblog", + ".fc2.com", + ".fc2china.com", + ".fc2cn.com", + "||fc2cn.com", + "fc2blog.net", + "|http://uygur.fc2web.com/", + "video.fdbox.com", + ".fdc64.de", + ".fdc64.org", + ".fdc89.jp", + "||fourface.nodesnoop.com", + "||feelssh.com", + "feer.com", + ".feifeiss.com", + "|http://feitianacademy.org", + ".feitian-california.org", + "||feministteacher.com", + ".fengzhenghu.com", + "||fengzhenghu.com", + ".fengzhenghu.net", + "||fengzhenghu.net", + ".fevernet.com", + "|http://ff.im", + "fffff.at", + "fflick.com", + ".ffvpn.com", + "fgmtv.net", + ".fgmtv.org", + ".fhreports.net", + "|http://fhreports.net", + ".figprayer.com", + "||figprayer.com", + ".fileflyer.com", + "||fileflyer.com", + "|http://feeds.fileforum.com", + ".files2me.com", + ".fileserve.com/file", + "fillthesquare.org", + "filmingfortibet.org", + ".filthdump.com", + ".finchvpn.com", + "||finchvpn.com", + "findmespot.com", + "||findyoutube.com", + "||findyoutube.net", + ".fingerdaily.com", + "finler.net", + ".firearmsworld.net", + "|http://firearmsworld.net", + ".fireofliberty.org", + "||fireofliberty.org", + ".firetweet.io", + "||firetweet.io", + ".flagsonline.it", + "fleshbot.com", + ".fleursdeslettres.com", + "|http://fleursdeslettres.com", + "||flgg.us", + "||flgjustice.org", + "||flickr.com", + "||staticflickr.com", + "flickrhivemind.net", + ".flickriver.com", + ".fling.com", + "||flipkart.com", + "||flog.tw", + ".flyvpn.com", + "||flyvpn.com", + "|http://cn.fmnnow.com", + "fofldfradio.org", + "blog.foolsmountain.com", + ".forum4hk.com", + "fangong.forums-free.com", + "pioneer-worker.forums-free.com", + "|https://ss*.4sqi.net", + "video.foxbusiness.com", + "|http://foxgay.com", + "||fringenetwork.com", + "||flecheinthepeche.fr", + ".fochk.org", + "|http://fochk.org", + "||focustaiwan.tw", + ".focusvpn.com", + "||fofg.org", + ".fofg-europe.net", + ".fooooo.com", + "||fooooo.com", + "footwiball.com", + ".fotile.me", + "||fourthinternational.org", + "||foxdie.us", + "||foxsub.com", + "foxtang.com", + ".fpmt.org", + "|http://fpmt.org", + ".fpmt.tw", + ".fpmt-osel.org", + "||fpmtmexico.org", + "fqok.org", + "||fqrouter.com", + "||franklc.com", + ".freakshare.com", + "|http://freakshare.com", + "||free4u.com.ar", + "free-gate.org", + ".free-hada-now.org", + "free-proxy.cz", + ".free.fr/adsl", + "kineox.free.fr", + "tibetlibre.free.fr", + "||freealim.com", + "whitebear.freebearblog.org", + "||freebrowser.org", + ".freechal.com", + ".freedomchina.info", + "||freedomchina.info", + ".freedomhouse.org", + "||freedomhouse.org", + ".freedomsherald.org", + "||freedomsherald.org", + ".freefq.com", + ".freefuckvids.com", + ".freegao.com", + "||freegao.com", + "freeilhamtohti.org", + ".freekwonpyong.org", + "||saveliuxiaobo.com", + ".freelotto.com", + "||freelotto.com", + "freeman2.com", + ".freeopenvpn.com", + "freemoren.com", + "freemorenews.com", + "freemuse.org/archives/789", + "freenet-china.org", + "freenewscn.com", + "cn.freeones.com", + ".freeoz.org/bbs", + "||freeoz.org", + "||freessh.us", + "free4u.com.ar", + ".free-ssh.com", + "||free-ssh.com", + ".freechina.news/", + "||freechinaforum.org", + "||freechinaweibo.com", + ".freedomcollection.org/interviews/rebiya_kadeer", + ".freeforums.org", + "||freenetproject.org", + ".freeoz.org", + ".freetibet.net", + "||freetibet.org", + ".freetibetanheroes.org", + "|http://freetibetanheroes.org", + ".freeviewmovies.com", + ".freevpn.me", + "|http://freevpn.me", + "||freewallpaper4.me", + ".freewebs.com", + ".freewechat.com", + "||freewechat.com", + "freeweibo.com", + "||freeweibo.com", + ".freexinwen.com", + ".freeyoutubeproxy.net", + "||freeyoutubeproxy.net", + "friendfeed.com", + "friendfeed-media.com/e99a4ebe2fb4c1985c2a58775eb4422961aa5a2e", + "friends-of-tibet.org", + ".friendsoftibet.org", + "freechina.net", + "|http://www.zensur.freerk.com/", + "freevpn.nl", + "freeyellow.com", + "hk.frienddy.com/hk", + "|http://adult.friendfinder.com/", + ".fring.com", + "||fring.com", + ".fromchinatousa.net", + "||frommel.net", + ".frontlinedefenders.org", + ".frootvpn.com", + "||frootvpn.com", + "||fscked.org", + ".fsurf.com", + ".ftv.com.tw", + "fucd.com", + ".fuckcnnic.net", + "||fuckcnnic.net", + "fuckgfw.org", + ".fulione.com", + "|https://fulione.com", + "||fullerconsideration.com", + "fulue.com", + ".funf.tw", + "funp.com", + ".fuq.com", + ".furhhdl.org", + "||furinkan.com", + ".futurechinaforum.org", + "||futuremessage.org", + ".fux.com", + ".fuyin.net", + ".fuyindiantai.org", + ".fuyu.org.tw", + "||fw.cm", + ".fxcm-chinese.com", + "||fxcm-chinese.com", + "fzh999.com", + "fzh999.net", + "fzlm.com", + ".g6hentai.com", + "|http://g6hentai.com", + "||g-queen.com", + "||gabocorp.com", + ".gaeproxy.com", + ".gaforum.org", + ".galaxymacau.com", + "||galenwu.com", + ".galstars.net", + "||game735.com", + "gamebase.com.tw", + "gamejolt.com", + "|http://wiki.gamerp.jp", + "||gamer.com.tw", + ".gamer.com.tw", + ".gamez.com.tw", + "||gamez.com.tw", + ".gamousa.com", + ".gaoming.net", + "||gaoming.net", + "ganges.com", + ".gaopi.net", + "|http://gaopi.net", + ".gaozhisheng.org", + ".gaozhisheng.net", + "gardennetworks.com", + "||gardennetworks.org", + "72.52.81.22", + "||gartlive.com", + "||gate-project.com", + "||gather.com", + ".gatherproxy.com", + "gati.org.tw", + ".gaybubble.com", + ".gaycn.net", + ".gayhub.com", + "||gaymap.cc", + ".gaymenring.com", + ".gaytube.com", + "||images-gaytube.com", + ".gaywatch.com", + "|http://gaywatch.com", + ".gazotube.com", + "||gazotube.com", + "||gcc.org.hk", + "||gclooney.com", + "||gcmasia.com", + ".gcpnews.com", + "|http://gcpnews.com", + ".gdbt.net/forum", + "gdzf.org", + "||geek-art.net", + "geekerhome.com/2010/03/xixiang-project-cross-gfw", + "||geekheart.info", + ".gekikame.com", + "|http://gekikame.com", + ".gelbooru.com", + "|http://gelbooru.com", + ".geocities.co.jp", + ".geocities.com/SiliconValley/Circuit/5683/download.html", + "hk.geocities.com", + "geocities.jp", + ".gerefoundation.org", + "||getastrill.com", + ".getchu.com", + ".getcloak.com", + "||getcloak.com", + "||getfoxyproxy.org", + ".getfreedur.com", + "||getgom.com", + ".geti2p.net", + "||geti2p.net", + ".getlantern.org", + "||getlantern.org", + ".getjetso.com/forum", + "getiton.com", + ".getsocialscope.com", + "||getsync.com", + "gfbv.de", + ".gfgold.com.hk", + ".gfsale.com", + "||gfsale.com", + "gfw.org.ua", + ".gfw.press", + "||gfw.press", + ".ggssl.com", + "||ggssl.com", + ".ghostpath.com", + "||ghostpath.com", + "||ghut.org", + ".giantessnight.com", + "|http://giantessnight.com", + ".gifree.com", + "||giga-web.jp", + "tw.gigacircle.com", + "|http://cn.giganews.com/", + "gigporno.ru", + "||girlbanker.com", + ".git.io", + "||git.io", + "|http://softwaredownload.gitbooks.io", + "github.com/getlantern", + "|https://gist.github.com", + "http://cthlo.github.io/hktv", + "hahaxixi.github.io", + "|https://hahaxixi.github.io", + "||haoel.github.io", + "||rg3.github.io", + "||sikaozhe1997.github.io", + "||sodatea.github.io", + "||terminus2049.github.io", + "||toutyrater.github.io", + "wsgzao.github.io", + "|https://wsgzao.github.io", + ".gizlen.net", + "||gizlen.net", + ".gjczz.com", + "||gjczz.com", + "globaljihad.net", + "globalmediaoutreach.com", + "globalmuseumoncommunism.org", + "||globalrescue.net", + ".globaltm.org", + ".globalvoicesonline.org", + "||globalvoicesonline.org", + "||globalvpn.net", + ".glock.com", + "gluckman.com/DalaiLama", + "gmbd.cn", + "||gmhz.org", + "|http://www.gmiddle.com", + "|http://www.gmiddle.net", + ".gmll.org", + "||gnci.org.hk", + "go-pki.com", + "||goagent.biz", + "||goagentplus.com", + "gobet.cc", + "godfootsteps.org", + "||godfootsteps.org", + "godns.work", + "godsdirectcontact.co.uk", + ".godsdirectcontact.org", + "godsdirectcontact.org.tw", + ".godsimmediatecontact.com", + ".gogotunnel.com", + "||gohappy.com.tw", + ".gokbayrak.com", + ".goldbet.com", + "||goldbetsports.com", + "||goldeneyevault.com", + ".goldenfrog.com", + "||goldenfrog.com", + ".goldjizz.com", + "|http://goldjizz.com", + ".goldstep.net", + "||goldwave.com", + "gongmeng.info", + "gongm.in", + "gongminliliang.com", + ".gongwt.com", + "|http://gongwt.com", + "blog.goo.ne.jp/duck-tail_2009", + ".gooday.xyz", + "|http://gooday.xyz", + ".goodreads.com", + "||goodreads.com", + ".goodreaders.com", + "||goodreaders.com", + ".goodtv.com.tw", + ".goodtv.tv", + "||goofind.com", + ".googlesile.com", + ".gopetition.com", + "||gopetition.com", + ".goproxing.net", + ".gotrusted.com", + "||gotrusted.com", + "||gotw.ca", + "||grammaly.com", + "grandtrial.org", + ".graphis.ne.jp", + "||graphis.ne.jp", + "||graphql.org", + "greatfirewall.biz", + "||greatfirewallofchina.net", + ".greatfirewallofchina.org", + "||greatfirewallofchina.org", + "||greenfieldbookstore.com.hk", + ".greenparty.org.tw", + "||greenpeace.org", + ".greenreadings.com/forum", + "great-firewall.com", + "great-roc.org", + "greatroc.org", + "greatzhonghua.org", + ".greenpeace.com.tw", + ".greenvpn.net", + "||greenvpn.net", + ".greenvpn.org", + "||grotty-monday.com", + "gs-discuss.com", + "||gtricks.com", + "guancha.org", + "guaneryu.com", + ".guardster.com", + ".gun-world.net", + "gunsandammo.com", + "||gutteruncensored.com", + "||gvm.com.tw", + ".gzm.tv", + "||gzone-anime.info", + "||clementine-player.org", + "echofon.com", + "||greasespot.net", + "||www.klip.me", + "@@||site.locql.com", + "||stephaniered.com", + "@@||download.syniumsoftware.com", + "|http://ub0.cc", + "wozy.in", + "gospelherald.com", + "||gospelherald.com", + "|http://hk.gradconnection.com/", + "||grangorz.org", + "greatfire.org", + "||greatfire.org", + "greatfirewallofchina.org", + "||greatroc.tw", + ".gts-vpn.com", + "|http://gts-vpn.com", + ".gu-chu-sum.org", + "|http://gu-chu-sum.org", + ".guaguass.com", + "|http://guaguass.com", + ".guaguass.org", + "|http://guaguass.org", + ".guangming.com.my", + "guishan.org", + "||guishan.org", + ".gumroad.com", + "||gumroad.com", + "||gunsamerica.com", + "guruonline.hk", + "|http://gvlib.com", + ".gyalwarinpoche.com", + ".gyatsostudio.com", + ".h528.com", + ".h5dm.com", + ".h5galgame.me", + "||h-china.org", + ".h-moe.com", + "|http://h-moe.com", + "h1n1china.org", + ".hacg.club", + "||hacg.club", + ".hacg.in", + "|http://hacg.in", + ".hacg.li", + "|http://hacg.li", + ".hacg.me", + "|http://hacg.me", + ".hacg.red", + "|http://hacg.red", + ".hacken.cc/bbs", + ".hacker.org", + "||hackthatphone.net", + "hahlo.com", + "||hakkatv.org.tw", + ".handcraftedsoftware.org", + "|http://bbs.hanminzu.org/", + ".hanunyi.com", + ".hao.news/news", + "|http://ae.hao123.com", + "|http://ar.hao123.com", + "|http://br.hao123.com", + "|http://en.hao123.com", + "|http://id.hao123.com", + "|http://jp.hao123.com", + "|http://ma.hao123.com", + "|http://mx.hao123.com", + "|http://sa.hao123.com", + "|http://th.hao123.com", + "|http://tw.hao123.com", + "|http://vn.hao123.com", + "|http://hk.hao123img.com", + "|http://ld.hao123img.com", + "||happy-vpn.com", + ".haproxy.org", + "||hardsextube.com", + ".harunyahya.com", + "|http://harunyahya.com", + "bbs.hasi.wang", + "have8.com", + "@@||haygo.com", + ".hclips.com", + "||hdlt.me", + "||hdtvb.net", + ".hdzog.com", + "|http://hdzog.com", + "||heartyit.com", + ".heavy-r.com", + ".hec.su", + "|http://hec.su", + ".hecaitou.net", + "||hecaitou.net", + ".hechaji.com", + "||hechaji.com", + "||heeact.edu.tw", + ".hegre-art.com", + "|http://hegre-art.com", + "||cdn.helixstudios.net", + "||helplinfen.com", + "||helloandroid.com", + "||helloqueer.com", + ".helloss.pw", + "hellotxt.com", + "||hellotxt.com", + ".hentai.to", + ".hellouk.org/forum/lofiversion", + ".helpeachpeople.com", + "||helpeachpeople.com", + "||helpster.de", + ".helpzhuling.org", + "hentaitube.tv", + ".hentaivideoworld.com", + "||id.heroku.com", + "heqinglian.net", + "||heungkongdiscuss.com", + ".hexieshe.com", + "||hexieshe.com", + "||hexieshe.xyz", + "||hexxeh.net", + "app.heywire.com", + ".heyzo.com", + ".hgseav.com", + ".hhdcb3office.org", + ".hhthesakyatrizin.org", + "hi-on.org.tw", + "hidden-advent.org", + "||hidden-advent.org", + "hidecloud.com/blog/2008/07/29/fuck-beijing-olympics.html", + "||hide.me", + ".hidein.net", + ".hideipvpn.com", + "||hideipvpn.com", + ".hideman.net", + "||hideman.net", + "hideme.nl", + "||hidemy.name", + ".hidemyass.com", + "||hidemyass.com", + "hidemycomp.com", + "||hidemycomp.com", + ".hihiforum.com", + ".hihistory.net", + "||hihistory.net", + ".higfw.com", + "highpeakspureearth.com", + "||highrockmedia.com", + "||hiitch.com", + "||hikinggfw.org", + ".hilive.tv", + ".himalayan-foundation.org", + "himalayanglacier.com", + ".himemix.com", + "||himemix.com", + ".himemix.net", + "times.hinet.net", + ".hitomi.la", + "|http://hitomi.la", + ".hiwifi.com", + "@@||hiwifi.com", + "hizbuttahrir.org", + "hizb-ut-tahrir.info", + "hizb-ut-tahrir.org", + ".hjclub.info", + ".hk-pub.com/forum", + "|http://hk-pub.com", + ".hk01.com", + "||hk01.com", + ".hk32168.com", + "||hk32168.com", + "||hkacg.com", + "||hkacg.net", + ".hkatvnews.com", + "hkbc.net", + ".hkbf.org", + ".hkbookcity.com", + "||hkbookcity.com", + ".hkchurch.org", + "hkci.org.hk", + ".hkcmi.edu", + "||hkcnews.com", + "||hkcoc.com", + "hkday.net", + ".hkdailynews.com.hk/china.php", + "hkdf.org", + ".hkej.com", + ".hkepc.com/forum/viewthread.php?tid=1153322", + "china.hket.com", + "||hkfaa.com", + "hkfreezone.com", + "hkfront.org", + "m.hkgalden.com", + "|https://m.hkgalden.com", + ".hkgreenradio.org/home", + ".hkheadline.com*blog", + ".hkheadline.com/instantnews", + "hkhkhk.com", + "hkhrc.org.hk", + "hkhrm.org.hk", + "||hkip.org.uk", + "1989report.hkja.org.hk", + "hkjc.com", + ".hkjp.org", + ".hklft.com", + ".hklts.org.hk", + "||hklts.org.hk", + "news.hkpeanut.com", + "hkptu.org", + ".hkreporter.com", + "||hkreporter.com", + "|http://hkupop.hku.hk/", + ".hkusu.net", + "||hkusu.net", + ".hkvwet.com", + ".hkwcc.org.hk", + "||hkzone.org", + ".hmonghot.com", + "|http://hmonghot.com", + ".hmv.co.jp/", + "hnjhj.com", + "||hnjhj.com", + ".hnntube.com", + "||hola.com", + "||hola.org", + "holymountaincn.com", + "holyspiritspeaks.org", + "||holyspiritspeaks.org", + "||derekhsu.homeip.net", + ".homeperversion.com", + "|http://homeservershow.com", + "|http://old.honeynet.org/scans/scan31/sub/doug_eric/spam_translation.html", + ".hongkongfp.com", + "||hongkongfp.com", + "hongmeimei.com", + "||hongzhi.li", + ".hootsuite.com", + "||hootsuite.com", + ".hopedialogue.org", + "|http://hopedialogue.org", + ".hopto.org", + ".hornygamer.com", + ".hornytrip.com", + "|http://hornytrip.com", + ".hotav.tv", + ".hotels.cn", + "hotfrog.com.tw", + "hotgoo.com", + ".hotpornshow.com", + "hotpot.hk", + ".hotshame.com", + "||hotspotshield.com", + ".hotvpn.com", + "||hotvpn.com", + "||hougaige.com", + "||howtoforge.com", + "||hoxx.com", + ".hqcdp.org", + "||hqcdp.org", + "||hqjapanesesex.com", + "hqmovies.com", + ".hrcir.com", + ".hrcchina.org", + ".hrea.org", + ".hrichina.org", + "||hrichina.org", + ".hrtsea.com", + ".hrw.org", + "||hrw.org", + "hrweb.org", + "||hsjp.net", + "||hsselite.com", + "|http://hst.net.tw", + ".hstern.net", + ".hstt.net", + ".htkou.net", + "||htkou.net", + ".hua-yue.net", + ".huaglad.com", + "||huaglad.com", + ".huanghuagang.org", + "||huanghuagang.org", + ".huangyiyu.com", + ".huaren.us", + "||huaren.us", + ".huaren4us.com", + ".huashangnews.com", + "|http://huashangnews.com", + "bbs.huasing.org", + "huaxia-news.com", + "huaxiabao.org", + "huaxin.ph", + "||huayuworld.org", + ".huffingtonpost.com/rebiya-kadeer", + "||hugoroy.eu", + "||huhaitai.com", + "||huhamhire.com", + "huiyi.in", + ".hulkshare.com", + "humanrightsbriefing.org", + "||hung-ya.com", + "||hungerstrikeforaids.org", + "||huping.net", + "hurgokbayrak.com", + ".hurriyet.com.tr", + ".hut2.ru", + "||hutianyi.net", + "hutong9.net", + "huyandex.com", + ".hwadzan.tw", + "||hwayue.org.tw", + "||hwinfo.com", + "||hxwk.org", + "hxwq.org", + "||hyperrate.com", + "ebook.hyread.com.tw", + "||ebook.hyread.com.tw", + "||i1.hk", + "||i2p2.de", + "||i2runner.com", + "||i818hk.com", + ".i-cable.com", + ".i-part.com.tw", + ".iamtopone.com", + "iask.ca", + "||iask.ca", + "iask.bz", + "||iask.bz", + ".iav19.com", + "ibiblio.org/pub/packages/ccic", + ".iblist.com", + "||iblogserv-f.net", + "ibros.org", + "|http://cn.ibtimes.com", + ".ibvpn.com", + "||ibvpn.com", + "icams.com", + "blogs.icerocket.com/tag", + ".icij.org", + "||icij.org", + "||icl-fi.org", + ".icoco.com", + "||icoco.com", + "||furbo.org", + "||warbler.iconfactory.net", + "||iconpaper.org", + "||icu-project.org", + "w.idaiwan.com/forum", + "||iddddg.com", + "idemocracy.asia", + ".identi.ca", + "||identi.ca", + "||idiomconnection.com", + "|http://www.idlcoyote.com", + ".idouga.com", + ".idreamx.com", + "forum.idsam.com", + ".idv.tw", + ".ieasy5.com", + "|http://ieasy5.com", + ".ied2k.net", + ".ienergy1.com", + "|http://if.ttt/", + "ifanqiang.com", + ".ifcss.org", + "||ifcss.org", + "ifjc.org", + ".ift.tt", + "|http://ift.tt", + "||ifreewares.com", + "||igcd.net", + ".igfw.net", + "||igfw.net", + ".igfw.tech", + "||igfw.tech", + ".igmg.de", + "||ignitedetroit.net", + ".igotmail.com.tw", + "||igvita.com", + "||ihakka.net", + ".ihao.org/dz5", + "||iicns.com", + ".ikstar.com", + "||illusionfactory.com", + "||ilove80.be", + "||im.tv", + "@@||myvlog.im.tv", + "||im88.tw", + ".imgchili.net", + "|http://imgchili.net", + ".imageab.com", + ".imagefap.com", + "||imagefap.com", + "||imageflea.com", + "imageshack.us", + "||imagevenue.com", + "||imagezilla.net", + ".imb.org", + "|http://imb.org", + "|http://www.imdb.com/name/nm0482730", + ".imdb.com/title/tt0819354", + ".imdb.com/title/tt1540068", + ".imdb.com/title/tt4908644", + ".img.ly", + "||img.ly", + ".imgur.com", + "||imgur.com", + ".imkev.com", + "||imkev.com", + ".imlive.com", + ".immoral.jp", + "impact.org.au", + "impp.mn", + "|http://tech2.in.com/video/", + "in99.org", + "in-disguise.com", + ".incapdns.net", + ".incloak.com", + "||incloak.com", + "||incredibox.fr", + "||indiandefensenews.in", + "timesofindia.indiatimes.com/dalai", + "timesofindia.indiatimes.com/defaultinterstitial.cms", + ".indiemerch.com", + "||indiemerch.com", + "info-graf.fr", + "website.informer.com", + ".initiativesforchina.org", + ".inkui.com", + ".inmediahk.net", + "||inmediahk.net", + "||innermongolia.org", + "|http://blog.inoreader.com", + ".inote.tw", + ".insecam.org", + "|http://insecam.org", + "||insidevoa.com", + ".institut-tibetain.org", + "|http://internet.org/", + "internetdefenseleague.org", + "internetfreedom.org", + "||internetpopculture.com", + ".inthenameofconfuciusmovie.com", + "||inthenameofconfuciusmovie.com", + "inxian.com", + "||inxian.com", + "ipalter.com", + ".ipfire.org", + "||iphone4hongkong.com", + "||iphonehacks.com", + "||iphonetaiwan.org", + "||iphonix.fr", + "||ipicture.ru", + ".ipjetable.net", + "||ipjetable.net", + ".ipobar.com/read.php?", + "ipoock.com/img", + ".iportal.me", + "|http://iportal.me", + "||ippotv.com", + ".ipredator.se", + "||ipredator.se", + ".iptv.com.tw", + "||iptvbin.com", + "||ipvanish.com", + "iredmail.org", + "chinese.irib.ir", + "||ironbigfools.compython.net", + "||ironpython.net", + ".ironsocket.com", + "||ironsocket.com", + ".is.gd", + ".islahhaber.net", + ".islam.org.hk", + "|http://islam.org.hk", + ".islamawareness.net/Asia/China", + ".islamhouse.com", + "||islamhouse.com", + ".islamicity.com", + ".islamicpluralism.org", + ".islamtoday.net", + ".isaacmao.com", + "||isaacmao.com", + "||isgreat.org", + "||ismaelan.com", + ".ismalltits.com", + "||ismprofessional.net", + "isohunt.com", + "||israbox.com", + ".issuu.com", + "||issuu.com", + ".istars.co.nz", + "oversea.istarshine.com", + "||oversea.istarshine.com", + "blog.istef.info/2007/10/21/myentunnel", + ".istiqlalhewer.com", + ".istockphoto.com", + "isunaffairs.com", + "isuntv.com", + "itaboo.info", + "||itaboo.info", + ".italiatibet.org", + "download.ithome.com.tw", + "ithelp.ithome.com.tw", + "||itshidden.com", + ".itsky.it", + ".itweet.net", + "|http://itweet.net", + ".iu45.com", + ".iuhrdf.org", + "||iuhrdf.org", + ".iuksky.com", + ".ivacy.com", + "||ivacy.com", + ".iverycd.com", + ".ivpn.net", + "||ixquick.com", + ".ixxx.com", + "iyouport.com", + "||iyouport.com", + ".izaobao.us", + "||gmozomg.izihost.org", + ".izles.net", + ".izlesem.org", + "||j.mp", + "blog.jackjia.com", + "jamaat.org", + ".jamyangnorbu.com", + "|http://jamyangnorbu.com", + ".jandyx.com", + "||janwongphoto.com", + "||japan-whores.com", + ".jav.com", + ".jav101.com", + ".jav2be.com", + "||jav2be.com", + ".jav68.tv", + ".javakiba.org", + "|http://javakiba.org", + ".javbus.com", + "||javbus.com", + "||javfor.me", + ".javhd.com", + ".javhip.com", + ".javmobile.net", + "|http://javmobile.net", + ".javmoo.com", + ".javseen.com", + "|http://javseen.com", + "jbtalks.cc", + "jbtalks.com", + "jbtalks.my", + ".jdwsy.com", + "jeanyim.com", + "||jfqu36.club", + "||jfqu37.xyz", + "||jgoodies.com", + ".jiangweiping.com", + "||jiangweiping.com", + "||jiaoyou8.com", + ".jiehua.cz", + "||hk.jiepang.com", + "||tw.jiepang.com", + "jieshibaobao.com", + ".jigglegifs.com", + "56cun04.jigsy.com", + "jigong1024.com", + "daodu14.jigsy.com", + "specxinzl.jigsy.com", + "wlcnew.jigsy.com", + ".jihadology.net", + "|http://jihadology.net", + "jinbushe.org", + "||jinbushe.org", + ".jingsim.org", + "zhao.jinhai.de", + "jingpin.org", + "||jingpin.org", + "jinpianwang.com", + ".jinroukong.com", + "ac.jiruan.net", + "||jitouch.com", + ".jizzthis.com", + "jjgirls.com", + ".jkb.cc", + "|http://jkb.cc", + "jkforum.net", + "||jma.go.jp", + "research.jmsc.hku.hk/social", + "weiboscope.jmsc.hku.hk", + ".jmscult.com", + "|http://jmscult.com", + "||joachims.org", + "||jobso.tv", + ".sunwinism.joinbbs.net", + ".journalchretien.net", + "||journalofdemocracy.org", + ".joymiihub.com", + ".joyourself.com", + "jpopforum.net", + "||fiddle.jshell.net", + ".jubushoushen.com", + "||jubushoushen.com", + ".juhuaren.com", + "||juliereyc.com", + "||junauza.com", + ".june4commemoration.org", + ".junefourth-20.net", + "||junefourth-20.net", + "||bbs.junglobal.net", + ".juoaa.com", + "|http://juoaa.com", + "justfreevpn.com", + ".justicefortenzin.org", + "justpaste.it", + "justtristan.com", + "juyuange.org", + "juziyue.com", + "||juziyue.com", + "||jwmusic.org", + "@@||music.jwmusic.org", + ".jyxf.net", + "||k-doujin.net", + "||ka-wai.com", + ".kagyu.org", + "||kagyu.org.za", + ".kagyumonlam.org", + ".kagyunews.com.hk", + ".kagyuoffice.org", + "||kagyuoffice.org", + "||kagyuoffice.org.tw", + ".kaiyuan.de", + ".kakao.com", + "||kakao.com", + ".kalachakralugano.org", + ".kankan.today", + ".kannewyork.com", + "||kannewyork.com", + ".kanshifang.com", + "||kanshifang.com", + "||kantie.org", + "kanzhongguo.com", + "kanzhongguo.eu", + ".kaotic.com", + "||karayou.com", + "karkhung.com", + ".karmapa.org", + ".karmapa-teachings.org", + "||kawase.com", + ".kba-tx.org", + ".kcoolonline.com", + ".kebrum.com", + "||kebrum.com", + ".kechara.com", + ".keepandshare.com/visit/visit_page.php?i=688154", + ".keezmovies.com", + ".kendincos.net", + ".kenengba.com", + "||kenengba.com", + "||keontech.net", + ".kepard.com", + "||kepard.com", + "wiki.keso.cn/Home", + "||keycdn.com", + ".khabdha.org", + ".khmusic.com.tw", + "||kichiku-doujinko.com", + ".kik.com", + "||kik.com", + "bbs.kimy.com.tw", + ".kindleren.com", + "|http://kindleren.com", + "|http://www.kindleren.com", + ".kingdomsalvation.org", + "||kingdomsalvation.org", + "kinghost.com", + "||kingstone.com.tw", + ".kink.com", + ".kinokuniya.com", + "||kinokuniya.com", + "killwall.com", + "||killwall.com", + "||kinmen.travel", + ".kir.jp", + ".kissbbao.cn", + "|http://kiwi.kz", + "||kk-whys.co.jp", + ".kmuh.org.tw", + ".knowledgerush.com/kr/encyclopedia", + ".kobo.com", + "||kobo.com", + ".kobobooks.com", + "||kobobooks.com", + "||kodingen.com", + "@@||www.kodingen.com", + "||kompozer.net", + ".konachan.com", + "|http://konachan.com", + ".kone.com", + "||koolsolutions.com", + ".koornk.com", + "||koornk.com", + "||koranmandarin.com", + ".korenan2.com", + "|http://gojet.krtco.com.tw", + ".ksdl.org", + ".ksnews.com.tw", + "||ktzhk.com", + ".kui.name/event", + "kun.im", + ".kurashsultan.com", + "||kurtmunger.com", + "kusocity.com", + "||kwcg.ca", + "kwongwah.com.my", + ".kxsw.life", + "||kxsw.life", + ".kyofun.com", + "kyohk.net", + "||kyoyue.com", + ".kyzyhello.com", + "||kyzyhello.com", + ".kzeng.info", + "||kzeng.info", + "la-forum.org", + "ladbrokes.com", + "||labiennale.org", + ".lagranepoca.com", + "||lagranepoca.com", + ".lalulalu.com", + ".lama.com.tw", + "||lama.com.tw", + ".lamayeshe.com", + "|http://lamayeshe.com", + "|http://www.lamenhu.com", + ".lamnia.co.uk", + "||lamnia.co.uk", + "lamrim.com", + ".lanterncn.cn", + "|http://lanterncn.cn", + ".lantosfoundation.org", + ".laod.cn", + "|http://laod.cn", + "laogai.org", + "||laogai.org", + "laomiu.com", + ".laoyang.info", + "|http://laoyang.info", + "||laptoplockdown.com", + ".laqingdan.net", + "||laqingdan.net", + "||larsgeorge.com", + ".lastcombat.com", + "|http://lastcombat.com", + "||lastfm.es", + "latelinenews.com", + ".latibet.org", + "||le-vpn.com", + ".leafyvpn.net", + "||leafyvpn.net", + "leeao.com.cn/bbs/forum.php", + "lefora.com", + "||left21.hk", + ".legalporno.com", + ".legsjapan.com", + "|http://leirentv.ca", + "leisurecafe.ca", + "||lematin.ch", + ".lemonde.fr", + "||lenwhite.com", + "lerosua.org", + "||lerosua.org", + "blog.lester850.info", + "||lesoir.be", + ".letou.com", + "letscorp.net", + "||letscorp.net", + "||ss.levyhsu.com", + "||cdn.assets.lfpcontent.com", + ".lhakar.org", + "|http://lhakar.org", + ".lhasocialwork.org", + ".liangyou.net", + "||liangyou.net", + ".lianyue.net", + "||liaowangxizang.net", + ".liaowangxizang.net", + "||liberal.org.hk", + ".libertytimes.com.tw", + "blogs.libraryinformationtechnology.com/jxyz", + ".lidecheng.com/blog/fucking-gfw", + ".lighten.org.tw", + ".lightnovel.cn", + "@@|https://www.lightnovel.cn", + "limiao.net", + "linkuswell.com", + "abitno.linpie.com/use-ipv6-to-fuck-gfw", + "||line.me", + "||line-apps.com", + ".linglingfa.com", + "||lingvodics.com", + ".link-o-rama.com", + "|http://link-o-rama.com", + ".linkideo.com", + "||api.linksalpha.com", + "||apidocs.linksalpha.com", + "||www.linksalpha.com", + "||help.linksalpha.com", + "||linux.org.hk", + "linuxtoy.org/archives/installing-west-chamber-on-ubuntu", + ".lionsroar.com", + ".lipuman.com", + "||liquidvpn.com", + "||greatfire.us7.list-manage.com", + "||listentoyoutube.com", + "listorious.com", + ".liu-xiaobo.org", + "||liudejun.com", + ".liuhanyu.com", + ".liujianshu.com", + "||liujianshu.com", + ".liuxiaobo.net", + "|http://liuxiaobo.net", + "liuxiaotong.com", + "||liuxiaotong.com", + ".livedoor.jp", + ".liveleak.com", + "||liveleak.com", + ".livestation.com", + "livestream.com", + "||livestream.com", + "||livingonline.us", + "||livingstream.com", + "||livevideo.com", + ".livevideo.com", + ".liwangyang.com", + "lizhizhuangbi.com", + "lkcn.net", + ".llss.me/", + ".load.to", + ".lobsangwangyal.com", + ".localdomain.ws", + "||localdomain.ws", + "localpresshk.com", + "||lockestek.com", + "logbot.net", + "||logiqx.com", + "secure.logmein.com", + "||secure.logmein.com", + ".londonchinese.ca", + ".longhair.hk", + "longmusic.com", + "||longtermly.net", + "||lookpic.com", + ".looktoronto.com", + "|http://looktoronto.com", + ".lotsawahouse.org/tibetan-masters/fourteenth-dalai-lama", + ".lotuslight.org.hk", + ".lotuslight.org.tw", + "hkreporter.loved.hk", + "||lpsg.com", + "||lrfz.com", + ".lrip.org", + "||lrip.org", + ".lsd.org.hk", + "||lsd.org.hk", + "lsforum.net", + ".lsm.org", + "||lsm.org", + ".lsmchinese.org", + "||lsmchinese.org", + ".lsmkorean.org", + "||lsmkorean.org", + ".lsmradio.com/rad_archives", + ".lsmwebcast.com", + ".ltn.com.tw", + "|http://ltn.com.tw", + ".luke54.com", + ".luke54.org", + ".lupm.org", + "||lupm.org", + "||lushstories.com", + "luxebc.com", + "lvhai.org", + "||lvhai.org", + "||lvv2.com", + ".lyfhk.net", + "|http://lyfhk.net", + ".lzmtnews.org", + "||lzmtnews.org", + "http://*.m-team.cc", + ".macrovpn.com", + "macts.com.tw", + "||mad-ar.ch", + "||madrau.com", + "||madthumbs.com", + "||magic-net.info", + "mahabodhi.org", + "my.mail.ru", + ".maiplus.com", + "|http://maiplus.com", + ".maizhong.org", + "makkahnewspaper.com", + ".mamingzhe.com", + "manicur4ik.ru", + ".maplew.com", + "|http://maplew.com", + "||marc.info", + "marguerite.su", + "||martincartoons.com", + "maskedip.com", + ".maiio.net", + ".mail-archive.com", + ".malaysiakini.com", + "||makemymood.com", + ".manchukuo.net", + ".maniash.com", + "|http://maniash.com", + ".mansion.com", + ".mansionpoker.com", + "||martau.com", + "|http://blog.martinoei.com", + ".martsangkagyuofficial.org", + "|http://martsangkagyuofficial.org", + "maruta.be/forget", + ".marxist.com", + "||marxist.net", + ".marxists.org/chinese", + "||matainja.com", + "||mathable.io", + "||mathiew-badimon.com", + "||matsushimakaede.com", + "|http://maturejp.com", + "mayimayi.com", + ".maxing.jp", + ".mcaf.ee", + "|http://mcaf.ee", + "||mcadforums.com", + "mcfog.com", + "mcreasite.com", + ".md-t.org", + "||md-t.org", + "||meansys.com", + ".media.org.hk", + ".mediachinese.com", + "||mediachinese.com", + ".mediafire.com/?", + ".mediafire.com/download", + ".mediafreakcity.com", + "||mediafreakcity.com", + ".medium.com", + "||medium.com", + ".meetav.com", + "||meetup.com", + "mefeedia.com", + "jihadintel.meforum.org", + "||mega.nz", + "||megaproxy.com", + "||megarotic.com", + "megavideo.com", + "||megurineluka.com", + "meirixiaochao.com", + ".meltoday.com", + ".memehk.com", + "||memehk.com", + "memorybbs.com", + ".memri.org", + ".memrijttm.org", + ".mercyprophet.org", + "|http://mercyprophet.org", + "||mergersandinquisitions.org", + ".meridian-trust.org", + "|http://meridian-trust.org", + ".meripet.biz", + "|http://meripet.biz", + ".meripet.com", + "|http://meripet.com", + "merit-times.com.tw", + "meshrep.com", + ".mesotw.com/bbs", + "metacafe.com/watch", + "||meteorshowersonline.com", + "|http://www.metro.taipei/", + ".metrohk.com.hk/?cmd=detail&categoryID=2", + "||metrolife.ca", + ".metroradio.com.hk", + "|http://metroradio.com.hk", + "meyou.jp", + ".meyul.com", + "||mgoon.com", + "||mgstage.com", + "||mh4u.org", + "mhradio.org", + "|http://michaelanti.com", + "||michaelmarketl.com", + "|http://bbs.mikocon.com", + ".microvpn.com", + "|http://microvpn.com", + "middle-way.net", + ".mihk.hk/forum", + ".mihr.com", + "mihua.org", + "||mikesoltys.com", + ".milph.net", + "|http://milph.net", + ".milsurps.com", + "mimiai.net", + ".mimivip.com", + ".mimivv.com", + ".mindrolling.org", + "|http://mindrolling.org", + ".minghui.or.kr", + "|http://minghui.or.kr", + "minghui.org", + "||minghui.org", + "minghui-a.org", + "minghui-b.org", + "minghui-school.org", + ".mingjinglishi.com", + "||mingjinglishi.com", + "mingjingnews.com", + "||mingjingtimes.com", + ".mingpao.com", + "||mingpao.com", + ".mingpaocanada.com", + ".mingpaomonthly.com", + "|http://mingpaomonthly.com", + "mingpaonews.com", + ".mingpaony.com", + ".mingpaosf.com", + ".mingpaotor.com", + ".mingpaovan.com", + ".mingshengbao.com", + ".minhhue.net", + ".miniforum.org", + ".ministrybooks.org", + ".minzhuhua.net", + "||minzhuhua.net", + "minzhuzhanxian.com", + "minzhuzhongguo.org", + "||miroguide.com", + "mirrorbooks.com", + ".mist.vip", + "thecenter.mit.edu", + ".mitao.com.tw", + ".mitbbs.com", + "||mitbbs.com", + "mitbbsau.com", + ".mixero.com", + "||mixero.com", + "mixpod.com", + ".mixx.com", + "||mixx.com", + "||mizzmona.com", + ".mk5000.com", + ".mlcool.com", + "||mlzs.work", + ".mm-cg.com", + "||mmaaxx.com", + ".mmmca.com", + "mnewstv.com", + "||mobatek.net", + ".mobile01.com", + "||mobile01.com", + "||mobileways.de", + ".mobypicture.com", + "|http://moby.to", + "||moeerolibrary.com", + "wiki.moegirl.org", + ".mofaxiehui.com", + ".mofos.com", + "||mog.com", + "molihua.org", + "||mondex.org", + ".money-link.com.tw", + "|http://money-link.com.tw", + "|http://www.monlamit.org", + ".moonbbs.com", + "||moonbbs.com", + "c1522.mooo.com", + "||monitorchina.org", + "bbs.morbell.com", + "||morningsun.org", + "||moroneta.com", + ".motherless.com", + "|http://motherless.com", + "motor4ik.ru", + ".mousebreaker.com", + ".movements.org", + "||movements.org", + "||moviefap.com", + "||www.moztw.org", + ".mp3buscador.com", + "mp3ye.eu", + "||mpettis.com", + "mpfinance.com", + "mpinews.com", + "mponline.hk", + ".mqxd.org", + "|http://mqxd.org", + "mrtweet.com", + "||mrtweet.com", + "news.hk.msn.com", + "news.msn.com.tw", + "msguancha.com", + ".mswe1.org", + "|http://mswe1.org", + "||mthruf.com", + "muchosucko.com", + "||multiply.com", + "multiproxy.org", + "multiupload.com", + ".mullvad.net", + "||mullvad.net", + ".mummysgold.com", + ".murmur.tw", + "|http://murmur.tw", + ".musicade.net", + ".muslimvideo.com", + "||muzi.com", + "||muzi.net", + "||mx981.com", + ".my-formosa.com", + ".my-proxy.com", + ".my-private-network.co.uk", + "||my-private-network.co.uk", + "forum.my903.com", + ".myactimes.com/actimes", + "||myanniu.com", + ".myaudiocast.com", + "||myaudiocast.com", + ".myav.com.tw/bbs", + ".mybbs.us", + ".myca168.com", + ".mycanadanow.com", + "||bbs.mychat.to", + "||mychinamyhome.com", + ".mychinamyhome.com", + ".mychinanet.com", + ".mychinanews.com", + "||mychinanews.com", + ".mychinese.news", + "||mycnnews.com", + "||mykomica.org", + "mycould.com/discuz", + ".myeasytv.com", + "||myeclipseide.com", + ".myforum.com.hk", + "||myforum.com.hk", + "||myforum.com.uk", + ".myfreecams.com", + ".myfreepaysite.com", + ".myfreshnet.com", + ".myiphide.com", + "||myiphide.com", + "forum.mymaji.com", + "mymediarom.com/files/box", + "||mymoe.moe", + "||mymusic.net.tw", + "||myparagliding.com", + "||mypopescu.com", + "myradio.hk/podcast", + ".myreadingmanga.info", + "mysinablog.com", + ".myspace.com", + "||myspacecdn.com", + ".mytalkbox.com", + ".mytizi.com", + "||naacoalition.org", + "old.nabble.com", + "||naitik.net", + ".nakuz.com/bbs", + "||nalandabodhi.org", + "||nalandawest.org", + ".namgyal.org", + "namgyalmonastery.org", + "||namsisi.com", + ".nanyang.com", + "||nanyang.com", + ".nanyangpost.com", + "||nanyangpost.com", + ".nanzao.com", + "||jpl.nasa.gov", + "||pds.nasa.gov", + "||solarsystem.nasa.gov", + ".nakido.com", + "||nakido.com", + ".naol.ca", + ".naol.cc", + "uighur.narod.ru", + ".nat.moe", + "||nat.moe", + "cyberghost.natado.com", + "||national-lottery.co.uk", + "news.nationalgeographic.com/news/2014/06/140603-tiananmen-square", + ".nationsonline.org/oneworld/tibet", + "||line.naver.jp", + "||navyfamily.navy.mil", + "||navyreserve.navy.mil", + "||nko.navy.mil", + "||usno.navy.mil", + "naweeklytimes.com", + ".nbtvpn.com", + "|http://nbtvpn.com", + "nccwatch.org.tw", + ".nch.com.tw", + ".ncn.org", + "||ncn.org", + "||etools.ncol.com", + ".nde.de", + ".ndr.de", + ".ned.org", + "||nekoslovakia.net", + "||nepusoku.com", + "||net-fits.pro", + "bbs.netbig.com", + ".netbirds.com", + "netcolony.com", + "bolin.netfirms.com", + "||netme.cc", + "netsneak.com", + ".network54.com", + "networkedblogs.com", + ".networktunnel.net", + "neverforget8964.org", + "new-3lunch.net", + ".new-akiba.com", + ".new96.ca", + ".newcenturymc.com", + "|http://newcenturymc.com", + "newcenturynews.com", + "||newchen.com", + ".newchen.com", + ".newgrounds.com", + "newipnow.com", + ".newlandmagazine.com.au", + ".newnews.ca", + "news100.com.tw", + "newschinacomment.org", + ".newscn.org", + "||newscn.org", + "newspeak.cc/story", + ".newsancai.com", + "||newsancai.com", + ".newsdetox.ca", + ".newsdh.com", + "||newstamago.com", + "||newstapa.org", + "newstarnet.com", + ".newtaiwan.com.tw", + "newtalk.tw", + "||newtalk.tw", + "newyorktimes.com", + "||nexon.com", + ".next11.co.jp", + ".nextmag.com.tw", + ".nextmedia.com", + "||nexton-net.jp", + "nexttv.com.tw", + ".nfjtyd.com", + "||co.ng.mil", + "||nga.mil", + "ngensis.com", + ".nhentai.net", + "|http://nhentai.net", + ".nhk-ondemand.jp", + ".nicovideo.jp/watch", + "||nicovideo.jp", + "||nighost.org", + "av.nightlife141.com", + "ninecommentaries.com", + ".ninjacloak.com", + "||ninjaproxy.ninja", + "nintendium.com", + "taiwanyes.ning.com", + "usmgtcg.ning.com/forum", + "||niusnews.com", + "||njactb.org", + "njuice.com", + "||njuice.com", + "nlfreevpn.com", + ".ddns.net/", + ".gooddns.info", + "||gotdns.ch", + ".maildns.xyz", + ".no-ip.org", + ".opendn.xyz", + ".servehttp.com", + "sytes.net", + ".whodns.xyz", + ".zapto.org", + "|http://dynupdate.no-ip.com/", + "||nobel.se", + "nobelprize.org/nobel_prizes/peace/laureates/1989", + "nobelprize.org/nobel_prizes/peace/laureates/2010", + "nobodycanstop.us", + "||nobodycanstop.us", + "||nokogiri.org", + "||nokola.com", + "noodlevpn.com", + ".norbulingka.org", + "nordvpn.com", + "||nordvpn.com", + "||novelasia.com", + ".news.now.com", + "|http://news.now.com", + "news.now.com%2Fhome", + "||nownews.com", + ".nowtorrents.com", + ".noypf.com", + "||noypf.com", + "||npa.go.jp", + ".npnt.me", + "|http://npnt.me", + ".nps.gov", + ".nradio.me", + "|http://nradio.me", + ".nrk.no", + "||nrk.no", + ".ntd.tv", + "||ntd.tv", + ".ntdtv.com", + "||ntdtv.com", + ".ntdtv.co.kr", + "ntdtv.ca", + "ntdtv.org", + "ntdtv.ru", + "ntdtvla.com", + ".ntrfun.com", + "||cbs.ntu.edu.tw", + "||media.nu.nl", + ".nubiles.net", + "||nuexpo.com", + ".nukistream.com", + "||nurgo-software.com", + "||nutaku.net", + ".nuvid.com", + "||nvdst.com", + "nuzcom.com", + ".nvquan.org", + ".nvtongzhisheng.org", + "|http://nvtongzhisheng.org", + ".nwtca.org", + "|http://nyaa.eu", + ".nydus.ca", + "nylon-angel.com", + "nylonstockingsonline.com", + ".nzchinese.com", + "||nzchinese.net.nz", + "observechina.net", + ".obutu.com", + "ocaspro.com", + "occupytiananmen.com", + "oclp.hk", + ".ocreampies.com", + "||october-review.org", + "offbeatchina.com", + "officeoftibet.com", + "|http://ofile.org", + "||ogaoga.org", + "twtr2src.ogaoga.org", + ".ogate.org", + "||ogate.org", + "www2.ohchr.org/english/bodies/cat/docs/ngos/II_China_41.pdf", + ".oikos.com.tw/v4", + ".oiktv.com", + "oizoblog.com", + ".ok.ru", + "||ok.ru", + ".okayfreedom.com", + "||okayfreedom.com", + "okk.tw", + "|http://filmy.olabloga.pl/player", + "old-cat.net", + "||olumpo.com", + ".olympicwatch.org", + "omgili.com", + "||omnitalk.com", + "||omnitalk.org", + "cling.omy.sg", + "forum.omy.sg", + "news.omy.sg", + "showbiz.omy.sg", + "||on.cc", + "||onedrive.live.com", + "||onion.city", + ".onlinecha.com", + "||onlineyoutube.com", + ".onlytweets.com", + "|http://onlytweets.com", + "onmoon.net", + "onmoon.com", + ".onthehunt.com", + "|http://onthehunt.com", + ".oopsforum.com", + "open.com.hk", + "openallweb.com", + "opendemocracy.net", + "||opendemocracy.net", + ".openervpn.in", + "openid.net", + "||openid.net", + ".openleaks.org", + "||openleaks.org", + "openvpn.net", + "||openvpn.net", + "||openwebster.com", + ".openwrt.org.cn", + "@@||openwrt.org.cn", + "my.opera.com/dahema", + "||demo.opera-mini.net", + ".opus-gaming.com", + "|http://opus-gaming.com", + "www.orchidbbs.com", + ".organcare.org.tw", + "organharvestinvestigation.net", + ".orgasm.com", + ".orgfree.com", + "||orient-doll.com", + "orientaldaily.com.my", + "||orientaldaily.com.my", + "||orn.jp", + "t.orzdream.com", + "||t.orzdream.com", + "tui.orzdream.com", + "||orzistic.org", + "||osfoora.com", + ".otnd.org", + "||otnd.org", + "||otto.de", + "||ourdearamy.com", + "oursogo.com", + ".oursteps.com.au", + "||oursteps.com.au", + ".oursweb.net", + "||ourtv.hk", + "xinqimeng.over-blog.com", + "||overplay.net", + "share.ovi.com/media", + "|http://owl.li", + "|http://ht.ly", + "|http://htl.li", + "|http://mash.to", + "www.owind.com", + "|http://www.oxid.it", + "oyax.com", + "oyghan.com/wps", + ".ozchinese.com/bbs", + "||ow.ly", + "bbs.ozchinese.com", + ".ozvoice.org", + "||ozvoice.org", + ".ozxw.com", + ".ozyoyo.com", + "||pachosting.com", + ".pacificpoker.com", + ".packetix.net", + "||pacopacomama.com", + ".padmanet.com", + "page2rss.com", + "||pagodabox.com", + ".palacemoon.com", + "forum.palmislife.com", + "||eriversoft.com", + ".paldengyal.com", + "paljorpublications.com", + ".paltalk.com", + "||pandapow.co", + ".pandapow.net", + ".pandavpn-jp.com", + ".panluan.net", + "||panluan.net", + "||pao-pao.net", + "paper.li", + "paperb.us", + ".paradisehill.cc", + ".paradisepoker.com", + ".partycasino.com", + ".partypoker.com", + ".passion.com", + "||passion.com", + ".passiontimes.hk", + "pastebin.com", + ".pastie.org", + "||pastie.org", + "||blog.pathtosharepoint.com", + "pbs.org/wgbh/pages/frontline/gate", + "pbs.org/wgbh/pages/frontline/tankman", + "pbs.org/wgbh/pages/frontline/tibet", + "video.pbs.org", + "pbwiki.com", + "||pbworks.com", + "||developers.box.net", + "||wiki.oauth.net", + "||wiki.phonegap.com", + "||wiki.jqueryui.com", + "||pbxes.com", + "||pbxes.org", + "pcdvd.com.tw", + ".pchome.com.tw", + "|http://pcij.org", + ".pcstore.com.tw", + "||pct.org.tw", + "pdetails.com", + "||pdproxy.com", + "||peace.ca", + "peacefire.org", + "peacehall.com", + "||peacehall.com", + "|http://pearlher.org", + ".peeasian.com", + ".pekingduck.org", + "||pekingduck.org", + ".pemulihan.or.id", + "|http://pemulihan.or.id", + "||pen.io", + "penchinese.com", + "||penchinese.net", + ".penchinese.net", + "pengyulong.com", + "penisbot.com", + "||blog.pentalogic.net", + ".penthouse.com", + ".pentoy.hk/%E4%B8%AD%E5%9C%8B", + ".pentoy.hk/%E6%99%82%E4%BA%8B", + ".peoplebookcafe.com", + ".peoplenews.tw", + "||peoplenews.tw", + ".peopo.org", + "||peopo.org", + ".percy.in", + ".perfectgirls.net", + "perfectvpn.net", + ".persecutionblog.com", + ".persiankitty.com", + "pfd.org.hk", + "phapluan.org", + "phayul.com", + "philborges.com", + "philly.com", + "||phncdn.com", + "||photodharma.net", + "||photofocus.com", + "||phuquocservices.com", + "||picacomiccn.com", + ".picidae.net", + "||img*.picturedip.com", + "picturesocial.com", + "||pin-cong.com", + ".pin6.com", + "||pin6.com", + ".ping.fm", + "||ping.fm", + "||pinimg.com", + ".pinkrod.com", + "||pinoy-n.com", + "||pinterest.at", + "||pinterest.ca", + "||pinterest.co.kr", + "||pinterest.co.uk", + ".pinterest.com", + "||pinterest.com", + "||pinterest.de", + "||pinterest.dk", + "||pinterest.fr", + "||pinterest.jp", + "||pinterest.nl", + "||pinterest.se", + ".pipii.tv", + ".piposay.com", + "piraattilahti.org", + ".piring.com", + "||pixelqi.com", + "||css.pixnet.in", + "||pixnet.net", + ".pixnet.net", + ".pk.com", + "||placemix.com", + "|http://pictures.playboy.com", + "||playboy.com", + ".playboyplus.com", + "||playboyplus.com", + "||player.fm", + ".playno1.com", + "||playno1.com", + "||playpcesor.com", + "plays.com.tw", + "||m.plixi.com", + "plm.org.hk", + "plunder.com", + ".plurk.com", + "||plurk.com", + ".plus28.com", + ".plusbb.com", + ".pmatehunter.com", + "|http://pmatehunter.com", + ".pmates.com", + "||po2b.com", + "pobieramy.top", + "||podictionary.com", + ".pokerstars.com", + "||pokerstars.com", + ".pokerstars.net", + "zh.pokerstrategy.com", + "politicalchina.org", + "politicalconsultation.org", + ".politiscales.net", + "||poloniex.com", + ".polymerhk.com", + "|http://polymerhk.com", + ".popo.tw", + "||popvote.hk", + ".popyard.com", + "||popyard.org", + ".porn.com", + ".porn2.com", + ".porn5.com", + ".pornbase.org", + ".pornerbros.com", + "||pornhd.com", + ".pornhost.com", + ".pornhub.com", + "||pornhub.com", + ".pornhubdeutsch.net", + "|http://pornhubdeutsch.net", + "||pornmm.net", + ".pornoxo.com", + ".pornrapidshare.com", + "||pornrapidshare.com", + ".pornsharing.com", + "|http://pornsharing.com", + ".pornsocket.com", + ".pornstarclub.com", + "||pornstarclub.com", + ".porntube.com", + ".porntubenews.com", + ".porntvblog.com", + "||porntvblog.com", + ".pornvisit.com", + ".portablevpn.nl", + "||poskotanews.com", + ".post01.com", + ".post76.com", + "||post76.com", + ".post852.com", + "postadult.com", + ".postimg.org", + "||potvpn.com", + "||powercx.com", + ".powerphoto.org", + "||www.powerpointninja.com", + "||presidentlee.tw", + "||cdn.printfriendly.com", + ".pritunl.com", + "provpnaccounts.com", + "||provpnaccounts.com", + ".proxfree.com", + "||proxfree.com", + "proxyanonimo.es", + ".proxynetwork.org.uk", + "||proxynetwork.org.uk", + "||pts.org.tw", + ".pttvan.org", + "pubu.com.tw", + "puffinbrowser.com", + "pureinsight.org", + ".pushchinawall.com", + ".putty.org", + "||putty.org", + "||calebelston.com", + "||blog.fizzik.com", + "||nf.id.au", + "||sogrady.me", + "||vatn.org", + "||ventureswell.com", + "||whereiswerner.com", + ".power.com", + "||power.com", + "powerapple.com", + "||powerapple.com", + "||abc.pp.ru", + "heix.pp.ru", + "||prayforchina.net", + "||premeforwindows7.com", + "||presentationzen.com", + "||prestige-av.com", + "prisoner-state-secret-journal-premier", + ".prisoneralert.com", + "||pritunl.com", + "||privacybox.de", + ".private.com/home", + "||privateinternetaccess.com", + "privatepaste.com", + "||privatepaste.com", + "privatetunnel.com", + "||privatetunnel.com", + "||privatevpn.com", + "||procopytips.com", + "provideocoalition.com", + "||prosiben.de", + "proxifier.com", + "api.proxlet.com", + "||proxomitron.info", + ".proxpn.com", + "||proxpn.com", + ".proxylist.org.uk", + "||proxylist.org.uk", + ".proxypy.net", + "||proxypy.net", + "proxyroad.com", + ".proxytunnel.net", + "||proyectoclubes.com", + "prozz.net", + "psblog.name", + "||psblog.name", + "||psiphon.ca", + ".psiphon3.com", + "||psiphon3.com", + ".psiphontoday.com", + ".ptt.cc", + "||ptt.cc", + ".puffstore.com", + ".puuko.com", + "||pullfolio.com", + ".punyu.com/puny", + "||pureconcepts.net", + "||pureinsight.org", + "||purepdf.com", + "||purevpn.com", + ".purplelotus.org", + ".pursuestar.com", + "||pursuestar.com", + ".pussyspace.com", + ".putihome.org", + ".putlocker.com/file", + "pwned.com", + "python.com", + ".python.com.tw", + "|http://python.com.tw", + "pythonhackers.com/p", + "ss.pythonic.life/", + ".qanote.com", + "||qanote.com", + ".qgirl.com.tw", + "||qiandao.today", + ".qi-gong.me", + "||qi-gong.me", + "||qiangyou.org", + ".qidian.ca", + ".qienkuen.org", + "||qienkuen.org", + "||qiwen.lu", + "qixianglu.cn", + "bbs.qmzdd.com", + ".qkshare.com", + "qoos.com", + "||qoos.com", + "blog.qooza.hk/dafengqixi", + "||efksoft.com", + "||qstatus.com", + "||qtweeter.com", + "||qtrac.eu", + ".quannengshen.org", + "|http://quannengshen.org", + "quantumbooter.net", + "||quitccp.net", + ".quitccp.net", + "||quitccp.org", + ".quitccp.org", + ".quora.com/Chinas-Future", + ".quran.com", + "|http://quran.com", + ".quranexplorer.com", + "qusi8.net", + ".qvodzy.org", + "nemesis2.qx.net/pages/MyEnTunnel", + "qxbbs.org", + ".ra.gg", + "|http://ra.gg/", + ".radicalparty.org", + "||rael.org", + "radicalparty.org", + "radioaustralia.net.au", + ".radiohilight.net", + "||radiohilight.net", + "opml.radiotime.com", + "||radiovaticana.org", + "||radiovncr.com", + "||raggedbanner.com", + "||raidcall.com.tw", + ".raidtalk.com.tw", + ".rainbowplan.org/bbs", + "|https://raindrop.io/", + ".raizoji.or.jp", + "|http://raizoji.or.jp", + "rangwang.biz", + "rangzen.com", + "rangzen.net", + "rangzen.org", + "|http://blog.ranxiang.com/", + "ranyunfei.com", + "||ranyunfei.com", + ".rapbull.net", + "|http://rapidgator.net/", + "||rapidmoviez.com", + "rapidvpn.com", + "||rapidvpn.com", + ".raremovie.cc", + "|http://raremovie.cc", + ".raremovie.net", + "|http://raremovie.net", + "||rawgit.com", + "||rawgithub.com", + "||razyboard.com", + "rcinet.ca", + ".read100.com", + ".readingtimes.com.tw", + "||readingtimes.com.tw", + "||readmoo.com", + ".readydown.com", + "|http://readydown.com", + ".realcourage.org", + ".realitykings.com", + "||realitykings.com", + ".realraptalk.com", + ".realsexpass.com", + ".recordhistory.org", + ".recovery.org.tw", + "|http://online.recoveryversion.org", + "||recoveryversion.com.tw", + "||red-lang.org", + "redballoonsolidarity.org", + ".redchinacn.net", + "|http://redchinacn.net", + "redchinacn.org", + "redtube.com", + "referer.us", + "||referer.us", + "||reflectivecode.com", + "relaxbbs.com", + ".relay.com.tw", + ".releaseinternational.org", + "religioustolerance.org", + "renminbao.com", + "||renminbao.com", + ".renyurenquan.org", + "||renyurenquan.org", + "|http://certificate.revocationcheck.com", + "subacme.rerouted.org", + "||resilio.com", + ".reuters.com", + "||reuters.com", + "||reutersmedia.net", + ".revleft.com", + "retweetist.com", + "||retweetrank.com", + "revver.com", + ".rfa.org", + "||rfa.org", + ".rfachina.com", + ".rfamobile.org", + "rfaweb.org", + "||rferl.org", + ".rfi.fr", + "||rfi.fr", + "|http://rfi.my/", + "|http://vds.rightster.com/", + ".rigpa.org", + ".rileyguide.com", + "riku.me/", + ".ritouki.jp", + "||ritter.vg", + ".rlwlw.com", + "||rlwlw.com", + ".rmjdw.com", + ".rmjdw132.info", + ".roadshow.hk", + ".roboforex.com", + "||robustnessiskey.com", + "||rocket-inc.net", + "|http://www2.rocketbbs.com/11/bbs.cgi?id=5mus", + "|http://www2.rocketbbs.com/11/bbs.cgi?id=freemgl", + "||rojo.com", + "||ronjoneswriter.com", + "||rolia.net", + ".roodo.com", + ".rosechina.net", + ".rotten.com", + ".rsf.org", + "||rsf.org", + ".rsf-chinese.org", + "||rsf-chinese.org", + ".rsgamen.org", + "||phosphation13.rssing.com", + ".rssmeme.com", + "||rssmeme.com", + "||rtalabel.org", + ".rthk.hk", + "|http://rthk.hk", + ".rthk.org.hk", + "|http://rthk.org.hk", + ".rti.org.tw", + "||rti.org.tw", + ".rtycminnesota.org", + ".ruanyifeng.com/blog*some_ways_to_break_the_great_firewall", + "rukor.org", + ".runbtx.com", + ".rushbee.com", + ".ruten.com.tw", + "rutube.ru", + ".ruyiseek.com", + ".rxhj.net", + "|http://rxhj.net", + ".s1s1s1.com", + "||s-cute.com", + ".s-dragon.org", + "||s1heng.com", + "|http://www.s4miniarchive.com", + "||s8forum.com", + "cdn1.lp.saboom.com", + "||sacks.com", + "sacom.hk", + "||sacom.hk", + "||sadpanda.us", + ".safervpn.com", + "||safervpn.com", + ".saintyculture.com", + "|http://saintyculture.com", + ".saiq.me", + "||saiq.me", + "||sakuralive.com", + ".sakya.org", + ".salvation.org.hk", + "||salvation.org.hk", + ".samair.ru/proxy/type-01", + ".sambhota.org", + ".cn.sandscotaicentral.com", + "|http://cn.sandscotaicentral.com", + ".sanmin.com.tw", + "sapikachu.net", + "savemedia.com", + "||savethesounds.info", + ".savetibet.de", + "||savetibet.de", + "savetibet.fr", + "savetibet.nl", + ".savetibet.org", + "||savetibet.org", + "savetibet.ru", + ".savetibetstore.org", + "||savetibetstore.org", + "savevid.com", + "||say2.info", + ".sbme.me", + "|http://sbme.me", + ".sbs.com.au/yourlanguage", + ".scasino.com", + "|http://www.sciencemag.org/content/344/6187/953", + ".sciencenets.com", + ".scmp.com", + "||scmp.com", + ".scmpchinese.com", + "||scramble.io", + ".scribd.com", + "||scribd.com", + "||scriptspot.com", + "seapuff.com", + "domainhelp.search.com", + ".searchtruth.com", + "secretchina.com", + "||secretchina.com", + "||secretgarden.no", + ".secretsline.biz", + "||secretsline.biz", + "||securetunnel.com", + "securityinabox.org", + "|https://securityinabox.org", + ".securitykiss.com", + "||securitykiss.com", + "||seed4.me", + "news.seehua.com", + "seesmic.com", + "||seevpn.com", + "||seezone.net", + "sejie.com", + ".sendspace.com", + "|http://tweets.seraph.me/", + "sesawe.net", + "||sesawe.net", + ".sesawe.org", + "||sethwklein.net", + ".setn.com", + ".settv.com.tw", + "forum.setty.com.tw", + ".sevenload.com", + "||sevenload.com", + ".sex.com", + ".sex-11.com", + "||sex3.com", + "||sex8.cc", + ".sexandsubmission.com", + ".sexbot.com", + ".sexhu.com", + ".sexhuang.com", + "sexinsex.net", + "||sexinsex.net", + ".sextvx.com", + "67.220.91.15", + "67.220.91.18", + "67.220.91.23", + "|http://*.sf.net", + ".sfileydy.com", + "||sfshibao.com", + ".sftindia.org", + ".sftuk.org", + "||sftuk.org", + "||shadeyouvpn.com", + "shadow.ma", + ".shadowsky.xyz", + ".shadowsocks.asia", + "||www.shadowsocks.com", + ".shadowsocks.com", + "||shadowsocks.com.hk", + ".shadowsocks.org", + "||shadowsocks.org", + "||shadowsocks-r.com", + "|http://cn.shafaqna.com", + ".shambalapost.com", + ".shambhalasun.com", + ".shangfang.org", + "||shangfang.org", + "shapeservices.com", + ".sharebee.com", + "||sharecool.org", + "sharpdaily.com.hk", + "||sharpdaily.com.hk", + ".sharpdaily.hk", + ".sharpdaily.tw", + ".shat-tibet.com", + "sheikyermami.com", + ".shellfire.de", + "||shellfire.de", + ".shenshou.org", + "shenyun.com", + "shenyunperformingarts.org", + "||shenyunperformingarts.org", + "shenzhoufilm.com", + "||shenzhoufilm.com", + "||sherabgyaltsen.com", + ".shiatv.net", + ".shicheng.org", + "shinychan.com", + "shipcamouflage.com", + ".shireyishunjian.com", + ".shitaotv.org", + "||shixiao.org", + "||shizhao.org", + "shizhao.org", + "shkspr.mobi/dabr", + "||shodanhq.com", + "||shooshtime.com", + ".shop2000.com.tw", + ".shopping.com", + ".showhaotu.com", + ".showtime.jp", + ".shutterstock.com", + "||shutterstock.com", + "ch.shvoong.com", + ".shwchurch.org", + "||www.shwchurch.org", + ".shwchurch3.com", + "|http://shwchurch3.com", + ".siddharthasintent.org", + "||sidelinesnews.com", + ".sidelinessportseatery.com", + ".sijihuisuo.club", + ".sijihuisuo.com", + ".silkbook.com", + "||simbolostwitter.com", + "simplecd.org", + "||simplecd.org", + "@@||simplecd.me", + "simpleproductivityblog.com", + "bbs.sina.com/", + "bbs.sina.com%2F", + "blog.sina.com.tw", + "dailynews.sina.com/", + "dailynews.sina.com%2F", + "forum.sina.com.hk", + "home.sina.com", + "||magazines.sina.com.tw", + "news.sina.com.hk", + "news.sina.com.tw", + "news.sinchew.com.my", + ".sinchew.com.my/node/", + ".sinchew.com.my/taxonomy/term", + ".singaporepools.com.sg", + "||singaporepools.com.sg", + ".singfortibet.com", + ".singpao.com.hk", + "singtao.com", + "||singtao.com", + "news.singtao.ca", + ".singtaousa.com", + "||singtaousa.com", + "sino-monthly.com", + "||sinocast.com", + "sinocism.com", + "sinomontreal.ca", + ".sinonet.ca", + ".sinopitt.info", + ".sinoants.com", + "||sinoants.com", + ".sinoquebec.com", + ".sierrafriendsoftibet.org", + "sis.xxx", + "||sis001.com", + "sis001.us", + ".site2unblock.com", + "||site90.net", + ".sitebro.tw", + "||sitekreator.com", + "||siteks.uk.to", + "||sitemaps.org", + ".sjrt.org", + "|http://sjrt.org", + "||sjum.cn", + "||sketchappsources.com", + "||skimtube.com", + "||skybet.com", + "|http://users.skynet.be/reves/tibethome.html", + ".skyking.com.tw", + "bbs.skykiwi.com", + "|http://www.skype.com/intl/", + "|http://www.skype.com/zh-Hant", + "||skyvegas.com", + ".xskywalker.com", + "||xskywalker.com", + "||skyxvpn.com", + "m.slandr.net", + ".slaytizle.com", + ".sleazydream.com", + "||slheng.com", + "||slideshare.net", + "forum.slime.com.tw", + ".slinkset.com", + "||slickvpn.com", + ".slutload.com", + "||smartdnsproxy.com", + ".smarthide.com", + "||app.smartmailcloud.com", + "smchbooks.com", + ".smh.com.au/world/death-of-chinese-playboy-leaves-fresh-scratches-in-party-paintwork-20120903-25a8v", + "smhric.org", + ".smith.edu/dalailama", + ".smyxy.org", + "||snapchat.com", + ".snaptu.com", + "||snaptu.com", + "||sndcdn.com", + "sneakme.net", + "snowlionpub.com", + "home.so-net.net.tw/yisa_tsai", + "||soc.mil", + ".socks-proxy.net", + "||socks-proxy.net", + ".sockscap64.com", + "||sockslist.net", + ".socrec.org", + "|http://socrec.org", + ".sod.co.jp", + ".softether.org", + "||softether.org", + ".softether-download.com", + "||softether-download.com", + "||cdn.softlayer.net", + "||sogclub.com", + "sohcradio.com", + "||sohcradio.com", + ".sokmil.com", + "||sorting-algorithms.com", + ".sostibet.org", + ".soumo.info", + "||soup.io", + "@@||static.soup.io", + ".sobees.com", + "||sobees.com", + "socialwhale.com", + ".softether.co.jp", + "||softwarebychuck.com", + "blog.sogoo.org", + "soh.tw", + "||soh.tw", + "sohfrance.org", + "||sohfrance.org", + "chinese.soifind.com", + "sokamonline.com", + ".solidaritetibet.org", + ".solidfiles.com", + "||somee.com", + ".songjianjun.com", + "||songjianjun.com", + ".sonicbbs.cc", + ".sonidodelaesperanza.org", + ".sopcast.com", + ".sopcast.org", + ".sorazone.net", + "||sos.org", + "bbs.sou-tong.org", + ".soubory.com", + "|http://soubory.com", + ".soul-plus.net", + ".soulcaliburhentai.net", + "||soulcaliburhentai.net", + "||soundcloud.com", + ".soundofhope.kr", + "soundofhope.org", + "||soundofhope.org", + "||soupofmedia.com", + "|http://sourceforge.net/p*/shadowsocksgui/", + ".sourcewadio.com", + "southnews.com.tw", + "sowers.org.hk", + "||wlx.sowiki.net", + "||spankbang.com", + ".spankingtube.com", + ".spankwire.com", + "||spb.com", + "||speakerdeck.com", + "||speedify.com", + "spem.at", + "||spencertipping.com", + "||spendee.com", + "||spicevpn.com", + ".spideroak.com", + "||spideroak.com", + ".spike.com", + ".spotflux.com", + "||spotflux.com", + ".spring4u.info", + "|http://spring4u.info", + "||sproutcore.com", + "||sproxy.info", + "||srocket.us", + ".ss-link.com", + "||ss-link.com", + ".ssglobal.co/wp", + "|http://ssglobal.co", + ".ssglobal.me", + "||ssh91.com", + ".sspro.ml", + "|http://sspro.ml", + ".ssrshare.com", + "||ssrshare.com", + "||sss.camp", + "||sstmlt.moe", + "sstmlt.net", + "||sstmlt.net", + "|http://stackoverflow.com/users/895245", + ".stage64.hk", + "||stage64.hk", + "||standupfortibet.org", + "stanford.edu/group/falun", + "usinfo.state.gov", + "||statueofdemocracy.org", + ".starfishfx.com", + ".starp2p.com", + "||starp2p.com", + ".startpage.com", + "||startpage.com", + ".startuplivingchina.com", + "|http://startuplivingchina.com", + "||static-economist.com", + "||stc.com.sa", + "||steel-storm.com", + ".steganos.com", + "||steganos.com", + ".steganos.net", + ".stepchina.com", + "ny.stgloballink.com", + "hd.stheadline.com/news/realtime", + "sthoo.com", + "||sthoo.com", + ".stickam.com", + "stickeraction.com/sesawe", + ".stileproject.com", + ".sto.cc", + ".stoporganharvesting.org", + "||storagenewsletter.com", + ".storm.mg", + "||storm.mg", + ".stoptibetcrisis.net", + "||stoptibetcrisis.net", + "||storify.com", + ".stormmediagroup.com", + "||stoweboyd.com", + "stranabg.com", + "||straplessdildo.com", + "||streamingthe.net", + "streema.com/tv/NTDTV_Chinese", + "cn.streetvoice.com/article", + "cn.streetvoice.com/diary", + "cn2.streetvoice.com", + "tw.streetvoice.com", + ".strikingly.com", + "||strongvpn.com", + ".strongwindpress.com", + ".student.tw/db", + "||studentsforafreetibet.org", + "||stumbleupon.com", + "stupidvideos.com", + ".successfn.com", + "panamapapers.sueddeutsche.de", + ".sugarsync.com", + "||sugarsync.com", + ".sugobbs.com", + "||sugumiru18.com", + "||suissl.com", + "summify.com", + ".sumrando.com", + "||sumrando.com", + "sun1911.com", + ".sunporno.com", + "||sunmedia.ca", + "||sunporno.com", + ".sunskyforum.com", + ".sunta.com.tw", + ".sunvpn.net", + ".suoluo.org", + ".superfreevpn.com", + ".supervpn.net", + "||supervpn.net", + ".superzooi.com", + "|http://superzooi.com", + ".suppig.net", + ".suprememastertv.com", + "|http://suprememastertv.com", + ".surfeasy.com", + "||surfeasy.com", + ".surfeasy.com.au", + "|http://surfeasy.com.au", + "||surrenderat20.net", + ".suyangg.com", + "|http://suyangg.com", + ".svsfx.com", + ".swissinfo.ch", + "||swissinfo.ch", + ".swissvpn.net", + "||swissvpn.net", + "switchvpn.net", + "||switchvpn.net", + ".sydneytoday.com", + "||sydneytoday.com", + ".sylfoundation.org", + "||syncback.com", + "sysresccd.org", + ".sytes.net", + "blog.syx86.com/2009/09/puff", + "blog.syx86.cn/2009/09/puff", + ".szbbs.net", + ".szetowah.org.hk", + "||t-g.com", + ".t35.com", + ".t66y.com", + "||t66y.com", + ".taa-usa.org", + "|http://taa-usa.org", + ".taaze.tw", + "||taaze.tw", + "|http://www.tablesgenerator.com/", + "tabtter.jp", + ".tacem.org", + ".taconet.com.tw", + "||taedp.org.tw", + ".tafm.org", + ".tagwa.org.au", + "tagwalk.com", + "||tagwalk.com", + "tahr.org.tw", + ".taipeisociety.org", + "||taipeisociety.org", + ".taiwanbible.com", + ".taiwancon.com", + ".taiwandaily.net", + "||taiwandaily.net", + ".taiwandc.org", + ".taiwanjustice.com", + "taiwankiss.com", + "taiwannation.com", + "taiwannation.com.tw", + "||taiwanncf.org.tw", + "||taiwannews.com.tw", + "|http://www.taiwanonline.cc/", + "taiwantp.net", + "||taiwantt.org.tw", + "taiwanus.net", + "taiwanyes.com", + "taiwan-sex.com", + ".talk853.com", + ".talkboxapp.com", + "||talkboxapp.com", + ".talkcc.com", + "||talkcc.com", + ".talkonly.net", + "||talkonly.net", + "||tamiaode.tk", + "||tanc.org", + "tangben.com", + ".tangren.us", + ".taoism.net", + "|http://taoism.net", + ".taolun.info", + "||taolun.info", + ".tapatalk.com", + "||tapatalk.com", + "blog.taragana.com", + ".tascn.com.au", + "||taup.net", + "|http://www.taup.org.tw", + ".taweet.com", + "||taweet.com", + ".tbcollege.org", + "||tbcollege.org", + ".tbi.org.hk", + ".tbicn.org", + ".tbjyt.org", + "||tbpic.info", + ".tbrc.org", + "tbs-rainbow.org", + ".tbsec.org", + "||tbsec.org", + "tbskkinabalu.page.tl", + ".tbsmalaysia.org", + ".tbsn.org", + "||tbsn.org", + ".tbsseattle.org", + ".tbssqh.org", + "|http://tbssqh.org", + "tbswd.org", + ".tbtemple.org.uk", + ".tbthouston.org", + ".tccwonline.org", + ".tcewf.org", + "tchrd.org", + "tcnynj.org", + "||tcpspeed.co", + ".tcpspeed.com", + "||tcpspeed.com", + ".tcsofbc.org", + ".tcsovi.org", + ".tdm.com.mo", + "teamamericany.com", + "||techviz.net", + "||teck.in", + ".teeniefuck.net", + "teensinasia.com", + ".telecomspace.com", + "||telegraph.co.uk", + ".tenacy.com", + "||tenzinpalmo.com", + ".tew.org", + ".thaicn.com", + "||theatrum-belli.com", + "theblemish.com", + "||thebcomplex.com", + ".thebobs.com", + "||thebobs.com", + ".thechinabeat.org", + "|http://www.thechinastory.org/yearbooks/yearbook-2012/", + ".thedalailamamovie.com", + "|http://thedalailamamovie.com", + "||thedw.us", + "thefrontier.hk/tf", + "cn.thegay.com", + "|http://thegioitinhoc.vn/", + ".thegly.com", + ".thehots.info", + "thehousenews.com", + "||thehun.net", + ".theinitium.com", + "||theinitium.com", + ".thenewslens.com", + "||thenewslens.com", + ".thepiratebay.org", + "||thepiratebay.org", + ".theporndude.com", + "||theporndude.com", + "||theportalwiki.com", + "thereallove.kr", + "therock.net.nz", + "thespeeder.com", + "||thestandnews.com", + "thetibetcenter.org", + "thetibetconnection.org", + ".thetibetmuseum.org", + ".thetibetpost.com", + "||thetibetpost.com", + "||thetinhat.com", + "thetrotskymovie.com", + "thevivekspot.com", + "||thewgo.org", + ".theync.com", + "|http://theync.com", + ".thinkingtaiwan.com", + ".thisav.com", + "|http://thisav.com", + ".thlib.org", + "||thomasbernhard.org", + ".thongdreams.com", + "threatchaos.com", + "||throughnightsfire.com", + ".thumbzilla.com", + "||thywords.com", + ".thywords.com.tw", + "tiananmenmother.org", + ".tiananmenduizhi.com", + "||tiananmenduizhi.com", + "||tiananmenuniv.com", + "||tiananmenuniv.net", + "||tiandixing.org", + ".tianhuayuan.com", + ".tianlawoffice.com", + "||tianti.io", + "tiantibooks.org", + "||tiantibooks.org", + "tianyantong.org.cn", + ".tianzhu.org", + ".tibet.at", + "tibet.ca", + ".tibet.com", + "||tibet.com", + "tibet.fr", + ".tibet.net", + "||tibet.net", + "tibet.nu", + ".tibet.org", + "||tibet.org", + ".tibet.sk", + "tibet.org.tw", + ".tibet.to", + ".tibet-envoy.eu", + "||tibet-envoy.eu", + ".tibet-foundation.org", + ".tibet-house-trust.co.uk", + "tibet-info.net", + "tibet-initiative.de", + "||tibet-initiative.de", + ".tibet-munich.de", + ".tibet3rdpole.org", + "|http://tibet3rdpole.org", + "tibetaction.net", + "||tibetaction.net", + ".tibetaid.org", + "tibetalk.com", + ".tibetan.fr", + "tibetan-alliance.org", + ".tibetanarts.org", + ".tibetanbuddhistinstitute.org", + "|http://tibetanbuddhistinstitute.org", + "tibetancommunity.org", + ".tibetanjournal.com", + ".tibetanlanguage.org", + ".tibetanliberation.org", + "||tibetanliberation.org", + ".tibetcollection.com", + ".tibetanaidproject.org", + ".tibetancommunityuk.net", + "|http://tibetancommunityuk.net", + "tibetanculture.org", + "tibetanfeministcollective.org", + ".tibetanpaintings.com", + ".tibetanphotoproject.com", + ".tibetanpoliticalreview.org", + ".tibetanreview.net", + "|http://tibetansports.org", + ".tibetanwomen.org", + "|http://tibetanwomen.org", + ".tibetanyouth.org", + ".tibetanyouthcongress.org", + "||tibetanyouthcongress.org", + ".tibetcharity.dk", + "tibetcharity.in", + ".tibetchild.org", + ".tibetcity.com", + ".tibetcorps.org", + ".tibetexpress.net", + "|http://tibetexpress.net", + "tibetfocus.com", + "tibetfund.org", + ".tibetgermany.com", + "||tibetgermany.de", + ".tibethaus.com", + ".tibetheritagefund.org", + "tibethouse.jp", + "tibethouse.org", + "||tibethouse.us", + ".tibetinfonet.net", + ".tibetjustice.org", + ".tibetkomite.dk", + "|http://tibetmuseum.org", + "tibetnetwork.org", + "||tibetnetwork.org", + ".tibetoffice.ch", + "|http://tibetoffice.ch", + "tibetoffice.eu", + "tibetoffice.org", + "tibetonline.com", + "||tibetonline.com", + ".tibetoffice.com.au", + "|http://tibetoffice.com.au", + "||tibetonline.tv", + ".tibetonline.tv", + ".tibetoralhistory.org", + "|http://tibetoralhistory.org", + ".tibetpolicy.eu", + ".tibetrelieffund.co.uk", + "tibetsites.com", + ".tibetsociety.com", + "||tibetsociety.com", + ".tibetsun.com", + ".tibetsupportgroup.org", + "|http://tibetsupportgroup.org", + ".tibetswiss.ch", + ".tibettelegraph.com", + "tibettimes.net", + "||tibetwrites.org", + ".ticket.com.tw", + ".tigervpn.com", + "||tigervpn.com", + ".timdir.com", + "|http://timdir.com", + ".time.com", + "|http://time.com", + ".timsah.com", + "||blog.tiney.com", + "tintuc101.com", + ".tiny.cc", + "|http://tiny.cc", + "tinychat.com", + "||tinypaste.com", + ".tistory.com", + "||tkcs-collins.com", + ".tmagazine.com", + "||tmagazine.com", + ".tmdfish.com", + "|http://tmi.me", + ".tmpp.org", + "|http://tmpp.org", + ".tnaflix.com", + "||tnaflix.com", + ".tngrnow.com", + ".tngrnow.net", + ".tnp.org", + "|http://tnp.org", + ".to-porno.com", + "||to-porno.com", + "togetter.com", + ".tokyo-247.com", + ".tokyo-hot.com", + "||tokyo-porn-tube.com", + "||tokyocn.com", + "tw.tomonews.net", + ".tongil.or.kr", + ".tono-oka.jp", + "tonyyan.net", + ".toodoc.com", + "toonel.net", + "top81.ws", + ".topnews.in", + ".toppornsites.com", + "|http://toppornsites.com", + ".torguard.net", + "||torguard.net", + "||top.tv", + ".topshareware.com", + ".topsy.com", + "||topsy.com", + "||toptip.ca", + "tora.to", + ".torcn.com", + ".torproject.org", + "||torproject.org", + "torrentprivacy.com", + "||torrentprivacy.com", + "|http://torrentproject.se", + "||torrenty.org", + "||torrentz.eu", + "||torvpn.com", + "||totalvpn.com", + ".toutiaoabc.com", + "towngain.com", + "toypark.in", + "toytractorshow.com", + ".tparents.org", + ".tpi.org.tw", + "||tpi.org.tw", + "traffichaus.com", + "||transparency.org", + "||treemall.com.tw", + "trendsmap.com", + "||trendsmap.com", + ".trialofccp.org", + "||trialofccp.org", + ".trimondi.de/SDLE", + ".trouw.nl", + "|http://trouw.nl", + ".trt.net.tr", + "trtc.com.tw", + ".truebuddha-md.org", + "|http://truebuddha-md.org", + "trulyergonomic.com", + ".truth101.co.tv", + "|http://truth101.co.tv", + ".truthontour.org", + "|http://truthontour.org", + ".truveo.com", + ".tsctv.net", + ".tsemtulku.com", + "tsquare.tv", + ".tsu.org.tw", + "tsunagarumon.com", + ".tsctv.net", + "||tt1069.com", + ".tttan.com", + "||tttan.com", + "bb.ttv.com.tw/bb", + "tu8964.com", + ".tubaholic.com", + ".tube.com", + "tube8.com", + "||tube8.com", + ".tube911.com", + "||tube911.com", + ".tubecup.com", + ".tubegals.com", + ".tubeislam.com", + "|http://tubeislam.com", + ".tubestack.com", + "||tubewolf.com", + ".tuibeitu.net", + "tuidang.net", + ".tuidang.org", + "||tuidang.org", + ".tuidang.se", + "bbs.tuitui.info", + ".tumutanzi.com", + "|http://tumutanzi.com", + "||tumview.com", + ".tunein.com", + "|http://tunein.com", + "||tunnelbear.com", + ".tunnelr.com", + "||tunnelr.com", + ".tuo8.blue", + "||tuo8.blue", + ".tuo8.cc", + ".tuo8.club", + "||tuo8.club", + ".tuo8.fit", + ".tuo8.hk", + ".tuo8.in", + ".tuo8.ninja", + ".tuo8.org", + "||tuo8.fit", + "||tuo8.org", + ".tuo8.pw", + "|http://tuo8.pw", + "||tuo8.red", + ".tuo8.space", + "tuitwit.com", + ".turansam.org", + ".turbobit.net", + "|http://turbobit.net", + ".turbohide.com", + "||turbohide.com", + ".tushycash.com", + "|http://tushycash.com", + "||app.tutanota.com", + ".tuvpn.com", + "||tuvpn.com", + "|http://tuzaijidi.com", + "|http://*.tuzaijidi.com", + ".tw01.org", + "|http://tw01.org", + ".tumblr.com", + "||tumblr.com", + "||lecloud.net", + "|http://cosmic.monar.ch", + "||slutmoonbeam.com", + "|http://blog.soylent.com", + ".tv.com", + "|http://tv.com", + "tvants.com", + "forum.tvb.com", + "news.tvb.com/list/world", + "news.tvb.com/local", + "news.tvbs.com.tw", + ".tvboxnow.com", + "|http://tvboxnow.com/", + "tvider.com", + ".tvmost.com.hk", + ".tvplayvideos.com", + "||tvunetworks.com", + ".tw-blog.com", + "|https://tw-blog.com", + ".tw-npo.org", + ".twaitter.com", + "twapperkeeper.com", + "||twapperkeeper.com", + "||twaud.io", + ".twaud.io", + ".twavi.com", + ".twbbs.net.tw", + "twbbs.org", + "twbbs.tw", + "||twblogger.com", + "tweepmag.com", + ".tweepml.org", + "||tweepml.org", + ".tweetbackup.com", + "||tweetbackup.com", + "tweetboard.com", + "||tweetboard.com", + ".tweetboner.biz", + "||tweetboner.biz", + ".tweetcs.com", + "|http://tweetcs.com", + "|http://deck.ly", + "||mtw.tl", + "||tweetedtimes.com", + "||tweetmylast.fm", + "tweetphoto.com", + "||tweetphoto.com", + "||tweetrans.com", + "tweetree.com", + "||tweetree.com", + ".tweettunnel.com", + "||tweettunnel.com", + "||tweetwally.com", + "tweetymail.com", + "||twelve.today", + ".tweez.net", + "|http://tweez.net", + "||twftp.org", + "||twgreatdaily.com", + "twibase.com", + ".twibble.de", + "||twibble.de", + "twibbon.com", + "||twibs.com", + ".twicountry.org", + "|http://twicountry.org", + "twicsy.com", + ".twiends.com", + "|http://twiends.com", + ".twifan.com", + "|http://twifan.com", + "twiffo.com", + "||twiffo.com", + ".twilightsex.com", + "twilog.org", + "twimbow.com", + "||twindexx.com", + "twipple.jp", + "||twipple.jp", + "||twip.me", + "twishort.com", + "||twishort.com", + "twistar.cc", + "||twister.net.co", + "||twisterio.com", + "twisternow.com", + "twistory.net", + "twitbrowser.net", + "||twitcause.com", + "||twitgether.com", + "||twiggit.org", + "twitgoo.com", + "twitiq.com", + "||twitiq.com", + ".twitlonger.com", + "||twitlonger.com", + "|http://tl.gd/", + "twitmania.com", + "twitoaster.com", + "||twitoaster.com", + "||twitonmsn.com", + ".twit2d.com", + "||twit2d.com", + ".twitstat.com", + "||twitstat.com", + "||firstfivefollowers.com", + "||retweeteffect.com", + "||tweeplike.me", + "||tweepguide.com", + "||turbotwitter.com", + ".twitvid.com", + "||twitvid.com", + "|http://twt.tl", + "twittbot.net", + "||ads-twitter.com", + "||twttr.com", + "||twitter4j.org", + ".twittercounter.com", + "||twittercounter.com", + "twitterfeed.com", + ".twittergadget.com", + "||twittergadget.com", + ".twitterkr.com", + "||twitterkr.com", + "||twittermail.com", + "||twitterrific.com", + "twittertim.es", + "||twittertim.es", + "twitthat.com", + "||twitturk.com", + ".twitturly.com", + "||twitturly.com", + ".twitzap.com", + "twiyia.com", + "||twstar.net", + ".twtkr.com", + "|http://twtkr.com", + ".twnorth.org.tw", + "twskype.com", + "twtrland.com", + "twurl.nl", + ".twyac.org", + "||twyac.org", + ".txxx.com", + ".tycool.com", + "||tycool.com", + "||typepad.com", + "@@||www.typepad.com", + "@@||static.typepad.com", + "||blog.expofutures.com", + "||legaltech.law.com", + "||blogs.tampabay.com", + "||contests.twilio.com", + ".embr.in", + "||embr.in", + ".u9un.com", + "||u9un.com", + ".ubddns.org", + "|http://ubddns.org", + "||uberproxy.net", + ".uc-japan.org", + "||uc-japan.org", + ".srcf.ucam.org/salon/", + "|http://china.ucanews.com/", + "||ucdc1998.org", + "|http://hum*.uchicago.edu/faculty/ywang/history", + "||uderzo.it", + ".udn.com", + "||udn.com", + "||udn.com.tw", + "udnbkk.com/bbs", + "||uforadio.com.tw", + "ufreevpn.com", + ".ugo.com", + "||uhdwallpapers.org", + "||uhrp.org", + ".uighur.nl", + "||uighur.nl", + "uighurbiz.net", + ".ulike.net", + "ukcdp.co.uk", + "ukliferadio.co.uk", + "||ukliferadio.co.uk", + "ultravpn.fr", + "||ultravpn.fr", + "ultraxs.com", + "umich.edu/~falun", + "||unblock.cn.com", + ".unblocker.yt", + "unblock-us.com", + "||unblock-us.com", + ".unblockdmm.com", + "|http://unblockdmm.com", + "||unblocksit.es", + "uncyclomedia.org", + ".uncyclopedia.hk/wiki", + "|http://uncyclopedia.hk", + "|http://uncyclopedia.tw", + "underwoodammo.com", + "||underwoodammo.com", + "||unholyknight.com", + ".uni.cc", + "||cldr.unicode.org", + ".unification.net", + ".unification.org.tw", + "||unirule.cloud", + ".unitedsocialpress.com", + ".unix100.com", + "||unknownspace.org", + ".unodedos.com", + "unpo.org", + ".untraceable.us", + "|http://untraceable.us", + "||uocn.org", + "tor.updatestar.com", + ".upholdjustice.org", + ".upload4u.info", + "uploaded.net/file", + "|http://uploaded.net/file", + "|http://uploaded.to/file", + ".uploadstation.com/file", + ".upmedia.mg", + "||upmedia.mg", + ".upornia.com", + "|http://upornia.com", + "||uproxy.org", + "|http://tor.cn.uptodown.com/", + ".upwill.org", + "ur7s.com", + "||urbansurvival.com", + "myshare.url.com.tw/", + "||urlborg.com", + "||urlparser.com", + "us.to", + "||usacn.com", + ".usaip.eu", + "||usaip.eu", + "dalailama.usc.edu", + "iipdigital.usembassy.gov", + "||usfk.mil", + "||usma.edu", + "||usmc.mil", + ".usocctn.com", + "|http://tarr.uspto.gov/", + "||tsdr.uspto.gov", + ".ustream.tv", + "||ustream.tv", + ".usunitednews.com", + "|http://usunitednews.com", + "usus.cc", + ".utopianpal.com", + "||utopianpal.com", + ".uu-gg.com", + ".uvwxyz.xyz", + "||uvwxyz.xyz", + ".uwants.com", + ".uwants.net", + "uyghur.co.uk", + "|http://uyghur-j.org", + "||uyghuramerican.org", + ".uyghurcanadiansociety.org", + ".uyghurensemble.co.uk", + "||uyghurcongress.org", + ".uyghurpen.org", + ".uyghurpress.com", + "|https://uyghurpress.com", + ".uyghurstudies.org", + "|http://uyghurstudies.org", + "uygur.org", + "|http://uymaarip.com/", + ".v2ray.com", + "||v2ray.com", + ".van001.com", + ".van698.com", + ".vanemu.cn", + ".vanilla-jp.com", + ".vanpeople.com", + "vansky.com", + "||vaticannews.va", + "||vcf-online.org", + "||vcfbuilder.org", + ".vegasred.com", + ".velkaepocha.sk", + ".venbbs.com", + ".venchina.com", + ".venetianmacao.com", + "||venetianmacao.com", + "veoh.com", + "mysite.verizon.net", + "vermonttibet.org", + ".versavpn.com", + "||versavpn.com", + "||verybs.com", + ".vft.com.tw", + ".viber.com", + "||viber.com", + ".vica.info", + ".victimsofcommunism.org", + "|http://victimsofcommunism.org", + "||vid.me", + "||vidble.com", + "videobam.com", + "||videobam.com", + ".videodetective.com", + ".videomega.tv", + "||videomega.tv", + ".videomo.com", + "videopediaworld.com", + ".videopress.com", + ".vidinfo.org/video", + "vietdaikynguyen.com", + ".vijayatemple.org", + "vimeo.com", + "||vimeo.com", + "||vimperator.org", + "||vincnd.com", + "||vinniev.com", + "|http://www.lib.virginia.edu/area-studies/Tibet/tibet.html", + ".virtualrealporn.com", + "||virtualrealporn.com", + "visibletweets.com", + "|http://ny.visiontimes.com", + ".vital247.org", + "||viu.com", + ".vivahentai4u.net", + ".vivatube.com", + ".vivthomas.com", + "||vivthomas.com", + ".vjav.com", + "||vjav.com", + ".vjmedia.com.hk", + ".vllcs.org", + "|http://vllcs.org", + "||vmixcore.com", + "||vnet.link", + "cn.voa.mobi", + "tw.voa.mobi", + ".voachineseblog.com", + "||voachineseblog.com", + "voagd.com", + ".voacantonese.com", + "||voacantonese.com", + "voachinese.com", + "||voachinese.com", + ".voanews.com", + "||voanews.com", + "voatibetan.com", + "||voatibetan.com", + ".voatibetanenglish.com", + "||voatibetanenglish.com", + ".vocativ.com", + "vocn.tv", + ".vot.org", + "||vot.org", + ".vovo2000.com", + "|http://vovo2000.com", + ".voxer.com", + "||voxer.com", + ".voy.com", + "||vpn.ac", + ".vpn4all.com", + "||vpn4all.com", + ".vpnaccount.org", + "|http://vpnaccount.org", + ".vpnaccounts.com", + "||vpnaccounts.com", + ".vpncomparison.org", + ".vpncup.com", + "||vpncup.com", + "vpnbook.com", + ".vpncoupons.com", + "|http://vpncoupons.com", + ".vpndada.com", + "||vpndada.com", + ".vpnfan.com", + "vpnfire.com", + ".vpnfires.biz", + ".vpnforgame.net", + "||vpnforgame.net", + "||vpngate.jp", + ".vpngate.net", + "||vpngate.net", + ".vpngratis.net", + "vpnhq.com", + ".vpnmaster.com", + "||vpnmaster.com", + ".vpnmentor.com", + "||vpnmentor.com", + ".vpninja.net", + "||vpninja.net", + ".vpnintouch.com", + "||vpnintouch.net", + "vpnjack.com", + "||vpnjack.com", + ".vpnpick.com", + "||vpnpick.com", + "||vpnpop.com", + "||vpnpronet.com", + ".vpnreactor.com", + "||vpnreactor.com", + "||vpnreviewz.com", + ".vpnsecure.me", + "||vpnsecure.me", + ".vpnshazam.com", + "||vpnshazam.com", + ".vpnshieldapp.com", + "||vpnshieldapp.com", + ".vpnsp.com", + ".vpntraffic.com", + ".vpntunnel.com", + "||vpntunnel.com", + ".vpnuk.info", + "||vpnuk.info", + "||vpnunlimitedapp.com", + ".vpnvip.com", + "||vpnvip.com", + ".vpnworldwide.com", + ".vporn.com", + "||vporn.com", + ".vpser.net", + "@@||vpser.net", + "vraiesagesse.net", + ".vrmtr.com", + "||vtunnel.com", + "||vuku.cc", + "lists.w3.org/archives/public", + "||w3schools.com", + "||waffle1999.com", + ".wahas.com", + ".waigaobu.com", + "waikeung.org/php_wind", + ".wailaike.net", + ".waiwaier.com", + "|http://waiwaier.com", + "||wallmama.com", + "wallornot.org", + "||wallpapercasa.com", + ".wallproxy.com", + "@@||wallproxy.com.cn", + "||waltermartin.com", + "||waltermartin.org", + "||www.wan-press.org", + "||wanderinghorse.net", + "||wangafu.net", + "||wangjinbo.org", + ".wangjinbo.org", + "wanglixiong.com", + ".wango.org", + "||wango.org", + "wangruoshui.net", + "www.wangruowang.org", + "want-daily.com", + "wapedia.mobi/zhsimp", + "||waselpro.com", + ".watchinese.com", + ".wattpad.com", + "||wattpad.com", + ".makzhou.warehouse333.com", + "washeng.net", + ".watch8x.com", + "||watchmygf.net", + "||wav.tv", + ".wdf5.com", + ".wearehairy.com", + ".wearn.com", + "||wearn.com", + "|http://hkcoc.weather.com.hk", + "||hudatoriq.web.id", + "||web2project.net", + "webbang.net", + ".webevader.org", + ".webfreer.com", + "weblagu.com", + ".webjb.org", + ".webrush.net", + "webs-tv.net", + ".websitepulse.com/help/testtools.china-test", + "|http://www.websnapr.com", + ".webwarper.net", + "|http://webwarper.net", + "webworkerdaily.com", + ".weekmag.info", + "||wefightcensorship.org", + ".wefong.com", + "weiboleak.com", + ".weihuo.org", + "weijingsheng.org", + ".weiming.info", + "||weiming.info", + "weiquanwang.org", + "|http://weisuo.ws", + ".welovecock.com", + ".wemigrate.org", + "|http://wemigrate.org", + "wengewang.com", + "||wengewang.org", + ".wenhui.ch", + "|http://trans.wenweipo.com/gb/", + ".wenxuecity.com", + "||wenxuecity.com", + ".wenyunchao.com", + "||wenyunchao.com", + ".westca.com", + "||westca.com", + "||westernwolves.com", + ".westkit.net", + "||westpoint.edu", + ".westernshugdensociety.org", + "wetpussygames.com", + ".wetplace.com", + "wexiaobo.org", + "||wexiaobo.org", + "wezhiyong.org", + "||wezone.net", + ".wforum.com", + "||wforum.com/", + ".whatblocked.com", + "||whatblocked.com", + ".wheatseeds.org", + "||wheelockslatin.com", + ".whippedass.com", + ".whoer.net", + "||whoer.net", + "whotalking.com", + "whylover.com", + "||whyx.org", + "|http://zh.ecdm.wikia.com", + "|http://evchk.wikia.com", + "fq.wikia.com", + "zh.pttpedia.wikia.com/wiki/%E7%BF%92%E5%8C%85%E5%AD%90%E4%B9%8B%E4%BA%82", + "cn.uncyclopedia.wikia.com", + "zh.uncyclopedia.wikia.com", + "||wikileaks.ch", + "||wikileaks.com", + "||wikileaks.de", + "||wikileaks.eu", + "||wikileaks.lu", + ".wikileaks.org", + "||wikileaks.org", + "||wikileaks.pl", + ".wikileaks-forum.com", + "wildammo.com", + ".williamhill.com", + "||collateralmurder.com", + "||collateralmurder.org", + "wikilivres.info/wiki/%E9%9B%B6%E5%85%AB%E5%AE%AA%E7%AB%A0", + "||wikimapia.org", + "|http://zh.wikisource.org", + "||zh.wikinews.org", + "||ja.wikipedia.org", + "||wikipedia.org", + "||wikiwiki.jp", + "||casino.williamhill.com", + "||sports.williamhill.com", + "||vegas.williamhill.com", + "||willw.net", + "||windowsphoneme.com", + ".windscribe.com", + "||windscribe.com", + "||community.windy.com", + "||wingy.site", + "winning11.com", + "winwhispers.info", + "||wiredbytes.com", + "||wiredpen.com", + ".wisdompubs.org", + ".wisevid.com", + "||wisevid.com", + ".witnessleeteaching.com", + ".witopia.net", + ".wjbk.org", + "||wjbk.org", + "|http://wn.com", + ".wnacg.com", + ".wnacg.org", + ".wo.tc", + "||woeser.com", + "|http://woesermiddle-way.net/", + ".wokar.org", + "|http://wokar.org", + "wolfax.com", + "||wolfax.com", + "||woolyss.com", + "woopie.jp", + "||woopie.jp", + "woopie.tv", + "||woopie.tv", + "||workatruna.com", + ".workerdemo.org.hk", + ".workerempowerment.org", + "||workersthebig.net", + ".worldcat.org", + "worldjournal.com", + ".worldvpn.net", + "||worldvpn.net", + "||videopress.com", + ".wordpress.com", + "|http://*.wordpress.com", + "||chenshan20042005.wordpress.com", + "||chinaview.wordpress.com", + "||cnbbnews.wordpress.com", + "||freedominfonetweb.wordpress.com", + "||hka8964.wordpress.com", + "||hkanews.wordpress.com", + "||hqsbnet.wordpress.com", + "||hqsbonline.wordpress.com", + "||investigating.wordpress.com", + "||jobnewera.wordpress.com", + "||minghuiyw.wordpress.com", + "||wo3ttt.wordpress.com", + "||sujiatun.wordpress.com", + "||xijie.wordpress.com", + "||wp.com", + ".wow.com", + ".wow-life.net", + "||wowlegacy.ml", + "||wowporn.com", + "||wowgirls.com", + ".wowrk.com", + "woxinghuiguo.com", + ".woyaolian.org", + "|http://woyaolian.org", + ".wpoforum.com", + "||wpoforum.com", + ".wqyd.org", + "||wqyd.org", + "wrchina.org", + "wretch.cc", + ".wsj.com", + "||wsj.com", + ".wsj.net", + "||wsj.net", + ".wsjhk.com", + ".wtbn.org", + ".wtfpeople.com", + "wuerkaixi.com", + "||wufafangwen.com", + "wufi.org.tw", + "||wuguoguang.com", + "wujie.net", + "wujieliulan.com", + "||wujieliulan.com", + "wukangrui.net", + "||wuw.red", + "||wuyanblog.com", + ".wwitv.com", + "||wwitv.com", + "wzyboy.im/post/160", + ".x-berry.com", + "||x-berry.com", + "||x-art.com", + "||x-wall.org", + "x1949x.com", + "x365x.com", + "xanga.com", + "||xbabe.com", + ".xbookcn.com", + "||xbookcn.com", + "||xcafe.in", + "||xcity.jp", + ".xcritic.com", + "|http://cdn*.xda-developers.com", + ".xerotica.com", + "destiny.xfiles.to/ubbthreads", + ".xfm.pp.ru", + ".xgmyd.com", + "||xgmyd.com", + "xhamster.com", + "||xhamster.com", + ".xianba.net", + ".xianchawang.net", + ".xianjian.tw", + "|http://xianjian.tw", + ".xianqiao.net", + ".xiaobaiwu.com", + ".xiaochuncnjp.com", + ".xiaod.in", + ".xiaohexie.com", + "||xiaolan.me", + "||xiaoma.org", + "||xiaohexie.com", + "xiezhua.com", + ".xihua.es", + "forum.xinbao.de/forum", + ".xing.com", + "|http://xing.com", + ".xinmiao.com.hk", + "||xinmiao.com.hk", + "xinsheng.net", + "xinshijue.com", + "xinhuanet.org", + "|http://xinyubbs.net", + ".xiongpian.com", + ".xiuren.org", + "xizang-zhiye.org", + "xjp.cc", + "||xjp.cc", + "||xjtravelguide.com", + "xlfmtalk.com", + "||xlfmwz.info", + "||xml-training-guide.com", + "xmovies.com", + "||xnxx.com", + "xpdo.net", + "||xpud.org", + ".xrentdvd.com", + ".xskywalker.net", + "||xtube.com", + "blog.xuite.net", + "vlog.xuite.net", + "xuzhiyong.net", + "||xuchao.org", + "xuchao.net", + "||xuchao.net", + "xvideo.cc", + ".xvideos.com", + "||xvideos.com", + "||xvideos.es", + ".xkiwi.tk/", + ".xxbbx.com", + ".xxlmovies.com", + "||xxx.com", + ".xxx.xxx", + "|http://xxx.xxx", + ".xxxfuckmom.com", + "||xxxx.com.au", + ".xxxymovies.com", + "|http://xxxymovies.com", + "xys.org", + "xysblogs.org", + "xyy69.com", + "xyy69.info", + "||yakbutterblues.com", + "||yam.com", + "||yam.org.tw", + ".yanghengjun.com", + "yangjianli.com", + ".yasni.co.uk", + "||yasni.co.uk", + ".yayabay.com/forum", + ".ydy.com", + ".yeahteentube.com", + "||yeahteentube.com", + "||yecl.net", + "||yeelou.com", + "yeeyi.com", + "yegle.net", + "||yegle.net", + ".yes.xxx", + "||yes123.com.tw", + "||yesasia.com", + "||yesasia.com.hk", + ".yes-news.com", + "|http://yes-news.com", + ".yespornplease.com", + "||yespornplease.com", + "|http://yeyeclub.com", + "||yhcw.net", + ".yibada.com", + ".yibaochina.com", + ".yidio.com", + "||yidio.com", + "yilubbs.com", + "xa.yimg.com", + ".yingsuoss.com", + ".yipub.com", + "||yipub.com", + "yinlei.org/mt", + ".yizhihongxing.com", + ".yobt.com", + ".yobt.tv", + "||yobt.tv", + ".yogichen.org", + "||yogichen.org", + ".yolasite.com", + ".yomiuri.co.jp", + "yong.hu", + ".yorkbbs.ca", + "||youxu.info", + ".youjizz.com", + "||youjizz.com", + ".youmaker.com", + "||youmaker.com", + ".youngpornvideos.com", + "youngspiration.hk", + ".youpai.org", + "||youpai.org", + ".your-freedom.net", + "||yourepeat.com", + ".yourprivatevpn.com", + "||yourprivatevpn.com", + ".yousendit.com", + "||yousendit.com", + ".youthnetradio.org/tmit/forum", + "blog.youthwant.com.tw", + "me.youthwant.com.tw", + "share.youthwant.com.tw", + "topic.youthwant.com.tw", + ".youporn.com", + "||youporn.com", + ".youporngay.com", + "||youporngay.com", + ".yourlisten.com", + "|http://yourlisten.com", + ".yourlust.com", + "|http://yourlust.com", + "youshun12.com", + ".youtubecn.com", + "youversion.com", + "||youversion.com", + "blog.youxu.info/2010/03/14/west-chamber", + "ytht.net", + "yuanming.net", + ".yuanzhengtang.org", + ".yulghun.com", + "||yunchao.net", + "||yuntipub.com", + ".yuvutu.com", + "||yvesgeleyn.com", + ".ywpw.com/forums/history/post/A0/p0/html/227", + "yx51.net", + ".yyii.org", + "||yyii.org", + ".yzzk.com", + "|http://yzzk.com", + "zacebook.com", + ".zalmos.com", + "||zalmos.com", + "||zannel.com", + ".zaobao.com", + "||zaobao.com", + "|http://zaobao.com.sg", + "||zaobao.com.sg", + ".zaozon.com", + "||zdnet.com.tw", + ".zello.com", + "||zello.com", + ".zengjinyan.org", + ".zenmate.com", + "||zenmate.com", + "||zenmate.com.ru", + "||zeronet.io", + "||zeutch.com", + ".zfreet.com", + ".zgsddh.com", + "zgzcjj.net", + ".zhanbin.net", + "||zhanbin.net", + ".zhangboli.net", + "||zhangtianliang.com", + "||zhanlve.org", + "zhenghui.org", + ".zhengjian.org", + "||zhengjian.org", + "zhengwunet.org", + "zhenlibu.info", + "||zhenlibu.info", + ".zhenlibu1984.com", + "||zhenlibu1984.com", + "|http://zhenxiang.biz", + ".zhinengluyou.com", + "zhongguo.ca", + "|http://zhongguorenquan.org", + "zhongguotese.net", + "||zhongguotese.net", + "||zhongmeng.org", + ".zhoushuguang.com", + "||zhreader.com", + ".zhuangbi.me", + "||zhuangbi.me", + ".zhuanxing.cn", + "||zhuatieba.com", + "zhuichaguoji.org", + "||zhuichaguoji.org", + "|http://book.zi5.me", + ".ziddu.com/download", + "||zillionk.com", + ".zinio.com", + "||zinio.com", + ".ziporn.com", + ".zippyshare.com", + ".zkaip.com", + "||zkaip.com", + "realforum.zkiz.com", + "||zmw.cn", + ".zodgame.us", + "zomobo.net", + ".zonaeuropa.com", + "||zonaeuropa.com", + "||zonghexinwen.com", + ".zonghexinwen.net", + "||zoogvpn.com", + "||zootool.com", + ".zoozle.net", + "writer.zoho.com", + "||zorrovpn.com", + "||zpn.im", + "||zspeeder.me", + ".zsrhao.com", + ".zuo.la", + "||zuo.la", + "||zuobiao.me", + ".zuola.com", + "||zuola.com", + "||zvereff.com", + ".zynaima.com", + "zyzc9.com", + ".zzcartoon.com", + "64memo", + "aHR0cHM6Ly95ZWNsLm5ldA", + "freenet", + ".google.*/falun", + "phobos.apple.com*/video", + "q=freedom", + "q%3Dfreedom", + "remembering_tiananmen_20_years", + "search*safeweb", + "q=triangle", + "q%3DTriangle", + "ultrareach", + "ultrasurf", + "@@||aliyun.com", + "@@||baidu.com", + "@@||chinaso.com", + "@@||chinaz.com", + "@@|http://nrch.culture.tw/", + "@@||adservice.google.com", + "@@||dl.google.com", + "@@||kh.google.com", + "@@||khm.google.com", + "@@||khm0.google.com", + "@@||khm1.google.com", + "@@||khm2.google.com", + "@@||khm3.google.com", + "@@||khmdb.google.com", + "@@||tools.google.com", + "@@||clientservices.googleapis.com", + "@@||fonts.googleapis.com", + "@@||khm.googleapis.com", + "@@||khm0.googleapis.com", + "@@||khm1.googleapis.com", + "@@||khm2.googleapis.com", + "@@||khm3.googleapis.com", + "@@||khmdb.googleapis.com", + "@@||storage.googleapis.com", + "@@||translate.googleapis.com", + "@@||update.googleapis.com", + "@@||safebrowsing.googleapis.com", + "@@||cn.gravatar.com", + "@@||connectivitycheck.gstatic.com", + "@@||csi.gstatic.com", + "@@||fonts.gstatic.com", + "@@||ssl.gstatic.com", + "@@||haosou.com", + "@@||ip.cn", + "@@||jike.com", + "@@|http://translate.google.cn", + "@@|http://www.google.cn/maps", + "@@||http2.golang.org", + "@@||gov.cn", + "@@||qq.com", + "@@||sina.cn", + "@@||sina.com.cn", + "@@||sogou.com", + "@@||so.com", + "@@||soso.com", + "@@||uluai.com.cn", + "@@||weibo.com", + "@@||yahoo.cn", + "@@||youdao.com", + "@@||zhongsou.com", + "@@|http://ime.baidu.jp" +]; + +/* +* This file is part of Adblock Plus , +* Copyright (C) 2006-2014 Eyeo GmbH +* +* Adblock Plus is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 3 as +* published by the Free Software Foundation. +* +* Adblock Plus is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with Adblock Plus. If not, see . +*/ + +function createDict() +{ + var result = {}; + result.__proto__ = null; + return result; +} + +function getOwnPropertyDescriptor(obj, key) +{ + if (obj.hasOwnProperty(key)) + { + return obj[key]; + } + return null; +} + +function extend(subclass, superclass, definition) +{ + if (Object.__proto__) + { + definition.__proto__ = superclass.prototype; + subclass.prototype = definition; + } + else + { + var tmpclass = function(){}, ret; + tmpclass.prototype = superclass.prototype; + subclass.prototype = new tmpclass(); + subclass.prototype.constructor = superclass; + for (var i in definition) + { + if (definition.hasOwnProperty(i)) + { + subclass.prototype[i] = definition[i]; + } + } + } +} + +function Filter(text) +{ + this.text = text; + this.subscriptions = []; +} +Filter.prototype = { + text: null, + subscriptions: null, + toString: function() + { + return this.text; + } +}; +Filter.knownFilters = createDict(); +Filter.elemhideRegExp = /^([^\/\*\|\@"!]*?)#(\@)?(?:([\w\-]+|\*)((?:\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\))*)|#([^{}]+))$/; +Filter.regexpRegExp = /^(@@)?\/.*\/(?:\$~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)?$/; +Filter.optionsRegExp = /\$(~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)$/; +Filter.fromText = function(text) +{ + if (text in Filter.knownFilters) + { + return Filter.knownFilters[text]; + } + var ret; + if (text.charAt(0) == "!") + { + ret = new CommentFilter(text); + } + else + { + ret = RegExpFilter.fromText(text); + } + Filter.knownFilters[ret.text] = ret; + return ret; +}; + +function InvalidFilter(text, reason) +{ + Filter.call(this, text); + this.reason = reason; +} +extend(InvalidFilter, Filter, { + reason: null +}); + +function CommentFilter(text) +{ + Filter.call(this, text); +} +extend(CommentFilter, Filter, { +}); + +function ActiveFilter(text, domains) +{ + Filter.call(this, text); + this.domainSource = domains; +} +extend(ActiveFilter, Filter, { + domainSource: null, + domainSeparator: null, + ignoreTrailingDot: true, + domainSourceIsUpperCase: false, + getDomains: function() + { + var prop = getOwnPropertyDescriptor(this, "domains"); + if (prop) + { + return prop; + } + var domains = null; + if (this.domainSource) + { + var source = this.domainSource; + if (!this.domainSourceIsUpperCase) + { + source = source.toUpperCase(); + } + var list = source.split(this.domainSeparator); + if (list.length == 1 && (list[0]).charAt(0) != "~") + { + domains = createDict(); + domains[""] = false; + if (this.ignoreTrailingDot) + { + list[0] = list[0].replace(/\.+$/, ""); + } + domains[list[0]] = true; + } + else + { + var hasIncludes = false; + for (var i = 0; i < list.length; i++) + { + var domain = list[i]; + if (this.ignoreTrailingDot) + { + domain = domain.replace(/\.+$/, ""); + } + if (domain == "") + { + continue; + } + var include; + if (domain.charAt(0) == "~") + { + include = false; + domain = domain.substr(1); + } + else + { + include = true; + hasIncludes = true; + } + if (!domains) + { + domains = createDict(); + } + domains[domain] = include; + } + domains[""] = !hasIncludes; + } + this.domainSource = null; + } + return this.domains; + }, + sitekeys: null, + isActiveOnDomain: function(docDomain, sitekey) + { + if (this.getSitekeys() && (!sitekey || this.getSitekeys().indexOf(sitekey.toUpperCase()) < 0)) + { + return false; + } + if (!this.getDomains()) + { + return true; + } + if (!docDomain) + { + return this.getDomains()[""]; + } + if (this.ignoreTrailingDot) + { + docDomain = docDomain.replace(/\.+$/, ""); + } + docDomain = docDomain.toUpperCase(); + while (true) + { + if (docDomain in this.getDomains()) + { + return this.domains[docDomain]; + } + var nextDot = docDomain.indexOf("."); + if (nextDot < 0) + { + break; + } + docDomain = docDomain.substr(nextDot + 1); + } + return this.domains[""]; + }, + isActiveOnlyOnDomain: function(docDomain) + { + if (!docDomain || !this.getDomains() || this.getDomains()[""]) + { + return false; + } + if (this.ignoreTrailingDot) + { + docDomain = docDomain.replace(/\.+$/, ""); + } + docDomain = docDomain.toUpperCase(); + for (var domain in this.getDomains()) + { + if (this.domains[domain] && domain != docDomain && (domain.length <= docDomain.length || domain.indexOf("." + docDomain) != domain.length - docDomain.length - 1)) + { + return false; + } + } + return true; + } +}); + +function RegExpFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys) +{ + ActiveFilter.call(this, text, domains, sitekeys); + if (contentType != null) + { + this.contentType = contentType; + } + if (matchCase) + { + this.matchCase = matchCase; + } + if (thirdParty != null) + { + this.thirdParty = thirdParty; + } + if (sitekeys != null) + { + this.sitekeySource = sitekeys; + } + if (regexpSource.length >= 2 && regexpSource.charAt(0) == "/" && regexpSource.charAt(regexpSource.length - 1) == "/") + { + var regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), this.matchCase ? "" : "i"); + this.regexp = regexp; + } + else + { + this.regexpSource = regexpSource; + } +} +extend(RegExpFilter, ActiveFilter, { + domainSourceIsUpperCase: true, + length: 1, + domainSeparator: "|", + regexpSource: null, + getRegexp: function() + { + var prop = getOwnPropertyDescriptor(this, "regexp"); + if (prop) + { + return prop; + } + var source = this.regexpSource.replace(/\*+/g, "*").replace(/\^\|$/, "^").replace(/\W/g, "\\$&").replace(/\\\*/g, ".*").replace(/\\\^/g, "(?:[\\x00-\\x24\\x26-\\x2C\\x2F\\x3A-\\x40\\x5B-\\x5E\\x60\\x7B-\\x7F]|$)").replace(/^\\\|\\\|/, "^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?").replace(/^\\\|/, "^").replace(/\\\|$/, "$").replace(/^(\.\*)/, "").replace(/(\.\*)$/, ""); + var regexp = new RegExp(source, this.matchCase ? "" : "i"); + this.regexp = regexp; + return regexp; + }, + contentType: 2147483647, + matchCase: false, + thirdParty: null, + sitekeySource: null, + getSitekeys: function() + { + var prop = getOwnPropertyDescriptor(this, "sitekeys"); + if (prop) + { + return prop; + } + var sitekeys = null; + if (this.sitekeySource) + { + sitekeys = this.sitekeySource.split("|"); + this.sitekeySource = null; + } + this.sitekeys = sitekeys; + return this.sitekeys; + }, + matches: function(location, contentType, docDomain, thirdParty, sitekey) + { + if (this.getRegexp().test(location) && this.isActiveOnDomain(docDomain, sitekey)) + { + return true; + } + return false; + } +}); +RegExpFilter.prototype["0"] = "#this"; +RegExpFilter.fromText = function(text) +{ + var blocking = true; + var origText = text; + if (text.indexOf("@@") == 0) + { + blocking = false; + text = text.substr(2); + } + var contentType = null; + var matchCase = null; + var domains = null; + var sitekeys = null; + var thirdParty = null; + var collapse = null; + var options; + var match = text.indexOf("$") >= 0 ? Filter.optionsRegExp.exec(text) : null; + if (match) + { + options = match[1].toUpperCase().split(","); + text = match.input.substr(0, match.index); + for (var _loopIndex6 = 0; _loopIndex6 < options.length; ++_loopIndex6) + { + var option = options[_loopIndex6]; + var value = null; + var separatorIndex = option.indexOf("="); + if (separatorIndex >= 0) + { + value = option.substr(separatorIndex + 1); + option = option.substr(0, separatorIndex); + } + option = option.replace(/-/, "_"); + if (option in RegExpFilter.typeMap) + { + if (contentType == null) + { + contentType = 0; + } + contentType |= RegExpFilter.typeMap[option]; + } + else if (option.charAt(0) == "~" && option.substr(1) in RegExpFilter.typeMap) + { + if (contentType == null) + { + contentType = RegExpFilter.prototype.contentType; + } + contentType &= ~RegExpFilter.typeMap[option.substr(1)]; + } + else if (option == "MATCH_CASE") + { + matchCase = true; + } + else if (option == "~MATCH_CASE") + { + matchCase = false; + } + else if (option == "DOMAIN" && typeof value != "undefined") + { + domains = value; + } + else if (option == "THIRD_PARTY") + { + thirdParty = true; + } + else if (option == "~THIRD_PARTY") + { + thirdParty = false; + } + else if (option == "COLLAPSE") + { + collapse = true; + } + else if (option == "~COLLAPSE") + { + collapse = false; + } + else if (option == "SITEKEY" && typeof value != "undefined") + { + sitekeys = value; + } + else + { + return new InvalidFilter(origText, "Unknown option " + option.toLowerCase()); + } + } + } + if (!blocking && (contentType == null || contentType & RegExpFilter.typeMap.DOCUMENT) && (!options || options.indexOf("DOCUMENT") < 0) && !/^\|?[\w\-]+:/.test(text)) + { + if (contentType == null) + { + contentType = RegExpFilter.prototype.contentType; + } + contentType &= ~RegExpFilter.typeMap.DOCUMENT; + } + try + { + if (blocking) + { + return new BlockingFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys, collapse); + } + else + { + return new WhitelistFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys); + } + } + catch (e) + { + return new InvalidFilter(origText, e); + } +}; +RegExpFilter.typeMap = { + OTHER: 1, + SCRIPT: 2, + IMAGE: 4, + STYLESHEET: 8, + OBJECT: 16, + SUBDOCUMENT: 32, + DOCUMENT: 64, + XBL: 1, + PING: 1, + XMLHTTPREQUEST: 2048, + OBJECT_SUBREQUEST: 4096, + DTD: 1, + MEDIA: 16384, + FONT: 32768, + BACKGROUND: 4, + POPUP: 268435456, + ELEMHIDE: 1073741824 +}; +RegExpFilter.prototype.contentType &= ~ (RegExpFilter.typeMap.ELEMHIDE | RegExpFilter.typeMap.POPUP); + +function BlockingFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys, collapse) +{ + RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys); + this.collapse = collapse; +} +extend(BlockingFilter, RegExpFilter, { + collapse: null +}); + +function WhitelistFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys) +{ + RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys); +} +extend(WhitelistFilter, RegExpFilter, { +}); + +function Matcher() +{ + this.clear(); +} +Matcher.prototype = { + filterByKeyword: null, + keywordByFilter: null, + clear: function() + { + this.filterByKeyword = createDict(); + this.keywordByFilter = createDict(); + }, + add: function(filter) + { + if (filter.text in this.keywordByFilter) + { + return; + } + var keyword = this.findKeyword(filter); + var oldEntry = this.filterByKeyword[keyword]; + if (typeof oldEntry == "undefined") + { + this.filterByKeyword[keyword] = filter; + } + else if (oldEntry.length == 1) + { + this.filterByKeyword[keyword] = [oldEntry, filter]; + } + else + { + oldEntry.push(filter); + } + this.keywordByFilter[filter.text] = keyword; + }, + remove: function(filter) + { + if (!(filter.text in this.keywordByFilter)) + { + return; + } + var keyword = this.keywordByFilter[filter.text]; + var list = this.filterByKeyword[keyword]; + if (list.length <= 1) + { + delete this.filterByKeyword[keyword]; + } + else + { + var index = list.indexOf(filter); + if (index >= 0) + { + list.splice(index, 1); + if (list.length == 1) + { + this.filterByKeyword[keyword] = list[0]; + } + } + } + delete this.keywordByFilter[filter.text]; + }, + findKeyword: function(filter) + { + var result = ""; + var text = filter.text; + if (Filter.regexpRegExp.test(text)) + { + return result; + } + var match = Filter.optionsRegExp.exec(text); + if (match) + { + text = match.input.substr(0, match.index); + } + if (text.substr(0, 2) == "@@") + { + text = text.substr(2); + } + var candidates = text.toLowerCase().match(/[^a-z0-9%*][a-z0-9%]{3,}(?=[^a-z0-9%*])/g); + if (!candidates) + { + return result; + } + var hash = this.filterByKeyword; + var resultCount = 16777215; + var resultLength = 0; + for (var i = 0, l = candidates.length; i < l; i++) + { + var candidate = candidates[i].substr(1); + var count = candidate in hash ? hash[candidate].length : 0; + if (count < resultCount || count == resultCount && candidate.length > resultLength) + { + result = candidate; + resultCount = count; + resultLength = candidate.length; + } + } + return result; + }, + hasFilter: function(filter) + { + return filter.text in this.keywordByFilter; + }, + getKeywordForFilter: function(filter) + { + if (filter.text in this.keywordByFilter) + { + return this.keywordByFilter[filter.text]; + } + else + { + return null; + } + }, + _checkEntryMatch: function(keyword, location, contentType, docDomain, thirdParty, sitekey) + { + var list = this.filterByKeyword[keyword]; + for (var i = 0; i < list.length; i++) + { + var filter = list[i]; + if (filter == "#this") + { + filter = list; + } + if (filter.matches(location, contentType, docDomain, thirdParty, sitekey)) + { + return filter; + } + } + return null; + }, + matchesAny: function(location, contentType, docDomain, thirdParty, sitekey) + { + var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); + if (candidates === null) + { + candidates = []; + } + candidates.push(""); + for (var i = 0, l = candidates.length; i < l; i++) + { + var substr = candidates[i]; + if (substr in this.filterByKeyword) + { + var result = this._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); + if (result) + { + return result; + } + } + } + return null; + } +}; + +function CombinedMatcher() +{ + this.blacklist = new Matcher(); + this.whitelist = new Matcher(); + this.resultCache = createDict(); +} +CombinedMatcher.maxCacheEntries = 1000; +CombinedMatcher.prototype = { + blacklist: null, + whitelist: null, + resultCache: null, + cacheEntries: 0, + clear: function() + { + this.blacklist.clear(); + this.whitelist.clear(); + this.resultCache = createDict(); + this.cacheEntries = 0; + }, + add: function(filter) + { + if (filter instanceof WhitelistFilter) + { + this.whitelist.add(filter); + } + else + { + this.blacklist.add(filter); + } + if (this.cacheEntries > 0) + { + this.resultCache = createDict(); + this.cacheEntries = 0; + } + }, + remove: function(filter) + { + if (filter instanceof WhitelistFilter) + { + this.whitelist.remove(filter); + } + else + { + this.blacklist.remove(filter); + } + if (this.cacheEntries > 0) + { + this.resultCache = createDict(); + this.cacheEntries = 0; + } + }, + findKeyword: function(filter) + { + if (filter instanceof WhitelistFilter) + { + return this.whitelist.findKeyword(filter); + } + else + { + return this.blacklist.findKeyword(filter); + } + }, + hasFilter: function(filter) + { + if (filter instanceof WhitelistFilter) + { + return this.whitelist.hasFilter(filter); + } + else + { + return this.blacklist.hasFilter(filter); + } + }, + getKeywordForFilter: function(filter) + { + if (filter instanceof WhitelistFilter) + { + return this.whitelist.getKeywordForFilter(filter); + } + else + { + return this.blacklist.getKeywordForFilter(filter); + } + }, + isSlowFilter: function(filter) + { + var matcher = filter instanceof WhitelistFilter ? this.whitelist : this.blacklist; + if (matcher.hasFilter(filter)) + { + return !matcher.getKeywordForFilter(filter); + } + else + { + return !matcher.findKeyword(filter); + } + }, + matchesAnyInternal: function(location, contentType, docDomain, thirdParty, sitekey) + { + var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g); + if (candidates === null) + { + candidates = []; + } + candidates.push(""); + var blacklistHit = null; + for (var i = 0, l = candidates.length; i < l; i++) + { + var substr = candidates[i]; + if (substr in this.whitelist.filterByKeyword) + { + var result = this.whitelist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); + if (result) + { + return result; + } + } + if (substr in this.blacklist.filterByKeyword && blacklistHit === null) + { + blacklistHit = this.blacklist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey); + } + } + return blacklistHit; + }, + matchesAny: function(location, docDomain) + { + var key = location + " " + docDomain + " "; + if (key in this.resultCache) + { + return this.resultCache[key]; + } + var result = this.matchesAnyInternal(location, 0, docDomain, null, null); + if (this.cacheEntries >= CombinedMatcher.maxCacheEntries) + { + this.resultCache = createDict(); + this.cacheEntries = 0; + } + this.resultCache[key] = result; + this.cacheEntries++; + return result; + } +}; +var defaultMatcher = new CombinedMatcher(); + +var direct = 'DIRECT;'; + +for (var i = 0; i < rules.length; i++) { + defaultMatcher.add(Filter.fromText(rules[i])); +} + +function FindProxyForURL(url, host) { + if (defaultMatcher.matchesAny(url, host) instanceof BlockingFilter) { + return proxy; + } + return direct; +} diff --git a/v2rayN/v2rayN/Resources/pac.txt.gz b/v2rayN/v2rayN/Resources/pac.txt.gz new file mode 100644 index 00000000..4020d6a6 Binary files /dev/null and b/v2rayN/v2rayN/Resources/pac.txt.gz differ diff --git a/v2rayN/v2rayN/Resources/privoxy.exe.gz b/v2rayN/v2rayN/Resources/privoxy.exe.gz new file mode 100644 index 00000000..bf58503c Binary files /dev/null and b/v2rayN/v2rayN/Resources/privoxy.exe.gz differ diff --git a/v2rayN/v2rayN/Resources/privoxy_conf.txt b/v2rayN/v2rayN/Resources/privoxy_conf.txt new file mode 100644 index 00000000..6a265b25 --- /dev/null +++ b/v2rayN/v2rayN/Resources/privoxy_conf.txt @@ -0,0 +1,8 @@ +listen-address __PRIVOXY_BIND_IP__:__PRIVOXY_BIND_PORT__ +toggle 0 +logfile v2ray_privoxy.log +show-on-task-bar 0 +activity-animation 0 +forward-socks5 / 127.0.0.1:__SOCKS_PORT__ . +max-client-connections 2048 +hide-console diff --git a/v2rayN/v2rayN/Resources/promotion.png b/v2rayN/v2rayN/Resources/promotion.png new file mode 100644 index 00000000..e7b6251f Binary files /dev/null and b/v2rayN/v2rayN/Resources/promotion.png differ diff --git a/v2rayN/v2rayN/Resources/restart.png b/v2rayN/v2rayN/Resources/restart.png new file mode 100644 index 00000000..1c0e0ca6 Binary files /dev/null and b/v2rayN/v2rayN/Resources/restart.png differ diff --git a/v2rayN/v2rayN/Resources/server.png b/v2rayN/v2rayN/Resources/server.png new file mode 100644 index 00000000..ee3b6970 Binary files /dev/null and b/v2rayN/v2rayN/Resources/server.png differ diff --git a/v2rayN/v2rayN/Resources/sub.png b/v2rayN/v2rayN/Resources/sub.png new file mode 100644 index 00000000..c60b5b35 Binary files /dev/null and b/v2rayN/v2rayN/Resources/sub.png differ diff --git a/v2rayN/v2rayN/Resources/sysproxy.exe.gz b/v2rayN/v2rayN/Resources/sysproxy.exe.gz new file mode 100644 index 00000000..980d304b Binary files /dev/null and b/v2rayN/v2rayN/Resources/sysproxy.exe.gz differ diff --git a/v2rayN/v2rayN/Resources/sysproxy64.exe.gz b/v2rayN/v2rayN/Resources/sysproxy64.exe.gz new file mode 100644 index 00000000..c5ff36af Binary files /dev/null and b/v2rayN/v2rayN/Resources/sysproxy64.exe.gz differ diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs new file mode 100644 index 00000000..58b42c18 --- /dev/null +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -0,0 +1,748 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace v2rayN.Resx { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class ResUI { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal ResUI() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("v2rayN.Resx.ResUI", typeof(ResUI).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性 + /// 重写当前线程的 CurrentUICulture 属性。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找类似 Batch export subscription to clipboard successfully 的本地化字符串。 + /// + internal static string BatchExportSubscriptionSuccessfully { + get { + return ResourceManager.GetString("BatchExportSubscriptionSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Batch export share URL to clipboard successfully 的本地化字符串。 + /// + internal static string BatchExportURLSuccessfully { + get { + return ResourceManager.GetString("BatchExportURLSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Please check the server settings first 的本地化字符串。 + /// + internal static string CheckServerSettings { + get { + return ResourceManager.GetString("CheckServerSettings", resourceCulture); + } + } + + /// + /// 查找类似 configuration format is incorrect 的本地化字符串。 + /// + internal static string ConfigurationFormatIncorrect { + get { + return ResourceManager.GetString("ConfigurationFormatIncorrect", resourceCulture); + } + } + + /// + /// 查找类似 Note that custom configuration relies entirely on your own configuration and does not work with all settings. The system agent is available when the socks port is equal to the port in the settings in the custom configuration inbound. 的本地化字符串。 + /// + internal static string CustomServerTips { + get { + return ResourceManager.GetString("CustomServerTips", resourceCulture); + } + } + + /// + /// 查找类似 DOWN 的本地化字符串。 + /// + internal static string downloadSpeed { + get { + return ResourceManager.GetString("downloadSpeed", resourceCulture); + } + } + + /// + /// 查找类似 Whether to download? {0} 的本地化字符串。 + /// + internal static string DownloadYesNo { + get { + return ResourceManager.GetString("DownloadYesNo", resourceCulture); + } + } + + /// + /// 查找类似 Failed to convert configuration file 的本地化字符串。 + /// + internal static string FailedConversionConfiguration { + get { + return ResourceManager.GetString("FailedConversionConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Failed to generate default configuration file 的本地化字符串。 + /// + internal static string FailedGenDefaultConfiguration { + get { + return ResourceManager.GetString("FailedGenDefaultConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Failed to get the default configuration 的本地化字符串。 + /// + internal static string FailedGetDefaultConfiguration { + get { + return ResourceManager.GetString("FailedGetDefaultConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Failed to import custom configuration server 的本地化字符串。 + /// + internal static string FailedImportedCustomServer { + get { + return ResourceManager.GetString("FailedImportedCustomServer", resourceCulture); + } + } + + /// + /// 查找类似 Failed to read configuration file 的本地化字符串。 + /// + internal static string FailedReadConfiguration { + get { + return ResourceManager.GetString("FailedReadConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the correct format extra ID 的本地化字符串。 + /// + internal static string FillCorrectAlterId { + get { + return ResourceManager.GetString("FillCorrectAlterId", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the correct format server port 的本地化字符串。 + /// + internal static string FillCorrectServerPort { + get { + return ResourceManager.GetString("FillCorrectServerPort", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the KCP parameters correctly 的本地化字符串。 + /// + internal static string FillKcpParameters { + get { + return ResourceManager.GetString("FillKcpParameters", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the local listening port 的本地化字符串。 + /// + internal static string FillLocalListeningPort { + get { + return ResourceManager.GetString("FillLocalListeningPort", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the password 的本地化字符串。 + /// + internal static string FillPassword { + get { + return ResourceManager.GetString("FillPassword", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the server address 的本地化字符串。 + /// + internal static string FillServerAddress { + get { + return ResourceManager.GetString("FillServerAddress", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the user ID 的本地化字符串。 + /// + internal static string FillUUID { + get { + return ResourceManager.GetString("FillUUID", resourceCulture); + } + } + + /// + /// 查找类似 is not the correct client configuration file, please check 的本地化字符串。 + /// + internal static string IncorrectClientConfiguration { + get { + return ResourceManager.GetString("IncorrectClientConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 is not the correct configuration, please check 的本地化字符串。 + /// + internal static string Incorrectconfiguration { + get { + return ResourceManager.GetString("Incorrectconfiguration", resourceCulture); + } + } + + /// + /// 查找类似 is not the correct server configuration file, please check 的本地化字符串。 + /// + internal static string IncorrectServerConfiguration { + get { + return ResourceManager.GetString("IncorrectServerConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Initial Configuration 的本地化字符串。 + /// + internal static string InitialConfiguration { + get { + return ResourceManager.GetString("InitialConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Address 的本地化字符串。 + /// + internal static string LvAddress { + get { + return ResourceManager.GetString("LvAddress", resourceCulture); + } + } + + /// + /// 查找类似 Alias 的本地化字符串。 + /// + internal static string LvAlias { + get { + return ResourceManager.GetString("LvAlias", resourceCulture); + } + } + + /// + /// 查找类似 Security 的本地化字符串。 + /// + internal static string LvEncryptionMethod { + get { + return ResourceManager.GetString("LvEncryptionMethod", resourceCulture); + } + } + + /// + /// 查找类似 Port 的本地化字符串。 + /// + internal static string LvPort { + get { + return ResourceManager.GetString("LvPort", resourceCulture); + } + } + + /// + /// 查找类似 Type 的本地化字符串。 + /// + internal static string LvServiceType { + get { + return ResourceManager.GetString("LvServiceType", resourceCulture); + } + } + + /// + /// 查找类似 Subs 的本地化字符串。 + /// + internal static string LvSubscription { + get { + return ResourceManager.GetString("LvSubscription", resourceCulture); + } + } + + /// + /// 查找类似 Test Results 的本地化字符串。 + /// + internal static string LvTestResults { + get { + return ResourceManager.GetString("LvTestResults", resourceCulture); + } + } + + /// + /// 查找类似 Today download traffic 的本地化字符串。 + /// + internal static string LvTodayDownloadDataAmount { + get { + return ResourceManager.GetString("LvTodayDownloadDataAmount", resourceCulture); + } + } + + /// + /// 查找类似 Today upload traffic 的本地化字符串。 + /// + internal static string LvTodayUploadDataAmount { + get { + return ResourceManager.GetString("LvTodayUploadDataAmount", resourceCulture); + } + } + + /// + /// 查找类似 Total download traffic 的本地化字符串。 + /// + internal static string LvTotalDownloadDataAmount { + get { + return ResourceManager.GetString("LvTotalDownloadDataAmount", resourceCulture); + } + } + + /// + /// 查找类似 Total upload traffic 的本地化字符串。 + /// + internal static string LvTotalUploadDataAmount { + get { + return ResourceManager.GetString("LvTotalUploadDataAmount", resourceCulture); + } + } + + /// + /// 查找类似 Transport 的本地化字符串。 + /// + internal static string LvTransportProtocol { + get { + return ResourceManager.GetString("LvTransportProtocol", resourceCulture); + } + } + + /// + /// 查找类似 MediumFresh 的本地化字符串。 + /// + internal static string MediumFresh { + get { + return ResourceManager.GetString("MediumFresh", resourceCulture); + } + } + + /// + /// 查找类似 Clear original subscription content 的本地化字符串。 + /// + internal static string MsgClearSubscription { + get { + return ResourceManager.GetString("MsgClearSubscription", resourceCulture); + } + } + + /// + /// 查找类似 Download V2rayCore successfully 的本地化字符串。 + /// + internal static string MsgDownloadV2rayCoreSuccessfully { + get { + return ResourceManager.GetString("MsgDownloadV2rayCoreSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Failed to import subscription content 的本地化字符串。 + /// + internal static string MsgFailedImportSubscription { + get { + return ResourceManager.GetString("MsgFailedImportSubscription", resourceCulture); + } + } + + /// + /// 查找类似 Get the subscription content successfully 的本地化字符串。 + /// + internal static string MsgGetSubscriptionSuccessfully { + get { + return ResourceManager.GetString("MsgGetSubscriptionSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 No valid subscriptions set 的本地化字符串。 + /// + internal static string MsgNoValidSubscription { + get { + return ResourceManager.GetString("MsgNoValidSubscription", resourceCulture); + } + } + + /// + /// 查找类似 PAC update failed 的本地化字符串。 + /// + internal static string MsgPACUpdateFailed { + get { + return ResourceManager.GetString("MsgPACUpdateFailed", resourceCulture); + } + } + + /// + /// 查找类似 PAC update succeeded 的本地化字符串。 + /// + internal static string MsgPACUpdateSuccessfully { + get { + return ResourceManager.GetString("MsgPACUpdateSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Resolve V2rayCore successfully 的本地化字符串。 + /// + internal static string MsgParsingV2rayCoreSuccessfully { + get { + return ResourceManager.GetString("MsgParsingV2rayCoreSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Simplify PAC Success 的本地化字符串。 + /// + internal static string MsgSimplifyPAC { + get { + return ResourceManager.GetString("MsgSimplifyPAC", resourceCulture); + } + } + + /// + /// 查找类似 Start getting subscriptions 的本地化字符串。 + /// + internal static string MsgStartGettingSubscriptions { + get { + return ResourceManager.GetString("MsgStartGettingSubscriptions", resourceCulture); + } + } + + /// + /// 查找类似 Start updating PAC... 的本地化字符串。 + /// + internal static string MsgStartUpdatingPAC { + get { + return ResourceManager.GetString("MsgStartUpdatingPAC", resourceCulture); + } + } + + /// + /// 查找类似 Start updating V2rayCore... 的本地化字符串。 + /// + internal static string MsgStartUpdatingV2rayCore { + get { + return ResourceManager.GetString("MsgStartUpdatingV2rayCore", resourceCulture); + } + } + + /// + /// 查找类似 Subscription content decoding failed (non-BASE64 code) 的本地化字符串。 + /// + internal static string MsgSubscriptionDecodingFailed { + get { + return ResourceManager.GetString("MsgSubscriptionDecodingFailed", resourceCulture); + } + } + + /// + /// 查找类似 is unpacking... 的本地化字符串。 + /// + internal static string MsgUnpacking { + get { + return ResourceManager.GetString("MsgUnpacking", resourceCulture); + } + } + + /// + /// 查找类似 Update subscription end 的本地化字符串。 + /// + internal static string MsgUpdateSubscriptionEnd { + get { + return ResourceManager.GetString("MsgUpdateSubscriptionEnd", resourceCulture); + } + } + + /// + /// 查找类似 Update subscription starts 的本地化字符串。 + /// + internal static string MsgUpdateSubscriptionStart { + get { + return ResourceManager.GetString("MsgUpdateSubscriptionStart", resourceCulture); + } + } + + /// + /// 查找类似 Update V2rayCore successfully 的本地化字符串。 + /// + internal static string MsgUpdateV2rayCoreSuccessfully { + get { + return ResourceManager.GetString("MsgUpdateV2rayCoreSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Update V2rayCore successfully! Restarting service... 的本地化字符串。 + /// + internal static string MsgUpdateV2rayCoreSuccessfullyMore { + get { + return ResourceManager.GetString("MsgUpdateV2rayCoreSuccessfullyMore", resourceCulture); + } + } + + /// + /// 查找类似 This feature relies on the Http global proxy, please set it correctly first. 的本地化字符串。 + /// + internal static string NeedHttpGlobalProxy { + get { + return ResourceManager.GetString("NeedHttpGlobalProxy", resourceCulture); + } + } + + /// + /// 查找类似 Non-vmess or ss protocol 的本地化字符串。 + /// + internal static string NonvmessOrssProtocol { + get { + return ResourceManager.GetString("NonvmessOrssProtocol", resourceCulture); + } + } + + /// + /// 查找类似 non-Vmess service, this feature is invalid 的本地化字符串。 + /// + internal static string NonVmessService { + get { + return ResourceManager.GetString("NonVmessService", resourceCulture); + } + } + + /// + /// 查找类似 V2ray-core not found, download address: {0} 的本地化字符串。 + /// + internal static string NotFoundCore { + get { + return ResourceManager.GetString("NotFoundCore", resourceCulture); + } + } + + /// + /// 查找类似 Scan completed, no valid QR code found 的本地化字符串。 + /// + internal static string NoValidQRcodeFound { + get { + return ResourceManager.GetString("NoValidQRcodeFound", resourceCulture); + } + } + + /// + /// 查找类似 operation failed, please check retry 的本地化字符串。 + /// + internal static string OperationFailed { + get { + return ResourceManager.GetString("OperationFailed", resourceCulture); + } + } + + /// + /// 查找类似 Please Fill Remarks 的本地化字符串。 + /// + internal static string PleaseFillRemarks { + get { + return ResourceManager.GetString("PleaseFillRemarks", resourceCulture); + } + } + + /// + /// 查找类似 Please select the encryption method 的本地化字符串。 + /// + internal static string PleaseSelectEncryption { + get { + return ResourceManager.GetString("PleaseSelectEncryption", resourceCulture); + } + } + + /// + /// 查找类似 Please select an agreement 的本地化字符串。 + /// + internal static string PleaseSelectProtocol { + get { + return ResourceManager.GetString("PleaseSelectProtocol", resourceCulture); + } + } + + /// + /// 查找类似 Please select the server first 的本地化字符串。 + /// + internal static string PleaseSelectServer { + get { + return ResourceManager.GetString("PleaseSelectServer", resourceCulture); + } + } + + /// + /// 查找类似 QuickFresh 的本地化字符串。 + /// + internal static string QuickFresh { + get { + return ResourceManager.GetString("QuickFresh", resourceCulture); + } + } + + /// + /// 查找类似 Are you sure to remove the server? 的本地化字符串。 + /// + internal static string RemoveServer { + get { + return ResourceManager.GetString("RemoveServer", resourceCulture); + } + } + + /// + /// 查找类似 The client configuration file is saved at: {0} 的本地化字符串。 + /// + internal static string SaveClientConfigurationIn { + get { + return ResourceManager.GetString("SaveClientConfigurationIn", resourceCulture); + } + } + + /// + /// 查找类似 The server configuration file is saved at: {0} 的本地化字符串。 + /// + internal static string SaveServerConfigurationIn { + get { + return ResourceManager.GetString("SaveServerConfigurationIn", resourceCulture); + } + } + + /// + /// 查找类似 SlowFresh 的本地化字符串。 + /// + internal static string SlowFresh { + get { + return ResourceManager.GetString("SlowFresh", resourceCulture); + } + } + + /// + /// 查找类似 Note: After this function relies on the Http global proxy test, please manually adjust the Http global proxy and active node! 的本地化字符串。 + /// + internal static string SpeedServerTips { + get { + return ResourceManager.GetString("SpeedServerTips", resourceCulture); + } + } + + /// + /// 查找类似 PAC failed to start. Pls with an administrator. 的本地化字符串。 + /// + internal static string StartPacFailed { + get { + return ResourceManager.GetString("StartPacFailed", resourceCulture); + } + } + + /// + /// 查找类似 Start service ({0})...... 的本地化字符串。 + /// + internal static string StartService { + get { + return ResourceManager.GetString("StartService", resourceCulture); + } + } + + /// + /// 查找类似 Successful configuration + ///{0} 的本地化字符串。 + /// + internal static string SuccessfulConfiguration { + get { + return ResourceManager.GetString("SuccessfulConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Successfully imported custom configuration server 的本地化字符串。 + /// + internal static string SuccessfullyImportedCustomServer { + get { + return ResourceManager.GetString("SuccessfullyImportedCustomServer", resourceCulture); + } + } + + /// + /// 查找类似 Imported bulk URL from clipboard successfully 的本地化字符串。 + /// + internal static string SuccessfullyImportedServerViaClipboard { + get { + return ResourceManager.GetString("SuccessfullyImportedServerViaClipboard", resourceCulture); + } + } + + /// + /// 查找类似 Scan import URL successfully 的本地化字符串。 + /// + internal static string SuccessfullyImportedServerViaScan { + get { + return ResourceManager.GetString("SuccessfullyImportedServerViaScan", resourceCulture); + } + } + } +} diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx new file mode 100644 index 00000000..9db82297 --- /dev/null +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Batch export subscription to clipboard successfully + + + Batch export share URL to clipboard successfully + + + Failed to import custom configuration server + + + Please fill in the correct format extra ID + + + Please fill in the correct format server port + + + Please fill in the KCP parameters correctly + + + Please fill in the local listening port + + + Please fill in the password + + + Please fill in the server address + + + Please fill in the user ID + + + This feature relies on the Http global proxy, please set it correctly first. + + + non-Vmess service, this feature is invalid + + + Scan completed, no valid QR code found + + + operation failed, please check retry + + + Please Fill Remarks + + + Please select the encryption method + + + Please select an agreement + + + Please select the server first + + + Successfully imported custom configuration server + + + Imported bulk URL from clipboard successfully + + + Note that custom configuration relies entirely on your own configuration and does not work with all settings. The system agent is available when the socks port is equal to the port in the settings in the custom configuration inbound. + + + The client configuration file is saved at: {0} + + + The server configuration file is saved at: {0} + + + Note: After this function relies on the Http global proxy test, please manually adjust the Http global proxy and active node! + + + Scan import URL successfully + + + Whether to download? {0} + + + Are you sure to remove the server? + + + Please check the server settings first + + + configuration format is incorrect + + + Failed to convert configuration file + + + Failed to generate default configuration file + + + Failed to get the default configuration + + + Failed to read configuration file + + + is not the correct client configuration file, please check + + + is not the correct configuration, please check + + + is not the correct server configuration file, please check + + + Initial Configuration + + + Non-vmess or ss protocol + + + Successful configuration +{0} + + + V2ray-core not found, download address: {0} + + + Start service ({0})...... + + + Address + + + Alias + + + Security + + + Port + + + Type + + + Subs + + + Test Results + + + Transport + + + Clear original subscription content + + + Download V2rayCore successfully + + + Failed to import subscription content + + + Get the subscription content successfully + + + No valid subscriptions set + + + PAC update failed + + + PAC update succeeded + + + Resolve V2rayCore successfully + + + Simplify PAC Success + + + Start getting subscriptions + + + Start updating PAC... + + + Start updating V2rayCore... + + + Subscription content decoding failed (non-BASE64 code) + + + is unpacking... + + + Update subscription end + + + Update subscription starts + + + Update V2rayCore successfully + + + Update V2rayCore successfully! Restarting service... + + + MediumFresh + + + QuickFresh + + + SlowFresh + + + DOWN + + + Today download traffic + + + Today upload traffic + + + Total download traffic + + + Total upload traffic + + + PAC failed to start. Pls with an administrator. + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.Designer.cs new file mode 100644 index 00000000..e69de29b diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx new file mode 100644 index 00000000..b775c152 --- /dev/null +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 批量导出订阅内容至剪贴板成功 + + + 批量导出分享URL至剪贴板成功 + + + 导入自定义配置服务器失败 + + + 请填写正确格式额外ID + + + 请填写正确格式服务器端口 + + + 请正确填写KCP参数 + + + 请填写本地监听端口 + + + 请填写密码 + + + 请填写服务器地址 + + + 请填写用户ID + + + 此功能依赖Http全局代理,请先设置正确。 + + + 非Vmess服务,此功能无效 + + + 扫描完成,未发现有效二维码 + + + 操作失败,请检查重试 + + + 请填写备注 + + + 请选择加密方式 + + + 请选择协议 + + + 请先选择服务器 + + + 成功导入自定义配置服务器 + + + 从剪贴板导入批量URL成功 + + + 注意,自定义配置完全依赖您自己的配置,不能使用所有设置功能。在自定义配置inbound中有socks port等于设置中的port时,系统代理才可用 + + + 客户端配置文件保存在:{0} + + + 服务端配置文件保存在:{0} + + + 注意:此功能依赖Http全局代理!测试完成后,请手工调整Http全局代理和活动节点。 + + + 扫描导入URL成功 + + + 是否下载? {0} + + + 是否确定移除服务器? + + + 请先检查服务器设置 + + + 配置格式不正确 + + + 转换配置文件失败 + + + 生成默认配置文件失败 + + + 取得默认配置失败 + + + 读取配置文件失败 + + + 不是正确的客户端配置文件,请检查 + + + 不是正确的配置,请检查 + + + 不是正确的服务端配置文件,请检查 + + + 初始化配置 + + + 非vmess或ss协议 + + + 配置成功 +{0} + + + 未找到v2ray-core,下载地址:{0} + + + 启动服务({0})...... + + + 地址 + + + 别名 + + + 加密方式 + + + 端口 + + + 服务类型 + + + 订阅 + + + 测试结果 + + + 传输协议 + + + 清除原订阅内容 + + + 下载V2rayCore成功 + + + 导入订阅内容失败 + + + 获取订阅内容成功 + + + 未设置有效的订阅 + + + PAC更新失败 + + + PAC更新成功 + + + 解析V2rayCore成功 + + + 简化PAC成功 + + + 开始获取订阅内容 + + + 开始更新PAC... + + + 开始更新V2rayCore... + + + 订阅内容解码失败(非BASE64码) + + + 正在解压...... + + + 更新订阅结束 + + + 更新订阅开始 + + + 更新V2rayCore成功 + + + 更新V2rayCore成功!正在重启服务... + + + 中等 + + + + + + + + + 下载 + + + 今日下载 + + + 今日上传 + + + 总下载 + + + 总上传 + + + PAC服务启动失败,请用管理员启动 + + \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/Resx.zip b/v2rayN/v2rayN/Resx/Resx.zip new file mode 100644 index 00000000..0cb38db9 Binary files /dev/null and b/v2rayN/v2rayN/Resx/Resx.zip differ diff --git a/v2rayN/v2rayN/Sample/BlankPac.txt b/v2rayN/v2rayN/Sample/BlankPac.txt new file mode 100644 index 00000000..906a14cb --- /dev/null +++ b/v2rayN/v2rayN/Sample/BlankPac.txt @@ -0,0 +1,5 @@ +var proxy = "__PROXY__"; + +function FindProxyForURL(url, host) { + return proxy; +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/SampleClientConfig.txt b/v2rayN/v2rayN/Sample/SampleClientConfig.txt new file mode 100644 index 00000000..11572d8a --- /dev/null +++ b/v2rayN/v2rayN/Sample/SampleClientConfig.txt @@ -0,0 +1,85 @@ +{ + "log": { + "access": "", + "error": "", + "loglevel": "error" + }, + "log": { + "access": "Vaccess.log", + "error": "Verror.log", + "loglevel": "warning" + }, + "inbounds": [ + { + "tag": "proxy", + "port": 10808, + "protocol": "socks", + "listen": "127.0.0.1", + "settings": { + "auth": "noauth", + "udp": true + }, + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls" + ] + } + } + ], + "outbounds": [{ + "tag": "proxy", + "protocol": "vmess", + "settings": { + "vnext": [{ + "address": "v2ray.cool", + "port": 10086, + "users": [{ + "id": "a3482e88-686a-4a58-8126-99c9df64b7bf", + "alterId": 64, + "security": "auto" + }] + }], + "servers": [{ + "address": "v2ray.cool", + "method": "chacha20", + "ota": false, + "password": "123456", + "port": 10086, + "level": 1 + }] + }, + "streamSettings": { + "network": "tcp" + }, + "mux": { + "enabled": false + } + }, + { + "protocol": "freedom", + "settings": {}, + "tag": "direct" + }, + { + "protocol": "blackhole", + "tag": "block", + "settings": { + "response": { + "type": "http" + } + } + } + ], + "routing": { + "domainStrategy": "IPIfNonMatch", + "rules": [ + { + "inboundTag": "api", + "outboundTag": "api", + "type": "field" + } + ] + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/SampleHttprequest.txt b/v2rayN/v2rayN/Sample/SampleHttprequest.txt new file mode 100644 index 00000000..48a0be41 --- /dev/null +++ b/v2rayN/v2rayN/Sample/SampleHttprequest.txt @@ -0,0 +1 @@ +{"version":"1.1","method":"GET","path":[$requestPath$],"headers":{"Host":[$requestHost$],"User-Agent":["Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36","Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"],"Accept-Encoding":["gzip, deflate"],"Connection":["keep-alive"],"Pragma":"no-cache"}} \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/SampleHttpresponse.txt b/v2rayN/v2rayN/Sample/SampleHttpresponse.txt new file mode 100644 index 00000000..257eaf66 --- /dev/null +++ b/v2rayN/v2rayN/Sample/SampleHttpresponse.txt @@ -0,0 +1 @@ +{"version":"1.1","status":"200","reason":"OK","headers":{"Content-Type":["application/octet-stream","video/mpeg"],"Transfer-Encoding":["chunked"],"Connection":["keep-alive"],"Pragma":"no-cache"}} \ No newline at end of file diff --git a/v2rayN/v2rayN/Sample/SampleServerConfig.txt b/v2rayN/v2rayN/Sample/SampleServerConfig.txt new file mode 100644 index 00000000..bd773f43 --- /dev/null +++ b/v2rayN/v2rayN/Sample/SampleServerConfig.txt @@ -0,0 +1,34 @@ +{ + "log": { + "access": "/var/log/v2ray/access.log", + "error": "/var/log/v2ray/error.log", + "loglevel": "warning" + }, + "inbounds": [{ + "port": 10086, + "protocol": "vmess", + "settings": { + "clients": [{ + "id": "23ad6b10-8d1a-40f7-8ad0-e3e35cd38297", + "level": 1, + "alterId": 64, + "email": "t@t.tt" + }] + }, + "streamSettings": { + "network": "tcp" + } + }], + "outbound": [{ + "protocol": "freedom", + "settings": {} + }, { + "protocol": "blackhole", + "settings": {}, + "tag": "block" + }], + "routing": { + "domainStrategy": "IPIfNonMatch", + "rules": [] + } +} \ No newline at end of file diff --git a/v2rayN/v2rayN/StringEx.cs b/v2rayN/v2rayN/StringEx.cs new file mode 100644 index 00000000..59916b32 --- /dev/null +++ b/v2rayN/v2rayN/StringEx.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace v2rayN +{ + static class StringEx + { + public static bool IsNullOrEmpty(this string value) + { + return string.IsNullOrEmpty(value); + } + + public static bool IsNullOrWhiteSpace(this string value) + { + return string.IsNullOrWhiteSpace(value); + } + + public static bool BeginWithAny(this string s, IEnumerable chars) + { + if (s.IsNullOrEmpty()) return false; + return chars.Contains(s[0]); + } + + public static bool IsWhiteSpace(this string value) + { + foreach (var c in value) + { + if (char.IsWhiteSpace(c)) continue; + + return false; + } + return true; + } + + + public static IEnumerable NonWhiteSpaceLines(this TextReader reader) + { + string line; + while ((line = reader.ReadLine()) != null) + { + if (line.IsWhiteSpace()) continue; + yield return line; + } + } + + public static string TrimEx(this string value) + { + return value == null ? string.Empty : value.Trim(); + } + } +} diff --git a/v2rayN/v2rayN/Tool/CDateTime.cs b/v2rayN/v2rayN/Tool/CDateTime.cs new file mode 100644 index 00000000..fb7a2e25 --- /dev/null +++ b/v2rayN/v2rayN/Tool/CDateTime.cs @@ -0,0 +1,156 @@ +using System; +using System.Net; +using System.Runtime.InteropServices; +using System.Text; + +namespace v2rayN +{ + class CDateTime + { + /// + /// 设置本地系统时间 + /// + public static void SetLocalTime() + { + using (WebClient wc = new WebClient()) + { + string url = ""; + string result = string.Empty; + + try + { + wc.Encoding = Encoding.UTF8; + wc.DownloadStringCompleted += wc_DownloadStringCompleted; + wc.DownloadStringAsync(new Uri(url)); + } + catch + { + } + } + } + + static void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) + { + try + { + string result = e.Result; + if (Utils.IsNullOrEmpty(result)) + { + return; + } + EWebTime webTime = Utils.FromJson(result); + if (webTime != null + && webTime.result != null + && webTime.result.stime != null + && !Utils.IsNullOrEmpty(webTime.result.stime)) + { + DateTime dtWeb = GetTimeFromLinux(webTime.result.stime); + + SYSTEMTIME st = new SYSTEMTIME(); + st.FromDateTime(dtWeb); + + //调用Win32 API设置系统时间 + Win32API.SetLocalTime(ref st); + } + } + catch + { + } + } + + /// + /// 时间戳转为C#格式时间 + /// + /// + /// + private static DateTime GetTimeFromLinux(string timeStamp) + { + DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); + long lTime = long.Parse(timeStamp + "0000000"); + TimeSpan toNow = new TimeSpan(lTime); return dtStart.Add(toNow); + } + } + + /// + /// + /// + public struct SYSTEMTIME + { + public ushort wYear; + public ushort wMonth; + public ushort wDayOfWeek; + public ushort wDay; + public ushort wHour; + public ushort wMinute; + public ushort wSecond; + public ushort wMilliseconds; + + /// + /// 从System.DateTime转换。 + /// + /// System.DateTime类型的时间。 + public void FromDateTime(DateTime time) + { + wYear = (ushort)time.Year; + wMonth = (ushort)time.Month; + wDayOfWeek = (ushort)time.DayOfWeek; + wDay = (ushort)time.Day; + wHour = (ushort)time.Hour; + wMinute = (ushort)time.Minute; + wSecond = (ushort)time.Second; + wMilliseconds = (ushort)time.Millisecond; + } + + /// + /// 转换为System.DateTime类型。 + /// + /// + public DateTime ToDateTime() + { + return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, wMilliseconds); + } + + /// + /// 静态方法。转换为System.DateTime类型。 + /// + /// SYSTEMTIME类型的时间。 + /// + public static DateTime ToDateTime(SYSTEMTIME time) + { + return time.ToDateTime(); + } + } + + public class Win32API + { + [DllImport("Kernel32.dll")] + public static extern bool SetLocalTime(ref SYSTEMTIME Time); + [DllImport("Kernel32.dll")] + public static extern void GetLocalTime(ref SYSTEMTIME Time); + } + + public class WTResult + { + /// + /// + /// + public string stime { get; set; } + } + + public class EWebTime + { + /// + /// + /// + public WTResult result { get; set; } + /// + /// + /// + public int error_code { get; set; } + /// + /// + /// + public string reason { get; set; } + } +} + diff --git a/v2rayN/v2rayN/Tool/FileManager.cs b/v2rayN/v2rayN/Tool/FileManager.cs new file mode 100644 index 00000000..6df1a4bb --- /dev/null +++ b/v2rayN/v2rayN/Tool/FileManager.cs @@ -0,0 +1,65 @@ +using System; +using System.IO; +using System.IO.Compression; +using System.Text; + +namespace v2rayN.Tool +{ + public static class FileManager + { + public static bool ByteArrayToFile(string fileName, byte[] content) + { + try + { + using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) + fs.Write(content, 0, content.Length); + return true; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + } + return false; + } + + public static void UncompressFile(string fileName, byte[] content) + { + // Because the uncompressed size of the file is unknown, + // we are using an arbitrary buffer size. + byte[] buffer = new byte[4096]; + int n; + + using (var fs = File.Create(fileName)) + using (var input = new GZipStream(new MemoryStream(content), + CompressionMode.Decompress, false)) + { + while ((n = input.Read(buffer, 0, buffer.Length)) > 0) + { + fs.Write(buffer, 0, n); + } + } + } + + public static string NonExclusiveReadAllText(string path) + { + return NonExclusiveReadAllText(path, Encoding.Default); + } + + public static string NonExclusiveReadAllText(string path, Encoding encoding) + { + try + { + using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var sr = new StreamReader(fs, encoding)) + { + return sr.ReadToEnd(); + } + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + throw ex; + } + } + } +} diff --git a/v2rayN/v2rayN/Tool/Job.cs b/v2rayN/v2rayN/Tool/Job.cs new file mode 100644 index 00000000..64415589 --- /dev/null +++ b/v2rayN/v2rayN/Tool/Job.cs @@ -0,0 +1,179 @@ +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + + +namespace v2rayN +{ + /* + * See: + * http://stackoverflow.com/questions/6266820/working-example-of-createjobobject-setinformationjobobject-pinvoke-in-net + */ + public class Job : IDisposable + { + private IntPtr handle = IntPtr.Zero; + + public Job() + { + handle = CreateJobObject(IntPtr.Zero, null); + var extendedInfoPtr = IntPtr.Zero; + var info = new JOBOBJECT_BASIC_LIMIT_INFORMATION + { + LimitFlags = 0x2000 + }; + + var extendedInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION + { + BasicLimitInformation = info + }; + + try + { + int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); + extendedInfoPtr = Marshal.AllocHGlobal(length); + Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false); + + if (!SetInformationJobObject(handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, + (uint) length)) + throw new Exception(string.Format("Unable to set information. Error: {0}", + Marshal.GetLastWin32Error())); + } + finally + { + if (extendedInfoPtr != IntPtr.Zero) + { + Marshal.FreeHGlobal(extendedInfoPtr); + extendedInfoPtr = IntPtr.Zero; + } + } + } + + public bool AddProcess(IntPtr processHandle) + { + var succ = AssignProcessToJobObject(handle, processHandle); + + if (!succ) + { + //Logging.Error("Failed to call AssignProcessToJobObject! GetLastError=" + Marshal.GetLastWin32Error()); + } + + return succ; + } + + public bool AddProcess(int processId) + { + return AddProcess(Process.GetProcessById(processId).Handle); + } + + #region IDisposable + + private bool disposed; + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposed) return; + disposed = true; + + if (disposing) + { + // no managed objects to free + } + + if (handle != IntPtr.Zero) + { + CloseHandle(handle); + handle = IntPtr.Zero; + } + } + + ~Job() + { + Dispose(false); + } + + #endregion + + #region Interop + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] + private static extern IntPtr CreateJobObject(IntPtr a, string lpName); + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool SetInformationJobObject(IntPtr hJob, JobObjectInfoType infoType, IntPtr lpJobObjectInfo, UInt32 cbJobObjectInfoLength); + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process); + + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool CloseHandle(IntPtr hObject); + + #endregion + } + + #region Helper classes + + [StructLayout(LayoutKind.Sequential)] + struct IO_COUNTERS + { + public UInt64 ReadOperationCount; + public UInt64 WriteOperationCount; + public UInt64 OtherOperationCount; + public UInt64 ReadTransferCount; + public UInt64 WriteTransferCount; + public UInt64 OtherTransferCount; + } + + + [StructLayout(LayoutKind.Sequential)] + struct JOBOBJECT_BASIC_LIMIT_INFORMATION + { + public Int64 PerProcessUserTimeLimit; + public Int64 PerJobUserTimeLimit; + public UInt32 LimitFlags; + public UIntPtr MinimumWorkingSetSize; + public UIntPtr MaximumWorkingSetSize; + public UInt32 ActiveProcessLimit; + public UIntPtr Affinity; + public UInt32 PriorityClass; + public UInt32 SchedulingClass; + } + + [StructLayout(LayoutKind.Sequential)] + public struct SECURITY_ATTRIBUTES + { + public UInt32 nLength; + public IntPtr lpSecurityDescriptor; + public Int32 bInheritHandle; + } + + [StructLayout(LayoutKind.Sequential)] + struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION + { + public JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; + public IO_COUNTERS IoInfo; + public UIntPtr ProcessMemoryLimit; + public UIntPtr JobMemoryLimit; + public UIntPtr PeakProcessMemoryUsed; + public UIntPtr PeakJobMemoryUsed; + } + + public enum JobObjectInfoType + { + AssociateCompletionPortInformation = 7, + BasicLimitInformation = 2, + BasicUIRestrictions = 4, + EndOfJobTimeInformation = 6, + ExtendedLimitInformation = 9, + SecurityLimitInformation = 5, + GroupInformation = 11 + } + + #endregion +} diff --git a/v2rayN/v2rayN/Tool/UI.cs b/v2rayN/v2rayN/Tool/UI.cs new file mode 100644 index 00000000..8225a291 --- /dev/null +++ b/v2rayN/v2rayN/Tool/UI.cs @@ -0,0 +1,38 @@ +using System.Globalization; +using System.Windows.Forms; + +namespace v2rayN +{ + class UI + { + public static void Show(string msg) + { + MessageBox.Show(msg); + } + + public static DialogResult ShowYesNo(string msg) + { + return MessageBox.Show(msg, "YesNo", MessageBoxButtons.YesNo); + } + + //public static string GetResourseString(string key) + //{ + // CultureInfo cultureInfo = null; + // try + // { + // string languageCode = this.LanguageCode; + // cultureInfo = new CultureInfo(languageCode); + // return Common.ResourceManager.GetString(key, cultureInfo); + // } + // catch (Exception) + // { + // //默认读取英文的多语言 + // cultureInfo = new CultureInfo(MKey.kDefaultLanguageCode); + // return Common.ResourceManager.GetString(key, cultureInfo); + // } + //} + + } + + +} diff --git a/v2rayN/v2rayN/Tool/UIRes.cs b/v2rayN/v2rayN/Tool/UIRes.cs new file mode 100644 index 00000000..a6b455a9 --- /dev/null +++ b/v2rayN/v2rayN/Tool/UIRes.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; +using System.Reflection; +using System.Resources; + +namespace v2rayN +{ + public class UIRes + { + static ResourceManager res = new ResourceManager("v2rayN.Resx.ResUI", Assembly.GetExecutingAssembly()); + + static string LoadString(ResourceManager resMgr, string key) + { + var value = resMgr.GetString(key); + if (value == null) + { + throw new KeyNotFoundException($"key: {key}"); + } + return value; + } + + public static string I18N(string key) + { + return LoadString(res, key); + } + } +} diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs new file mode 100644 index 00000000..f8439463 --- /dev/null +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -0,0 +1,932 @@ +using Microsoft.Win32; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.IO.Compression; +using System.Net; +using System.Net.NetworkInformation; +using System.Net.Sockets; +using System.Reflection; +using System.Runtime.Serialization.Formatters.Binary; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using System.Drawing; +using ZXing; +using ZXing.Common; +using ZXing.QrCode; +using System.Security.Principal; + +namespace v2rayN +{ + class Utils + { + + + #region 资源Json操作 + + /// + /// 获取嵌入文本资源 + /// + /// + /// + public static string GetEmbedText(string res) + { + string result = string.Empty; + + try + { + var assembly = Assembly.GetExecutingAssembly(); + using (Stream stream = assembly.GetManifestResourceStream(res)) + using (StreamReader reader = new StreamReader(stream)) + { + result = reader.ReadToEnd(); + } + } + catch + { + } + return result; + } + + + /// + /// 取得存储资源 + /// + /// + public static string LoadResource(string res) + { + string result = string.Empty; + + try + { + using (StreamReader reader = new StreamReader(res)) + { + result = reader.ReadToEnd(); + } + } + catch + { + } + return result; + } + + /// + /// 反序列化成对象 + /// + /// + /// + /// + public static T FromJson(string strJson) + { + try + { + T obj = JsonConvert.DeserializeObject(strJson); + return obj; + } + catch + { + return JsonConvert.DeserializeObject(""); + } + } + + /// + /// 序列化成Json + /// + /// + /// + public static string ToJson(Object obj) + { + string result = string.Empty; + try + { + result = JsonConvert.SerializeObject(obj, + Formatting.Indented, + new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); + } + catch + { + } + return result; + } + + /// + /// 保存成json文件 + /// + /// + /// + /// + public static int ToJsonFile(Object obj, string filePath) + { + int result = -1; + try + { + using (StreamWriter file = System.IO.File.CreateText(filePath)) + { + //JsonSerializer serializer = new JsonSerializer(); + JsonSerializer serializer = new JsonSerializer() { Formatting = Formatting.Indented }; + //JsonSerializer serializer = new JsonSerializer() { Formatting = Formatting.Indented, NullValueHandling = NullValueHandling.Ignore }; + + serializer.Serialize(file, obj); + } + result = 0; + } + catch + { + result = -1; + } + return result; + } + #endregion + + #region 转换函数 + + /// + /// List转逗号分隔的字符串 + /// + /// + /// + public static string List2String(List lst, bool wrap = false) + { + try + { + if (wrap) + { + return string.Join(",\r\n", lst.ToArray()); + } + else + { + return string.Join(",", lst.ToArray()); + } + } + catch + { + return string.Empty; + } + } + /// + /// 逗号分隔的字符串,转List + /// + /// + /// + public static List String2List(string str) + { + try + { + str = str.Replace("\r\n", ""); + return new List(str.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)); + } + catch + { + return new List(); + } + } + + /// + /// Base64编码 + /// + /// + /// + public static string Base64Encode(string plainText) + { + try + { + var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); + return Convert.ToBase64String(plainTextBytes); + } + catch (Exception ex) + { + SaveLog("Base64Encode", ex); + return string.Empty; + } + } + + /// + /// Base64解码 + /// + /// + /// + public static string Base64Decode(string plainText) + { + try + { + plainText = plainText.TrimEx() + .Replace("\n", "") + .Replace("\r\n", "") + .Replace("\r", "") + .Replace(" ", ""); + + if (plainText.Length % 4 > 0) + { + plainText = plainText.PadRight(plainText.Length + 4 - plainText.Length % 4, '='); + } + + byte[] data = Convert.FromBase64String(plainText); + return Encoding.UTF8.GetString(data); + } + catch (Exception ex) + { + SaveLog("Base64Decode", ex); + return string.Empty; + } + } + + /// + /// 转Int + /// + /// + /// + public static int ToInt(object obj) + { + try + { + return Convert.ToInt32(obj); + } + catch + { + return 0; + } + } + + public static string ToString(object obj) + { + try + { + return (obj == null ? string.Empty : obj.ToString()); + } + catch + { + return string.Empty; + } + } + + /// + /// byte 转成 有两位小数点的 方便阅读的数据 + /// 比如 2.50 MB + /// + /// bytes + /// 转换之后的数据 + /// 单位 + public static void ToHumanReadable(ulong amount, out double result, out string unit) + { + var factor = 1024u; + var KBs = amount / factor; + if (KBs > 0) + { + // multi KB + var MBs = KBs / factor; + if (MBs > 0) + { + // multi MB + var GBs = MBs / factor; + if (GBs > 0) + { + // multi GB + var TBs = GBs / factor; + if (TBs > 0) + { + // 你是魔鬼吗? 用这么多流量 + result = TBs + GBs % factor / (factor + 0.0); + unit = "TB"; + return; + } + result = GBs + MBs % factor / (factor + 0.0); + unit = "GB"; + return; + } + result = MBs + KBs % factor / (factor + 0.0); + unit = "MB"; + return; + } + result = KBs + amount % factor / (factor + 0.0); + unit = "KB"; + return; + } + else + { + result = amount; + unit = "B"; + } + } + + public static string HumanFy(ulong amount) + { + double result; + string unit; + ToHumanReadable(amount, out result, out unit); + return $"{string.Format("{0:f1}", result)}{unit}"; + } + + public static void DedupServerList(List source, out List result) + { + var list = new List(); + foreach (var item in source) + { + if (!list.Exists(i => item.address == i.address && item.port == i.port && item.path == i.path)) + { + list.Add(item); + } + } + + result = list; + } + + #endregion + + + #region 数据检查 + + /// + /// 判断输入的是否是数字 + /// + /// + /// + public static bool IsNumberic(string oText) + { + try + { + int var1 = Utils.ToInt(oText); + return true; + } + catch + { + return false; + } + } + + /// + /// 文本 + /// + /// + /// + public static bool IsNullOrEmpty(string text) + { + if (string.IsNullOrEmpty(text)) + { + return true; + } + if (text.Equals("null")) + { + return true; + } + return false; + } + + /// + /// 验证IP地址是否合法 + /// + /// + public static bool IsIP(string ip) + { + //如果为空 + if (IsNullOrEmpty(ip)) + { + return false; + } + + //清除要验证字符串中的空格 + //ip = ip.TrimEx(); + //可能是CIDR + if (ip.IndexOf(@"/") > 0) + { + var cidr = ip.Split('/'); + if (cidr.Length == 2) + { + if (!IsNumberic(cidr[0])) + { + return false; + } + ip = cidr[0]; + } + } + + + //模式字符串 + string pattern = @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$"; + + //验证 + return IsMatch(ip, pattern); + } + + /// + /// 验证Domain地址是否合法 + /// + /// + public static bool IsDomain(string domain) + { + //如果为空 + if (IsNullOrEmpty(domain)) + { + return false; + } + + //清除要验证字符串中的空格 + //domain = domain.TrimEx(); + + //模式字符串 + string pattern = @"^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$"; + + //验证 + return IsMatch(domain, pattern); + } + + /// + /// 验证输入字符串是否与模式字符串匹配,匹配返回true + /// + /// 输入字符串 + /// 模式字符串 + public static bool IsMatch(string input, string pattern) + { + return Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase); + } + + public static bool IsIdenticalServer(Mode.ServerStatistics a, Mode.ServerStatistics b) + { + return (a.address == b.address + && a.port == b.port + && a.path == b.path + && a.host == b.host + ); + } + + #endregion + + #region 开机自动启动 + + private static string autoRunName = "v2rayNAutoRun"; + private static string autoRunRegPath + { + get + { + return @"Software\Microsoft\Windows\CurrentVersion\Run"; + //if (Environment.Is64BitProcess) + //{ + // return @"Software\Microsoft\Windows\CurrentVersion\Run"; + //} + //else + //{ + // return @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run"; + //} + } + } + + /// + /// 开机自动启动 + /// + /// + /// + public static int SetAutoRun(bool run) + { + try + { + if (run) + { + string exePath = GetExePath(); + RegWriteValue(autoRunRegPath, autoRunName, exePath); + } + else + { + RegWriteValue(autoRunRegPath, autoRunName, ""); + } + } + catch + { + } + return 0; + } + + /// + /// 是否已经设置开机自动启动 + /// + /// + public static bool IsAutoRun() + { + try + { + var value = RegReadValue(autoRunRegPath, autoRunName, ""); + string exePath = GetExePath(); + if (value?.Equals(exePath) == true) + { + return true; + } + } + catch + { + } + return false; + } + + /// + /// 获取启动了应用程序的可执行文件的路径 + /// + /// + public static string GetPath(string fileName) + { + string startupPath = StartupPath(); + if (Utils.IsNullOrEmpty(fileName)) + { + return startupPath; + } + return Path.Combine(startupPath, fileName); + } + + /// + /// 获取启动了应用程序的可执行文件的路径及文件名 + /// + /// + public static string GetExePath() + { + return Application.ExecutablePath; + } + + public static string StartupPath() + { + try + { + string exePath = GetExePath(); + return exePath.Substring(0, exePath.LastIndexOf("\\", StringComparison.Ordinal)); + } + catch + { + return Application.StartupPath; + } + } + + public static string RegReadValue(string path, string name, string def) + { + RegistryKey regKey = null; + try + { + regKey = Registry.CurrentUser.OpenSubKey(path, false); + string value = regKey?.GetValue(name) as string; + if (IsNullOrEmpty(value)) + { + return def; + } + else + { + return value; + } + } + catch + { + } + finally + { + regKey?.Close(); + } + return def; + } + + public static void RegWriteValue(string path, string name, string value) + { + RegistryKey regKey = null; + try + { + regKey = Registry.CurrentUser.CreateSubKey(path); + if (IsNullOrEmpty(value)) + { + regKey?.DeleteValue(name, false); + } + else + { + regKey?.SetValue(name, value); + } + } + catch + { + } + finally + { + regKey?.Close(); + } + } + #endregion + + #region 测速 + + /// + /// Ping + /// + /// + /// + public static long Ping(string host) + { + long roundtripTime = -1; + try + { + int timeout = 120; + int echoNum = 2; + Ping pingSender = new Ping(); + for (int i = 0; i < echoNum; i++) + { + PingReply reply = pingSender.Send(host, timeout); + if (reply.Status == IPStatus.Success) + { + if (reply.RoundtripTime < 0) + { + continue; + } + if (roundtripTime < 0 || reply.RoundtripTime < roundtripTime) + { + roundtripTime = reply.RoundtripTime; + } + } + } + } + catch + { + return -1; + } + return roundtripTime; + } + + /// + /// 取得本机 IP Address + /// + /// + public static List GetHostIPAddress() + { + List lstIPAddress = new List(); + try + { + IPHostEntry IpEntry = Dns.GetHostEntry(Dns.GetHostName()); + foreach (IPAddress ipa in IpEntry.AddressList) + { + if (ipa.AddressFamily == AddressFamily.InterNetwork) + lstIPAddress.Add(ipa.ToString()); + } + } + catch + { + } + return lstIPAddress; + } + + + #endregion + + #region 杂项 + + /// + /// 取得版本 + /// + /// + public static string GetVersion() + { + try + { + string location = GetExePath(); + return string.Format("v2rayN - V{0} - {1}", + FileVersionInfo.GetVersionInfo(location).FileVersion.ToString(), + File.GetLastWriteTime(location).ToString("yyyy/MM/dd")); + } + catch + { + return string.Empty; + } + } + + /// + /// 深度拷贝 + /// + /// + /// + /// + public static T DeepCopy(T obj) + { + object retval; + using (MemoryStream ms = new MemoryStream()) + { + BinaryFormatter bf = new BinaryFormatter(); + //序列化成流 + bf.Serialize(ms, obj); + ms.Seek(0, SeekOrigin.Begin); + //反序列化成对象 + retval = bf.Deserialize(ms); + ms.Close(); + } + return (T)retval; + } + + /// + /// 获取剪贴板数 + /// + /// + public static string GetClipboardData() + { + string strData = string.Empty; + try + { + IDataObject data = Clipboard.GetDataObject(); + if (data.GetDataPresent(DataFormats.Text)) + { + strData = data.GetData(DataFormats.Text).ToString(); + } + return strData; + } + catch + { + } + return strData; + } + + /// + /// 拷贝至剪贴板 + /// + /// + public static void SetClipboardData(string strData) + { + try + { + Clipboard.SetText(strData); + } + catch + { + } + } + + /// + /// 取得GUID + /// + /// + public static string GetGUID() + { + try + { + return Guid.NewGuid().ToString("D"); + } + catch + { + } + return string.Empty; + } + + /// + /// IsAdministrator + /// + /// + public static bool IsAdministrator() + { + try + { + WindowsIdentity current = WindowsIdentity.GetCurrent(); + WindowsPrincipal windowsPrincipal = new WindowsPrincipal(current); + //WindowsBuiltInRole可以枚举出很多权限,例如系统用户、User、Guest等等 + return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator); + } + catch + { + return false; + } + } + + #endregion + + #region TempPath + + private static string _tempPath = null; + + // return path to store temporary files + public static string GetTempPath() + { + if (_tempPath == null) + { + Directory.CreateDirectory(Path.Combine(StartupPath(), "v2ray_win_temp")); + // don't use "/", it will fail when we call explorer /select xxx/ss_win_temp\xxx.log + _tempPath = Path.Combine(StartupPath(), "v2ray_win_temp"); + } + return _tempPath; + } + + public static string GetTempPath(string filename) + { + return Path.Combine(GetTempPath(), filename); + } + + public static void ClearTempPath() + { + //Directory.Delete(GetTempPath(), true); + //_tempPath = null; + } + + public static string UnGzip(byte[] buf) + { + byte[] buffer = new byte[1024]; + int n; + using (MemoryStream sb = new MemoryStream()) + { + using (GZipStream input = new GZipStream(new MemoryStream(buf), + CompressionMode.Decompress, + false)) + { + while ((n = input.Read(buffer, 0, buffer.Length)) > 0) + { + sb.Write(buffer, 0, n); + } + } + return System.Text.Encoding.UTF8.GetString(sb.ToArray()); + } + } + + #endregion + + #region Log + + public static void SaveLog(string strContent) + { + SaveLog("info", new Exception(strContent)); + } + public static void SaveLog(string strTitle, Exception ex) + { + try + { + string path = Path.Combine(StartupPath(), "guiLogs"); + string FilePath = Path.Combine(path, DateTime.Now.ToString("yyyyMMdd") + ".txt"); + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + if (!File.Exists(FilePath)) + { + FileStream FsCreate = new FileStream(FilePath, FileMode.Create); + FsCreate.Close(); + FsCreate.Dispose(); + } + FileStream FsWrite = new FileStream(FilePath, FileMode.Append, FileAccess.Write); + StreamWriter SwWrite = new StreamWriter(FsWrite); + + string strContent = ex.ToString(); + + SwWrite.WriteLine(string.Format("{0}{1}[{2}]{3}", "--------------------------------", strTitle, DateTime.Now.ToString("HH:mm:ss"), "--------------------------------")); + SwWrite.Write(strContent); + SwWrite.WriteLine("\r\n"); + SwWrite.WriteLine(" "); + SwWrite.Flush(); + SwWrite.Close(); + } + catch { } + } + + #endregion + + + #region scan screen + + public static string ScanScreen() + { + string ret = string.Empty; + try + { + foreach (Screen screen in Screen.AllScreens) + { + using (Bitmap fullImage = new Bitmap(screen.Bounds.Width, + screen.Bounds.Height)) + { + using (Graphics g = Graphics.FromImage(fullImage)) + { + g.CopyFromScreen(screen.Bounds.X, + screen.Bounds.Y, + 0, 0, + fullImage.Size, + CopyPixelOperation.SourceCopy); + } + int maxTry = 10; + for (int i = 0; i < maxTry; i++) + { + int marginLeft = (int)((double)fullImage.Width * i / 2.5 / maxTry); + int marginTop = (int)((double)fullImage.Height * i / 2.5 / maxTry); + Rectangle cropRect = new Rectangle(marginLeft, marginTop, fullImage.Width - marginLeft * 2, fullImage.Height - marginTop * 2); + Bitmap target = new Bitmap(screen.Bounds.Width, screen.Bounds.Height); + + double imageScale = (double)screen.Bounds.Width / (double)cropRect.Width; + using (Graphics g = Graphics.FromImage(target)) + { + g.DrawImage(fullImage, new Rectangle(0, 0, target.Width, target.Height), + cropRect, + GraphicsUnit.Pixel); + } + + var source = new BitmapLuminanceSource(target); + var bitmap = new BinaryBitmap(new HybridBinarizer(source)); + QRCodeReader reader = new QRCodeReader(); + var result = reader.decode(bitmap); + if (result != null) + { + ret = result.Text; + return ret; + } + } + } + } + } + catch { } + return string.Empty; + } + + #endregion + + } +} diff --git a/v2rayN/v2rayN/app.config b/v2rayN/v2rayN/app.config new file mode 100644 index 00000000..620ddb42 --- /dev/null +++ b/v2rayN/v2rayN/app.config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/v2rayN/v2rayN/grpc_csharp_ext.x64.dll b/v2rayN/v2rayN/grpc_csharp_ext.x64.dll new file mode 100644 index 00000000..8c10df69 Binary files /dev/null and b/v2rayN/v2rayN/grpc_csharp_ext.x64.dll differ diff --git a/v2rayN/v2rayN/grpc_csharp_ext.x86.dll b/v2rayN/v2rayN/grpc_csharp_ext.x86.dll new file mode 100644 index 00000000..dd3876df Binary files /dev/null and b/v2rayN/v2rayN/grpc_csharp_ext.x86.dll differ diff --git a/v2rayN/v2rayN/packages.config b/v2rayN/v2rayN/packages.config new file mode 100644 index 00000000..99dcde88 --- /dev/null +++ b/v2rayN/v2rayN/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj new file mode 100644 index 00000000..04dfe9e9 --- /dev/null +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -0,0 +1,455 @@ + + + + + + Debug + AnyCPU + {0A9785E6-D256-4B73-9757-4EF59955FD1E} + WinExe + Properties + v2rayN + v2rayN + v4.6 + 512 + + false + + + 发布\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 2 + 1.0.0.%2a + false + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + v2rayN.ico + + + BD431FE78E8A6683106E7110882AE5C41CBF5C60 + + + v2rayN_TemporaryKey.pfx + + + false + + + false + + + + LocalIntranet + + + + + + False + LIB\Google.Protobuf.dll + False + + + False + LIB\Grpc.Core.dll + False + + + False + LIB\Grpc.Core.Api.dll + False + + + False + LIB\Newtonsoft.Json.dll + False + + + + False + LIB\System.Buffers.dll + False + + + + + + + + + + + False + LIB\System.Memory.dll + False + + + + False + LIB\System.Runtime.CompilerServices.Unsafe.dll + False + + + + + False + LIB\zxing.dll + False + + + False + LIB\zxing.presentation.dll + False + + + + + Form + + + AddServer4Form.cs + + + Component + + + Form + + + MainForm.cs + + + Form + + + SubSettingForm.cs + + + Form + + + AddServer2Form.cs + + + Form + + + AddServer3Form.cs + + + UserControl + + + QRCodeControl.cs + + + UserControl + + + SubSettingControl.cs + + + + + + + + + + + + + + + Component + + + + + + + True + True + ResUI.zh-Hans.resx + + + True + True + ResUI.resx + + + Code + + + Form + + + AddServerForm.cs + + + Form + + + BaseForm.cs + + + + + + + + + + + + Form + + + OptionSettingForm.cs + + + + + + + + + + + AddServer2Form.cs + Designer + + + AddServer4Form.cs + Designer + + + AddServer4Form.cs + Designer + + + AddServer3Form.cs + Designer + + + AddServerForm.cs + Designer + + + MainForm.cs + Designer + + + MainForm.cs + Designer + + + OptionSettingForm.cs + + + QRCodeControl.cs + Designer + + + SubSettingControl.cs + + + SubSettingControl.cs + + + SubSettingForm.cs + Designer + + + AddServerForm.cs + Designer + + + BaseForm.cs + + + OptionSettingForm.cs + Designer + + + QRCodeControl.cs + Designer + + + AddServer2Form.cs + Designer + + + AddServer3Form.cs + Designer + + + SubSettingForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + Designer + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + ResXFileCodeGenerator + ResUI.zh-Hans.Designer.cs + Designer + + + ResXFileCodeGenerator + ResUI.Designer.cs + Designer + + + + + + + + + + + + + False + Microsoft .NET Framework 4 %28x86 和 x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 4.5 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Always + + + Always + + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.csproj.user b/v2rayN/v2rayN/v2rayN.csproj.user new file mode 100644 index 00000000..778969a8 --- /dev/null +++ b/v2rayN/v2rayN/v2rayN.csproj.user @@ -0,0 +1,22 @@ + + + + 发布\ + + + + + + zh-CN + false + ProjectFiles + + + false + + + Project + + + + \ No newline at end of file diff --git a/v2rayN/v2rayN/v2rayN.ico b/v2rayN/v2rayN/v2rayN.ico new file mode 100644 index 00000000..2a2f85a9 Binary files /dev/null and b/v2rayN/v2rayN/v2rayN.ico differ