diff --git a/LICENSE b/LICENSE
index 261eeb9e9f..94a9ed024d 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,201 +1,674 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
+ 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
index 55bfdec3e5..bb10c50783 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,10 @@
-# v2rayN
\ No newline at end of file
+# 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 0000000000..02f175e531
--- /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 0000000000..91d8fcf081
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 0000000000..0e407a4313
--- /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 0000000000..a88afb44d6
--- /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 0000000000..c98d40e0ec
--- /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 0000000000..a01d4dfa83
--- /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 0000000000..3515e6b98e
--- /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 0000000000..c39f2cfe5e
--- /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 0000000000..f2f23bbab5
--- /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 0000000000..2a5968cafd
--- /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 0000000000..fb950a5c98
--- /dev/null
+++ b/v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs
@@ -0,0 +1,188 @@
+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.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
+ //
+ 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.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);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.TabStop = false;
+ //
+ // 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
+ //
+ 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";
+ //
+ // menuServer
+ //
+ resources.ApplyResources(this.menuServer, "menuServer");
+ this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.MenuItem1});
+ this.menuServer.Name = "menuServer";
+ //
+ // MenuItem1
+ //
+ resources.ApplyResources(this.MenuItem1, "MenuItem1");
+ this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.menuItemImportClipboard});
+ this.MenuItem1.Name = "MenuItem1";
+ //
+ // menuItemImportClipboard
+ //
+ resources.ApplyResources(this.menuItemImportClipboard, "menuItemImportClipboard");
+ this.menuItemImportClipboard.Name = "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;
+ }
+}
\ 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 0000000000..edb8051666
--- /dev/null
+++ b/v2rayN/v2rayN/Forms/AddServer4Form.cs
@@ -0,0 +1,122 @@
+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();
+ txtRemarks.Text = vmessItem.remarks;
+ }
+
+
+ ///
+ /// 清除设置
+ ///
+ private void ClearServer()
+ {
+ txtAddress.Text = "";
+ txtPort.Text = "";
+ txtRemarks.Text = "";
+ }
+
+ private void btnOK_Click(object sender, EventArgs e)
+ {
+ string address = txtAddress.Text;
+ string port = txtPort.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.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();
+ txtRemarks.Text = vmessItem.remarks;
+ }
+
+ #endregion
+
+
+ }
+}
diff --git a/v2rayN/v2rayN/Forms/AddServer4Form.resx b/v2rayN/v2rayN/Forms/AddServer4Form.resx
new file mode 100644
index 0000000000..d1e34f1a16
--- /dev/null
+++ b/v2rayN/v2rayN/Forms/AddServer4Form.resx
@@ -0,0 +1,483 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ Server address
+
+
+
+ 3
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ Bottom
+
+
+ groupBox1
+
+
+ True
+
+
+ menuServer
+
+
+ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ btnOK
+
+
+ txtRemarks
+
+
+
+ 194, 21
+
+
+ System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ AddServer4Form
+
+
+ 89, 12
+
+
+ label1
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ panel2
+
+
+ 12, 158
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Fill
+
+
+ 194, 21
+
+
+ groupBox1
+
+
+ 6, 12
+
+
+ 547, 25
+
+
+ True
+
+
+ Alias (remarks)
+
+
+ 127, 154
+
+
+ groupBox1
+
+
+ 6
+
+
+ 7
+
+
+ groupBox1
+
+
+ 113, 12
+
+
+ MenuItem1
+
+
+ Server
+
+
+ 162, 21
+
+
+ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 0
+
+
+ 2
+
+
+ 547, 60
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Edit or add a [Socks] server
+
+
+ 359, 21
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 547, 10
+
+
+ * Fill in manually
+
+
+ 4
+
+
+ 10
+
+
+ 71, 12
+
+
+ 0
+
+
+ panel1
+
+
+ 75, 23
+
+
+ 12, 60
+
+
+ 1
+
+
+ $this
+
+
+ btnClose
+
+
+ label6
+
+
+ 8
+
+
+ 303, 17
+
+
+ 127, 27
+
+
+ 75, 23
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ Top
+
+
+ 0, 35
+
+
+ 2
+
+
+ $this
+
+
+ panel2
+
+
+ 547, 196
+
+
+ 2
+
+
+ 6
+
+
+ 235, 22
+
+
+ 4
+
+
+ 3
+
+
+ True
+
+
+ 5
+
+
+ groupBox1
+
+
+ txtPort
+
+
+ 127, 56
+
+
+ 95, 12
+
+
+ System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ True
+
+
+ Import URL from clipboard
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ &Cancel
+
+
+ 12, 31
+
+
+ &OK
+
+
+ 11
+
+
+ 0
+
+
+ Server port
+
+
+ 337, 158
+
+
+ groupBox1
+
+
+ Import configuration file
+
+
+ 0, 0
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 5
+
+
+ System.Windows.Forms.MenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 3
+
+
+ 1
+
+
+ 0, 25
+
+
+ 1
+
+
+ label13
+
+
+ 3
+
+
+ label2
+
+
+ groupBox1
+
+
+ panel2
+
+
+ 0, 231
+
+
+ 22
+
+
+ 547, 291
+
+
+ 0
+
+
+ v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+
+
+ menuItemImportClipboard
+
+
+ $this
+
+
+ 396, 17
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 1
+
+
+ System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ True
+
+
+ 17, 17
+
+
\ 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 0000000000..40b56c76aa
--- /dev/null
+++ b/v2rayN/v2rayN/Forms/AddServer4Form.zh-Hans.resx
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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)
+
+
+ 服务器
+
+
+ *手填,方便识别管理
+
+
+
+ 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 0000000000..c398397bec
--- /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 0000000000..816b70137e
--- /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 0000000000..e519eab6eb
--- /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 0000000000..7c5b362330
--- /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 0000000000..f23103bbfb
--- /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 0000000000..9d8f9b0efb
--- /dev/null
+++ b/v2rayN/v2rayN/Forms/BaseForm.cs
@@ -0,0 +1,39 @@
+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 0000000000..61360d3de7
--- /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/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs
new file mode 100644
index 0000000000..5b8d5681f6
--- /dev/null
+++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs
@@ -0,0 +1,749 @@
+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 System.Windows.Forms.ListView();
+ 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.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.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.tsbServer = new System.Windows.Forms.ToolStripDropDownButton();
+ this.qrCodeControl = new v2rayN.Forms.QRCodeControl();
+ 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.bgwPing = new System.ComponentModel.BackgroundWorker();
+ 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.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.tsMain.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // splitContainer1
+ //
+ resources.ApplyResources(this.splitContainer1, "splitContainer1");
+ this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+ this.splitContainer1.Name = "splitContainer1";
+ //
+ // splitContainer1.Panel1
+ //
+ resources.ApplyResources(this.splitContainer1.Panel1, "splitContainer1.Panel1");
+ this.splitContainer1.Panel1.Controls.Add(this.lvServers);
+ //
+ // splitContainer1.Panel2
+ //
+ resources.ApplyResources(this.splitContainer1.Panel2, "splitContainer1.Panel2");
+ this.splitContainer1.Panel2.Controls.Add(this.qrCodeControl);
+ this.splitContainer1.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.splitContainer1_SplitterMoved);
+ //
+ // lvServers
+ //
+ resources.ApplyResources(this.lvServers, "lvServers");
+ this.lvServers.ContextMenuStrip = this.cmsLv;
+ this.lvServers.FullRowSelect = true;
+ this.lvServers.GridLines = true;
+ this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+ 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
+ //
+ resources.ApplyResources(this.cmsLv, "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.menuCopyServer,
+ this.menuSetDefaultServer,
+ this.toolStripSeparator3,
+ this.menuMoveTop,
+ this.menuMoveUp,
+ this.menuMoveDown,
+ this.menuMoveBottom,
+ this.menuSelectAll,
+ this.toolStripSeparator9,
+ this.menuPingServer,
+ this.menuSpeedServer,
+ this.toolStripSeparator6,
+ this.menuExport2ClientConfig,
+ this.menuExport2ServerConfig,
+ this.menuExport2ShareUrl,
+ this.menuExport2SubContent});
+ this.cmsLv.Name = "cmsLv";
+ this.cmsLv.OwnerItem = this.tsbServer;
+ //
+ // menuAddVmessServer
+ //
+ resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer");
+ this.menuAddVmessServer.Name = "menuAddVmessServer";
+ this.menuAddVmessServer.Click += new System.EventHandler(this.menuAddVmessServer_Click);
+ //
+ // menuAddShadowsocksServer
+ //
+ resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer");
+ this.menuAddShadowsocksServer.Name = "menuAddShadowsocksServer";
+ this.menuAddShadowsocksServer.Click += new System.EventHandler(this.menuAddShadowsocksServer_Click);
+ //
+ // menuAddSocksServer
+ //
+ resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer");
+ this.menuAddSocksServer.Name = "menuAddSocksServer";
+ this.menuAddSocksServer.Click += new System.EventHandler(this.menuAddSocksServer_Click);
+ //
+ // menuAddCustomServer
+ //
+ resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer");
+ this.menuAddCustomServer.Name = "menuAddCustomServer";
+ this.menuAddCustomServer.Click += new System.EventHandler(this.menuAddCustomServer_Click);
+ //
+ // menuAddServers
+ //
+ resources.ApplyResources(this.menuAddServers, "menuAddServers");
+ this.menuAddServers.Name = "menuAddServers";
+ this.menuAddServers.Click += new System.EventHandler(this.menuAddServers_Click);
+ //
+ // menuScanScreen
+ //
+ resources.ApplyResources(this.menuScanScreen, "menuScanScreen");
+ this.menuScanScreen.Name = "menuScanScreen";
+ this.menuScanScreen.Click += new System.EventHandler(this.menuScanScreen_Click);
+ //
+ // toolStripSeparator1
+ //
+ resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1");
+ this.toolStripSeparator1.Name = "toolStripSeparator1";
+ //
+ // menuRemoveServer
+ //
+ resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer");
+ this.menuRemoveServer.Name = "menuRemoveServer";
+ this.menuRemoveServer.Click += new System.EventHandler(this.menuRemoveServer_Click);
+ //
+ // menuCopyServer
+ //
+ resources.ApplyResources(this.menuCopyServer, "menuCopyServer");
+ this.menuCopyServer.Name = "menuCopyServer";
+ this.menuCopyServer.Click += new System.EventHandler(this.menuCopyServer_Click);
+ //
+ // menuSetDefaultServer
+ //
+ resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer");
+ this.menuSetDefaultServer.Name = "menuSetDefaultServer";
+ this.menuSetDefaultServer.Click += new System.EventHandler(this.menuSetDefaultServer_Click);
+ //
+ // toolStripSeparator3
+ //
+ resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3");
+ this.toolStripSeparator3.Name = "toolStripSeparator3";
+ //
+ // menuMoveTop
+ //
+ resources.ApplyResources(this.menuMoveTop, "menuMoveTop");
+ this.menuMoveTop.Name = "menuMoveTop";
+ this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click);
+ //
+ // menuMoveUp
+ //
+ resources.ApplyResources(this.menuMoveUp, "menuMoveUp");
+ this.menuMoveUp.Name = "menuMoveUp";
+ this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click);
+ //
+ // menuMoveDown
+ //
+ resources.ApplyResources(this.menuMoveDown, "menuMoveDown");
+ this.menuMoveDown.Name = "menuMoveDown";
+ this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click);
+ //
+ // menuMoveBottom
+ //
+ resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom");
+ this.menuMoveBottom.Name = "menuMoveBottom";
+ this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click);
+ //
+ // menuSelectAll
+ //
+ resources.ApplyResources(this.menuSelectAll, "menuSelectAll");
+ this.menuSelectAll.Name = "menuSelectAll";
+ this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click);
+ //
+ // toolStripSeparator9
+ //
+ resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9");
+ this.toolStripSeparator9.Name = "toolStripSeparator9";
+ //
+ // menuPingServer
+ //
+ resources.ApplyResources(this.menuPingServer, "menuPingServer");
+ this.menuPingServer.Name = "menuPingServer";
+ this.menuPingServer.Click += new System.EventHandler(this.menuPingServer_Click);
+ //
+ // menuSpeedServer
+ //
+ resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer");
+ this.menuSpeedServer.Name = "menuSpeedServer";
+ this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click);
+ //
+ // toolStripSeparator6
+ //
+ resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6");
+ this.toolStripSeparator6.Name = "toolStripSeparator6";
+ //
+ // menuExport2ClientConfig
+ //
+ resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig");
+ this.menuExport2ClientConfig.Name = "menuExport2ClientConfig";
+ this.menuExport2ClientConfig.Click += new System.EventHandler(this.menuExport2ClientConfig_Click);
+ //
+ // menuExport2ServerConfig
+ //
+ resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig");
+ this.menuExport2ServerConfig.Name = "menuExport2ServerConfig";
+ this.menuExport2ServerConfig.Click += new System.EventHandler(this.menuExport2ServerConfig_Click);
+ //
+ // menuExport2ShareUrl
+ //
+ resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl");
+ this.menuExport2ShareUrl.Name = "menuExport2ShareUrl";
+ this.menuExport2ShareUrl.Click += new System.EventHandler(this.menuExport2ShareUrl_Click);
+ //
+ // menuExport2SubContent
+ //
+ resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent");
+ this.menuExport2SubContent.Name = "menuExport2SubContent";
+ this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click);
+ //
+ // tsbServer
+ //
+ resources.ApplyResources(this.tsbServer, "tsbServer");
+ this.tsbServer.DropDown = this.cmsLv;
+ this.tsbServer.Image = global::v2rayN.Properties.Resources.server;
+ this.tsbServer.Name = "tsbServer";
+ //
+ // qrCodeControl
+ //
+ resources.ApplyResources(this.qrCodeControl, "qrCodeControl");
+ this.qrCodeControl.Name = "qrCodeControl";
+ //
+ // notifyMain
+ //
+ resources.ApplyResources(this.notifyMain, "notifyMain");
+ this.notifyMain.ContextMenuStrip = this.cmsMain;
+ this.notifyMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyMain_MouseClick);
+ //
+ // cmsMain
+ //
+ resources.ApplyResources(this.cmsMain, "cmsMain");
+ this.cmsMain.ImageScalingSize = new System.Drawing.Size(20, 20);
+ 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
+ //
+ resources.ApplyResources(this.menuSysAgentEnabled, "menuSysAgentEnabled");
+ this.menuSysAgentEnabled.Name = "menuSysAgentEnabled";
+ this.menuSysAgentEnabled.Click += new System.EventHandler(this.menuSysAgentEnabled_Click);
+ //
+ // menuSysAgentMode
+ //
+ resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode");
+ this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.menuGlobal,
+ this.menuGlobalPAC,
+ this.menuKeep,
+ this.menuKeepPAC});
+ this.menuSysAgentMode.Name = "menuSysAgentMode";
+ //
+ // menuGlobal
+ //
+ resources.ApplyResources(this.menuGlobal, "menuGlobal");
+ this.menuGlobal.Name = "menuGlobal";
+ this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click);
+ //
+ // menuGlobalPAC
+ //
+ resources.ApplyResources(this.menuGlobalPAC, "menuGlobalPAC");
+ this.menuGlobalPAC.Name = "menuGlobalPAC";
+ this.menuGlobalPAC.Click += new System.EventHandler(this.menuGlobalPAC_Click);
+ //
+ // menuKeep
+ //
+ resources.ApplyResources(this.menuKeep, "menuKeep");
+ this.menuKeep.Name = "menuKeep";
+ this.menuKeep.Click += new System.EventHandler(this.menuKeep_Click);
+ //
+ // menuKeepPAC
+ //
+ resources.ApplyResources(this.menuKeepPAC, "menuKeepPAC");
+ this.menuKeepPAC.Name = "menuKeepPAC";
+ this.menuKeepPAC.Click += new System.EventHandler(this.menuKeepPAC_Click);
+ //
+ // menuServers
+ //
+ resources.ApplyResources(this.menuServers, "menuServers");
+ this.menuServers.Name = "menuServers";
+ //
+ // menuAddServers2
+ //
+ resources.ApplyResources(this.menuAddServers2, "menuAddServers2");
+ this.menuAddServers2.Name = "menuAddServers2";
+ this.menuAddServers2.Click += new System.EventHandler(this.menuAddServers_Click);
+ //
+ // menuScanScreen2
+ //
+ resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2");
+ this.menuScanScreen2.Name = "menuScanScreen2";
+ this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click);
+ //
+ // menuCopyPACUrl
+ //
+ resources.ApplyResources(this.menuCopyPACUrl, "menuCopyPACUrl");
+ this.menuCopyPACUrl.Name = "menuCopyPACUrl";
+ this.menuCopyPACUrl.Click += new System.EventHandler(this.menuCopyPACUrl_Click);
+ //
+ // toolStripSeparator2
+ //
+ resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2");
+ this.toolStripSeparator2.Name = "toolStripSeparator2";
+ //
+ // menuExit
+ //
+ resources.ApplyResources(this.menuExit, "menuExit");
+ this.menuExit.Name = "menuExit";
+ this.menuExit.Click += new System.EventHandler(this.menuExit_Click);
+ //
+ // bgwPing
+ //
+ this.bgwPing.WorkerReportsProgress = true;
+ this.bgwPing.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgwPing_DoWork);
+ this.bgwPing.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgwPing_ProgressChanged);
+ //
+ // 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
+ //
+ resources.ApplyResources(this.groupBox1, "groupBox1");
+ this.groupBox1.Controls.Add(this.splitContainer1);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.TabStop = false;
+ //
+ // groupBox2
+ //
+ resources.ApplyResources(this.groupBox2, "groupBox2");
+ this.groupBox2.Controls.Add(this.txtMsgBox);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.TabStop = false;
+ //
+ // txtMsgBox
+ //
+ resources.ApplyResources(this.txtMsgBox, "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;
+ this.txtMsgBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(226)))), ((int)(((byte)(228)))));
+ this.txtMsgBox.Name = "txtMsgBox";
+ this.txtMsgBox.ReadOnly = true;
+ //
+ // panel1
+ //
+ resources.ApplyResources(this.panel1, "panel1");
+ this.panel1.Name = "panel1";
+ //
+ // tsMain
+ //
+ resources.ApplyResources(this.tsMain, "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});
+ this.tsMain.Name = "tsMain";
+ //
+ // toolStripSeparator4
+ //
+ resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4");
+ this.toolStripSeparator4.Name = "toolStripSeparator4";
+ //
+ // tsbSub
+ //
+ resources.ApplyResources(this.tsbSub, "tsbSub");
+ this.tsbSub.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.tsbSubSetting,
+ this.tsbSubUpdate});
+ this.tsbSub.Image = global::v2rayN.Properties.Resources.sub;
+ this.tsbSub.Name = "tsbSub";
+ //
+ // tsbSubSetting
+ //
+ resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting");
+ this.tsbSubSetting.Name = "tsbSubSetting";
+ this.tsbSubSetting.Click += new System.EventHandler(this.tsbSubSetting_Click);
+ //
+ // tsbSubUpdate
+ //
+ resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate");
+ this.tsbSubUpdate.Name = "tsbSubUpdate";
+ this.tsbSubUpdate.Click += new System.EventHandler(this.tsbSubUpdate_Click);
+ //
+ // toolStripSeparator8
+ //
+ resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8");
+ this.toolStripSeparator8.Name = "toolStripSeparator8";
+ //
+ // tsbOptionSetting
+ //
+ resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting");
+ this.tsbOptionSetting.Image = global::v2rayN.Properties.Resources.option;
+ this.tsbOptionSetting.Name = "tsbOptionSetting";
+ this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click);
+ //
+ // toolStripSeparator5
+ //
+ resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5");
+ this.toolStripSeparator5.Name = "toolStripSeparator5";
+ //
+ // tsbReload
+ //
+ resources.ApplyResources(this.tsbReload, "tsbReload");
+ this.tsbReload.Name = "tsbReload";
+ this.tsbReload.Click += new System.EventHandler(this.tsbReload_Click);
+ //
+ // toolStripSeparator7
+ //
+ resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7");
+ this.toolStripSeparator7.Name = "toolStripSeparator7";
+ //
+ // tsbCheckUpdate
+ //
+ resources.ApplyResources(this.tsbCheckUpdate, "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;
+ this.tsbCheckUpdate.Name = "tsbCheckUpdate";
+ //
+ // tsbCheckUpdateN
+ //
+ resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN");
+ this.tsbCheckUpdateN.Name = "tsbCheckUpdateN";
+ this.tsbCheckUpdateN.Click += new System.EventHandler(this.tsbCheckUpdateN_Click);
+ //
+ // tsbCheckUpdateCore
+ //
+ resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore");
+ this.tsbCheckUpdateCore.Name = "tsbCheckUpdateCore";
+ this.tsbCheckUpdateCore.Click += new System.EventHandler(this.tsbCheckUpdateCore_Click);
+ //
+ // tsbCheckUpdatePACList
+ //
+ resources.ApplyResources(this.tsbCheckUpdatePACList, "tsbCheckUpdatePACList");
+ this.tsbCheckUpdatePACList.Name = "tsbCheckUpdatePACList";
+ this.tsbCheckUpdatePACList.Click += new System.EventHandler(this.tsbCheckUpdatePACList_Click);
+ //
+ // tsbCheckClearPACList
+ //
+ resources.ApplyResources(this.tsbCheckClearPACList, "tsbCheckClearPACList");
+ this.tsbCheckClearPACList.Name = "tsbCheckClearPACList";
+ this.tsbCheckClearPACList.Click += new System.EventHandler(this.tsbCheckClearPACList_Click);
+ //
+ // toolStripSeparator10
+ //
+ resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10");
+ this.toolStripSeparator10.Name = "toolStripSeparator10";
+ //
+ // tsbHelp
+ //
+ resources.ApplyResources(this.tsbHelp, "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;
+ this.tsbHelp.Name = "tsbHelp";
+ //
+ // tsbAbout
+ //
+ resources.ApplyResources(this.tsbAbout, "tsbAbout");
+ this.tsbAbout.Name = "tsbAbout";
+ this.tsbAbout.Click += new System.EventHandler(this.tsbAbout_Click);
+ //
+ // toolStripSeparator12
+ //
+ resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12");
+ this.toolStripSeparator12.Name = "toolStripSeparator12";
+ //
+ // tsbLanguageDef
+ //
+ resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef");
+ this.tsbLanguageDef.Name = "tsbLanguageDef";
+ this.tsbLanguageDef.Click += new System.EventHandler(this.tsbLanguageDef_Click);
+ //
+ // tsbLanguageZhHans
+ //
+ resources.ApplyResources(this.tsbLanguageZhHans, "tsbLanguageZhHans");
+ this.tsbLanguageZhHans.Name = "tsbLanguageZhHans";
+ this.tsbLanguageZhHans.Click += new System.EventHandler(this.tsbLanguageZhHans_Click);
+ //
+ // tsbPromotion
+ //
+ resources.ApplyResources(this.tsbPromotion, "tsbPromotion");
+ this.tsbPromotion.ForeColor = System.Drawing.Color.Black;
+ this.tsbPromotion.Image = global::v2rayN.Properties.Resources.promotion;
+ this.tsbPromotion.Name = "tsbPromotion";
+ this.tsbPromotion.Click += new System.EventHandler(this.tsbPromotion_Click);
+ //
+ // toolStripSeparator11
+ //
+ resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11");
+ this.toolStripSeparator11.Name = "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.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.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 System.Windows.Forms.ListView 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.ComponentModel.BackgroundWorker bgwPing;
+ 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;
+ }
+}
+
diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs
new file mode 100644
index 0000000000..e9a94ce429
--- /dev/null
+++ b/v2rayN/v2rayN/Forms/MainForm.cs
@@ -0,0 +1,1370 @@
+using System;
+using System.IO.Compression;
+using System.Text;
+using System.Windows.Forms;
+using v2rayN.Handler;
+using v2rayN.HttpProxyHandler;
+using v2rayN.Mode;
+using System.Collections.Generic;
+using System.IO;
+
+namespace v2rayN.Forms
+{
+ public partial class MainForm : BaseForm
+ {
+ private V2rayHandler v2rayHandler;
+ private PACListHandle pacListHandle;
+ private V2rayUpdateHandle v2rayUpdateHandle;
+ private V2rayUpdateHandle v2rayUpdateHandle2;
+ private List lvSelecteds = new List();
+
+ #region Window 事件
+
+ public MainForm()
+ {
+ InitializeComponent();
+ this.ShowInTaskbar = false;
+ //this.WindowState = FormWindowState.Minimized;
+ HideForm();
+ this.Text = Utils.GetVersion();
+
+ Application.ApplicationExit += (sender, args) =>
+ {
+ Utils.ClearTempPath();
+ };
+ }
+
+ private void MainForm_Load(object sender, EventArgs e)
+ {
+ ConfigHandler.LoadConfig(ref config);
+ v2rayHandler = new V2rayHandler();
+ v2rayHandler.ProcessEvent += v2rayHandler_ProcessEvent;
+
+ }
+
+ private void MainForm_Shown(object sender, EventArgs e)
+ {
+ InitServersView();
+ RefreshServers();
+
+ LoadV2ray();
+
+ HideForm();
+
+ }
+
+ private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
+ {
+ if (e.CloseReason == CloseReason.UserClosing)
+ {
+ e.Cancel = true;
+
+ HideForm();
+ return;
+ }
+ }
+
+ 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:
+ // CloseV2ray();
+ // 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"), 100, HorizontalAlignment.Left);
+
+ }
+
+ ///
+ /// 刷新服务器列表
+ ///
+ private void RefreshServersView()
+ {
+ lvServers.Items.Clear();
+
+ for (int k = 0; k < config.vmess.Count; k++)
+ {
+ string def = string.Empty;
+ if (config.index.Equals(k))
+ {
+ def = "√";
+ }
+
+ VmessItem item = config.vmess[k];
+ ListViewItem 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
+ });
+ 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);
+ }
+
+ #endregion
+
+ #region v2ray 操作
+
+ ///
+ /// 载入V2ray
+ ///
+ private void LoadV2ray()
+ {
+ if (Global.reloadV2ray)
+ {
+ ClearMsg();
+ }
+ v2rayHandler.LoadV2ray(config);
+ Global.reloadV2ray = false;
+
+ ChangeSysAgent(config.sysAgentEnabled);
+ }
+
+ ///
+ /// 关闭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;
+ }
+ }
+ 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 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();
+ bgwPing.RunWorkerAsync();
+ }
+
+ 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();
+ ServerSpeedTest();
+ }
+
+ 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();
+ //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 bgwPing_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
+ {
+ try
+ {
+ for (int k = 0; k < lvSelecteds.Count; k++)
+ {
+ int index = lvSelecteds[k];
+ if (config.vmess[index].configType == (int)EConfigType.Custom)
+ {
+ continue;
+ }
+ long time = Utils.Ping(config.vmess[index].address);
+ bgwPing.ReportProgress(index, string.Format("{0}ms", time));
+ }
+ }
+ catch
+ {
+ }
+ }
+
+ private void bgwPing_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
+ {
+ try
+ {
+ int k = e.ProgressPercentage;
+ string time = string.Format("{0}", Convert.ToString(e.UserState));
+ SetTestResult(k, time);
+ }
+ catch
+ {
+ }
+ }
+ private void SetTestResult(int k, string txt)
+ {
+ config.vmess[k].testResult = txt;
+ lvServers.Items[k].SubItems[lvServers.Items[k].SubItems.Count - 1].Text = txt;
+ }
+ private void ClearTestResult()
+ {
+ for (int k = 0; k < config.vmess.Count; k++)
+ {
+ SetTestResult(k, "");
+ }
+ }
+
+ private int testCounter = 0;
+ private int ServerSpeedTestSub(int index, string url)
+ {
+ if (index >= lvSelecteds.Count)
+ {
+ return -1;
+ }
+
+ if (ConfigHandler.SetDefaultServer(ref config, lvSelecteds[index]) == 0)
+ {
+ SetTestResult(lvSelecteds[index], "testing...");
+
+ v2rayHandler.LoadV2ray(config);
+ v2rayUpdateHandle2.DownloadFileAsync(config, url);
+ testCounter++;
+ return 0;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+ private void ServerSpeedTest()
+ {
+ if (config.vmess.Count <= 0)
+ {
+ return;
+ }
+ ClearTestResult();
+
+ string url = Global.SpeedTestUrl;
+ testCounter = 0;
+ if (v2rayUpdateHandle2 == null)
+ {
+ v2rayUpdateHandle2 = new V2rayUpdateHandle();
+ v2rayUpdateHandle2.UpdateCompleted += (sender2, args) =>
+ {
+ if (args.Success)
+ {
+ AppendText(false, args.Msg);
+ SetTestResult(lvSelecteds[testCounter - 1], args.Msg);
+
+ if (ServerSpeedTestSub(testCounter, url) != 0)
+ {
+ RefreshServers();
+ return;
+ }
+ }
+ else
+ {
+ AppendText(false, args.Msg);
+ }
+ };
+ v2rayUpdateHandle2.Error += (sender2, args) =>
+ {
+ SetTestResult(lvSelecteds[testCounter - 1], args.GetException().Message);
+ AppendText(true, args.GetException().Message);
+
+ if (ServerSpeedTestSub(testCounter, url) != 0)
+ {
+ RefreshServers();
+ return;
+ }
+ };
+ }
+ if (ServerSpeedTestSub(testCounter, url) != 0)
+ {
+ return;
+ }
+ }
+ #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;
+ }
+ }
+
+ }
+
+ ///
+ /// 改变系统代理
+ ///
+ ///
+ 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;
+ }
+ #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 (string.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.Trim();
+ string url = config.subItem[k - 1].url.Trim();
+ 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 0000000000..99934306ce
--- /dev/null
+++ b/v2rayN/v2rayN/Forms/MainForm.resx
@@ -0,0 +1,1217 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+ 447, 22
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Magenta
+
+
+ 447, 22
+
+
+ 97, 53
+
+
+ 447, 22
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Restart service
+
+
+ tsbSubSetting
+
+
+ menuMoveUp
+
+
+ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 语言-[中文简体]
+
+
+
+ NoControl
+
+
+ Top
+
+
+ tsbHelp
+
+
+ 338, 22
+
+
+ System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ toolStripSeparator6
+
+
+ 93, 53
+
+
+ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 187, 22
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 447, 22
+
+
+ tsbCheckUpdateN
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ menuExport2SubContent
+
+
+ toolStripSeparator7
+
+
+ Check for updates to v2rayCore
+
+
+ Magenta
+
+
+ 447, 22
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Fill
+
+
+ Subscription
+
+
+ 992, 351
+
+
+ 447, 22
+
+
+ Export selected server for client configuration
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Export selected server for server configuration
+
+
+ splitContainer1
+
+
+ ImageAboveText
+
+
+ System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 992, 56
+
+
+ Bottom
+
+
+ 992, 176
+
+
+
+ 100
+
+
+ 448, 468
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ v2rayN
+
+
+ 444, 6
+
+
+ 447, 22
+
+
+ toolStripSeparator1
+
+
+ 4
+
+
+ System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 338, 22
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 187, 22
+
+
+ System.Windows.Forms.ToolStripMenuItem, 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
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd
+ QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X
+ jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY
+ 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3
+ NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY
+ B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg==
+
+
+
+ Servers
+
+
+ 3
+
+
+ 3, 17
+
+
+ Fill
+
+
+ 6, 56
+
+
+ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ menuAddCustomServer
+
+
+ menuMoveDown
+
+
+ Import bulk URL from clipboard
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Moves down to the bottom
+
+
+ 6, 12
+
+
+ 48, 53
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ menuGlobalPAC
+
+
+ Fill
+
+
+ 726, 331
+
+
+ toolStripSeparator4
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Batch export share URL to clipboard (multiple choice)
+
+
+ Update subscription
+
+
+ menuAddServers2
+
+
+ Fill
+
+
+ 2
+
+
+ Add [VMess] server
+
+
+ 264, 22
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+
+
+ tsbAbout
+
+
+ 0
+
+
+ toolStripSeparator5
+
+
+ True
+
+
+ 444, 6
+
+
+ tsbPromotion
+
+
+ 256, 331
+
+
+ 4, 4, 4, 4
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 444, 6
+
+
+ groupBox1
+
+
+ Add [Socks] server
+
+
+ 0
+
+
+ 197, 22
+
+
+ splitContainer1.Panel2
+
+
+ 52, 53
+
+
+ 447, 22
+
+
+ 6, 56
+
+
+ Test server speed (multiple choice)
+
+
+ ImageAboveText
+
+
+ splitContainer1
+
+
+ 265, 164
+
+
+ 547, 22
+
+
+ $this
+
+
+ System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Check for updates
+
+
+ tsbLanguageDef
+
+
+ panel1
+
+
+ 3, 17
+
+
+ 4
+
+
+ 197, 22
+
+
+ Only open Http proxy, do not automatically configure proxy server (direct mode)
+
+
+ 547, 22
+
+
+ Magenta
+
+
+ Remove selected server (multiple choice) (Delete)
+
+
+ 0
+
+
+ Help
+
+
+ menuSelectAll
+
+
+ Up to top
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Scan QR code on the screen
+
+
+ ImageAboveText
+
+
+ tsbCheckUpdate
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ menuSetDefaultServer
+
+
+ Promotion
+
+
+ menuAddServers
+
+
+ 447, 22
+
+
+ menuAddVmessServer
+
+
+ tsbLanguageZhHans
+
+
+ toolStripSeparator9
+
+
+ BottomCenter
+
+
+ menuExport2ShareUrl
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tsbReload
+
+
+ Check for updates to v2rayN
+
+
+ Magenta
+
+
+ splitContainer1.Panel1
+
+
+ 0, 66
+
+
+ 5
+
+
+ Server
+
+
+ System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ menuAddShadowsocksServer
+
+
+ txtMsgBox
+
+
+ 261, 6
+
+
+ System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ v2rayN
+
+
+ Language-[English]
+
+
+ 264, 22
+
+
+ menuScanScreen2
+
+
+ 0
+
+
+ 128, 53
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ ImageAboveText
+
+
+ System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 0, 417
+
+
+ 444, 6
+
+
+ 264, 22
+
+
+ Setting
+
+
+ menuMoveTop
+
+
+ menuKeep
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
+ LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0
+ ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu
+ PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA
+ BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5
+ bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp
+ bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz
+ dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA
+ CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp
+ bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5
+ bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3
+ ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0
+ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw==
+
+
+
+ menuScanScreen
+
+
+ cmsLv
+
+
+ toolStripSeparator12
+
+
+ 6, 56
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tsbSubUpdate
+
+
+ tsMain
+
+
+ 2
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ menuSysAgentMode
+
+
+ 986, 331
+
+
+ ImageAboveText
+
+
+ 447, 22
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 1
+
+
+ cmsMain
+
+
+ 264, 22
+
+
+ menuServers
+
+
+ $this
+
+
+ 0
+
+
+ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tsbClose
+
+
+ menuExport2ClientConfig
+
+
+ True
+
+
+ 6, 56
+
+
+ 992, 10
+
+
+ menuKeepPAC
+
+
+ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 0
+
+
+ toolStripSeparator8
+
+
+ 89, 53
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Test server delay (multiple choice)
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 447, 22
+
+
+ 264, 22
+
+
+ menuSysAgentEnabled
+
+
+ System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Enable Http proxy
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Subscription settings
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ menuCopyServer
+
+
+ Http proxy mode
+
+
+ 547, 22
+
+
+ Only open PAC, do not automatically configure PAC
+
+
+ 447, 22
+
+
+ MainForm
+
+
+ System.Windows.Forms.ToolStripDropDownButton, 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
+
+
+ Server list
+
+
+ lvServers
+
+
+ splitContainer1.Panel1
+
+
+ Magenta
+
+
+ menuGlobal
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 5
+
+
+ Check for updated PAC (requires Http proxy)
+
+
+ toolStripSeparator11
+
+
+ 447, 22
+
+
+ About
+
+
+ System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Select All (Ctrl+A)
+
+
+ Information
+
+
+ $this
+
+
+ System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tsbCheckUpdateCore
+
+
+ 447, 22
+
+
+ menuRemoveServer
+
+
+ 986, 156
+
+
+ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Windows.Forms.NotifyIcon, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Down (D)
+
+
+ menuCopyPACUrl
+
+
+ groupBox1
+
+
+ 447, 22
+
+
+ tsbSub
+
+
+ Magenta
+
+
+ ImageAboveText
+
+
+ Copy selected server
+
+
+ 0, 0
+
+
+ 447, 22
+
+
+ System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox2
+
+
+ Simplify PAC (please set Core route)
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Vertical
+
+
+ 447, 22
+
+
+ v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+
+
+ System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ 0, 0
+
+
+ qrCodeControl
+
+
+ 264, 22
+
+
+ tsbServer
+
+
+ 1
+
+
+ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox2
+
+
+ ImageAboveText
+
+
+ splitContainer1.Panel2
+
+
+ 338, 22
+
+
+ 184, 6
+
+
+ 0, 0
+
+
+ Upward (U)
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ notifyMain
+
+
+ Open Http proxy and automatically configure proxy server (global mode)
+
+
+ tsbOptionSetting
+
+
+ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ menuAddSocksServer
+
+
+ 64, 53
+
+
+ Magenta
+
+
+ Open PAC and automatically configure PAC (PAC mode)
+
+
+ 447, 22
+
+
+ Set as active server (Enter)
+
+
+ bgwPing
+
+
+ 726
+
+
+ 6, 56
+
+
+ Add [Shadowsocks] server
+
+
+ splitContainer1
+
+
+ 992, 593
+
+
+ 547, 22
+
+
+ tsbCheckClearPACList
+
+
+ Scan QR code on the screen
+
+
+ toolStripSeparator10
+
+
+ menuMoveBottom
+
+
+ 338, 22
+
+
+ 6
+
+
+ Magenta
+
+
+ 187, 22
+
+
+ menuExport2ServerConfig
+
+
+ 0
+
+
+ ImageAboveText
+
+
+ 6, 56
+
+
+ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Batch export subscription content to clipboard (multiple choice)
+
+
+ 52, 53
+
+
+ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Exit
+
+
+ bgwScan
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 0, 56
+
+
+ Close
+
+
+ 264, 22
+
+
+ System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Import bulk URL from clipboard
+
+
+ toolStripSeparator2
+
+
+ Add a custom configuration server
+
+
+ System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 2
+
+
+ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ menuSpeedServer
+
+
+ 2
+
+
+ Fill
+
+
+ Copy local PAC URL
+
+
+ toolStripSeparator3
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/
+ GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg==
+
+
+
+ 447, 22
+
+
+ 447, 22
+
+
+ System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tsbCheckUpdatePACList
+
+
+ 232, 17
+
+
+ zh-Hans
+
+
+ True
+
+
+ 65
+
+
+ 137, 17
+
+
+ 498, 17
+
+
+ 17, 17
+
+
+ 409, 17
+
+
+ 327, 17
+
+
\ 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 0000000000..8395e525d6
--- /dev/null
+++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx
@@ -0,0 +1,453 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+ 252, 22
+
+
+ 添加[VMess]服务器
+
+
+ 252, 22
+
+
+ 添加[Shadowsocks]服务器
+
+
+ 252, 22
+
+
+ 添加[Socks]服务器
+
+
+ 252, 22
+
+
+ 添加自定义配置服务器
+
+
+ 252, 22
+
+
+ 从剪贴板导入批量URL
+
+
+ 252, 22
+
+
+ 扫描屏幕上的二维码
+
+
+ 249, 6
+
+
+ 252, 22
+
+
+ 移除所选服务器(多选) (Delete)
+
+
+ 252, 22
+
+
+ 复制所选服务器
+
+
+ 252, 22
+
+
+ 设为活动服务器 (Enter)
+
+
+ 249, 6
+
+
+ 252, 22
+
+
+ 上移至顶
+
+
+ 252, 22
+
+
+ 上移 (U)
+
+
+ 252, 22
+
+
+ 下移 (D)
+
+
+ 252, 22
+
+
+ 下移至底
+
+
+ 252, 22
+
+
+ 全选 (Ctrl+A)
+
+
+ 249, 6
+
+
+ 252, 22
+
+
+ 测试服务器延迟(多选)
+
+
+ 252, 22
+
+
+ 测试服务器速度(多选)
+
+
+ 249, 6
+
+
+ 252, 22
+
+
+ 导出所选服务器为客户端配置
+
+
+ 252, 22
+
+
+ 导出所选服务器为服务端配置
+
+
+ 252, 22
+
+
+ 批量导出分享URL至剪贴板(多选)
+
+
+ 252, 22
+
+
+ 批量导出订阅内容至剪贴板(多选)
+
+
+ 73, 53
+
+
+ 服务器
+
+
+ 253, 468
+
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
+ LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0
+ ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu
+ PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA
+ BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5
+ bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp
+ bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz
+ dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA
+ CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp
+ bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5
+ bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3
+ ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0
+ ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw==
+
+
+
+ 195, 22
+
+
+ 启用Http代理
+
+
+ 340, 22
+
+
+ 开启Http代理,并自动配置代理服务器(全局模式)
+
+
+ 340, 22
+
+
+ 开启PAC,并自动配置PAC(PAC模式)
+
+
+ 340, 22
+
+
+ 仅开启Http代理,不自动配置代理服务器(直连模式)
+
+
+ 340, 22
+
+
+ 仅开启PAC,不自动配置PAC
+
+
+ 195, 22
+
+
+ Http代理模式
+
+
+ 195, 22
+
+
+ 服务器
+
+
+ 195, 22
+
+
+ 从剪贴板导入批量URL
+
+
+ 195, 22
+
+
+ 扫描屏幕上的二维码
+
+
+ 195, 22
+
+
+ 复制本地PAC网址
+
+
+ 192, 6
+
+
+ 195, 22
+
+
+ 退出
+
+
+ 196, 164
+
+
+ 服务器列表
+
+
+ 信息
+
+
+ 124, 22
+
+
+ 订阅设置
+
+
+ 124, 22
+
+
+ 更新订阅
+
+
+ 61, 53
+
+
+ 订阅
+
+
+ 76, 53
+
+
+ 参数设置
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAE3SURBVFhH7ZaBDQIhDEVvBEdwBDfQDXQER3AD3cARdAPd
+ QDfSDbQvuSb1AicFjJrwkxcN0FIolOuamv5VE2E+gLaPayWchEcE+hhTXVPhIoQmDcFYbKpoJtwEdX4X
+ jgIrXfTwnzb6dBw22BaJVdjJmWQs1/SdBRtE0U5cBXW2oSFRO0HtSEeW2FZ1wsq9sjuRdTDVAXnNuWLY
+ 6JnAl0sYa/Q5q1dhq35ci+Bkq2HJvbZpxGeybAAuw4Fq+cnW1wPITgHFYxvBUw+qHEIL1yq1vDKhVlH3
+ NQwF4JkcFRWiUAB7IVW2FFPO3YqlgPd+LJf02e8Fdi3rMdIAcLDuf9UpeT0IS0G/hvhPm305vSl7EQFY
+ B6zCvozvYGzRM8zEoeg5TPZwDaGvpHQni1yzSxbXPW9q+hF13ROHuJnQcjbhtQAAAABJRU5ErkJggg==
+
+
+
+ 76, 53
+
+
+ 重启服务
+
+
+ 232, 22
+
+
+ 检查更新v2rayN
+
+
+ 232, 22
+
+
+ 检查更新v2rayCore
+
+
+ 232, 22
+
+
+ 检查更新PAC (需要Http代理)
+
+
+ 232, 22
+
+
+ 简化PAC (请设置Core路由)
+
+
+ 85, 53
+
+
+ 检查更新
+
+
+ 关于
+
+
+ 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 0000000000..8c5eb9b9a8
--- /dev/null
+++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs
@@ -0,0 +1,623 @@
+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()
+ {
+ 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.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.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();
+ 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.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;
+ //
+ // 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";
+ //
+ // 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);
+ 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;
+ }
+}
\ 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 0000000000..6cf8ebb41e
--- /dev/null
+++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs
@@ -0,0 +1,361 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Text;
+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;
+
+ }
+
+ 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.Trim();
+
+ //Mux
+ bool muxEnabled = chkmuxEnabled.Checked;
+
+ //本地监听
+ string localPort = txtlocalPort.Text.Trim();
+ string protocol = cmbprotocol.Text.Trim();
+ 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.Trim();
+ string protocol2 = cmbprotocol2.Text.Trim();
+ 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.Trim();
+
+ return 0;
+ }
+
+ ///
+ /// 保存路由设置
+ ///
+ ///
+ private int SaveRouting()
+ {
+ //路由
+ string domainStrategy = cmbdomainStrategy.Text;
+ string routingMode = cmbroutingMode.SelectedIndex.ToString();
+
+ string useragent = txtUseragent.Text.Trim();
+ string userdirect = txtUserdirect.Text.Trim();
+ string userblock = txtUserblock.Text.Trim();
+
+ 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.Trim();
+ string tti = txtKcptti.Text.Trim();
+ string uplinkCapacity = txtKcpuplinkCapacity.Text.Trim();
+ string downlinkCapacity = txtKcpdownlinkCapacity.Text.Trim();
+ string readBufferSize = txtKcpreadBufferSize.Text.Trim();
+ string writeBufferSize = txtKcpwriteBufferSize.Text.Trim();
+ 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.Trim();
+
+ config.allowLANConn = chkAllowLANConn.Checked;
+
+ 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;
+ }
+ }
+}
diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx
new file mode 100644
index 0000000000..9a4a727c42
--- /dev/null
+++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx
@@ -0,0 +1,2247 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ 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
+
+
+ tabPage3
+
+
+ System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabControl2
+
+
+ 0
+
+
+ tabPage4
+
+
+ System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabControl2
+
+
+ 1
+
+
+ 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
+
+
+ chkKcpcongestion
+
+
+ System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage6
+
+
+ 0
+
+
+ txtKcpwriteBufferSize
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage6
+
+
+ 1
+
+
+ label10
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage6
+
+
+ 2
+
+
+ txtKcpreadBufferSize
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage6
+
+
+ 3
+
+
+ label11
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage6
+
+
+ 4
+
+
+ txtKcpdownlinkCapacity
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage6
+
+
+ 5
+
+
+ label8
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage6
+
+
+ 6
+
+
+ txtKcpuplinkCapacity
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage6
+
+
+ 7
+
+
+ label9
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage6
+
+
+ 8
+
+
+ txtKcptti
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage6
+
+
+ 9
+
+
+ label7
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage6
+
+
+ 10
+
+
+ txtKcpmtu
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage6
+
+
+ 11
+
+
+ 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
+
+
+ chkAllowLANConn
+
+
+ System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage7
+
+
+ 0
+
+
+ txturlGFWList
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage7
+
+
+ 1
+
+
+ label13
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage7
+
+
+ 2
+
+
+ chkAutoRun
+
+
+ System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage7
+
+
+ 3
+
+
+ 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
+
+
+ chksniffingEnabled2
+
+
+ System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 0
+
+
+ chksniffingEnabled
+
+
+ System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 1
+
+
+ txtremoteDNS
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 2
+
+
+ label14
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 3
+
+
+ chkmuxEnabled
+
+
+ System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 4
+
+
+ chkAllowIn2
+
+
+ System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 5
+
+
+ chkudpEnabled2
+
+
+ System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 6
+
+
+ cmbprotocol2
+
+
+ System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 7
+
+
+ label3
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 8
+
+
+ txtlocalPort2
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 9
+
+
+ cmbprotocol
+
+
+ System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 10
+
+
+ label1
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 11
+
+
+ chkudpEnabled
+
+
+ System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 12
+
+
+ chklogEnabled
+
+
+ System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 13
+
+
+ cmbloglevel
+
+
+ System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 14
+
+
+ label5
+
+
+ System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 15
+
+
+ txtlocalPort
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ groupBox1
+
+
+ 16
+
+
+ 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
+
+
+ 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
+
+
+ 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
+
+
+ 0
+
+
+ txtUseragent
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage3
+
+
+ 0
+
+
+ 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
+
+
+ txtUserdirect
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage4
+
+
+ 0
+
+
+ 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, 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
+
+
+ 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
+
+
+ True
+
+
+ 15, 42
+
+
+ 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
+
+
+ 0
+
+
+ 30, 132
+
+
+ 468, 21
+
+
+ 28
+
+
+ txturlGFWList
+
+
+ System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ tabPage7
+
+
+ 1
+
+
+ True
+
+
+ 30, 111
+
+
+ 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
+
+
+ 2
+
+
+ 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
+
+
+ 3
+
+
+ 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
+
+
+ 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
+
+
+ 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
+
+
+ True
+
+
+ 6, 12
+
+
+ 638, 675
+
+
+ 4, 4, 4, 4
+
+
+ Settings
+
+
+ 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 0000000000..d0a2519d63
--- /dev/null
+++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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)
+
+
+ 参数设置
+
+
\ 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 0000000000..5d0a2624aa
--- /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 0000000000..b9c86ed369
--- /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 (string.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 0000000000..ef0c4f0494
--- /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 0000000000..991ed0d021
--- /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 0000000000..733adb4703
--- /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 0000000000..d170b173c5
--- /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 0000000000..1af7de150c
--- /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 0000000000..30fcadf5e8
--- /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 0000000000..26f83e3d53
--- /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.Trim();
+ subItem.url = txtUrl.Text.Trim();
+ 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 0000000000..af5f03e909
--- /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 0000000000..12e6dbd4dd
--- /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 0000000000..489693c839
--- /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 0000000000..14b5fbf61e
--- /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 0000000000..05d3db7b73
--- /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 0000000000..628dd5abaa
--- /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 0000000000..5046c45987
--- /dev/null
+++ b/v2rayN/v2rayN/Global.cs
@@ -0,0 +1,170 @@
+
+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";
+
+ ///
+ /// 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";
+
+ ///
+ /// vmess
+ ///
+ public const string vmessProtocol = "vmess://";
+ ///
+ /// shadowsocks
+ ///
+ public const string ssProtocol = "ss://";
+ ///
+ /// socks
+ ///
+ public const string socksProtocol = "socks://";
+
+ ///
+ /// 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";
+
+ #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; }
+
+ #endregion
+
+
+
+ }
+}
diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs
new file mode 100644
index 0000000000..ecefedf04a
--- /dev/null
+++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs
@@ -0,0 +1,784 @@
+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;
+ }
+
+ //本地监听
+ 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 == 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;
+ 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.Trim(); //备注也许很长 ;
+ 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}",
+ 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;
+ 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;
+ 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;
+ 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;
+ }
+
+ ///
+ /// 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 0000000000..ec43bce1bb
--- /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 0000000000..e5433dec32
--- /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 0000000000..57d4f56466
--- /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/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs
new file mode 100644
index 0000000000..531c501b12
--- /dev/null
+++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs
@@ -0,0 +1,1264 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using v2rayN.Mode;
+using System.Net;
+using System.Text;
+
+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);
+
+ 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].Trim();
+ 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();
+
+ 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();
+ streamSettings.security = config.streamSecurity();
+
+ //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 host2 = config.requestHost();
+ string path = config.path();
+ if (!string.IsNullOrWhiteSpace(host2))
+ {
+ wsSettings.headers = new Headers();
+ wsSettings.headers.Host = host2;
+ }
+ if (!string.IsNullOrWhiteSpace(path))
+ {
+ wsSettings.path = path;
+ }
+ streamSettings.wsSettings = wsSettings;
+
+ TlsSettings tlsSettings = new TlsSettings();
+ tlsSettings.allowInsecure = config.allowInsecure();
+ if (!string.IsNullOrWhiteSpace(host2))
+ {
+ tlsSettings.serverName = host2;
+ }
+ streamSettings.tlsSettings = tlsSettings;
+ break;
+ //h2
+ case "h2":
+ HttpSettings httpSettings = new HttpSettings();
+
+ string host3 = config.requestHost();
+ if (!string.IsNullOrWhiteSpace(host3))
+ {
+ httpSettings.host = Utils.String2List(host3);
+ }
+ 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 = config.requestHost();
+ 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 = config.requestHost().Split(',');
+ string host = string.Join("\",\"", arrHost);
+ request = request.Replace("$requestHost$", string.Format("\"{0}\"", host));
+ //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