├── .github └── workflows │ └── updateclash.yaml ├── .gitignore ├── .idea ├── .gitignore ├── modules.xml ├── proxypool.iml └── vcs.xml ├── LICENSE ├── README.md ├── cdn ├── FastlyIpRange.txt ├── GcoreIpRange.txt └── cloudflare │ ├── CloudflareIpRange.txt │ ├── CloudflarePremiumDomain.txt │ └── CloudflarePremiumIp.txt ├── config └── config.go ├── go.mod ├── go.sum ├── main.go ├── script ├── alive.sh ├── rebase.sh ├── result.log └── test.sh ├── source ├── clash-meta-2.yaml ├── clash-meta.yaml ├── nodelist.txt ├── proxies.txt ├── tgchannel.json ├── v2ray-2.txt ├── v2ray.txt └── webfuzz.yaml ├── spider ├── IP2LOCATION-LITE-DB1.BIN ├── clash.go ├── flags.json ├── fuzzy.go ├── getter.go ├── mypool.go ├── sharelink.go ├── spider.go └── v2ray.go └── tools ├── httpclient.go ├── randstr.go ├── snowflake.go └── tools.go /.github/workflows/updateclash.yaml: -------------------------------------------------------------------------------- 1 | name: update clash-meta.yaml 2 | 3 | on: 4 | push: 5 | paths-ignore: 6 | - "README.md" 7 | - "script/**" 8 | - "source/**" 9 | - ".gitignore" 10 | branches: 11 | - main 12 | schedule: 13 | - cron: '0 */6 * * *' 14 | 15 | jobs: 16 | Build: 17 | permissions: write-all 18 | runs-on: ubuntu-latest 19 | steps: 20 | - uses: actions/checkout@v4 21 | with: 22 | persist-credentials: false 23 | fetch-depth: 0 24 | 25 | - name: Update Clash 1 26 | run: | 27 | curl -L ${{ secrets.V2RAY_API }} > source/v2ray.txt 28 | curl -L ${{ secrets.CLASH_API }} > source/clash-meta.yaml 29 | rand=_$(date +%s%N | md5sum |cut -c 2-6)_ 30 | sed -i "s/${{ secrets.CLASH_REPLACE }}/$rand/g" source/clash-meta.yaml 31 | 32 | - name: Update Clash 2 33 | run: | 34 | curl ${{ secrets.CLASH_API_2 }} > source/clash-meta-2.yaml 35 | curl ${{ secrets.V2RAY_API_2 }} > source/v2ray-2.txt 36 | 37 | - name: Commit files 38 | run: | 39 | git config --local user.email "snakem982@gmail.com" 40 | git config --local user.name "snakem982" 41 | git add -A 42 | git commit -a -m "Updated $(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M %Z')" --allow-empty 43 | 44 | - name: Git Push 45 | uses: ad-m/github-push-action@master 46 | with: 47 | github_token: ${{ secrets.GITHUB_TOKEN }} 48 | branch: ${{ github.ref }} 49 | 50 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /test/ 2 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/proxypool.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # proxypool 2 | 3 | ![Static Badge](https://img.shields.io/badge/ss|ssr|vmess|vless|trojan-free-orange) 4 | ![Static Badge](https://img.shields.io/badge/tuic|hysteria|hysteria2-free-orange) 5 | 6 | Mihomo/Clash.Meta/Clash 节点池. 7 |
8 | Mihomo/Clash.Meta/Clash node aggregation. 9 | 10 | ##
温馨提示
Friendly Reminder
11 | 12 | 节点链接来自公开在互联网上的信息,不保证财产信息安全和稳定性。不建议长期使用!!!
13 | Nodes come from information published on the Internet, 14 | which does not guarantee the security and stability of property information. 15 | Long-term use is not recommended! ! !

16 | 为什么不安全?请观看大佬讲解
17 | 18 | - https://www.youtube.com/watch?v=vuF6rDLp3pg 19 | - https://www.youtube.com/watch?v=7yTpdsOF8us
20 | 21 | 若要持续、稳定、安全、高速的节点请自建,
22 | 推荐使用Tuic,Hysteria2,Juicity协议套上Tls,任何时候稳定输出,
23 | 下面是免实名免备案的高性价比 **德国、美国** 云服务器推荐:
24 | If you want a continuous, stable, safe, and high-speed node, please build it yourself. 25 | The following is a self-built node cost-effective cloud server recommendation:
26 | 27 | **美国服务器**(支付宝) 28 | 29 | | 序号 | 流量/月 | 网速 | CPU核数 | 运行内存 | 硬盘 | 美元/年 | 查看详情 | 30 | |:--:|:-----:|:-----:|:-----:|:-----:|:-----:|:------:|:------------------------------------------------------------------:| 31 | | 1 | 20T | 1Gbps | 1 | 1 G | 25 GB | $10 | [链接](https://cloud.colocrossing.com/aff.php?aff=821&pid=49 "点击查看") | 32 | | 2 | 2000G | 1Gbps | 1 | 1 G | 20 GB | $10.96 | [链接](https://my.racknerd.com/aff.php?aff=8613&pid=912 "点击查看") | 33 | | 3 | 3000G | 1Gbps | 1 | 1 G | 17 GB | $10.98 | [链接](https://my.racknerd.com/aff.php?aff=8613&pid=358 "点击查看") | 34 | | 4 | 20T | 1Gbps | 1 | 1 G | 20 GB | $12 | [链接](https://cloud.colocrossing.com/aff.php?aff=821&pid=33 "点击查看") | 35 | | 5 | 2000G | 1Gbps | 1 | 1 G | 24 GB | $11.29 | [链接](https://my.racknerd.com/aff.php?aff=8613&pid=903 "点击查看") | 36 | | 6 | 4000G | 1Gbps | 2 | 2 G | 30 GB | $17.66 | [链接](https://my.racknerd.com/aff.php?aff=8613&pid=913 "点击查看") | 37 | | 7 | 3500G | 1Gbps | 1 | 2 G | 40 GB | $18.29 | [链接](https://my.racknerd.com/aff.php?aff=8613&pid=904 "点击查看") | 38 | | 8 | 20T | 1Gbps | 1 | 2 G | 40 GB | $20 | [链接](https://cloud.colocrossing.com/aff.php?aff=821&pid=34 "点击查看") | 39 | | 9 | 5000G | 1Gbps | 3 | 3.5 G | 60 GB | $29.89 | [链接](https://my.racknerd.com/aff.php?aff=8613&pid=914 "点击查看") | 40 | | 10 | 7000G | 1Gbps | 2 | 3.5 G | 65 GB | $32.49 | [链接](https://my.racknerd.com/aff.php?aff=8613&pid=905 "点击查看") | 41 | 42 | 43 | 44 | **香港服务器** (需要注册登录后查看) 45 | 46 | | 序号 | 流量/月 | 网速 | CPU核数 | 运行内存 | 硬盘 | 人民币/年 | 查看详情 | 47 | |:--:|:----:|:-------:|:-----:|:----:|:-----:|:-----:|:-----------------------------------------------------:| 48 | | 1 | 600G | 100Mbps | 2 | 2 G | 30 GB | ¥99 | [链接](https://my.yecaoyun.com/aff.php?aff=5170 "点击查看") | 49 | | 2 | 600G | 100Mbps | 1 | 2 G | 30 GB | ¥128 | [链接](https://my.yecaoyun.com/aff.php?aff=5170 "点击查看") | 50 | | 3 | 600G | 100Mbps | 2 | 4 G | 50 GB | ¥188 | [链接](https://my.yecaoyun.com/aff.php?aff=5170 "点击查看") | 51 | | 4 | 600G | 100Mbps | 2 | 4 G | 50 GB | ¥228 | [链接](https://my.yecaoyun.com/aff.php?aff=5170 "点击查看") | 52 | | 5 | 800G | 100Mbps | 4 | 8 G | 90 GB | ¥288 | [链接](https://my.yecaoyun.com/aff.php?aff=5170 "点击查看") | 53 | | 6 | 800G | 100Mbps | 4 | 8 G | 90 GB | ¥358 | [链接](https://my.yecaoyun.com/aff.php?aff=5170 "点击查看") | 54 | 55 | **德国服务器** (PayPal) 56 | 57 | | 序号 | 流量/月 | 网速 | CPU核数 | 运行内存 | 硬盘 | 价格 | 查看详情 | 58 | |:--:|:----:|:-----:|:-----:|:----:|:-----:|:------------:|:-------------------------------------------------------------------:| 59 | | 1 | 20T | 1Gbps | 1 | 1 G | 32 GB | 9.99美元/1年 | [链接](https://portal.massivegrid.com/aff.php?aff=277&pid=896 "点击查看") | 60 | | 2 | 20T | 1Gbps | 1 | 1 G | 10 GB | 10.29美元/1年 | [链接](https://my.dasabo.com/aff.php?aff=51&pid=173 "点击查看") | 61 | | 3 | 20T | 1Gbps | 1 | 1 G | 32 GB | 18.65美元/2年 | [链接](https://portal.massivegrid.com/aff.php?aff=277&pid=896 "点击查看") | 62 | | 4 | 20T | 1Gbps | 1 | 1 G | 32 GB | 23.98美元/4年 | [链接](https://portal.massivegrid.com/aff.php?aff=277&pid=896 "点击查看") | 63 | 64 | 65 | ##
订阅地址或分享链接在如下文件里
The subscription address or sharing link is in the following file 66 | 67 | ### clash.meta/mihomo 订阅地址 68 | 69 | https://raw.githubusercontent.com/snakem982/proxypool/main/source/clash-meta.yaml 70 | https://raw.githubusercontent.com/snakem982/proxypool/main/source/clash-meta-2.yaml 71 | 72 | ### v2ray 订阅地址 73 | 74 | https://raw.githubusercontent.com/snakem982/proxypool/main/source/v2ray.txt 75 | https://raw.githubusercontent.com/snakem982/proxypool/main/source/v2ray-2.txt 76 | 77 | ### nodelist.txt 78 | 79 | https://github.com/snakem982/proxypool/blob/main/source/nodelist.txt 80 | 81 | ### proxies.txt 82 | 83 | https://github.com/snakem982/proxypool/blob/main/source/proxies.txt 84 | 85 | ### webfuzz.yaml 86 | 87 | https://github.com/snakem982/proxypool/blob/main/source/webfuzz.yaml 88 | 89 | ### telegram channel hub 90 | 91 | https://github.com/snakem982/proxypool/blob/main/source/tgchannel.json 92 | 93 | ##
免责声明
Disclaimer 94 | 95 | 该项目仅供个人和教育用途。 96 | 使用本项目时请遵守相关法律法规。 97 | 项目所有者对内容的使用不承担任何责任。 98 |
99 | This project is meant for personal and educational uses only. 100 | Please follow relevant laws and regulations when using this project. 101 | Project owner is not responsible or liable in any manner for the use of the content. 102 | -------------------------------------------------------------------------------- /cdn/FastlyIpRange.txt: -------------------------------------------------------------------------------- 1 | 23.235.32.0/20 2 | 43.249.72.0/22 3 | 103.244.50.0/24 4 | 103.245.222.0/23 5 | 103.245.224.0/24 6 | 104.156.80.0/20 7 | 140.248.64.0/18 8 | 140.248.128.0/17 9 | 146.75.0.0/17 10 | 151.101.0.0/16 11 | 157.52.64.0/18 12 | 167.82.0.0/17 13 | 167.82.128.0/20 14 | 167.82.160.0/20 15 | 167.82.224.0/20 16 | 172.111.64.0/18 17 | 185.31.16.0/22 18 | 199.27.72.0/21 19 | 199.232.0.0/16 -------------------------------------------------------------------------------- /cdn/GcoreIpRange.txt: -------------------------------------------------------------------------------- 1 | 81.253.239.34/32 2 | 80.93.215.7/32 3 | 92.223.107.49/32 4 | 103.178.28.8/32 5 | 93.123.17.151/32 6 | 92.223.124.36/32 7 | 92.223.107.48/32 8 | 195.216.237.199/32 9 | 92.223.120.13/32 10 | 185.194.11.74/32 11 | 79.133.108.28/32 12 | 92.223.107.46/32 13 | 93.123.17.165/32 14 | 92.223.63.29/32 15 | 193.57.89.4/32 16 | 93.123.17.145/32 17 | 92.223.116.220/32 18 | 79.133.108.10/32 19 | 185.101.136.9/32 20 | 5.188.121.182/32 21 | 92.223.116.204/32 22 | 92.223.12.26/32 23 | 92.223.107.59/32 24 | 92.223.92.24/32 25 | 93.123.17.141/32 26 | 92.223.107.51/32 27 | 80.240.113.5/32 28 | 78.111.101.4/32 29 | 202.78.162.5/32 30 | 92.223.124.53/32 31 | 102.130.69.141/32 32 | 92.223.124.30/32 33 | 92.223.124.42/32 34 | 92.223.116.214/32 35 | 80.15.243.3/32 36 | 92.223.107.52/32 37 | 78.111.103.5/32 38 | 79.133.108.8/32 39 | 109.230.114.2/32 40 | 102.67.99.66/32 41 | 92.223.118.37/32 42 | 92.223.114.7/32 43 | 93.123.17.136/32 44 | 95.85.69.7/32 45 | 92.223.123.41/32 46 | 93.123.17.132/32 47 | 92.223.107.50/32 48 | 45.82.101.7/32 49 | 92.223.124.50/32 50 | 92.223.123.32/32 51 | 92.223.118.16/32 52 | 171.229.196.133/32 53 | 139.28.7.4/32 54 | 92.223.118.39/32 55 | 45.82.103.4/32 56 | 92.223.116.208/32 57 | 181.39.11.210/32 58 | 81.253.239.30/32 59 | 5.101.68.8/32 60 | 93.123.17.164/32 61 | 92.223.55.6/32 62 | 5.252.26.8/32 63 | 193.169.251.5/32 64 | 92.223.107.58/32 65 | 93.123.17.180/32 66 | 92.223.124.40/32 67 | 92.223.78.23/32 68 | 92.223.12.17/32 69 | 93.123.17.142/32 70 | 92.223.12.14/32 71 | 91.149.176.70/32 72 | 45.82.100.5/32 73 | 92.223.107.42/32 74 | 5.8.92.4/32 75 | 93.123.17.140/32 76 | 171.234.242.195/32 77 | 185.163.3.4/32 78 | 94.176.183.8/32 79 | 92.223.116.223/32 80 | 92.223.116.222/32 81 | 81.253.239.14/32 82 | 92.223.124.25/32 83 | 79.133.108.14/32 84 | 80.240.124.9/32 85 | 92.223.118.12/32 86 | 93.123.17.191/32 87 | 125.214.171.164/32 88 | 92.223.116.210/32 89 | 92.223.63.21/32 90 | 92.223.124.51/32 91 | 45.82.101.5/32 92 | 92.223.61.23/32 93 | 92.223.118.25/32 94 | 5.188.133.10/32 95 | 92.223.118.40/32 96 | 93.123.11.11/32 97 | 79.133.108.25/32 98 | 37.110.209.228/32 99 | 194.44.246.206/32 100 | 185.158.211.186/32 101 | 92.223.124.48/32 102 | 92.38.142.25/32 103 | 93.123.17.163/32 104 | 92.223.12.13/32 105 | 91.243.87.5/32 106 | 92.223.124.15/32 107 | 92.38.170.7/32 108 | 93.123.17.144/32 109 | 79.133.108.23/32 110 | 92.223.107.56/32 111 | 92.223.123.34/32 112 | 5.188.121.136/32 113 | 80.240.113.8/32 114 | 93.123.17.167/32 115 | 92.223.124.28/32 116 | 80.15.252.33/32 117 | 5.188.121.163/32 118 | 195.216.237.201/32 119 | 92.223.124.52/32 120 | 92.223.116.221/32 121 | 92.223.63.28/32 122 | 80.240.124.11/32 123 | 5.101.219.6/32 124 | 92.223.124.54/32 125 | 93.123.17.160/32 126 | 92.223.118.38/32 127 | 93.123.17.134/32 128 | 79.133.108.6/32 129 | 92.223.76.24/32 130 | 92.223.107.47/32 131 | 80.240.113.7/32 132 | 92.223.124.33/32 133 | 185.101.136.8/32 134 | 170.238.234.217/32 135 | 93.123.17.135/32 136 | 80.240.124.8/32 137 | 92.223.120.15/32 138 | 186.16.19.94/32 139 | 92.223.123.45/32 140 | 92.223.61.25/32 141 | 92.223.124.16/32 142 | 82.213.5.50/32 143 | 92.223.108.16/32 144 | 5.189.207.4/32 145 | 92.223.63.6/32 146 | 79.133.108.24/32 147 | 195.22.198.49/32 148 | 171.229.196.136/32 149 | 185.249.133.4/32 150 | 92.38.170.8/32 151 | 92.223.74.20/32 152 | 80.15.252.1/32 153 | 193.169.251.4/32 154 | 93.123.17.149/32 155 | 93.123.17.162/32 156 | 5.188.126.7/32 157 | 195.14.146.81/32 158 | 81.253.239.2/32 159 | 45.65.8.4/32 160 | 93.123.17.175/32 161 | 92.223.116.200/32 162 | 92.223.123.48/32 163 | 5.188.121.151/32 164 | 45.80.213.7/32 165 | 80.240.113.11/32 166 | 92.223.112.42/32 167 | 92.223.118.19/32 168 | 213.156.151.4/32 169 | 92.223.118.15/32 170 | 92.223.63.24/32 171 | 92.223.124.41/32 172 | 81.253.239.10/32 173 | 185.188.144.8/32 174 | 92.223.63.25/32 175 | 213.156.144.7/32 176 | 5.188.121.133/32 177 | 92.223.124.4/32 178 | 87.120.164.4/32 179 | 92.223.108.6/32 180 | 31.184.207.8/32 181 | 92.223.64.8/32 182 | 103.178.28.12/32 183 | 81.253.239.18/32 184 | 80.93.215.12/32 185 | 92.223.64.12/32 186 | 92.223.74.26/32 187 | 80.15.243.1/32 188 | 92.223.116.203/32 189 | 185.188.144.5/32 190 | 185.105.1.10/32 191 | 1.37.77.98/32 192 | 95.85.92.4/32 193 | 80.240.113.13/32 194 | 80.93.215.4/32 195 | 92.223.116.205/32 196 | 93.123.17.146/32 197 | 80.240.124.5/32 198 | 93.123.17.148/32 199 | 103.178.28.5/32 200 | 92.223.76.25/32 201 | 79.133.108.7/32 202 | 5.188.94.5/32 203 | 80.240.124.10/32 204 | 92.223.12.4/32 205 | 37.17.119.211/32 206 | 92.223.12.6/32 207 | 92.223.124.5/32 208 | 80.15.251.9/32 209 | 93.123.17.155/32 210 | 92.223.123.47/32 211 | 92.223.118.24/32 212 | 93.123.17.166/32 213 | 93.123.17.176/32 214 | 5.8.92.6/32 215 | 92.223.118.17/32 216 | 92.46.108.106/32 217 | 92.223.107.45/32 218 | 92.223.92.23/32 219 | 80.93.221.4/32 220 | 92.223.116.211/32 221 | 92.223.122.185/32 222 | 171.229.196.138/32 223 | 179.0.200.126/32 224 | 92.223.123.51/32 225 | 80.93.215.11/32 226 | 5.188.121.165/32 227 | 80.93.215.9/32 228 | 92.223.124.9/32 229 | 95.85.88.9/32 230 | 5.188.121.161/32 231 | 5.8.43.4/32 232 | 217.76.64.195/32 233 | 92.223.12.16/32 234 | 31.184.207.7/32 235 | 92.223.107.36/32 236 | 45.80.213.4/32 237 | 82.97.205.5/32 238 | 92.223.63.11/32 239 | 80.93.215.6/32 240 | 93.123.17.154/32 241 | 80.15.251.11/32 242 | 92.223.116.216/32 243 | 92.223.92.25/32 244 | 213.252.220.4/32 245 | 103.178.28.7/32 246 | 92.223.123.50/32 247 | 92.223.116.224/32 248 | 171.234.242.198/32 249 | 79.133.108.30/32 250 | 78.111.101.5/32 251 | 5.252.26.11/32 252 | 92.223.107.44/32 253 | 92.223.120.12/32 254 | 103.178.28.6/32 255 | 93.123.17.178/32 256 | 93.123.17.177/32 257 | 213.156.144.5/32 258 | 185.101.136.7/32 259 | 80.240.124.6/32 260 | 92.223.124.44/32 261 | 92.223.78.22/32 262 | 93.123.17.189/32 263 | 193.169.250.4/32 264 | 93.123.17.188/32 265 | 93.123.17.190/32 266 | 93.123.11.12/32 267 | 195.216.237.197/32 268 | 93.123.17.153/32 269 | 92.223.116.213/32 270 | 92.223.74.21/32 271 | 103.178.28.10/32 272 | 213.156.144.4/32 273 | 180.149.90.66/32 274 | 92.223.118.21/32 275 | 80.15.243.13/32 276 | 92.223.118.5/32 277 | 202.78.162.4/32 278 | 92.223.124.29/32 279 | 92.223.110.4/32 280 | 5.188.121.185/32 281 | 93.123.17.192/32 282 | 93.123.17.137/32 283 | 146.185.221.132/32 284 | 92.223.123.40/32 285 | 5.1.107.249/32 286 | 95.85.92.6/32 287 | 92.223.61.21/32 288 | 92.223.55.5/32 289 | 92.223.122.188/32 290 | 79.133.108.29/32 291 | 185.188.144.7/32 292 | 94.128.12.238/32 293 | 92.223.61.24/32 294 | 78.111.103.4/32 295 | 92.223.124.37/32 296 | 92.223.124.24/32 297 | 93.123.11.14/32 298 | 92.38.159.4/32 299 | 5.101.219.5/32 300 | 94.176.183.6/32 301 | 213.156.144.6/32 302 | 81.253.239.26/32 303 | 80.240.124.7/32 304 | 92.223.124.27/32 305 | 5.188.121.135/32 306 | 81.253.239.38/32 307 | 91.243.87.4/32 308 | 95.85.92.7/32 309 | 176.222.187.178/32 310 | 80.240.113.10/32 311 | 92.223.108.5/32 312 | 80.93.215.5/32 313 | 92.223.12.22/32 314 | 80.15.251.1/32 315 | 92.223.112.12/32 316 | 185.215.162.226/32 317 | 92.223.124.31/32 318 | 92.223.92.26/32 319 | 92.223.107.57/32 320 | 92.223.124.34/32 321 | 43.245.140.2/32 322 | 45.80.213.8/32 323 | 92.223.107.53/32 324 | 92.223.12.15/32 325 | 92.223.116.201/32 326 | 92.223.63.22/32 327 | 92.223.55.4/32 328 | 92.38.159.5/32 329 | 5.8.43.5/32 330 | 92.223.12.27/32 331 | 92.38.170.6/32 332 | 109.68.233.242/32 333 | 37.17.119.210/32 334 | 93.123.17.150/32 335 | 92.223.123.36/32 336 | 213.156.151.6/32 337 | 82.148.98.42/32 338 | 80.93.210.4/32 339 | 5.101.222.5/32 340 | 92.223.114.6/32 341 | 92.223.107.54/32 342 | 92.223.12.7/32 343 | 92.223.108.13/32 344 | 37.236.95.2/32 345 | 92.223.124.13/32 346 | 92.223.63.5/32 347 | 87.120.164.7/32 348 | 92.223.122.184/32 349 | 79.133.108.31/32 350 | 92.223.124.22/32 351 | 62.209.27.232/32 352 | 93.123.17.179/32 353 | 5.188.121.178/32 354 | 5.188.121.166/32 355 | 80.93.223.4/32 356 | 200.10.177.54/32 357 | 92.223.108.15/32 358 | 79.133.108.4/32 359 | 179.51.50.82/32 360 | 181.174.80.182/32 361 | 92.223.123.15/32 362 | 5.252.26.6/32 363 | 92.223.63.23/32 364 | 45.82.103.5/32 365 | 202.129.236.162/32 366 | 92.223.124.32/32 367 | 45.82.100.4/32 368 | 92.223.116.209/32 369 | 5.252.26.9/32 370 | 80.15.252.25/32 371 | 92.223.120.10/32 372 | 79.133.108.16/32 373 | 151.248.104.91/32 374 | 5.188.121.181/32 375 | 92.223.118.22/32 376 | 185.244.209.4/32 377 | 92.223.123.20/32 378 | 80.15.251.15/32 379 | 93.123.17.147/32 380 | 45.82.101.9/32 381 | 171.234.242.199/32 382 | 92.223.116.215/32 383 | 92.223.63.7/32 384 | 45.82.103.6/32 385 | 92.223.114.14/32 386 | 92.223.12.23/32 387 | 5.188.126.4/32 388 | 5.188.133.13/32 389 | 92.223.12.9/32 390 | 92.223.63.27/32 391 | 92.223.43.13/32 392 | 92.223.63.10/32 393 | 80.15.250.1/32 394 | 92.223.124.49/32 395 | 95.85.69.6/32 396 | 185.48.136.150/32 397 | 186.2.150.34/32 398 | 92.223.76.20/32 399 | 5.188.121.137/32 400 | 31.184.207.4/32 401 | 92.223.124.17/32 402 | 92.223.63.8/32 403 | 80.15.252.17/32 404 | 193.36.180.7/32 405 | 92.223.12.11/32 406 | 5.252.26.10/32 407 | 92.223.124.10/32 408 | 80.93.215.8/32 409 | 95.85.92.5/32 410 | 94.176.183.11/32 411 | 5.188.121.138/32 412 | 92.38.168.5/32 413 | 93.123.11.13/32 414 | 46.49.10.229/32 415 | 92.223.122.187/32 416 | 92.223.12.20/32 417 | 79.133.108.9/32 418 | 185.101.136.12/32 419 | 5.188.133.11/32 420 | 45.82.101.6/32 421 | 92.223.63.4/32 422 | 202.78.162.6/32 423 | 213.156.156.4/32 424 | 103.178.28.13/32 425 | 92.223.124.45/32 426 | 92.223.107.38/32 427 | 92.223.12.24/32 428 | 5.188.121.162/32 429 | 80.15.251.13/32 430 | 79.133.108.15/32 431 | 94.176.183.7/32 432 | 92.223.107.43/32 433 | 93.123.17.143/32 434 | 150.107.126.4/32 435 | 92.223.12.12/32 436 | 80.240.124.4/32 437 | 93.123.17.156/32 438 | 5.252.26.7/32 439 | 185.188.144.4/32 440 | 92.223.116.212/32 441 | 193.169.250.5/32 442 | 93.123.17.174/32 443 | 5.189.207.5/32 444 | 92.223.123.46/32 445 | 92.38.168.7/32 446 | 80.240.113.12/32 447 | 5.188.121.132/32 448 | 92.223.112.28/32 449 | 92.223.63.26/32 450 | 213.156.156.5/32 451 | 92.223.124.39/32 452 | 45.82.103.7/32 453 | 171.229.196.135/32 454 | 197.215.140.235/32 455 | 5.188.132.5/32 456 | 92.223.12.5/32 457 | 171.234.242.197/32 458 | 92.223.43.14/32 459 | 92.223.116.206/32 460 | 92.223.112.41/32 461 | 92.223.118.20/32 462 | 193.36.180.5/32 463 | 31.184.207.5/32 464 | 45.80.213.5/32 465 | 92.38.142.21/32 466 | 134.0.219.26/32 467 | 93.123.17.133/32 468 | 5.252.26.5/32 469 | 92.223.123.33/32 470 | 92.223.124.12/32 471 | 92.223.68.27/32 472 | 79.133.108.17/32 473 | 92.223.116.207/32 474 | 92.223.118.8/32 475 | 92.223.12.25/32 476 | 5.101.217.4/32 477 | 92.223.123.30/32 478 | 92.223.107.39/32 479 | 89.223.90.4/32 480 | 92.223.124.26/32 481 | 103.211.151.21/32 482 | 92.223.63.9/32 483 | 87.120.164.5/32 484 | 5.188.121.183/32 485 | 5.188.126.6/32 486 | 5.188.126.5/32 487 | 190.95.248.34/32 488 | 92.223.47.4/32 489 | 92.223.124.23/32 490 | 195.216.237.203/32 491 | 92.223.118.7/32 492 | 93.123.17.157/32 493 | 80.15.243.15/32 494 | 5.188.121.191/32 495 | 92.223.107.55/32 496 | 92.38.168.6/32 497 | 92.223.124.38/32 498 | 92.223.107.40/32 499 | 92.38.170.10/32 500 | 171.229.196.137/32 501 | 93.123.17.159/32 502 | 5.188.121.192/32 503 | 130.193.166.2/32 504 | 93.123.38.4/32 505 | 92.223.12.19/32 506 | 93.123.17.158/32 507 | 79.133.108.5/32 508 | 92.223.122.186/32 509 | 92.223.76.23/32 510 | 45.82.101.8/32 511 | 93.123.17.138/32 512 | 185.76.48.122/32 513 | 81.253.239.6/32 514 | 213.156.151.5/32 515 | 92.223.124.6/32 516 | 102.67.99.50/32 517 | 93.123.17.139/32 518 | 92.223.124.35/32 519 | 5.101.68.5/32 520 | 80.240.113.14/32 521 | 197.188.22.102/32 522 | 151.248.104.69/32 523 | 79.133.108.13/32 524 | 92.223.92.22/32 525 | 92.223.118.18/32 526 | 5.101.222.4/32 527 | 94.43.206.202/32 528 | 79.133.108.32/32 529 | 92.223.68.25/32 530 | 92.223.118.4/32 531 | 41.210.189.22/32 532 | 80.240.113.9/32 533 | 197.148.108.106/32 534 | 94.176.183.12/32 535 | 120.28.10.46/32 536 | 31.184.207.6/32 537 | 197.215.140.234/32 538 | 82.97.205.4/32 539 | 45.80.213.6/32 540 | 92.223.68.26/32 541 | 87.120.164.6/32 542 | 197.225.145.26/32 543 | 92.223.118.14/32 544 | 92.223.12.10/32 545 | 91.243.83.5/32 546 | 118.103.136.245/32 547 | 92.223.12.8/32 548 | 5.8.92.5/32 549 | 80.240.113.6/32 550 | 103.178.28.11/32 551 | 92.223.118.10/32 552 | 193.36.180.6/32 553 | 134.0.219.37/32 554 | 185.101.136.13/32 555 | 103.178.28.9/32 556 | 79.133.108.26/32 557 | 95.85.92.8/32 558 | 92.223.124.8/32 559 | 92.223.107.60/32 560 | 80.240.113.4/32 561 | 79.133.108.27/32 562 | 5.188.121.134/32 563 | 92.223.64.4/32 564 | 93.123.17.161/32 565 | 5.188.121.184/32 566 | 92.223.118.23/32 567 | 171.229.196.134/32 568 | 103.178.28.4/32 569 | 92.223.124.43/32 570 | 80.15.252.9/32 571 | 93.123.38.5/32 572 | 92.223.120.14/32 573 | 5.252.26.4/32 574 | 171.229.196.132/32 575 | 80.93.215.10/32 576 | 92.223.12.18/32 577 | 94.176.183.5/32 -------------------------------------------------------------------------------- /cdn/cloudflare/CloudflareIpRange.txt: -------------------------------------------------------------------------------- 1 | 173.245.48.0/20 2 | 103.21.244.0/22 3 | 103.22.200.0/22 4 | 103.31.4.0/22 5 | 141.101.64.0/18 6 | 108.162.192.0/18 7 | 190.93.240.0/20 8 | 188.114.96.0/20 9 | 197.234.240.0/22 10 | 198.41.128.0/17 11 | 162.158.0.0/15 12 | 104.16.0.0/13 13 | 104.24.0.0/14 14 | 172.64.0.0/13 15 | 131.0.72.0/22 -------------------------------------------------------------------------------- /cdn/cloudflare/CloudflarePremiumDomain.txt: -------------------------------------------------------------------------------- 1 | acjp2.cloudflarest.link:2052 2 | acsg.cloudflarest.link:2052 3 | acsg3.cloudflarest.link:2052 4 | -------------------------------------------------------------------------------- /cdn/cloudflare/CloudflarePremiumIp.txt: -------------------------------------------------------------------------------- 1 | https://stock.hostmonit.com/CloudFlareYes 2 | https://zip.baipiao.eu.org 3 | https://t.me/cf_push 4 | -------------------------------------------------------------------------------- /config/config.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | func init() { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/snakem982/proxypool 2 | 3 | go 1.22 4 | 5 | require ( 6 | github.com/ip2location/ip2location-go/v9 v9.7.0 7 | github.com/metacubex/mihomo v1.18.6 8 | github.com/panjf2000/ants/v2 v2.10.0 9 | golang.org/x/net v0.26.0 10 | gopkg.in/yaml.v3 v3.0.1 11 | ) 12 | 13 | require ( 14 | github.com/3andne/restls-client-go v0.1.6 // indirect 15 | github.com/RyuaNerin/go-krypto v1.2.4 // indirect 16 | github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 // indirect 17 | github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect 18 | github.com/andybalholm/brotli v1.0.6 // indirect 19 | github.com/bahlo/generic-list-go v0.2.0 // indirect 20 | github.com/buger/jsonparser v1.1.1 // indirect 21 | github.com/cilium/ebpf v0.12.3 // indirect 22 | github.com/cloudflare/circl v1.3.7 // indirect 23 | github.com/coreos/go-iptables v0.7.0 // indirect 24 | github.com/dlclark/regexp2 v1.11.0 // indirect 25 | github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 // indirect 26 | github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect 27 | github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect 28 | github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 // indirect 29 | github.com/fsnotify/fsnotify v1.7.0 // indirect 30 | github.com/gaukas/godicttls v0.0.4 // indirect 31 | github.com/go-ole/go-ole v1.3.0 // indirect 32 | github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect 33 | github.com/gobwas/httphead v0.1.0 // indirect 34 | github.com/gobwas/pool v0.2.1 // indirect 35 | github.com/gobwas/ws v1.4.0 // indirect 36 | github.com/gofrs/uuid/v5 v5.2.0 // indirect 37 | github.com/google/btree v1.1.2 // indirect 38 | github.com/google/go-cmp v0.6.0 // indirect 39 | github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect 40 | github.com/hashicorp/yamux v0.1.1 // indirect 41 | github.com/insomniacslk/dhcp v0.0.0-20240529192340-51bc6136a0a6 // indirect 42 | github.com/josharian/native v1.1.0 // indirect 43 | github.com/klauspost/compress v1.17.4 // indirect 44 | github.com/klauspost/cpuid/v2 v2.2.8 // indirect 45 | github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect 46 | github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 // indirect 47 | github.com/mailru/easyjson v0.7.7 // indirect 48 | github.com/mdlayher/netlink v1.7.2 // indirect 49 | github.com/mdlayher/socket v0.4.1 // indirect 50 | github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 // indirect 51 | github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec // indirect 52 | github.com/metacubex/quic-go v0.45.1-0.20240610004319-163fee60637e // indirect 53 | github.com/metacubex/randv2 v0.2.0 // indirect 54 | github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72 // indirect 55 | github.com/metacubex/sing-shadowsocks v0.2.6 // indirect 56 | github.com/metacubex/sing-shadowsocks2 v0.2.0 // indirect 57 | github.com/metacubex/sing-tun v0.2.7-0.20240627012306-9d1f5fc0b45e // indirect 58 | github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f // indirect 59 | github.com/metacubex/sing-wireguard v0.0.0-20240618022557-a6efaa37127a // indirect 60 | github.com/metacubex/tfo-go v0.0.0-20240228025757-be1269474a66 // indirect 61 | github.com/metacubex/utls v1.6.6 // indirect 62 | github.com/miekg/dns v1.1.61 // indirect 63 | github.com/mroth/weightedrand/v2 v2.1.0 // indirect 64 | github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7 // indirect 65 | github.com/onsi/ginkgo/v2 v2.9.5 // indirect 66 | github.com/openacid/low v0.1.21 // indirect 67 | github.com/oschwald/maxminddb-golang v1.12.0 // indirect 68 | github.com/pierrec/lz4/v4 v4.1.14 // indirect 69 | github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect 70 | github.com/puzpuzpuz/xsync/v3 v3.2.0 // indirect 71 | github.com/quic-go/qpack v0.4.0 // indirect 72 | github.com/quic-go/qtls-go1-20 v0.4.1 // indirect 73 | github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a // indirect 74 | github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect 75 | github.com/sagernet/nftables v0.3.0-beta.4 // indirect 76 | github.com/sagernet/sing v0.5.0-alpha.10 // indirect 77 | github.com/sagernet/sing-mux v0.2.1-0.20240124034317-9bfb33698bb6 // indirect 78 | github.com/sagernet/sing-shadowtls v0.1.4 // indirect 79 | github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 // indirect 80 | github.com/sagernet/wireguard-go v0.0.0-20231209092712-9a439356a62e // indirect 81 | github.com/samber/lo v1.39.0 // indirect 82 | github.com/shirou/gopsutil/v3 v3.24.5 // indirect 83 | github.com/shoenig/go-m1cpu v0.1.6 // indirect 84 | github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b // indirect 85 | github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c // indirect 86 | github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e // indirect 87 | github.com/sirupsen/logrus v1.9.3 // indirect 88 | github.com/tklauser/go-sysconf v0.3.12 // indirect 89 | github.com/tklauser/numcpus v0.6.1 // indirect 90 | github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 // indirect 91 | github.com/vishvananda/netns v0.0.4 // indirect 92 | github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect 93 | github.com/yusufpapurcu/wmi v1.2.4 // indirect 94 | gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec // indirect 95 | go.uber.org/mock v0.4.0 // indirect 96 | go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect 97 | golang.org/x/crypto v0.24.0 // indirect 98 | golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect 99 | golang.org/x/mod v0.18.0 // indirect 100 | golang.org/x/sync v0.7.0 // indirect 101 | golang.org/x/sys v0.21.0 // indirect 102 | golang.org/x/text v0.16.0 // indirect 103 | golang.org/x/time v0.5.0 // indirect 104 | golang.org/x/tools v0.22.0 // indirect 105 | google.golang.org/protobuf v1.34.2 // indirect 106 | lukechampine.com/blake3 v1.3.0 // indirect 107 | lukechampine.com/uint128 v1.2.0 // indirect 108 | ) 109 | 110 | replace ( 111 | github.com/metacubex/mihomo => github.com/snakem982/mihomo v1.11.9-0.20240713031232-2bbde78a2dbf 112 | github.com/sagernet/sing => github.com/metacubex/sing v0.0.0-20240617013425-3e3bd9dab6a2 113 | ) 114 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/3andne/restls-client-go v0.1.6 h1:tRx/YilqW7iHpgmEL4E1D8dAsuB0tFF3uvncS+B6I08= 2 | github.com/3andne/restls-client-go v0.1.6/go.mod h1:iEdTZNt9kzPIxjIGSMScUFSBrUH6bFRNg0BWlP4orEY= 3 | github.com/RyuaNerin/elliptic2 v1.0.0/go.mod h1:wWB8fWrJI/6EPJkyV/r1Rj0hxUgrusmqSj8JN6yNf/A= 4 | github.com/RyuaNerin/go-krypto v1.2.4 h1:mXuNdK6M317aPV0llW6Xpjbo4moOlPF7Yxz4tb4b4Go= 5 | github.com/RyuaNerin/go-krypto v1.2.4/go.mod h1:QqCYkoutU3yInyD9INt2PGolVRsc3W4oraQadVGXJ/8= 6 | github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 h1:cDVUiFo+npB0ZASqnw4q90ylaVAbnYyx0JYqK4YcGok= 7 | github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344/go.mod h1:9pIqrY6SXNL8vjRQE5Hd/OL5GyK/9MrGUWs87z/eFfk= 8 | github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= 9 | github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= 10 | github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= 11 | github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= 12 | github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= 13 | github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= 14 | github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= 15 | github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= 16 | github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= 17 | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= 18 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= 19 | github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 20 | github.com/cilium/ebpf v0.12.3 h1:8ht6F9MquybnY97at+VDZb3eQQr8ev79RueWeVaEcG4= 21 | github.com/cilium/ebpf v0.12.3/go.mod h1:TctK1ivibvI3znr66ljgi4hqOT8EYQjz1KWBfb1UVgM= 22 | github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= 23 | github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= 24 | github.com/coreos/go-iptables v0.7.0 h1:XWM3V+MPRr5/q51NuWSgU0fqMad64Zyxs8ZUoMsamr8= 25 | github.com/coreos/go-iptables v0.7.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= 26 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 27 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 28 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 29 | github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= 30 | github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= 31 | github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 h1:/5RkVc9Rc81XmMyVqawCiDyrBHZbLAZgTTCqou4mwj8= 32 | github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9/go.mod h1:hkIFzoiIPZYxdFOOLyDho59b7SrDfo+w3h+yWdlg45I= 33 | github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 h1:8j2RH289RJplhA6WfdaPqzg1MjH2K8wX5e0uhAxrw2g= 34 | github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391/go.mod h1:K2R7GhgxrlJzHw2qiPWsCZXf/kXEJN9PLnQK73Ll0po= 35 | github.com/ericlagergren/saferand v0.0.0-20220206064634-960a4dd2bc5c h1:RUzBDdZ+e/HEe2Nh8lYsduiPAZygUfVXJn0Ncj5sHMg= 36 | github.com/ericlagergren/saferand v0.0.0-20220206064634-960a4dd2bc5c/go.mod h1:ETASDWf/FmEb6Ysrtd1QhjNedUU/ZQxBCRLh60bQ/UI= 37 | github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 h1:tlDMEdcPRQKBEz5nGDMvswiajqh7k8ogWRlhRwKy5mY= 38 | github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1/go.mod h1:4RfsapbGx2j/vU5xC/5/9qB3kn9Awp1YDiEnN43QrJ4= 39 | github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 h1:fuGucgPk5dN6wzfnxl3D0D3rVLw4v2SbBT9jb4VnxzA= 40 | github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010/go.mod h1:JtBcj7sBuTTRupn7c2bFspMDIObMJsVK8TeUvpShPok= 41 | github.com/frankban/quicktest v1.14.5 h1:dfYrrRyLtiqT9GyKXgdh+k4inNeTvmGbuSgZ3lx3GhA= 42 | github.com/frankban/quicktest v1.14.5/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= 43 | github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= 44 | github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= 45 | github.com/gaukas/godicttls v0.0.4 h1:NlRaXb3J6hAnTmWdsEKb9bcSBD6BvcIjdGdeb0zfXbk= 46 | github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI= 47 | github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= 48 | github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= 49 | github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= 50 | github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= 51 | github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= 52 | github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= 53 | github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= 54 | github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= 55 | github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= 56 | github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= 57 | github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= 58 | github.com/gobwas/ws v1.4.0 h1:CTaoG1tojrh4ucGPcoJFiAQUAsEWekEWvLy7GsVNqGs= 59 | github.com/gobwas/ws v1.4.0/go.mod h1:G3gNqMNtPppf5XUz7O4shetPpcZ1VJ7zt18dlUeakrc= 60 | github.com/gofrs/uuid/v5 v5.2.0 h1:qw1GMx6/y8vhVsx626ImfKMuS5CvJmhIKKtuyvfajMM= 61 | github.com/gofrs/uuid/v5 v5.2.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= 62 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 63 | github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= 64 | github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 65 | github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= 66 | github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= 67 | github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 68 | github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= 69 | github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 70 | github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= 71 | github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 72 | github.com/google/tink/go v1.6.1 h1:t7JHqO8Ath2w2ig5vjwQYJzhGEZymedQc90lQXUBa4I= 73 | github.com/google/tink/go v1.6.1/go.mod h1:IGW53kTgag+st5yPhKKwJ6u2l+SSp5/v9XF7spovjlY= 74 | github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= 75 | github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= 76 | github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= 77 | github.com/insomniacslk/dhcp v0.0.0-20240529192340-51bc6136a0a6 h1:dh8D8FksyMhD64mRMbUhZHWYJfNoNMCxfVq6eexleMw= 78 | github.com/insomniacslk/dhcp v0.0.0-20240529192340-51bc6136a0a6/go.mod h1:KclMyHxX06VrVr0DJmeFSUb1ankt7xTfoOA35pCkoic= 79 | github.com/ip2location/ip2location-go/v9 v9.7.0 h1:ipwl67HOWcrw+6GOChkEXcreRQR37NabqBd2ayYa4Q0= 80 | github.com/ip2location/ip2location-go/v9 v9.7.0/go.mod h1:MPLnsKxwQlvd2lBNcQCsLoyzJLDBFizuO67wXXdzoyI= 81 | github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= 82 | github.com/josharian/native v1.0.1-0.20221213033349-c1e37c09b531/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= 83 | github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA= 84 | github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= 85 | github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= 86 | github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= 87 | github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= 88 | github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= 89 | github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= 90 | github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= 91 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 92 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 93 | github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= 94 | github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= 95 | github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 h1:EnfXoSqDfSNJv0VBNqY/88RNnhSGYkrHaO0mmFGbVsc= 96 | github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40/go.mod h1:vy1vK6wD6j7xX6O6hXe621WabdtNkou2h7uRtTfRMyg= 97 | github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= 98 | github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= 99 | github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g= 100 | github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw= 101 | github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U= 102 | github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= 103 | github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvOzK9ubNCCkQ+ldc4YSH/rILn53l/xGBFHHI= 104 | github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88= 105 | github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec h1:HxreOiFTUrJXJautEo8rnE1uKTVGY8wtZepY1Tii/Nc= 106 | github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec/go.mod h1:8BVmQ+3cxjqzWElafm24rb2Ae4jRI6vAXNXWqWjfrXw= 107 | github.com/metacubex/quic-go v0.45.1-0.20240610004319-163fee60637e h1:bLYn3GuRvWDcBDAkIv5kUYIhzHwafDVq635BuybnKqI= 108 | github.com/metacubex/quic-go v0.45.1-0.20240610004319-163fee60637e/go.mod h1:Yza2H7Ax1rxWPUcJx0vW+oAt9EsPuSiyQFhFabUPzwU= 109 | github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs= 110 | github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY= 111 | github.com/metacubex/sing v0.0.0-20240617013425-3e3bd9dab6a2 h1:N5tidgg/FRmkgPw/AjRwhLUinKDx/ODCSbvv9xqRoLM= 112 | github.com/metacubex/sing v0.0.0-20240617013425-3e3bd9dab6a2/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak= 113 | github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72 h1:Wr4g1HCb5Z/QIFwFiVNjO2qL+dRu25+Mdn9xtAZZ+ew= 114 | github.com/metacubex/sing-quic v0.0.0-20240518034124-7696d3f7da72/go.mod h1:g7Mxj7b7zm7YVqD975mk/hSmrb0A0G4bVvIMr2MMzn8= 115 | github.com/metacubex/sing-shadowsocks v0.2.6 h1:6oEB3QcsFYnNiFeoevcXrCwJ3sAablwVSgtE9R3QeFQ= 116 | github.com/metacubex/sing-shadowsocks v0.2.6/go.mod h1:zIkMeSnb8Mbf4hdqhw0pjzkn1d99YJ3JQm/VBg5WMTg= 117 | github.com/metacubex/sing-shadowsocks2 v0.2.0 h1:hqwT/AfI5d5UdPefIzR6onGHJfDXs5zgOM5QSgaM/9A= 118 | github.com/metacubex/sing-shadowsocks2 v0.2.0/go.mod h1:LCKF6j1P94zN8ZS+LXRK1gmYTVGB3squivBSXAFnOg8= 119 | github.com/metacubex/sing-tun v0.2.7-0.20240627012306-9d1f5fc0b45e h1:o+zohxPRo45P35fS9u1zfdBgr+L/7S0ObGU6YjbVBIc= 120 | github.com/metacubex/sing-tun v0.2.7-0.20240627012306-9d1f5fc0b45e/go.mod h1:WwJGbCx7bQcBzuQXiDOJvZH27R0kIjKNNlISIWsL6kM= 121 | github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f h1:QjXrHKbTMBip/C+R79bvbfr42xH1gZl3uFb0RELdZiQ= 122 | github.com/metacubex/sing-vmess v0.1.9-0.20231207122118-72303677451f/go.mod h1:olVkD4FChQ5gKMHG4ZzuD7+fMkJY1G8vwOKpRehjrmY= 123 | github.com/metacubex/sing-wireguard v0.0.0-20240618022557-a6efaa37127a h1:NpSGclHJUYndUwBmyIpFBSoBVg8PoVX7QQKhYg0DjM0= 124 | github.com/metacubex/sing-wireguard v0.0.0-20240618022557-a6efaa37127a/go.mod h1:uY+BYb0UEknLrqvbGcwi9i++KgrKxsurysgI6G1Pveo= 125 | github.com/metacubex/tfo-go v0.0.0-20240228025757-be1269474a66 h1:as/aO/fM8nv4W4pOr9EETP6kV/Oaujk3fUNyQSJK61c= 126 | github.com/metacubex/tfo-go v0.0.0-20240228025757-be1269474a66/go.mod h1:c7bVFM9f5+VzeZ/6Kg77T/jrg1Xp8QpqlSHvG/aXVts= 127 | github.com/metacubex/utls v1.6.6 h1:3D12YKHTf2Z41UPhQU2dWerNWJ5TVQD9gKoQ+H+iLC8= 128 | github.com/metacubex/utls v1.6.6/go.mod h1:+WLFUnXjcpdxXCnyX25nggw8C6YonZ8zOK2Zm/oRvdo= 129 | github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= 130 | github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= 131 | github.com/mroth/weightedrand/v2 v2.1.0 h1:o1ascnB1CIVzsqlfArQQjeMy1U0NcIbBO5rfd5E/OeU= 132 | github.com/mroth/weightedrand/v2 v2.1.0/go.mod h1:f2faGsfOGOwc1p94wzHKKZyTpcJUW7OJ/9U4yfiNAOU= 133 | github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7 h1:1102pQc2SEPp5+xrS26wEaeb26sZy6k9/ZXlZN+eXE4= 134 | github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7/go.mod h1:UqoUn6cHESlliMhOnKLWr+CBH+e3bazUPvFj1XZwAjs= 135 | github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q= 136 | github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k= 137 | github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= 138 | github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= 139 | github.com/openacid/errors v0.8.1/go.mod h1:GUQEJJOJE3W9skHm8E8Y4phdl2LLEN8iD7c5gcGgdx0= 140 | github.com/openacid/low v0.1.21 h1:Tr2GNu4N/+rGRYdOsEHOE89cxUIaDViZbVmKz29uKGo= 141 | github.com/openacid/low v0.1.21/go.mod h1:q+MsKI6Pz2xsCkzV4BLj7NR5M4EX0sGz5AqotpZDVh0= 142 | github.com/openacid/must v0.1.3/go.mod h1:luPiXCuJlEo3UUFQngVQokV0MPGryeYvtCbQPs3U1+I= 143 | github.com/openacid/testkeys v0.1.6/go.mod h1:MfA7cACzBpbiwekivj8StqX0WIRmqlMsci1c37CA3Do= 144 | github.com/oschwald/maxminddb-golang v1.12.0 h1:9FnTOD0YOhP7DGxGsq4glzpGy5+w7pq50AS6wALUMYs= 145 | github.com/oschwald/maxminddb-golang v1.12.0/go.mod h1:q0Nob5lTCqyQ8WT6FYgS1L7PXKVVbgiymefNwIjPzgY= 146 | github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8= 147 | github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I= 148 | github.com/pierrec/lz4/v4 v4.1.14 h1:+fL8AQEZtz/ijeNnpduH0bROTu0O3NZAlPjQxGn8LwE= 149 | github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= 150 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 151 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 152 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 153 | github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= 154 | github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= 155 | github.com/puzpuzpuz/xsync/v3 v3.2.0 h1:9AzuUeF88YC5bK8u2vEG1Fpvu4wgpM1wfPIExfaaDxQ= 156 | github.com/puzpuzpuz/xsync/v3 v3.2.0/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= 157 | github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= 158 | github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= 159 | github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs= 160 | github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= 161 | github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= 162 | github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= 163 | github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a h1:+NkI2670SQpQWvkkD2QgdTuzQG263YZ+2emfpeyGqW0= 164 | github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a/go.mod h1:63s7jpZqcDAIpj8oI/1v4Izok+npJOHACFCU6+huCkM= 165 | github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZNjr6sGeT00J8uU7JF4cNUdb44/Duis= 166 | github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= 167 | github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I= 168 | github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8= 169 | github.com/sagernet/sing-mux v0.2.1-0.20240124034317-9bfb33698bb6 h1:5bCAkvDDzSMITiHFjolBwpdqYsvycdTu71FsMEFXQ14= 170 | github.com/sagernet/sing-mux v0.2.1-0.20240124034317-9bfb33698bb6/go.mod h1:khzr9AOPocLa+g53dBplwNDz4gdsyx/YM3swtAhlkHQ= 171 | github.com/sagernet/sing-shadowtls v0.1.4 h1:aTgBSJEgnumzFenPvc+kbD9/W0PywzWevnVpEx6Tw3k= 172 | github.com/sagernet/sing-shadowtls v0.1.4/go.mod h1:F8NBgsY5YN2beQavdgdm1DPlhaKQlaL6lpDdcBglGK4= 173 | github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ= 174 | github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7/go.mod h1:FP9X2xjT/Az1EsG/orYYoC+5MojWnuI7hrffz8fGwwo= 175 | github.com/sagernet/wireguard-go v0.0.0-20231209092712-9a439356a62e h1:iGH0RMv2FzELOFNFQtvsxH7NPmlo7X5JizEK51UCojo= 176 | github.com/sagernet/wireguard-go v0.0.0-20231209092712-9a439356a62e/go.mod h1:YbL4TKHRR6APYQv3U2RGfwLDpPYSyWz6oUlpISBEzBE= 177 | github.com/samber/lo v1.39.0 h1:4gTz1wUhNYLhFSKl6O+8peW0v2F4BCY034GRpU9WnuA= 178 | github.com/samber/lo v1.39.0/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= 179 | github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= 180 | github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= 181 | github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= 182 | github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= 183 | github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= 184 | github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= 185 | github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b h1:rXHg9GrUEtWZhEkrykicdND3VPjlVbYiLdX9J7gimS8= 186 | github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b/go.mod h1:X7qrxNQViEaAN9LNZOPl9PfvQtp3V3c7LTo0dvGi0fM= 187 | github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c h1:DjKMC30y6yjG3IxDaeAj3PCoRr+IsO+bzyT+Se2m2Hk= 188 | github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c/go.mod h1:NV/a66PhhWYVmUMaotlXJ8fIEFB98u+c8l/CQIEFLrU= 189 | github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e h1:ur8uMsPIFG3i4Gi093BQITvwH9znsz2VUZmnmwHvpIo= 190 | github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e/go.mod h1:+e5fBW3bpPyo+3uLo513gIUblc03egGjMM0+5GKbzK8= 191 | github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= 192 | github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= 193 | github.com/snakem982/mihomo v1.11.9-0.20240713031232-2bbde78a2dbf h1:kNjx7imNu8expE7vzuf+3EudFhAw/a3Fef1McV12oD8= 194 | github.com/snakem982/mihomo v1.11.9-0.20240713031232-2bbde78a2dbf/go.mod h1:4k6CJ9MoYhuQP40evJUSc3p1uRXASyyS8O+63k3nHVU= 195 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 196 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 197 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 198 | github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= 199 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 200 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 201 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 202 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 203 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 204 | github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 205 | github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 206 | github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= 207 | github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 208 | github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= 209 | github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= 210 | github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= 211 | github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= 212 | github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 h1:tHNk7XK9GkmKUR6Gh8gVBKXc2MVSZ4G/NnWLtzw4gNA= 213 | github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264= 214 | github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= 215 | github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= 216 | github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= 217 | github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8= 218 | github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= 219 | github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= 220 | github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= 221 | github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= 222 | github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= 223 | gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo= 224 | gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec/go.mod h1:BZ1RAoRPbCxum9Grlv5aeksu2H8BiKehBYooU2LFiOQ= 225 | go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= 226 | go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= 227 | go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M= 228 | go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= 229 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 230 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 231 | golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= 232 | golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= 233 | golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= 234 | golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= 235 | golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 236 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 237 | golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= 238 | golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 239 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 240 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 241 | golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= 242 | golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= 243 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 244 | golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= 245 | golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= 246 | golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 247 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 248 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 249 | golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 250 | golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 251 | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 252 | golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 253 | golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 254 | golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 255 | golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 256 | golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 257 | golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 258 | golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 259 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 260 | golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 261 | golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 262 | golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= 263 | golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 264 | golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= 265 | golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= 266 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 267 | golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= 268 | golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= 269 | golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= 270 | golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= 271 | golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 272 | golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= 273 | golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= 274 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 275 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 276 | google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= 277 | google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= 278 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 279 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 280 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 281 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 282 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 283 | lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= 284 | lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= 285 | lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= 286 | lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= 287 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func main() { 6 | fmt.Println("proxypool") 7 | } 8 | -------------------------------------------------------------------------------- /script/alive.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | while getopts ":x:" opt 4 | do 5 | case $opt in 6 | x) 7 | export http_proxy=$OPTARG 8 | export https_proxy=$http_proxy 9 | echo "使用代理 $https_proxy" 10 | ;; 11 | ?) 12 | echo "未知参数" 13 | exit 1;; 14 | esac 15 | done 16 | 17 | jsonQ() { 18 | json=$(cat) 19 | awk -v json="$json" -v json_original="$json" -v key="$1" ' 20 | function strLastChar(s) { 21 | return substr(s, length(s), 1) 22 | } 23 | function startWith(s, c) { 24 | start = substr(s, 1, 1) 25 | return start == c 26 | } 27 | function endWith(s, c) { 28 | return strLastChar(s) == c 29 | } 30 | function innerStr(s) { 31 | # 取出括号/引号内的内容 32 | return substr(s, 2, length(s)-2) 33 | } 34 | function strIndex(s, n) { 35 | # 字符串通过下标取值,索引是从1开始的 36 | return substr(s, n, 1) 37 | } 38 | function trim(s) { 39 | sub("^[ \n]*", "", s); 40 | sub("[ \n]*$", "", s); 41 | return s 42 | } 43 | function findValueByKey(s, k) { 44 | if ("\""k"\"" != substr(s, 1, length(k)+2)) {exit 0} 45 | s = trim(s) 46 | start = 0; stop = 0; layer = 0 47 | for (i = 2 + length(k) + 1; i <= length(s); ++i) { 48 | lastChar = substr(s, i - 1, 1) 49 | currChar = substr(s, i, 1) 50 | if (start <= 0) { 51 | if (lastChar == ":") { 52 | start = currChar == " " ? i + 1: i 53 | if (currChar == "{" || currChar == "[") { 54 | layer = 1 55 | } 56 | } 57 | } else { 58 | if (currChar == "{" || currChar == "[") { 59 | ++layer 60 | } 61 | if (currChar == "}" || currChar == "]") { 62 | --layer 63 | } 64 | if ((currChar == "," || currChar == "}" || currChar == "]") && layer <= 0) { 65 | stop = currChar == "," ? i : i + 1 + layer 66 | break 67 | } 68 | } 69 | } 70 | if (start <= 0 || stop <= 0 || start > length(s) || stop > length(s) || start >= stop) { 71 | exit 0 72 | } else { 73 | return trim(substr(s, start, stop - start)) 74 | } 75 | } 76 | function unquote(s) { 77 | if (startWith(s, "\"")) { 78 | s = substr(s, 2, length(s)-1) 79 | } 80 | if (endWith(s, "\"")) { 81 | s = substr(s, 1, length(s)-1) 82 | } 83 | return s 84 | } 85 | BEGIN{ 86 | if (match(key, /^\./) == 0) {exit 0;} 87 | sub(/\][ ]*\[/,"].[", key) 88 | split(key, ks, ".") 89 | if (length(ks) == 1) {print json; exit 0} 90 | for (j = 2; j <= length(ks); j++) { 91 | k = ks[j] 92 | if (startWith(k, "[") && endWith(k, "]") == 1) { # [n] 93 | idx = innerStr(k) 94 | currentIdx = -1 95 | # 找匹配对 96 | pairs = "" 97 | json = trim(json) 98 | if (startWith(json, "[") == 0) { 99 | exit 0 100 | } 101 | start = 2 102 | cursor = 2 103 | for (; cursor <= length(json); cursor++) { 104 | current = strIndex(json, cursor) 105 | if (current == " " || current == "\n") {continue} 106 | # 忽略空白 107 | if (current == "[" || current == "{") { 108 | if (length(pairs) == 0) {start = cursor} 109 | pairs = pairs""current 110 | } 111 | if (current == "]" || current == "}") { 112 | if ((strLastChar(pairs) == "[" && current == "]") || (strLastChar(pairs) == "{" && current == "}")) { 113 | pairs = substr(pairs, 1, length(pairs)-1) 114 | # 删掉最后一个字符 115 | if (pairs == "") { 116 | # 匹配到了所有的左括号 117 | currentIdx++ 118 | if (currentIdx == idx) { 119 | json = substr(json, start, cursor-start+1) 120 | break 121 | } 122 | } 123 | } else { 124 | pairs = pairs""current 125 | } 126 | } 127 | } 128 | } else { 129 | # 到这里,就只能是{"key": "value"}或{"key":{}}或{"key":[{}]} 130 | pairs = "" 131 | json = trim(json) 132 | if (startWith(json, "[")) {exit 0} 133 | #if (!startWith(json, "\"") || !startWith(json, "{")) {json="\""json} 134 | # 找匹配的键 135 | start = 2 136 | cursor = 2 137 | noMatch = 0 138 | for (; cursor <= length(json); cursor++) { 139 | current = strIndex(json, cursor) 140 | if (current == " " || current == "\n" || current == ",") {continue} 141 | # 忽略空白和逗号 142 | if (substr(json, cursor, length(k)+2) == "\""k"\"") { 143 | json = findValueByKey(substr(json, cursor, length(json)-cursor+1), k) 144 | break 145 | } else { 146 | noMatch = 1 147 | } 148 | if (noMatch) { 149 | pos = match(substr(json, cursor+1, length(json)-cursor), /[^(\\")]"/) 150 | ck = substr(substr(json, cursor+1, length(json)-cursor), 1, pos) 151 | t = findValueByKey(substr(json, cursor, length(json)-cursor+1), ck) 152 | tLen = length(t) 153 | sub(/\\/, "\\\\", t) 154 | pos = match(substr(json, cursor+1, length(json)-cursor), t) 155 | if (pos != 0) { 156 | cursor = cursor + pos + tLen 157 | } 158 | noMatch = 0 159 | continue 160 | } 161 | } 162 | } 163 | } 164 | if (json_original == json) { print;exit 0 } 165 | print unquote(json) 166 | }' 167 | } 168 | 169 | month=2592000 170 | timestamp=$(date +%s) 171 | lastMonth=$(( timestamp-month )) 172 | function isUpdated() 173 | { 174 | t1=`gdate -d "$1" +%s` 175 | if [ $t1 -gt $lastMonth ] 176 | then 177 | return 0 178 | else 179 | return 1 180 | fi 181 | } 182 | 183 | rm -rf result.log 184 | i=1 185 | 186 | data=$(cat ../source/nodelist.txt) 187 | for url in $data; do 188 | if [[ $url == https://raw.githubusercontent.com* ]]; then 189 | i=$[$i+1] 190 | code=$(curl -o /dev/null -k -s -w %{http_code} $url) 191 | if [ $code -ne 404 ] 192 | then 193 | arr=(`echo $url | tr '/' ' '`) 194 | repository=${arr[2]}%2F${arr[3]} 195 | response=$(curl -s https://github.com/search?q=$repository&type=repositories) 196 | response=$(echo "$response" | jsonQ ".payload.results.[0].repo.repository.updated_at") 197 | response=${response: 0: 19} 198 | response=${response/T/' '} 199 | if isUpdated $response ; then 200 | echo $url >> result.log 201 | fi 202 | fi 203 | 204 | ix=`expr $i % 8` 205 | if [ $ix -eq 0 ] 206 | then 207 | echo stop 208 | sleep 120 209 | fi 210 | fi 211 | done 212 | 213 | 214 | 215 | -------------------------------------------------------------------------------- /script/rebase.sh: -------------------------------------------------------------------------------- 1 | cd .. 2 | # 切换到一个脱离主分支的另外一条全新主分支,不用太在意叫什么,因为后面还会修改分支名称 3 | git checkout --orphan latest_branch 4 | # 暂存所有改动过的文件,内容为当前旧分支的最新版本所有文件 5 | git add -A 6 | #提交更改 7 | git commit -am "rebase" 8 | #删除原始主分支 9 | git branch -D main 10 | #将当前分支重命名为 main 11 | git branch -m main 12 | #最后,强制更新您的存储库 13 | git push -f origin main 14 | -------------------------------------------------------------------------------- /script/result.log: -------------------------------------------------------------------------------- 1 | https://raw.githubusercontent.com/aiboboxx/clashfree/main/clash.yml 2 | https://raw.githubusercontent.com/anaer/Sub/main/clash.yaml 3 | https://raw.githubusercontent.com/chengaopan/AutoMergePublicNodes/master/list.yml 4 | https://raw.githubusercontent.com/mahdibland/V2RayAggregator/master/sub/sub_merge_yaml.yml 5 | https://raw.githubusercontent.com/mheidari98/.proxy/main/all 6 | https://raw.githubusercontent.com/NiceVPN123/NiceVPN/main/Clash.yaml 7 | https://raw.githubusercontent.com/ts-sf/fly/main/clash 8 | https://raw.githubusercontent.com/PangTouY00/Auto_proxy/main/Long_term_subscription_num 9 | https://raw.githubusercontent.com/zhangkaiitugithub/passcro/main/speednodes.yaml 10 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/hysteria 11 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/vmess 12 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/vless 13 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/trojan 14 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/shadowsocks 15 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/reality 16 | https://raw.githubusercontent.com/yebekhe/TelegramV2rayCollector/main/sub/base64/mix 17 | https://raw.githubusercontent.com/peasoft/NoMoreWalls/master/list.yml 18 | https://raw.githubusercontent.com/Vauth/node/main/Main 19 | https://raw.githubusercontent.com/Vauth/node/main/Master 20 | https://raw.githubusercontent.com/WilliamStar007/ClashX-V2Ray-TopFreeProxy/main/combine/clash.config.yaml 21 | https://raw.githubusercontent.com/Epodonios/v2ray-configs/main/All_Configs_base64_Sub.txt 22 | https://raw.githubusercontent.com/lagzian/SS-Collector/main/mix_clash.yaml 23 | https://raw.githubusercontent.com/ALIILAPRO/v2rayNG-Config/main/sub.txt 24 | https://raw.githubusercontent.com/MrMohebi/xray-proxy-grabber-telegram/master/collected-proxies/clash-meta/all.yaml 25 | https://raw.githubusercontent.com/Misaka-blog/chromego_merge/main/sub/merged_proxies_new.yaml 26 | -------------------------------------------------------------------------------- /script/test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | data=$(cat proxies.txt) 3 | rm -rf result.log 4 | for url in $data; do 5 | if [[ $url == https://raw.githubusercontent.com* ]]; then 6 | echo "$url" >> result.log 7 | else 8 | code=$(curl --connect-timeout 10 -o /dev/null -k -s -w %{http_code} $url) 9 | if [ "000" != "$code" ]; then 10 | echo "$url" >> result.log 11 | fi 12 | fi 13 | done 14 | -------------------------------------------------------------------------------- /source/nodelist.txt: -------------------------------------------------------------------------------- 1 | https://raw.githubusercontent.com/aiboboxx/clashfree/main/clash.yml 2 | https://raw.githubusercontent.com/anaer/Sub/main/clash.yaml 3 | https://raw.githubusercontent.com/chengaopan/AutoMergePublicNodes/master/list.yml 4 | https://raw.githubusercontent.com/mahdibland/V2RayAggregator/master/sub/sub_merge_yaml.yml 5 | https://raw.githubusercontent.com/mheidari98/.proxy/main/all 6 | https://raw.githubusercontent.com/NiceVPN123/NiceVPN/main/Clash.yaml 7 | https://raw.githubusercontent.com/ts-sf/fly/main/clash 8 | https://raw.githubusercontent.com/PangTouY00/Auto_proxy/main/Long_term_subscription_num 9 | https://raw.githubusercontent.com/zhangkaiitugithub/passcro/main/speednodes.yaml 10 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/hysteria 11 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/vmess 12 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/vless 13 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/trojan 14 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/shadowsocks 15 | https://raw.githubusercontent.com/soroushmirzaei/telegram-configs-collector/main/protocols/reality 16 | https://raw.githubusercontent.com/yebekhe/TelegramV2rayCollector/main/sub/base64/mix 17 | https://raw.githubusercontent.com/peasoft/NoMoreWalls/master/list.yml 18 | https://raw.githubusercontent.com/Vauth/node/main/Main 19 | https://raw.githubusercontent.com/Vauth/node/main/Master 20 | https://raw.githubusercontent.com/WilliamStar007/ClashX-V2Ray-TopFreeProxy/main/combine/clash.config.yaml 21 | https://raw.githubusercontent.com/Epodonios/v2ray-configs/main/All_Configs_base64_Sub.txt 22 | https://raw.githubusercontent.com/lagzian/SS-Collector/main/mix_clash.yaml 23 | https://raw.githubusercontent.com/ALIILAPRO/v2rayNG-Config/main/sub.txt 24 | https://raw.githubusercontent.com/MrMohebi/xray-proxy-grabber-telegram/master/collected-proxies/clash-meta/all.yaml 25 | https://raw.githubusercontent.com/Misaka-blog/chromego_merge/main/sub/merged_proxies_new.yaml -------------------------------------------------------------------------------- /source/proxies.txt: -------------------------------------------------------------------------------- 1 | http://141.147.161.50:12580/clash/proxies 2 | http://150.230.195.209:12580/clash/proxies 3 | http://155.248.172.106:12580/clash/proxies 4 | http://174.137.58.32:12580/clash/proxies 5 | http://175.178.182.178:12580/clash/proxies 6 | http://66.42.50.118:12580/clash/proxies 7 | http://104.168.244.47:12580/clash/proxies 8 | http://beetle.lander.work/clash/proxies 9 | https://clashe.eu.org/clash/proxies 10 | https://proxy.crazygeeky.com/clash/proxies 11 | https://proxy.fldhhhhhh.top/clash/proxies 12 | https://proxypool.link/clash/proxies 13 | https://proxypool1999.banyunxiaoxi.icu/clash/proxies -------------------------------------------------------------------------------- /source/tgchannel.json: -------------------------------------------------------------------------------- 1 | [ 2 | "jiedian_share", 3 | "dingyue_center", 4 | "zerobaipiao", 5 | "freeV2rayi", 6 | "aifenxiang2020", 7 | "ShareCentrePro", 8 | "mftizi", 9 | "jiuJieD", 10 | "hkaa0", 11 | "V2ray60", 12 | "FreeV2rays", 13 | "JiedianSsr", 14 | "jiedianF", 15 | "wxdy666", 16 | "Socks5_bott", 17 | "MFJD666", 18 | "freevpnjd", 19 | "xinjichangguancha", 20 | "v2ray_configs_pool" 21 | ] 22 | -------------------------------------------------------------------------------- /source/v2ray-2.txt: -------------------------------------------------------------------------------- 1 | dm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1TMHhTaUlzSW1Ga1pDSTZJbU5tTGpBNU1ESXlOeTU0ZVhvaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pWmpFM05tTm1OVFF0TXpoak55MDBOR1ZoTFdFM1kyVXRPR0k0TjJGbU1qWTVPR0V3SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2TCtxNW91Y0xURkpJaXdpWVdSa0lqb2liWFZuWlc0eE1TNDJZbTUzTG5SdmNDSXNJbkJ2Y25RaU9pSTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJMU1UTmlNR015TXkweVpHSXhMVFF5TmpZdE9XSmxPQzA1TjJOa1kyTXdNalF4T1RnaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUprYVdKaGFTNTRhV0Z2Y1drMU5UVXVlSGw2SWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTXkweFFpSXNJbUZrWkNJNkltNXZaR2xsTG5saGJtZHRhV1V1YjI1c2FXNWxJaXdpY0c5eWRDSTZJamd3SWl3aWRIbHdaU0k2SW01dmJtVWlMQ0pwWkNJNklqSTVObVE1Tm1OakxUQXhNbVF0TkdNek15MDROVGs0TFdGak9EZGhZakF4TjJKbE5TSXNJbUZwWkNJNklqQWlMQ0p1WlhRaU9pSjNjeUlzSW5CaGRHZ2lPaUl2SWl3aWFHOXpkQ0k2SW5Ob2N5NTRhV0Z2Y1drMU5UVXVlSGw2SWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNkwrcTVvdWNMVEZFSWl3aVlXUmtJam9pYlhWblpXNHhNUzQyWW01M0xuUnZjQ0lzSW5CdmNuUWlPaUk0TUNJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSXpOMkk0Wm1Vd1pTMWtOMk15TFRSaE9ERXRZamt3WlMwNVpHUmpOR0ppTmpaa1ptWWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKa2FXSmhhUzU0YVdGdmNXazFOVFV1ZUhsNklpd2lkR3h6SWpvaUluMD0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1TMHhRU0lzSW1Ga1pDSTZJbU5tTGpBNU1ESXlOeTU0ZVhvaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pWmpRMlkySXpabUV0WlRreE1pMDBNelU1TFRnell6UXROMlZpTXpjd01ETmhNRGhpSWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1cGF3NVlxZzVaMmhRMFl0TVVJaUxDSmhaR1FpT2lKMGFXMWxMbWx6SWl3aWNHOXlkQ0k2SWpnd0lpd2lkSGx3WlNJNkltNXZibVVpTENKcFpDSTZJakk1Tm1RNU5tTmpMVEF4TW1RdE5HTXpNeTA0TlRrNExXRmpPRGRoWWpBeE4ySmxOU0lzSW1GcFpDSTZJakFpTENKdVpYUWlPaUozY3lJc0luQmhkR2dpT2lJdklpd2lhRzl6ZENJNkltMW5jMmN5TG5wb2IzVnphUzVzYVc1cklpd2lkR3h6SWpvaUluMD0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1pMHhRaUlzSW1Ga1pDSTZJbTExWjJWdU1qSXVObUp1ZHk1MGIzQWlMQ0p3YjNKMElqb2lPREE0TUNJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSXlPVFprT1Raall5MHdNVEprTFRSak16TXRPRFU1T0MxaFl6ZzNZV0l3TVRkaVpUVWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKemFITXVlR2xoYjNGcE5UVTFMbmg1ZWlJc0luUnNjeUk2SWlKOQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTVMweFNDSXNJbUZrWkNJNkltTm1MakE1TURJeU55NTRlWG9pTENKd2IzSjBJam9pT0RBaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2lOR0ZsWmpNMk5EZ3RZMll5WVMwMFpXVTNMV0psTkdRdE1HUmpZVGMyT1RSbFlqY3pJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWMyaHpMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lJaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2SU9TNm11bXByT21BaWlBd2VDMHhSeUlzSW1Ga1pDSTZJakU0TGpFMk55NHhOekl1TVRFeUlpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJNU1ETTJaV1F5WVMxaE56UXpMVFJtWVdVdE9UWTVOQzFqTXpnelkyTTNOamRtWkdRaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpoZDNNdVlXNXphQzUwYjNBaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdjVhNjI1YTY5U0V0VUlERXdlQzB4UkNJc0ltRmtaQ0k2SW1KbGRtVnVkQzVpYVd4cFltbHNhUzUwZGlJc0luQnZjblFpT2lJME5ETWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pTXpkaU9HWmxNR1V0WkRkak1pMDBZVGd4TFdJNU1HVXRPV1JrWXpSaVlqWTJaR1ptSWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2lhR3QwTG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNmFhWjVyaXY1YTYyNWE2OVNFdENUaUF4TUhndE1VZ2lMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJMFlXVm1NelkwT0MxalpqSmhMVFJsWlRjdFltVTBaQzB3WkdOaE56WTVOR1ZpTnpNaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpvYTJKdUxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUowYkhNaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU5DMHhSU0lzSW1Ga1pDSTZJbUpsYzNSalppNTBiM0FpTENKd2IzSjBJam9pT0RBaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2laVFkwWVRWbFlqVXRPR0ptT1MwME9EZ3pMVGt6WVRndE1tVXhOR1kxWkRKaVpEQXpJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWMyaHpMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lJaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1TMHhTU0lzSW1Ga1pDSTZJbU5tTGpBNU1ESXlOeTU0ZVhvaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pTlRFellqQmpNak10TW1SaU1TMDBNalkyTFRsaVpUZ3RPVGRqWkdOak1ESTBNVGs0SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNeTB4U0NJc0ltRmtaQ0k2SW01dlpHbGxMbmxoYm1kdGFXVXViMjVzYVc1bElpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SWpSaFpXWXpOalE0TFdObU1tRXROR1ZsTnkxaVpUUmtMVEJrWTJFM05qazBaV0kzTXlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbk5vY3k1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2TCtxNW91Y0xURkdJaXdpWVdSa0lqb2liWFZuWlc0eE1TNDJZbTUzTG5SdmNDSXNJbkJ2Y25RaU9pSTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbU9ESXpOR1EwWVMxaU1qZ3pMVFJtTnprdE9EWTNaQzA0TnpsaE9UbGpOR1pqWWpJaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUprYVdKaGFTNTRhV0Z2Y1drMU5UVXVlSGw2SWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTlMweFNpSXNJbUZrWkNJNkltMTFaMlZ1TVRFdU5tSnVkeTUwYjNBaUxDSndiM0owSWpvaU9EQTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbU1UYzJZMlkxTkMwek9HTTNMVFEwWldFdFlUZGpaUzA0WWpnM1lXWXlOams0WVRBaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUp6YUhNdWVHbGhiM0ZwTlRVMUxuaDVlaUlzSW5Sc2N5STZJaUo5CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1cGF3NVlxZzVaMmhRMFl0TVVNaUxDSmhaR1FpT2lKMGFXMWxMbWx6SWl3aWNHOXlkQ0k2SWpnd0lpd2lkSGx3WlNJNkltNXZibVVpTENKcFpDSTZJamRpTXpSa05HSTJMVEU1WkRFdE5ETmxOeTA0WXpZd0xUQTNPR05sTlRBd05UTTRaQ0lzSW1GcFpDSTZJakFpTENKdVpYUWlPaUozY3lJc0luQmhkR2dpT2lJdklpd2lhRzl6ZENJNkltMW5jMmN5TG5wb2IzVnphUzVzYVc1cklpd2lkR3h6SWpvaUluMD0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2NWE2MjVhNjlTRXRDVGlBeE1IZ3RNVVVpTENKaFpHUWlPaUowYVcxbExtbHpJaXdpY0c5eWRDSTZJalEwTXlJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSmxOalJoTldWaU5TMDRZbVk1TFRRNE9ETXRPVE5oT0MweVpURTBaalZrTW1Ka01ETWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKb2EySnVMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNeTB4U1NJc0ltRmtaQ0k2SW01dlpHbGxMbmxoYm1kdGFXVXViMjVzYVc1bElpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SWpVeE0ySXdZekl6TFRKa1lqRXROREkyTmkwNVltVTRMVGszWTJSall6QXlOREU1T0NJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbk5vY3k1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdjVhNjI1YTY5U0V0VUlERXdlQzB4U3lJc0ltRmtaQ0k2SW1KbGRtVnVkQzVpYVd4cFltbHNhUzUwZGlJc0luQnZjblFpT2lJME5ETWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pTlRBNE9USXpaREV0TVRZd1ppMDBOVE5sTFdFMU56Z3RObUZqWVRGbVptRTRPVEl5SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2lhR3QwTG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTkMweFJ5SXNJbUZrWkNJNkltSmxjM1JqWmk1MGIzQWlMQ0p3YjNKMElqb2lPREFpTENKMGVYQmxJam9pYm05dVpTSXNJbWxrSWpvaU9UQXpObVZrTW1FdFlUYzBNeTAwWm1GbExUazJPVFF0WXpNNE0yTmpOelkzWm1Sa0lpd2lZV2xrSWpvaU1DSXNJbTVsZENJNkluZHpJaXdpY0dGMGFDSTZJaThpTENKb2IzTjBJam9pYzJoekxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUlpZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNkwrcTVvdWNMVEZESWl3aVlXUmtJam9pYlhWblpXNHhNUzQyWW01M0xuUnZjQ0lzSW5CdmNuUWlPaUk0TUNJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSTNZak0wWkRSaU5pMHhPV1F4TFRRelpUY3RPR00yTUMwd056aGpaVFV3TURVek9HUWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKa2FXSmhhUzU0YVdGdmNXazFOVFV1ZUhsNklpd2lkR3h6SWpvaUluMD0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZMK3E1b3VjTFRGSUlpd2lZV1JrSWpvaWJYVm5aVzR4TVM0MlltNTNMblJ2Y0NJc0luQnZjblFpT2lJNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkwWVdWbU16WTBPQzFqWmpKaExUUmxaVGN0WW1VMFpDMHdaR05oTnpZNU5HVmlOek1pTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSmthV0poYVM1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdjVhNjI1YTY5U0V0VUlERXdlQzB4U1NJc0ltRmtaQ0k2SW1KbGRtVnVkQzVpYVd4cFltbHNhUzUwZGlJc0luQnZjblFpT2lJME5ETWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pTlRFellqQmpNak10TW1SaU1TMDBNalkyTFRsaVpUZ3RPVGRqWkdOak1ESTBNVGs0SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2lhR3QwTG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNXBhdzVZcWc1WjJoUTBZdE1VZ2lMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SWpSaFpXWXpOalE0TFdObU1tRXROR1ZsTnkxaVpUUmtMVEJrWTJFM05qazBaV0kzTXlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbTFuYzJjeUxucG9iM1Z6YVM1c2FXNXJJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNUzB4UWlJc0ltRmtaQ0k2SW1ObUxqQTVNREl5Tnk1NGVYb2lMQ0p3YjNKMElqb2lPREFpTENKMGVYQmxJam9pYm05dVpTSXNJbWxrSWpvaU1qazJaRGsyWTJNdE1ERXlaQzAwWXpNekxUZzFPVGd0WVdNNE4yRmlNREUzWW1VMUlpd2lZV2xrSWpvaU1DSXNJbTVsZENJNkluZHpJaXdpY0dGMGFDSTZJaThpTENKb2IzTjBJam9pYzJoekxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUlpZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTXkweFNpSXNJbUZrWkNJNkltNXZaR2xsTG5saGJtZHRhV1V1YjI1c2FXNWxJaXdpY0c5eWRDSTZJamd3SWl3aWRIbHdaU0k2SW01dmJtVWlMQ0pwWkNJNkltWXhOelpqWmpVMExUTTRZemN0TkRSbFlTMWhOMk5sTFRoaU9EZGhaakkyT1RoaE1DSXNJbUZwWkNJNklqQWlMQ0p1WlhRaU9pSjNjeUlzSW5CaGRHZ2lPaUl2SWl3aWFHOXpkQ0k2SW5Ob2N5NTRhV0Z2Y1drMU5UVXVlSGw2SWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNXBhdzVZcWc1WjJoUTBZdE1Va2lMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SWpVeE0ySXdZekl6TFRKa1lqRXROREkyTmkwNVltVTRMVGszWTJSall6QXlOREU1T0NJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbTFuYzJjeUxucG9iM1Z6YVM1c2FXNXJJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOQzB4UVNJc0ltRmtaQ0k2SW1KbGMzUmpaaTUwYjNBaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pWmpRMlkySXpabUV0WlRreE1pMDBNelU1TFRnell6UXROMlZpTXpjd01ETmhNRGhpSWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNaTB4U0NJc0ltRmtaQ0k2SW0xMVoyVnVNakl1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkwWVdWbU16WTBPQzFqWmpKaExUUmxaVGN0WW1VMFpDMHdaR05oTnpZNU5HVmlOek1pTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU5DMHhSQ0lzSW1Ga1pDSTZJbUpsYzNSalppNTBiM0FpTENKd2IzSjBJam9pT0RBaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2lNemRpT0dabE1HVXRaRGRqTWkwMFlUZ3hMV0k1TUdVdE9XUmtZelJpWWpZMlpHWm1JaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWMyaHpMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lJaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU5DMHhTeUlzSW1Ga1pDSTZJbUpsYzNSalppNTBiM0FpTENKd2IzSjBJam9pT0RBaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2lOVEE0T1RJelpERXRNVFl3WmkwME5UTmxMV0UxTnpndE5tRmpZVEZtWm1FNE9USXlJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWMyaHpMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lJaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVwYXc1WXFnNVoyaFEwWXRNVW9pTENKaFpHUWlPaUowYVcxbExtbHpJaXdpY0c5eWRDSTZJamd3SWl3aWRIbHdaU0k2SW01dmJtVWlMQ0pwWkNJNkltWXhOelpqWmpVMExUTTRZemN0TkRSbFlTMWhOMk5sTFRoaU9EZGhaakkyT1RoaE1DSXNJbUZwWkNJNklqQWlMQ0p1WlhRaU9pSjNjeUlzSW5CaGRHZ2lPaUl2SWl3aWFHOXpkQ0k2SW0xbmMyY3lMbnBvYjNWemFTNXNhVzVySWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNkwrcTVvdWNMVEZCSWl3aVlXUmtJam9pYlhWblpXNHhNUzQyWW01M0xuUnZjQ0lzSW5CdmNuUWlPaUk0TUNJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSm1ORFpqWWpObVlTMWxPVEV5TFRRek5Ua3RPRE5qTkMwM1pXSXpOekF3TTJFd09HSWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKa2FXSmhhUzU0YVdGdmNXazFOVFV1ZUhsNklpd2lkR3h6SWpvaUluMD0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1TMHhTeUlzSW1Ga1pDSTZJbU5tTGpBNU1ESXlOeTU0ZVhvaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pTlRBNE9USXpaREV0TVRZd1ppMDBOVE5sTFdFMU56Z3RObUZqWVRGbVptRTRPVEl5SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOUzB4UkNJc0ltRmtaQ0k2SW0xMVoyVnVNVEV1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUl6TjJJNFptVXdaUzFrTjJNeUxUUmhPREV0WWprd1pTMDVaR1JqTkdKaU5qWmtabVlpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1TMHhSU0lzSW1Ga1pDSTZJbU5tTGpBNU1ESXlOeTU0ZVhvaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pWlRZMFlUVmxZalV0T0dKbU9TMDBPRGd6TFRrellUZ3RNbVV4TkdZMVpESmlaREF6SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOUzB4U3lJc0ltRmtaQ0k2SW0xMVoyVnVNVEV1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkxTURnNU1qTmtNUzB4TmpCbUxUUTFNMlV0WVRVM09DMDJZV05oTVdabVlUZzVNaklpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1pMHhTaUlzSW1Ga1pDSTZJbTExWjJWdU1qSXVObUp1ZHk1MGIzQWlMQ0p3YjNKMElqb2lPREE0TUNJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSm1NVGMyWTJZMU5DMHpPR00zTFRRMFpXRXRZVGRqWlMwNFlqZzNZV1l5TmprNFlUQWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKemFITXVlR2xoYjNGcE5UVTFMbmg1ZWlJc0luUnNjeUk2SWlKOQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNXBhdzVZcWc1WjJoUTBZdE1Vc2lMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SWpVd09Ea3lNMlF4TFRFMk1HWXRORFV6WlMxaE5UYzRMVFpoWTJFeFptWmhPRGt5TWlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbTFuYzJjeUxucG9iM1Z6YVM1c2FXNXJJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNeTB4UVNJc0ltRmtaQ0k2SW01dlpHbGxMbmxoYm1kdGFXVXViMjVzYVc1bElpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SW1ZME5tTmlNMlpoTFdVNU1USXRORE0xT1MwNE0yTTBMVGRsWWpNM01EQXpZVEE0WWlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbk5vY3k1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdklPUzZtdW1wck9tQWlpQXdlQzB4UVNJc0ltRmtaQ0k2SWpFNExqRTJOeTR4TnpJdU1URXlJaXdpY0c5eWRDSTZJalEwTXlJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSm1ORFpqWWpObVlTMWxPVEV5TFRRek5Ua3RPRE5qTkMwM1pXSXpOekF3TTJFd09HSWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKaGQzTXVZVzV6YUM1MGIzQWlMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTkMweFJpSXNJbUZrWkNJNkltSmxjM1JqWmk1MGIzQWlMQ0p3YjNKMElqb2lPREFpTENKMGVYQmxJam9pYm05dVpTSXNJbWxrSWpvaVpqZ3lNelJrTkdFdFlqSTRNeTAwWmpjNUxUZzJOMlF0T0RjNVlUazVZelJtWTJJeUlpd2lZV2xrSWpvaU1DSXNJbTVsZENJNkluZHpJaXdpY0dGMGFDSTZJaThpTENKb2IzTjBJam9pYzJoekxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUlpZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTlMweFFTSXNJbUZrWkNJNkltMTFaMlZ1TVRFdU5tSnVkeTUwYjNBaUxDSndiM0owSWpvaU9EQTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbU5EWmpZak5tWVMxbE9URXlMVFF6TlRrdE9ETmpOQzAzWldJek56QXdNMkV3T0dJaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUp6YUhNdWVHbGhiM0ZwTlRVMUxuaDVlaUlzSW5Sc2N5STZJaUo5CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdjVhNjI1YTY5U0V0Q1RpQXhNSGd0TVVjaUxDSmhaR1FpT2lKMGFXMWxMbWx6SWl3aWNHOXlkQ0k2SWpRME15SXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUk1TURNMlpXUXlZUzFoTnpRekxUUm1ZV1V0T1RZNU5DMWpNemd6WTJNM05qZG1aR1FpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSm9hMkp1TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNmFhWjVyaXY1YTYyNWE2OVNFdFVJREV3ZUMweFFpSXNJbUZrWkNJNkltSmxkbVZ1ZEM1aWFXeHBZbWxzYVM1MGRpSXNJbkJ2Y25RaU9pSTBORE1pTENKMGVYQmxJam9pYm05dVpTSXNJbWxrSWpvaU1qazJaRGsyWTJNdE1ERXlaQzAwWXpNekxUZzFPVGd0WVdNNE4yRmlNREUzWW1VMUlpd2lZV2xrSWpvaU1DSXNJbTVsZENJNkluZHpJaXdpY0dGMGFDSTZJaThpTENKb2IzTjBJam9pYUd0MExuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUowYkhNaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2NWE2MjVhNjlTRXRDVGlBeE1IZ3RNVW9pTENKaFpHUWlPaUowYVcxbExtbHpJaXdpY0c5eWRDSTZJalEwTXlJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSm1NVGMyWTJZMU5DMHpPR00zTFRRMFpXRXRZVGRqWlMwNFlqZzNZV1l5TmprNFlUQWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKb2EySnVMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNaTB4UXlJc0ltRmtaQ0k2SW0xMVoyVnVNakl1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkzWWpNMFpEUmlOaTB4T1dReExUUXpaVGN0T0dNMk1DMHdOemhqWlRVd01EVXpPR1FpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZMK3E1b3VjTFRGS0lpd2lZV1JrSWpvaWJYVm5aVzR4TVM0MlltNTNMblJ2Y0NJc0luQnZjblFpT2lJNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUptTVRjMlkyWTFOQzB6T0dNM0xUUTBaV0V0WVRkalpTMDRZamczWVdZeU5qazRZVEFpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSmthV0poYVM1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2TCtxNW91Y0xURkxJaXdpWVdSa0lqb2liWFZuWlc0eE1TNDJZbTUzTG5SdmNDSXNJbkJ2Y25RaU9pSTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJMU1EZzVNak5rTVMweE5qQm1MVFExTTJVdFlUVTNPQzAyWVdOaE1XWm1ZVGc1TWpJaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUprYVdKaGFTNTRhV0Z2Y1drMU5UVXVlSGw2SWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTVMweFJpSXNJbUZrWkNJNkltTm1MakE1TURJeU55NTRlWG9pTENKd2IzSjBJam9pT0RBaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2laamd5TXpSa05HRXRZakk0TXkwMFpqYzVMVGcyTjJRdE9EYzVZVGs1WXpSbVkySXlJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWMyaHpMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lJaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2SU9TNm11bXByT21BaWlBd2VDMHhTeUlzSW1Ga1pDSTZJakU0TGpFMk55NHhOekl1TVRFeUlpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJMU1EZzVNak5rTVMweE5qQm1MVFExTTJVdFlUVTNPQzAyWVdOaE1XWm1ZVGc1TWpJaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpoZDNNdVlXNXphQzUwYjNBaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNaTB4U1NJc0ltRmtaQ0k2SW0xMVoyVnVNakl1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkxTVROaU1HTXlNeTB5WkdJeExUUXlOall0T1dKbE9DMDVOMk5rWTJNd01qUXhPVGdpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVwYXc1WXFnNVoyaFEwWXRNVVlpTENKaFpHUWlPaUowYVcxbExtbHpJaXdpY0c5eWRDSTZJamd3SWl3aWRIbHdaU0k2SW01dmJtVWlMQ0pwWkNJNkltWTRNak0wWkRSaExXSXlPRE10TkdZM09TMDROamRrTFRnM09XRTVPV00wWm1OaU1pSXNJbUZwWkNJNklqQWlMQ0p1WlhRaU9pSjNjeUlzSW5CaGRHZ2lPaUl2SWl3aWFHOXpkQ0k2SW0xbmMyY3lMbnBvYjNWemFTNXNhVzVySWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTlMweFFpSXNJbUZrWkNJNkltMTFaMlZ1TVRFdU5tSnVkeTUwYjNBaUxDSndiM0owSWpvaU9EQTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJeU9UWmtPVFpqWXkwd01USmtMVFJqTXpNdE9EVTVPQzFoWXpnM1lXSXdNVGRpWlRVaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUp6YUhNdWVHbGhiM0ZwTlRVMUxuaDVlaUlzSW5Sc2N5STZJaUo5CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOQzB4U0NJc0ltRmtaQ0k2SW1KbGMzUmpaaTUwYjNBaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pTkdGbFpqTTJORGd0WTJZeVlTMDBaV1UzTFdKbE5HUXRNR1JqWVRjMk9UUmxZamN6SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOQzB4U1NJc0ltRmtaQ0k2SW1KbGMzUmpaaTUwYjNBaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pTlRFellqQmpNak10TW1SaU1TMDBNalkyTFRsaVpUZ3RPVGRqWkdOak1ESTBNVGs0SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdklPUzZtdW1wck9tQWlpQXdlQzB4U1NJc0ltRmtaQ0k2SWpFNExqRTJOeTR4TnpJdU1URXlJaXdpY0c5eWRDSTZJalEwTXlJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSTFNVE5pTUdNeU15MHlaR0l4TFRReU5qWXRPV0psT0MwNU4yTmtZMk13TWpReE9UZ2lMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKaGQzTXVZVzV6YUM1MGIzQWlMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNmFhWjVyaXY1YTYyNWE2OVNFdENUaUF4TUhndE1VRWlMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbU5EWmpZak5tWVMxbE9URXlMVFF6TlRrdE9ETmpOQzAzWldJek56QXdNMkV3T0dJaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpvYTJKdUxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUowYkhNaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2NWE2MjVhNjlTRXRDVGlBeE1IZ3RNVVlpTENKaFpHUWlPaUowYVcxbExtbHpJaXdpY0c5eWRDSTZJalEwTXlJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSm1PREl6TkdRMFlTMWlNamd6TFRSbU56a3RPRFkzWkMwNE56bGhPVGxqTkdaallqSWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKb2EySnVMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOUzB4UXlJc0ltRmtaQ0k2SW0xMVoyVnVNVEV1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkzWWpNMFpEUmlOaTB4T1dReExUUXpaVGN0T0dNMk1DMHdOemhqWlRVd01EVXpPR1FpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2SU9TNm11bXByT21BaWlBd2VDMHhRaUlzSW1Ga1pDSTZJakU0TGpFMk55NHhOekl1TVRFeUlpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJeU9UWmtPVFpqWXkwd01USmtMVFJqTXpNdE9EVTVPQzFoWXpnM1lXSXdNVGRpWlRVaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpoZDNNdVlXNXphQzUwYjNBaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdjVhNjI1YTY5U0V0Q1RpQXhNSGd0TVVNaUxDSmhaR1FpT2lKMGFXMWxMbWx6SWl3aWNHOXlkQ0k2SWpRME15SXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkzWWpNMFpEUmlOaTB4T1dReExUUXpaVGN0T0dNMk1DMHdOemhqWlRVd01EVXpPR1FpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSm9hMkp1TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTWkweFFTSXNJbUZrWkNJNkltMTFaMlZ1TWpJdU5tSnVkeTUwYjNBaUxDSndiM0owSWpvaU9EQTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbU5EWmpZak5tWVMxbE9URXlMVFF6TlRrdE9ETmpOQzAzWldJek56QXdNMkV3T0dJaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUp6YUhNdWVHbGhiM0ZwTlRVMUxuaDVlaUlzSW5Sc2N5STZJaUo5CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNeTB4UnlJc0ltRmtaQ0k2SW01dlpHbGxMbmxoYm1kdGFXVXViMjVzYVc1bElpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SWprd016WmxaREpoTFdFM05ETXROR1poWlMwNU5qazBMV016T0ROall6YzJOMlprWkNJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbk5vY3k1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOUzB4UmlJc0ltRmtaQ0k2SW0xMVoyVnVNVEV1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUptT0RJek5HUTBZUzFpTWpnekxUUm1Oemt0T0RZM1pDMDROemxoT1Rsak5HWmpZaklpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2SU9TNm11bXByT21BaWlBd2VDMHhTaUlzSW1Ga1pDSTZJakU0TGpFMk55NHhOekl1TVRFeUlpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbU1UYzJZMlkxTkMwek9HTTNMVFEwWldFdFlUZGpaUzA0WWpnM1lXWXlOams0WVRBaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpoZDNNdVlXNXphQzUwYjNBaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNaTB4UlNJc0ltRmtaQ0k2SW0xMVoyVnVNakl1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUpsTmpSaE5XVmlOUzA0WW1ZNUxUUTRPRE10T1ROaE9DMHlaVEUwWmpWa01tSmtNRE1pTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2NWE2MjVhNjlTRXRVSURFd2VDMHhTQ0lzSW1Ga1pDSTZJbUpsZG1WdWRDNWlhV3hwWW1sc2FTNTBkaUlzSW5CdmNuUWlPaUkwTkRNaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2lOR0ZsWmpNMk5EZ3RZMll5WVMwMFpXVTNMV0psTkdRdE1HUmpZVGMyT1RSbFlqY3pJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWFHdDBMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOUzB4U0NJc0ltRmtaQ0k2SW0xMVoyVnVNVEV1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkwWVdWbU16WTBPQzFqWmpKaExUUmxaVGN0WW1VMFpDMHdaR05oTnpZNU5HVmlOek1pTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2SU9TNm11bXByT21BaWlBd2VDMHhReUlzSW1Ga1pDSTZJakU0TGpFMk55NHhOekl1TVRFeUlpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJM1lqTTBaRFJpTmkweE9XUXhMVFF6WlRjdE9HTTJNQzB3TnpoalpUVXdNRFV6T0dRaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpoZDNNdVlXNXphQzUwYjNBaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOQzB4UWlJc0ltRmtaQ0k2SW1KbGMzUmpaaTUwYjNBaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pTWprMlpEazJZMk10TURFeVpDMDBZek16TFRnMU9UZ3RZV000TjJGaU1ERTNZbVUxSWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdjVhNjI1YTY5U0V0Q1RpQXhNSGd0TVVRaUxDSmhaR1FpT2lKMGFXMWxMbWx6SWl3aWNHOXlkQ0k2SWpRME15SXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUl6TjJJNFptVXdaUzFrTjJNeUxUUmhPREV0WWprd1pTMDVaR1JqTkdKaU5qWmtabVlpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSm9hMkp1TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTkMweFF5SXNJbUZrWkNJNkltSmxjM1JqWmk1MGIzQWlMQ0p3YjNKMElqb2lPREFpTENKMGVYQmxJam9pYm05dVpTSXNJbWxrSWpvaU4ySXpOR1EwWWpZdE1UbGtNUzAwTTJVM0xUaGpOakF0TURjNFkyVTFNREExTXpoa0lpd2lZV2xrSWpvaU1DSXNJbTVsZENJNkluZHpJaXdpY0dGMGFDSTZJaThpTENKb2IzTjBJam9pYzJoekxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUlpZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNmFhWjVyaXY1YTYyNWE2OVNFdENUaUF4TUhndE1Vc2lMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJMU1EZzVNak5rTVMweE5qQm1MVFExTTJVdFlUVTNPQzAyWVdOaE1XWm1ZVGc1TWpJaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpvYTJKdUxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUowYkhNaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1pMHhTeUlzSW1Ga1pDSTZJbTExWjJWdU1qSXVObUp1ZHk1MGIzQWlMQ0p3YjNKMElqb2lPREE0TUNJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSTFNRGc1TWpOa01TMHhOakJtTFRRMU0yVXRZVFUzT0MwMllXTmhNV1ptWVRnNU1qSWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKemFITXVlR2xoYjNGcE5UVTFMbmg1ZWlJc0luUnNjeUk2SWlKOQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTVMweFF5SXNJbUZrWkNJNkltTm1MakE1TURJeU55NTRlWG9pTENKd2IzSjBJam9pT0RBaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2lOMkl6TkdRMFlqWXRNVGxrTVMwME0yVTNMVGhqTmpBdE1EYzRZMlUxTURBMU16aGtJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWMyaHpMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lJaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2SU9TNm11bXByT21BaWlBd2VDMHhSQ0lzSW1Ga1pDSTZJakU0TGpFMk55NHhOekl1TVRFeUlpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJek4ySTRabVV3WlMxa04yTXlMVFJoT0RFdFlqa3daUzA1WkdSak5HSmlOalprWm1ZaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpoZDNNdVlXNXphQzUwYjNBaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNaTB4UkNJc0ltRmtaQ0k2SW0xMVoyVnVNakl1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUl6TjJJNFptVXdaUzFrTjJNeUxUUmhPREV0WWprd1pTMDVaR1JqTkdKaU5qWmtabVlpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2SU9TNm11bXByT21BaWlBd2VDMHhSaUlzSW1Ga1pDSTZJakU0TGpFMk55NHhOekl1TVRFeUlpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbU9ESXpOR1EwWVMxaU1qZ3pMVFJtTnprdE9EWTNaQzA0TnpsaE9UbGpOR1pqWWpJaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpoZDNNdVlXNXphQzUwYjNBaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2TCtxNW91Y0xURkhJaXdpWVdSa0lqb2liWFZuWlc0eE1TNDJZbTUzTG5SdmNDSXNJbkJ2Y25RaU9pSTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJNU1ETTJaV1F5WVMxaE56UXpMVFJtWVdVdE9UWTVOQzFqTXpnelkyTTNOamRtWkdRaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUprYVdKaGFTNTRhV0Z2Y1drMU5UVXVlSGw2SWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTXkweFJDSXNJbUZrWkNJNkltNXZaR2xsTG5saGJtZHRhV1V1YjI1c2FXNWxJaXdpY0c5eWRDSTZJamd3SWl3aWRIbHdaU0k2SW01dmJtVWlMQ0pwWkNJNklqTTNZamhtWlRCbExXUTNZekl0TkdFNE1TMWlPVEJsTFRsa1pHTTBZbUkyTm1SbVppSXNJbUZwWkNJNklqQWlMQ0p1WlhRaU9pSjNjeUlzSW5CaGRHZ2lPaUl2SWl3aWFHOXpkQ0k2SW5Ob2N5NTRhV0Z2Y1drMU5UVXVlSGw2SWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNXBhdzVZcWc1WjJoUTBZdE1VVWlMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SW1VMk5HRTFaV0kxTFRoaVpqa3RORGc0TXkwNU0yRTRMVEpsTVRSbU5XUXlZbVF3TXlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbTFuYzJjeUxucG9iM1Z6YVM1c2FXNXJJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1cGF3NVlxZzVaMmhRMFl0TVVjaUxDSmhaR1FpT2lKMGFXMWxMbWx6SWl3aWNHOXlkQ0k2SWpnd0lpd2lkSGx3WlNJNkltNXZibVVpTENKcFpDSTZJamt3TXpabFpESmhMV0UzTkRNdE5HWmhaUzA1TmprMExXTXpPRE5qWXpjMk4yWmtaQ0lzSW1GcFpDSTZJakFpTENKdVpYUWlPaUozY3lJc0luQmhkR2dpT2lJdklpd2lhRzl6ZENJNkltMW5jMmN5TG5wb2IzVnphUzVzYVc1cklpd2lkR3h6SWpvaUluMD0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2NWE2MjVhNjlTRXRVSURFd2VDMHhTaUlzSW1Ga1pDSTZJbUpsZG1WdWRDNWlhV3hwWW1sc2FTNTBkaUlzSW5CdmNuUWlPaUkwTkRNaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2laakUzTm1ObU5UUXRNemhqTnkwME5HVmhMV0UzWTJVdE9HSTROMkZtTWpZNU9HRXdJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWFHdDBMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2TCtxNW91Y0xURkNJaXdpWVdSa0lqb2liWFZuWlc0eE1TNDJZbTUzTG5SdmNDSXNJbkJ2Y25RaU9pSTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJeU9UWmtPVFpqWXkwd01USmtMVFJqTXpNdE9EVTVPQzFoWXpnM1lXSXdNVGRpWlRVaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUprYVdKaGFTNTRhV0Z2Y1drMU5UVXVlSGw2SWl3aWRHeHpJam9pSW4wPQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNmFhWjVyaXY1YTYyNWE2OVNFdENUaUF4TUhndE1VSWlMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJeU9UWmtPVFpqWXkwd01USmtMVFJqTXpNdE9EVTVPQzFoWXpnM1lXSXdNVGRpWlRVaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpvYTJKdUxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUowYkhNaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2SU9TNm11bXByT21BaWlBd2VDMHhSU0lzSW1Ga1pDSTZJakU0TGpFMk55NHhOekl1TVRFeUlpd2ljRzl5ZENJNklqUTBNeUlzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbE5qUmhOV1ZpTlMwNFltWTVMVFE0T0RNdE9UTmhPQzB5WlRFMFpqVmtNbUprTURNaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUpoZDNNdVlXNXphQzUwYjNBaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNaTB4UmlJc0ltRmtaQ0k2SW0xMVoyVnVNakl1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUptT0RJek5HUTBZUzFpTWpnekxUUm1Oemt0T0RZM1pDMDROemxoT1Rsak5HWmpZaklpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU5TMHhTU0lzSW1Ga1pDSTZJbTExWjJWdU1URXVObUp1ZHk1MGIzQWlMQ0p3YjNKMElqb2lPREE0TUNJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSTFNVE5pTUdNeU15MHlaR0l4TFRReU5qWXRPV0psT0MwNU4yTmtZMk13TWpReE9UZ2lMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKemFITXVlR2xoYjNGcE5UVTFMbmg1ZWlJc0luUnNjeUk2SWlKOQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTlMweFJ5SXNJbUZrWkNJNkltMTFaMlZ1TVRFdU5tSnVkeTUwYjNBaUxDSndiM0owSWpvaU9EQTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lJNU1ETTJaV1F5WVMxaE56UXpMVFJtWVdVdE9UWTVOQzFqTXpnelkyTTNOamRtWkdRaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUp6YUhNdWVHbGhiM0ZwTlRVMUxuaDVlaUlzSW5Sc2N5STZJaUo5CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNeTB4UmlJc0ltRmtaQ0k2SW01dlpHbGxMbmxoYm1kdGFXVXViMjVzYVc1bElpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SW1ZNE1qTTBaRFJoTFdJeU9ETXROR1kzT1MwNE5qZGtMVGczT1dFNU9XTTBabU5pTWlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbk5vY3k1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNaTB4UnlJc0ltRmtaQ0k2SW0xMVoyVnVNakl1Tm1KdWR5NTBiM0FpTENKd2IzSjBJam9pT0RBNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUk1TURNMlpXUXlZUzFoTnpRekxUUm1ZV1V0T1RZNU5DMWpNemd6WTJNM05qZG1aR1FpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSnphSE11ZUdsaGIzRnBOVFUxTG5oNWVpSXNJblJzY3lJNklpSjkKdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2NWE2MjVhNjlTRXRVSURFd2VDMHhRU0lzSW1Ga1pDSTZJbUpsZG1WdWRDNWlhV3hwWW1sc2FTNTBkaUlzSW5CdmNuUWlPaUkwTkRNaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2laalEyWTJJelptRXRaVGt4TWkwME16VTVMVGd6WXpRdE4yVmlNemN3TUROaE1EaGlJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWFHdDBMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lKMGJITWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdjVhNjI1YTY5U0V0VUlERXdlQzB4UlNJc0ltRmtaQ0k2SW1KbGRtVnVkQzVpYVd4cFltbHNhUzUwZGlJc0luQnZjblFpT2lJME5ETWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pWlRZMFlUVmxZalV0T0dKbU9TMDBPRGd6TFRrellUZ3RNbVV4TkdZMVpESmlaREF6SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2lhR3QwTG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNmFhWjVyaXY1YTYyNWE2OVNFdFVJREV3ZUMweFJ5SXNJbUZrWkNJNkltSmxkbVZ1ZEM1aWFXeHBZbWxzYVM1MGRpSXNJbkJ2Y25RaU9pSTBORE1pTENKMGVYQmxJam9pYm05dVpTSXNJbWxrSWpvaU9UQXpObVZrTW1FdFlUYzBNeTAwWm1GbExUazJPVFF0WXpNNE0yTmpOelkzWm1Sa0lpd2lZV2xrSWpvaU1DSXNJbTVsZENJNkluZHpJaXdpY0dGMGFDSTZJaThpTENKb2IzTjBJam9pYUd0MExuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUowYkhNaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZMK3E1b3VjTFRGRklpd2lZV1JrSWpvaWJYVm5aVzR4TVM0MlltNTNMblJ2Y0NJc0luQnZjblFpT2lJNE1DSXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUpsTmpSaE5XVmlOUzA0WW1ZNUxUUTRPRE10T1ROaE9DMHlaVEUwWmpWa01tSmtNRE1pTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSmthV0poYVM1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdjVhNjI1YTY5U0V0Q1RpQXhNSGd0TVVraUxDSmhaR1FpT2lKMGFXMWxMbWx6SWl3aWNHOXlkQ0k2SWpRME15SXNJblI1Y0dVaU9pSnViMjVsSWl3aWFXUWlPaUkxTVROaU1HTXlNeTB5WkdJeExUUXlOall0T1dKbE9DMDVOMk5rWTJNd01qUXhPVGdpTENKaGFXUWlPaUl3SWl3aWJtVjBJam9pZDNNaUxDSndZWFJvSWpvaUx5SXNJbWh2YzNRaU9pSm9hMkp1TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNVp5ajVMMlY1YUdlTlMweFJTSXNJbUZrWkNJNkltMTFaMlZ1TVRFdU5tSnVkeTUwYjNBaUxDSndiM0owSWpvaU9EQTRNQ0lzSW5SNWNHVWlPaUp1YjI1bElpd2lhV1FpT2lKbE5qUmhOV1ZpTlMwNFltWTVMVFE0T0RNdE9UTmhPQzB5WlRFMFpqVmtNbUprTURNaUxDSmhhV1FpT2lJd0lpd2libVYwSWpvaWQzTWlMQ0p3WVhSb0lqb2lMeUlzSW1odmMzUWlPaUp6YUhNdWVHbGhiM0ZwTlRVMUxuaDVlaUlzSW5Sc2N5STZJaUo5CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNUzB4UkNJc0ltRmtaQ0k2SW1ObUxqQTVNREl5Tnk1NGVYb2lMQ0p3YjNKMElqb2lPREFpTENKMGVYQmxJam9pYm05dVpTSXNJbWxrSWpvaU16ZGlPR1psTUdVdFpEZGpNaTAwWVRneExXSTVNR1V0T1dSa1l6UmlZalkyWkdabUlpd2lZV2xrSWpvaU1DSXNJbTVsZENJNkluZHpJaXdpY0dGMGFDSTZJaThpTENKb2IzTjBJam9pYzJoekxuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUlpZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNmFhWjVyaXY1YTYyNWE2OVNFdFVJREV3ZUMweFJpSXNJbUZrWkNJNkltSmxkbVZ1ZEM1aWFXeHBZbWxzYVM1MGRpSXNJbkJ2Y25RaU9pSTBORE1pTENKMGVYQmxJam9pYm05dVpTSXNJbWxrSWpvaVpqZ3lNelJrTkdFdFlqSTRNeTAwWmpjNUxUZzJOMlF0T0RjNVlUazVZelJtWTJJeUlpd2lZV2xrSWpvaU1DSXNJbTVsZENJNkluZHpJaXdpY0dGMGFDSTZJaThpTENKb2IzTjBJam9pYUd0MExuaHBZVzl4YVRVMU5TNTRlWG9pTENKMGJITWlPaUowYkhNaWZRPT0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU1TMHhSeUlzSW1Ga1pDSTZJbU5tTGpBNU1ESXlOeTU0ZVhvaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pT1RBek5tVmtNbUV0WVRjME15MDBabUZsTFRrMk9UUXRZek00TTJOak56WTNabVJrSWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNeTB4U3lJc0ltRmtaQ0k2SW01dlpHbGxMbmxoYm1kdGFXVXViMjVzYVc1bElpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SWpVd09Ea3lNMlF4TFRFMk1HWXRORFV6WlMxaE5UYzRMVFpoWTJFeFptWmhPRGt5TWlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbk5vY3k1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VOQzB4U2lJc0ltRmtaQ0k2SW1KbGMzUmpaaTUwYjNBaUxDSndiM0owSWpvaU9EQWlMQ0owZVhCbElqb2libTl1WlNJc0ltbGtJam9pWmpFM05tTm1OVFF0TXpoak55MDBOR1ZoTFdFM1kyVXRPR0k0TjJGbU1qWTVPR0V3SWl3aVlXbGtJam9pTUNJc0ltNWxkQ0k2SW5keklpd2ljR0YwYUNJNklpOGlMQ0pvYjNOMElqb2ljMmh6TG5ocFlXOXhhVFUxTlM1NGVYb2lMQ0owYkhNaU9pSWlmUT09CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k2YWFaNXJpdklPUzZtdW1wck9tQWlpQXdlQzB4U0NJc0ltRmtaQ0k2SWpFNExqRTJOeTR4TnpJdU1URXlJaXdpY0c5eWRDSTZJalEwTXlJc0luUjVjR1VpT2lKdWIyNWxJaXdpYVdRaU9pSTBZV1ZtTXpZME9DMWpaakpoTFRSbFpUY3RZbVUwWkMwd1pHTmhOelk1TkdWaU56TWlMQ0poYVdRaU9pSXdJaXdpYm1WMElqb2lkM01pTENKd1lYUm9Jam9pTHlJc0ltaHZjM1FpT2lKaGQzTXVZVzV6YUM1MGIzQWlMQ0owYkhNaU9pSjBiSE1pZlE9PQp2bWVzczovL2V5SjJJam9pTWlJc0luQnpJam9pNXBhdzVZcWc1WjJoUTBZdE1VRWlMQ0poWkdRaU9pSjBhVzFsTG1seklpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SW1ZME5tTmlNMlpoTFdVNU1USXRORE0xT1MwNE0yTTBMVGRsWWpNM01EQXpZVEE0WWlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbTFuYzJjeUxucG9iM1Z6YVM1c2FXNXJJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1WnlqNUwyVjVhR2VNeTB4UlNJc0ltRmtaQ0k2SW01dlpHbGxMbmxoYm1kdGFXVXViMjVzYVc1bElpd2ljRzl5ZENJNklqZ3dJaXdpZEhsd1pTSTZJbTV2Ym1VaUxDSnBaQ0k2SW1VMk5HRTFaV0kxTFRoaVpqa3RORGc0TXkwNU0yRTRMVEpsTVRSbU5XUXlZbVF3TXlJc0ltRnBaQ0k2SWpBaUxDSnVaWFFpT2lKM2N5SXNJbkJoZEdnaU9pSXZJaXdpYUc5emRDSTZJbk5vY3k1NGFXRnZjV2sxTlRVdWVIbDZJaXdpZEd4eklqb2lJbjA9CnZtZXNzOi8vZXlKMklqb2lNaUlzSW5Ceklqb2k1cGF3NVlxZzVaMmhRMFl0TVVRaUxDSmhaR1FpT2lKMGFXMWxMbWx6SWl3aWNHOXlkQ0k2SWpnd0lpd2lkSGx3WlNJNkltNXZibVVpTENKcFpDSTZJak0zWWpobVpUQmxMV1EzWXpJdE5HRTRNUzFpT1RCbExUbGtaR00wWW1JMk5tUm1aaUlzSW1GcFpDSTZJakFpTENKdVpYUWlPaUozY3lJc0luQmhkR2dpT2lJdklpd2lhRzl6ZENJNkltMW5jMmN5TG5wb2IzVnphUzVzYVc1cklpd2lkR3h6SWpvaUluMD0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTVaeWo1TDJWNWFHZU15MHhReUlzSW1Ga1pDSTZJbTV2WkdsbExubGhibWR0YVdVdWIyNXNhVzVsSWl3aWNHOXlkQ0k2SWpnd0lpd2lkSGx3WlNJNkltNXZibVVpTENKcFpDSTZJamRpTXpSa05HSTJMVEU1WkRFdE5ETmxOeTA0WXpZd0xUQTNPR05sTlRBd05UTTRaQ0lzSW1GcFpDSTZJakFpTENKdVpYUWlPaUozY3lJc0luQmhkR2dpT2lJdklpd2lhRzl6ZENJNkluTm9jeTU0YVdGdmNXazFOVFV1ZUhsNklpd2lkR3h6SWpvaUluMD0Kdm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SWpvaTZhYVo1cml2NWE2MjVhNjlTRXRVSURFd2VDMHhReUlzSW1Ga1pDSTZJbUpsZG1WdWRDNWlhV3hwWW1sc2FTNTBkaUlzSW5CdmNuUWlPaUkwTkRNaUxDSjBlWEJsSWpvaWJtOXVaU0lzSW1sa0lqb2lOMkl6TkdRMFlqWXRNVGxrTVMwME0yVTNMVGhqTmpBdE1EYzRZMlUxTURBMU16aGtJaXdpWVdsa0lqb2lNQ0lzSW01bGRDSTZJbmR6SWl3aWNHRjBhQ0k2SWk4aUxDSm9iM04wSWpvaWFHdDBMbmhwWVc5eGFUVTFOUzU0ZVhvaUxDSjBiSE1pT2lKMGJITWlmUT09Cg== -------------------------------------------------------------------------------- /source/webfuzz.yaml: -------------------------------------------------------------------------------- 1 | # 20230708 2 | - type: webfuzz 3 | options: 4 | url: https://raw.githubusercontent.com/abshare/abshare.github.io/main/README.md 5 | 6 | - type: webfuzz 7 | options: 8 | url: https://raw.githubusercontent.com/mksshare/mksshare.github.io/main/README.md 9 | 10 | - type: webfuzzsub 11 | options: 12 | url: https://raw.githubusercontent.com/WilliamStar007/ClashX-V2Ray-TopFreeProxy/main/README.md 13 | 14 | - type: webfuzz 15 | options: 16 | url: https://raw.githubusercontent.com/peasoft/NoMoreWalls/master/list_raw.txt 17 | 18 | - type: webfuzz 19 | options: 20 | url: https://raw.githubusercontent.com/yaney01/Yaney01/main/README.md 21 | 22 | # 20230729 23 | - type: webfuzz 24 | options: 25 | url: https://raw.githubusercontent.com/HakurouKen/free-node/main/public 26 | 27 | # 20230813 28 | - type: webfuzz 29 | options: 30 | url: https://raw.githubusercontent.com/MrMohebi/xray-proxy-grabber-telegram/master/collected-proxies/row-url/actives.txt 31 | 32 | # 20230909 33 | - type: webfuzz 34 | options: 35 | url: https://raw.githubusercontent.com/shabane/kamaji/master/hub/merged.txt 36 | 37 | # 20231108 38 | - type: webfuzz 39 | options: 40 | url: https://raw.githubusercontent.com/barry-far/V2ray-Configs/main/All_Configs_Sub.txt 41 | 42 | # 20240218 43 | - type: webfuzz 44 | options: 45 | url: https://raw.githubusercontent.com/markbang/chromegopacs/main/hy2pac.txt 46 | 47 | # 20240415 48 | - type: webfuzz 49 | options: 50 | url: https://raw.githubusercontent.com/imohammadkhalili/V2RAY/main/Mkhalili 51 | -------------------------------------------------------------------------------- /spider/IP2LOCATION-LITE-DB1.BIN: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/snakem982/proxypool/97c56684a953f900b4dcf541a97e905c84b00d68/spider/IP2LOCATION-LITE-DB1.BIN -------------------------------------------------------------------------------- /spider/clash.go: -------------------------------------------------------------------------------- 1 | package spider 2 | 3 | import ( 4 | "github.com/metacubex/mihomo/config" 5 | "log" 6 | "sync" 7 | ) 8 | 9 | func init() { 10 | Register(CollectClash, NewClashCollect) 11 | } 12 | 13 | type Clash struct { 14 | Url string 15 | } 16 | 17 | func (c *Clash) Get() []map[string]any { 18 | proxies := make([]map[string]any, 0) 19 | 20 | all := GetBytes(c.Url) 21 | if all != nil { 22 | rawCfg, err := config.UnmarshalRawConfig(all) 23 | if err == nil && rawCfg.Proxy != nil { 24 | proxies = rawCfg.Proxy 25 | } 26 | } 27 | 28 | return proxies 29 | } 30 | 31 | func (c *Clash) Get2ChanWG(pc chan []map[string]any, wg *sync.WaitGroup) { 32 | defer wg.Done() 33 | nodes := c.Get() 34 | log.Printf("STATISTIC: Clash count=%d url=%s\n", len(nodes), c.Url) 35 | if len(nodes) > 0 { 36 | pc <- nodes 37 | } 38 | } 39 | 40 | func NewClashCollect(getter Getter) Collect { 41 | return &Clash{Url: getter.Url} 42 | } 43 | -------------------------------------------------------------------------------- /spider/flags.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "code": "AD", 4 | "emoji": "🇦🇩", 5 | "unicode": "U+1F1E6 U+1F1E9", 6 | "name": "Andorra", 7 | "title": "flag for Andorra", 8 | "dialCode": "+376" 9 | }, 10 | { 11 | "code": "AE", 12 | "emoji": "🇦🇪", 13 | "unicode": "U+1F1E6 U+1F1EA", 14 | "name": "United Arab Emirates", 15 | "title": "flag for United Arab Emirates", 16 | "dialCode": "+971" 17 | }, 18 | { 19 | "code": "AF", 20 | "emoji": "🇦🇫", 21 | "unicode": "U+1F1E6 U+1F1EB", 22 | "name": "Afghanistan", 23 | "title": "flag for Afghanistan", 24 | "dialCode": "+93" 25 | }, 26 | { 27 | "code": "AG", 28 | "emoji": "🇦🇬", 29 | "unicode": "U+1F1E6 U+1F1EC", 30 | "name": "Antigua and Barbuda", 31 | "title": "flag for Antigua and Barbuda", 32 | "dialCode": "+1268" 33 | }, 34 | { 35 | "code": "AI", 36 | "emoji": "🇦🇮", 37 | "unicode": "U+1F1E6 U+1F1EE", 38 | "name": "Anguilla", 39 | "title": "flag for Anguilla", 40 | "dialCode": "+1 264" 41 | }, 42 | { 43 | "code": "AL", 44 | "emoji": "🇦🇱", 45 | "unicode": "U+1F1E6 U+1F1F1", 46 | "name": "Albania", 47 | "title": "flag for Albania", 48 | "dialCode": "+355" 49 | }, 50 | { 51 | "code": "AM", 52 | "emoji": "🇦🇲", 53 | "unicode": "U+1F1E6 U+1F1F2", 54 | "name": "Armenia", 55 | "title": "flag for Armenia", 56 | "dialCode": "+374" 57 | }, 58 | { 59 | "code": "AO", 60 | "emoji": "🇦🇴", 61 | "unicode": "U+1F1E6 U+1F1F4", 62 | "name": "Angola", 63 | "title": "flag for Angola", 64 | "dialCode": "+244" 65 | }, 66 | { 67 | "code": "AQ", 68 | "emoji": "🇦🇶", 69 | "unicode": "U+1F1E6 U+1F1F6", 70 | "name": "Antarctica", 71 | "title": "flag for Antarctica", 72 | "dialCode": null 73 | }, 74 | { 75 | "code": "AR", 76 | "emoji": "🇦🇷", 77 | "unicode": "U+1F1E6 U+1F1F7", 78 | "name": "Argentina", 79 | "title": "flag for Argentina", 80 | "dialCode": "+54" 81 | }, 82 | { 83 | "code": "AS", 84 | "emoji": "🇦🇸", 85 | "unicode": "U+1F1E6 U+1F1F8", 86 | "name": "American Samoa", 87 | "title": "flag for American Samoa", 88 | "dialCode": "+1 684" 89 | }, 90 | { 91 | "code": "AT", 92 | "emoji": "🇦🇹", 93 | "unicode": "U+1F1E6 U+1F1F9", 94 | "name": "Austria", 95 | "title": "flag for Austria", 96 | "dialCode": "+43" 97 | }, 98 | { 99 | "code": "AU", 100 | "emoji": "🇦🇺", 101 | "unicode": "U+1F1E6 U+1F1FA", 102 | "name": "Australia", 103 | "title": "flag for Australia", 104 | "dialCode": "+61" 105 | }, 106 | { 107 | "code": "AW", 108 | "emoji": "🇦🇼", 109 | "unicode": "U+1F1E6 U+1F1FC", 110 | "name": "Aruba", 111 | "title": "flag for Aruba", 112 | "dialCode": "+297" 113 | }, 114 | { 115 | "code": "AX", 116 | "emoji": "🇦🇽", 117 | "unicode": "U+1F1E6 U+1F1FD", 118 | "name": "Åland Islands", 119 | "title": "flag for Åland Islands", 120 | "dialCode": "" 121 | }, 122 | { 123 | "code": "AZ", 124 | "emoji": "🇦🇿", 125 | "unicode": "U+1F1E6 U+1F1FF", 126 | "name": "Azerbaijan", 127 | "title": "flag for Azerbaijan", 128 | "dialCode": "+994" 129 | }, 130 | { 131 | "code": "BA", 132 | "emoji": "🇧🇦", 133 | "unicode": "U+1F1E7 U+1F1E6", 134 | "name": "Bosnia and Herzegovina", 135 | "title": "flag for Bosnia and Herzegovina", 136 | "dialCode": "+387" 137 | }, 138 | { 139 | "code": "BB", 140 | "emoji": "🇧🇧", 141 | "unicode": "U+1F1E7 U+1F1E7", 142 | "name": "Barbados", 143 | "title": "flag for Barbados", 144 | "dialCode": "+1 246" 145 | }, 146 | { 147 | "code": "BD", 148 | "emoji": "🇧🇩", 149 | "unicode": "U+1F1E7 U+1F1E9", 150 | "name": "Bangladesh", 151 | "title": "flag for Bangladesh", 152 | "dialCode": "+880" 153 | }, 154 | { 155 | "code": "BE", 156 | "emoji": "🇧🇪", 157 | "unicode": "U+1F1E7 U+1F1EA", 158 | "name": "Belgium", 159 | "title": "flag for Belgium", 160 | "dialCode": "+32" 161 | }, 162 | { 163 | "code": "BF", 164 | "emoji": "🇧🇫", 165 | "unicode": "U+1F1E7 U+1F1EB", 166 | "name": "Burkina Faso", 167 | "title": "flag for Burkina Faso", 168 | "dialCode": "+226" 169 | }, 170 | { 171 | "code": "BG", 172 | "emoji": "🇧🇬", 173 | "unicode": "U+1F1E7 U+1F1EC", 174 | "name": "Bulgaria", 175 | "title": "flag for Bulgaria", 176 | "dialCode": "+359" 177 | }, 178 | { 179 | "code": "BH", 180 | "emoji": "🇧🇭", 181 | "unicode": "U+1F1E7 U+1F1ED", 182 | "name": "Bahrain", 183 | "title": "flag for Bahrain", 184 | "dialCode": "+973" 185 | }, 186 | { 187 | "code": "BI", 188 | "emoji": "🇧🇮", 189 | "unicode": "U+1F1E7 U+1F1EE", 190 | "name": "Burundi", 191 | "title": "flag for Burundi", 192 | "dialCode": "+257" 193 | }, 194 | { 195 | "code": "BJ", 196 | "emoji": "🇧🇯", 197 | "unicode": "U+1F1E7 U+1F1EF", 198 | "name": "Benin", 199 | "title": "flag for Benin", 200 | "dialCode": "+229" 201 | }, 202 | { 203 | "code": "BL", 204 | "emoji": "🇧🇱", 205 | "unicode": "U+1F1E7 U+1F1F1", 206 | "name": "Saint Barthélemy", 207 | "title": "flag for Saint Barthélemy", 208 | "dialCode": "+590" 209 | }, 210 | { 211 | "code": "BM", 212 | "emoji": "🇧🇲", 213 | "unicode": "U+1F1E7 U+1F1F2", 214 | "name": "Bermuda", 215 | "title": "flag for Bermuda", 216 | "dialCode": "+1 441" 217 | }, 218 | { 219 | "code": "BN", 220 | "emoji": "🇧🇳", 221 | "unicode": "U+1F1E7 U+1F1F3", 222 | "name": "Brunei Darussalam", 223 | "title": "flag for Brunei Darussalam", 224 | "dialCode": "+673" 225 | }, 226 | { 227 | "code": "BO", 228 | "emoji": "🇧🇴", 229 | "unicode": "U+1F1E7 U+1F1F4", 230 | "name": "Bolivia", 231 | "title": "flag for Bolivia", 232 | "dialCode": "+591" 233 | }, 234 | { 235 | "code": "BQ", 236 | "emoji": "🇧🇶", 237 | "unicode": "U+1F1E7 U+1F1F6", 238 | "name": "Bonaire, Sint Eustatius and Saba", 239 | "title": "flag for Bonaire, Sint Eustatius and Saba" 240 | }, 241 | { 242 | "code": "BR", 243 | "emoji": "🇧🇷", 244 | "unicode": "U+1F1E7 U+1F1F7", 245 | "name": "Brazil", 246 | "title": "flag for Brazil", 247 | "dialCode": "+55" 248 | }, 249 | { 250 | "code": "BS", 251 | "emoji": "🇧🇸", 252 | "unicode": "U+1F1E7 U+1F1F8", 253 | "name": "Bahamas", 254 | "title": "flag for Bahamas", 255 | "dialCode": "+1 242" 256 | }, 257 | { 258 | "code": "BT", 259 | "emoji": "🇧🇹", 260 | "unicode": "U+1F1E7 U+1F1F9", 261 | "name": "Bhutan", 262 | "title": "flag for Bhutan", 263 | "dialCode": "+975" 264 | }, 265 | { 266 | "code": "BV", 267 | "emoji": "🇧🇻", 268 | "unicode": "U+1F1E7 U+1F1FB", 269 | "name": "Bouvet Island", 270 | "title": "flag for Bouvet Island" 271 | }, 272 | { 273 | "code": "BW", 274 | "emoji": "🇧🇼", 275 | "unicode": "U+1F1E7 U+1F1FC", 276 | "name": "Botswana", 277 | "title": "flag for Botswana", 278 | "dialCode": "+267" 279 | }, 280 | { 281 | "code": "BY", 282 | "emoji": "🇧🇾", 283 | "unicode": "U+1F1E7 U+1F1FE", 284 | "name": "Belarus", 285 | "title": "flag for Belarus", 286 | "dialCode": "+375" 287 | }, 288 | { 289 | "code": "BZ", 290 | "emoji": "🇧🇿", 291 | "unicode": "U+1F1E7 U+1F1FF", 292 | "name": "Belize", 293 | "title": "flag for Belize", 294 | "dialCode": "+501" 295 | }, 296 | { 297 | "code": "CA", 298 | "emoji": "🇨🇦", 299 | "unicode": "U+1F1E8 U+1F1E6", 300 | "name": "Canada", 301 | "title": "flag for Canada", 302 | "dialCode": "+1" 303 | }, 304 | { 305 | "code": "CC", 306 | "emoji": "🇨🇨", 307 | "unicode": "U+1F1E8 U+1F1E8", 308 | "name": "Cocos (Keeling) Islands", 309 | "title": "flag for Cocos (Keeling) Islands", 310 | "dialCode": "+61" 311 | }, 312 | { 313 | "code": "CD", 314 | "emoji": "🇨🇩", 315 | "unicode": "U+1F1E8 U+1F1E9", 316 | "name": "Congo", 317 | "title": "flag for Congo", 318 | "dialCode": "+243" 319 | }, 320 | { 321 | "code": "CF", 322 | "emoji": "🇨🇫", 323 | "unicode": "U+1F1E8 U+1F1EB", 324 | "name": "Central African Republic", 325 | "title": "flag for Central African Republic", 326 | "dialCode": "+236" 327 | }, 328 | { 329 | "code": "CG", 330 | "emoji": "🇨🇬", 331 | "unicode": "U+1F1E8 U+1F1EC", 332 | "name": "Congo", 333 | "title": "flag for Congo", 334 | "dialCode": "+242" 335 | }, 336 | { 337 | "code": "CH", 338 | "emoji": "🇨🇭", 339 | "unicode": "U+1F1E8 U+1F1ED", 340 | "name": "Switzerland", 341 | "title": "flag for Switzerland", 342 | "dialCode": "+41" 343 | }, 344 | { 345 | "code": "CI", 346 | "emoji": "🇨🇮", 347 | "unicode": "U+1F1E8 U+1F1EE", 348 | "name": "Côte D'Ivoire", 349 | "title": "flag for Côte D'Ivoire", 350 | "dialCode": "+225" 351 | }, 352 | { 353 | "code": "CK", 354 | "emoji": "🇨🇰", 355 | "unicode": "U+1F1E8 U+1F1F0", 356 | "name": "Cook Islands", 357 | "title": "flag for Cook Islands", 358 | "dialCode": "+682" 359 | }, 360 | { 361 | "code": "CL", 362 | "emoji": "🇨🇱", 363 | "unicode": "U+1F1E8 U+1F1F1", 364 | "name": "Chile", 365 | "title": "flag for Chile", 366 | "dialCode": "+56" 367 | }, 368 | { 369 | "code": "CM", 370 | "emoji": "🇨🇲", 371 | "unicode": "U+1F1E8 U+1F1F2", 372 | "name": "Cameroon", 373 | "title": "flag for Cameroon", 374 | "dialCode": "+237" 375 | }, 376 | { 377 | "code": "CN", 378 | "emoji": "🇨🇳", 379 | "unicode": "U+1F1E8 U+1F1F3", 380 | "name": "China", 381 | "title": "flag for China", 382 | "dialCode": "+86" 383 | }, 384 | { 385 | "code": "CO", 386 | "emoji": "🇨🇴", 387 | "unicode": "U+1F1E8 U+1F1F4", 388 | "name": "Colombia", 389 | "title": "flag for Colombia", 390 | "dialCode": "+57" 391 | }, 392 | { 393 | "code": "CR", 394 | "emoji": "🇨🇷", 395 | "unicode": "U+1F1E8 U+1F1F7", 396 | "name": "Costa Rica", 397 | "title": "flag for Costa Rica", 398 | "dialCode": "+506" 399 | }, 400 | { 401 | "code": "CU", 402 | "emoji": "🇨🇺", 403 | "unicode": "U+1F1E8 U+1F1FA", 404 | "name": "Cuba", 405 | "title": "flag for Cuba", 406 | "dialCode": "+53" 407 | }, 408 | { 409 | "code": "CV", 410 | "emoji": "🇨🇻", 411 | "unicode": "U+1F1E8 U+1F1FB", 412 | "name": "Cape Verde", 413 | "title": "flag for Cape Verde", 414 | "dialCode": "+238" 415 | }, 416 | { 417 | "code": "CW", 418 | "emoji": "🇨🇼", 419 | "unicode": "U+1F1E8 U+1F1FC", 420 | "name": "Curaçao", 421 | "title": "flag for Curaçao" 422 | }, 423 | { 424 | "code": "CX", 425 | "emoji": "🇨🇽", 426 | "unicode": "U+1F1E8 U+1F1FD", 427 | "name": "Christmas Island", 428 | "title": "flag for Christmas Island", 429 | "dialCode": "+61" 430 | }, 431 | { 432 | "code": "CY", 433 | "emoji": "🇨🇾", 434 | "unicode": "U+1F1E8 U+1F1FE", 435 | "name": "Cyprus", 436 | "title": "flag for Cyprus", 437 | "dialCode": "+537" 438 | }, 439 | { 440 | "code": "CZ", 441 | "emoji": "🇨🇿", 442 | "unicode": "U+1F1E8 U+1F1FF", 443 | "name": "Czech Republic", 444 | "title": "flag for Czech Republic", 445 | "dialCode": "+420" 446 | }, 447 | { 448 | "code": "DE", 449 | "emoji": "🇩🇪", 450 | "unicode": "U+1F1E9 U+1F1EA", 451 | "name": "Germany", 452 | "title": "flag for Germany", 453 | "dialCode": "+49" 454 | }, 455 | { 456 | "code": "DJ", 457 | "emoji": "🇩🇯", 458 | "unicode": "U+1F1E9 U+1F1EF", 459 | "name": "Djibouti", 460 | "title": "flag for Djibouti", 461 | "dialCode": "+253" 462 | }, 463 | { 464 | "code": "DK", 465 | "emoji": "🇩🇰", 466 | "unicode": "U+1F1E9 U+1F1F0", 467 | "name": "Denmark", 468 | "title": "flag for Denmark", 469 | "dialCode": "+45" 470 | }, 471 | { 472 | "code": "DM", 473 | "emoji": "🇩🇲", 474 | "unicode": "U+1F1E9 U+1F1F2", 475 | "name": "Dominica", 476 | "title": "flag for Dominica", 477 | "dialCode": "+1 767" 478 | }, 479 | { 480 | "code": "DO", 481 | "emoji": "🇩🇴", 482 | "unicode": "U+1F1E9 U+1F1F4", 483 | "name": "Dominican Republic", 484 | "title": "flag for Dominican Republic", 485 | "dialCode": "+1 849" 486 | }, 487 | { 488 | "code": "DZ", 489 | "emoji": "🇩🇿", 490 | "unicode": "U+1F1E9 U+1F1FF", 491 | "name": "Algeria", 492 | "title": "flag for Algeria", 493 | "dialCode": "+213" 494 | }, 495 | { 496 | "code": "EC", 497 | "emoji": "🇪🇨", 498 | "unicode": "U+1F1EA U+1F1E8", 499 | "name": "Ecuador", 500 | "title": "flag for Ecuador", 501 | "dialCode": "+593" 502 | }, 503 | { 504 | "code": "EE", 505 | "emoji": "🇪🇪", 506 | "unicode": "U+1F1EA U+1F1EA", 507 | "name": "Estonia", 508 | "title": "flag for Estonia", 509 | "dialCode": "+372" 510 | }, 511 | { 512 | "code": "EG", 513 | "emoji": "🇪🇬", 514 | "unicode": "U+1F1EA U+1F1EC", 515 | "name": "Egypt", 516 | "title": "flag for Egypt", 517 | "dialCode": "+20" 518 | }, 519 | { 520 | "code": "EH", 521 | "emoji": "🇪🇭", 522 | "unicode": "U+1F1EA U+1F1ED", 523 | "name": "Western Sahara", 524 | "title": "flag for Western Sahara" 525 | }, 526 | { 527 | "code": "ER", 528 | "emoji": "🇪🇷", 529 | "unicode": "U+1F1EA U+1F1F7", 530 | "name": "Eritrea", 531 | "title": "flag for Eritrea", 532 | "dialCode": "+291" 533 | }, 534 | { 535 | "code": "ES", 536 | "emoji": "🇪🇸", 537 | "unicode": "U+1F1EA U+1F1F8", 538 | "name": "Spain", 539 | "title": "flag for Spain", 540 | "dialCode": "+34" 541 | }, 542 | { 543 | "code": "ET", 544 | "emoji": "🇪🇹", 545 | "unicode": "U+1F1EA U+1F1F9", 546 | "name": "Ethiopia", 547 | "title": "flag for Ethiopia", 548 | "dialCode": "+251" 549 | }, 550 | { 551 | "code": "EU", 552 | "emoji": "🇪🇺", 553 | "unicode": "U+1F1EA U+1F1FA", 554 | "name": "European Union", 555 | "title": "flag for European Union" 556 | }, 557 | { 558 | "code": "FI", 559 | "emoji": "🇫🇮", 560 | "unicode": "U+1F1EB U+1F1EE", 561 | "name": "Finland", 562 | "title": "flag for Finland", 563 | "dialCode": "+358" 564 | }, 565 | { 566 | "code": "FJ", 567 | "emoji": "🇫🇯", 568 | "unicode": "U+1F1EB U+1F1EF", 569 | "name": "Fiji", 570 | "title": "flag for Fiji", 571 | "dialCode": "+679" 572 | }, 573 | { 574 | "code": "FK", 575 | "emoji": "🇫🇰", 576 | "unicode": "U+1F1EB U+1F1F0", 577 | "name": "Falkland Islands (Malvinas)", 578 | "title": "flag for Falkland Islands (Malvinas)", 579 | "dialCode": "+500" 580 | }, 581 | { 582 | "code": "FM", 583 | "emoji": "🇫🇲", 584 | "unicode": "U+1F1EB U+1F1F2", 585 | "name": "Micronesia", 586 | "title": "flag for Micronesia", 587 | "dialCode": "+691" 588 | }, 589 | { 590 | "code": "FO", 591 | "emoji": "🇫🇴", 592 | "unicode": "U+1F1EB U+1F1F4", 593 | "name": "Faroe Islands", 594 | "title": "flag for Faroe Islands", 595 | "dialCode": "+298" 596 | }, 597 | { 598 | "code": "FR", 599 | "emoji": "🇫🇷", 600 | "unicode": "U+1F1EB U+1F1F7", 601 | "name": "France", 602 | "title": "flag for France", 603 | "dialCode": "+33" 604 | }, 605 | { 606 | "code": "GA", 607 | "emoji": "🇬🇦", 608 | "unicode": "U+1F1EC U+1F1E6", 609 | "name": "Gabon", 610 | "title": "flag for Gabon", 611 | "dialCode": "+241" 612 | }, 613 | { 614 | "code": "GB", 615 | "emoji": "🇬🇧", 616 | "unicode": "U+1F1EC U+1F1E7", 617 | "name": "United Kingdom", 618 | "title": "flag for United Kingdom", 619 | "dialCode": "+44" 620 | }, 621 | { 622 | "code": "GD", 623 | "emoji": "🇬🇩", 624 | "unicode": "U+1F1EC U+1F1E9", 625 | "name": "Grenada", 626 | "title": "flag for Grenada", 627 | "dialCode": "+1 473" 628 | }, 629 | { 630 | "code": "GE", 631 | "emoji": "🇬🇪", 632 | "unicode": "U+1F1EC U+1F1EA", 633 | "name": "Georgia", 634 | "title": "flag for Georgia", 635 | "dialCode": "+995" 636 | }, 637 | { 638 | "code": "GF", 639 | "emoji": "🇬🇫", 640 | "unicode": "U+1F1EC U+1F1EB", 641 | "name": "French Guiana", 642 | "title": "flag for French Guiana", 643 | "dialCode": "+594" 644 | }, 645 | { 646 | "code": "GG", 647 | "emoji": "🇬🇬", 648 | "unicode": "U+1F1EC U+1F1EC", 649 | "name": "Guernsey", 650 | "title": "flag for Guernsey", 651 | "dialCode": "+44" 652 | }, 653 | { 654 | "code": "GH", 655 | "emoji": "🇬🇭", 656 | "unicode": "U+1F1EC U+1F1ED", 657 | "name": "Ghana", 658 | "title": "flag for Ghana", 659 | "dialCode": "+233" 660 | }, 661 | { 662 | "code": "GI", 663 | "emoji": "🇬🇮", 664 | "unicode": "U+1F1EC U+1F1EE", 665 | "name": "Gibraltar", 666 | "title": "flag for Gibraltar", 667 | "dialCode": "+350" 668 | }, 669 | { 670 | "code": "GL", 671 | "emoji": "🇬🇱", 672 | "unicode": "U+1F1EC U+1F1F1", 673 | "name": "Greenland", 674 | "title": "flag for Greenland", 675 | "dialCode": "+299" 676 | }, 677 | { 678 | "code": "GM", 679 | "emoji": "🇬🇲", 680 | "unicode": "U+1F1EC U+1F1F2", 681 | "name": "Gambia", 682 | "title": "flag for Gambia", 683 | "dialCode": "+220" 684 | }, 685 | { 686 | "code": "GN", 687 | "emoji": "🇬🇳", 688 | "unicode": "U+1F1EC U+1F1F3", 689 | "name": "Guinea", 690 | "title": "flag for Guinea", 691 | "dialCode": "+224" 692 | }, 693 | { 694 | "code": "GP", 695 | "emoji": "🇬🇵", 696 | "unicode": "U+1F1EC U+1F1F5", 697 | "name": "Guadeloupe", 698 | "title": "flag for Guadeloupe", 699 | "dialCode": "+590" 700 | }, 701 | { 702 | "code": "GQ", 703 | "emoji": "🇬🇶", 704 | "unicode": "U+1F1EC U+1F1F6", 705 | "name": "Equatorial Guinea", 706 | "title": "flag for Equatorial Guinea", 707 | "dialCode": "+240" 708 | }, 709 | { 710 | "code": "GR", 711 | "emoji": "🇬🇷", 712 | "unicode": "U+1F1EC U+1F1F7", 713 | "name": "Greece", 714 | "title": "flag for Greece", 715 | "dialCode": "+30" 716 | }, 717 | { 718 | "code": "GS", 719 | "emoji": "🇬🇸", 720 | "unicode": "U+1F1EC U+1F1F8", 721 | "name": "South Georgia", 722 | "title": "flag for South Georgia", 723 | "dialCode": "+500" 724 | }, 725 | { 726 | "code": "GT", 727 | "emoji": "🇬🇹", 728 | "unicode": "U+1F1EC U+1F1F9", 729 | "name": "Guatemala", 730 | "title": "flag for Guatemala", 731 | "dialCode": "+502" 732 | }, 733 | { 734 | "code": "GU", 735 | "emoji": "🇬🇺", 736 | "unicode": "U+1F1EC U+1F1FA", 737 | "name": "Guam", 738 | "title": "flag for Guam", 739 | "dialCode": "+1 671" 740 | }, 741 | { 742 | "code": "GW", 743 | "emoji": "🇬🇼", 744 | "unicode": "U+1F1EC U+1F1FC", 745 | "name": "Guinea-Bissau", 746 | "title": "flag for Guinea-Bissau", 747 | "dialCode": "+245" 748 | }, 749 | { 750 | "code": "GY", 751 | "emoji": "🇬🇾", 752 | "unicode": "U+1F1EC U+1F1FE", 753 | "name": "Guyana", 754 | "title": "flag for Guyana", 755 | "dialCode": "+595" 756 | }, 757 | { 758 | "code": "HK", 759 | "emoji": "🇭🇰", 760 | "unicode": "U+1F1ED U+1F1F0", 761 | "name": "Hong Kong", 762 | "title": "flag for Hong Kong", 763 | "dialCode": "+852" 764 | }, 765 | { 766 | "code": "HM", 767 | "emoji": "🇭🇲", 768 | "unicode": "U+1F1ED U+1F1F2", 769 | "name": "Heard Island and Mcdonald Islands", 770 | "title": "flag for Heard Island and Mcdonald Islands" 771 | }, 772 | { 773 | "code": "HN", 774 | "emoji": "🇭🇳", 775 | "unicode": "U+1F1ED U+1F1F3", 776 | "name": "Honduras", 777 | "title": "flag for Honduras", 778 | "dialCode": "+504" 779 | }, 780 | { 781 | "code": "HR", 782 | "emoji": "🇭🇷", 783 | "unicode": "U+1F1ED U+1F1F7", 784 | "name": "Croatia", 785 | "title": "flag for Croatia", 786 | "dialCode": "+385" 787 | }, 788 | { 789 | "code": "HT", 790 | "emoji": "🇭🇹", 791 | "unicode": "U+1F1ED U+1F1F9", 792 | "name": "Haiti", 793 | "title": "flag for Haiti", 794 | "dialCode": "+509" 795 | }, 796 | { 797 | "code": "HU", 798 | "emoji": "🇭🇺", 799 | "unicode": "U+1F1ED U+1F1FA", 800 | "name": "Hungary", 801 | "title": "flag for Hungary", 802 | "dialCode": "+36" 803 | }, 804 | { 805 | "code": "ID", 806 | "emoji": "🇮🇩", 807 | "unicode": "U+1F1EE U+1F1E9", 808 | "name": "Indonesia", 809 | "title": "flag for Indonesia", 810 | "dialCode": "+62" 811 | }, 812 | { 813 | "code": "IE", 814 | "emoji": "🇮🇪", 815 | "unicode": "U+1F1EE U+1F1EA", 816 | "name": "Ireland", 817 | "title": "flag for Ireland", 818 | "dialCode": "+353" 819 | }, 820 | { 821 | "code": "IL", 822 | "emoji": "🇮🇱", 823 | "unicode": "U+1F1EE U+1F1F1", 824 | "name": "Israel", 825 | "title": "flag for Israel", 826 | "dialCode": "+972" 827 | }, 828 | { 829 | "code": "IM", 830 | "emoji": "🇮🇲", 831 | "unicode": "U+1F1EE U+1F1F2", 832 | "name": "Isle of Man", 833 | "title": "flag for Isle of Man", 834 | "dialCode": "+44" 835 | }, 836 | { 837 | "code": "IN", 838 | "emoji": "🇮🇳", 839 | "unicode": "U+1F1EE U+1F1F3", 840 | "name": "India", 841 | "title": "flag for India", 842 | "dialCode": "+91" 843 | }, 844 | { 845 | "code": "IO", 846 | "emoji": "🇮🇴", 847 | "unicode": "U+1F1EE U+1F1F4", 848 | "name": "British Indian Ocean Territory", 849 | "title": "flag for British Indian Ocean Territory", 850 | "dialCode": "+246" 851 | }, 852 | { 853 | "code": "IQ", 854 | "emoji": "🇮🇶", 855 | "unicode": "U+1F1EE U+1F1F6", 856 | "name": "Iraq", 857 | "title": "flag for Iraq", 858 | "dialCode": "+964" 859 | }, 860 | { 861 | "code": "IR", 862 | "emoji": "🇮🇷", 863 | "unicode": "U+1F1EE U+1F1F7", 864 | "name": "Iran", 865 | "title": "flag for Iran", 866 | "dialCode": "+98" 867 | }, 868 | { 869 | "code": "IS", 870 | "emoji": "🇮🇸", 871 | "unicode": "U+1F1EE U+1F1F8", 872 | "name": "Iceland", 873 | "title": "flag for Iceland", 874 | "dialCode": "+354" 875 | }, 876 | { 877 | "code": "IT", 878 | "emoji": "🇮🇹", 879 | "unicode": "U+1F1EE U+1F1F9", 880 | "name": "Italy", 881 | "title": "flag for Italy", 882 | "dialCode": "+39" 883 | }, 884 | { 885 | "code": "JE", 886 | "emoji": "🇯🇪", 887 | "unicode": "U+1F1EF U+1F1EA", 888 | "name": "Jersey", 889 | "title": "flag for Jersey", 890 | "dialCode": "+44" 891 | }, 892 | { 893 | "code": "JM", 894 | "emoji": "🇯🇲", 895 | "unicode": "U+1F1EF U+1F1F2", 896 | "name": "Jamaica", 897 | "title": "flag for Jamaica", 898 | "dialCode": "+1 876" 899 | }, 900 | { 901 | "code": "JO", 902 | "emoji": "🇯🇴", 903 | "unicode": "U+1F1EF U+1F1F4", 904 | "name": "Jordan", 905 | "title": "flag for Jordan", 906 | "dialCode": "+962" 907 | }, 908 | { 909 | "code": "JP", 910 | "emoji": "🇯🇵", 911 | "unicode": "U+1F1EF U+1F1F5", 912 | "name": "Japan", 913 | "title": "flag for Japan", 914 | "dialCode": "+81" 915 | }, 916 | { 917 | "code": "KE", 918 | "emoji": "🇰🇪", 919 | "unicode": "U+1F1F0 U+1F1EA", 920 | "name": "Kenya", 921 | "title": "flag for Kenya", 922 | "dialCode": "+254" 923 | }, 924 | { 925 | "code": "KG", 926 | "emoji": "🇰🇬", 927 | "unicode": "U+1F1F0 U+1F1EC", 928 | "name": "Kyrgyzstan", 929 | "title": "flag for Kyrgyzstan", 930 | "dialCode": "+996" 931 | }, 932 | { 933 | "code": "KH", 934 | "emoji": "🇰🇭", 935 | "unicode": "U+1F1F0 U+1F1ED", 936 | "name": "Cambodia", 937 | "title": "flag for Cambodia", 938 | "dialCode": "+855" 939 | }, 940 | { 941 | "code": "KI", 942 | "emoji": "🇰🇮", 943 | "unicode": "U+1F1F0 U+1F1EE", 944 | "name": "Kiribati", 945 | "title": "flag for Kiribati", 946 | "dialCode": "+686" 947 | }, 948 | { 949 | "code": "KM", 950 | "emoji": "🇰🇲", 951 | "unicode": "U+1F1F0 U+1F1F2", 952 | "name": "Comoros", 953 | "title": "flag for Comoros", 954 | "dialCode": "+269" 955 | }, 956 | { 957 | "code": "KN", 958 | "emoji": "🇰🇳", 959 | "unicode": "U+1F1F0 U+1F1F3", 960 | "name": "Saint Kitts and Nevis", 961 | "title": "flag for Saint Kitts and Nevis", 962 | "dialCode": "+1 869" 963 | }, 964 | { 965 | "code": "KP", 966 | "emoji": "🇰🇵", 967 | "unicode": "U+1F1F0 U+1F1F5", 968 | "name": "North Korea", 969 | "title": "flag for North Korea", 970 | "dialCode": "+850" 971 | }, 972 | { 973 | "code": "KR", 974 | "emoji": "🇰🇷", 975 | "unicode": "U+1F1F0 U+1F1F7", 976 | "name": "South Korea", 977 | "title": "flag for South Korea", 978 | "dialCode": "+82" 979 | }, 980 | { 981 | "code": "KW", 982 | "emoji": "🇰🇼", 983 | "unicode": "U+1F1F0 U+1F1FC", 984 | "name": "Kuwait", 985 | "title": "flag for Kuwait", 986 | "dialCode": "+965" 987 | }, 988 | { 989 | "code": "KY", 990 | "emoji": "🇰🇾", 991 | "unicode": "U+1F1F0 U+1F1FE", 992 | "name": "Cayman Islands", 993 | "title": "flag for Cayman Islands", 994 | "dialCode": "+ 345" 995 | }, 996 | { 997 | "code": "KZ", 998 | "emoji": "🇰🇿", 999 | "unicode": "U+1F1F0 U+1F1FF", 1000 | "name": "Kazakhstan", 1001 | "title": "flag for Kazakhstan", 1002 | "dialCode": "+7 7" 1003 | }, 1004 | { 1005 | "code": "LA", 1006 | "emoji": "🇱🇦", 1007 | "unicode": "U+1F1F1 U+1F1E6", 1008 | "name": "Lao People's Democratic Republic", 1009 | "title": "flag for Lao People's Democratic Republic", 1010 | "dialCode": "+856" 1011 | }, 1012 | { 1013 | "code": "LB", 1014 | "emoji": "🇱🇧", 1015 | "unicode": "U+1F1F1 U+1F1E7", 1016 | "name": "Lebanon", 1017 | "title": "flag for Lebanon", 1018 | "dialCode": "+961" 1019 | }, 1020 | { 1021 | "code": "LC", 1022 | "emoji": "🇱🇨", 1023 | "unicode": "U+1F1F1 U+1F1E8", 1024 | "name": "Saint Lucia", 1025 | "title": "flag for Saint Lucia", 1026 | "dialCode": "+1 758" 1027 | }, 1028 | { 1029 | "code": "LI", 1030 | "emoji": "🇱🇮", 1031 | "unicode": "U+1F1F1 U+1F1EE", 1032 | "name": "Liechtenstein", 1033 | "title": "flag for Liechtenstein", 1034 | "dialCode": "+423" 1035 | }, 1036 | { 1037 | "code": "LK", 1038 | "emoji": "🇱🇰", 1039 | "unicode": "U+1F1F1 U+1F1F0", 1040 | "name": "Sri Lanka", 1041 | "title": "flag for Sri Lanka", 1042 | "dialCode": "+94" 1043 | }, 1044 | { 1045 | "code": "LR", 1046 | "emoji": "🇱🇷", 1047 | "unicode": "U+1F1F1 U+1F1F7", 1048 | "name": "Liberia", 1049 | "title": "flag for Liberia", 1050 | "dialCode": "+231" 1051 | }, 1052 | { 1053 | "code": "LS", 1054 | "emoji": "🇱🇸", 1055 | "unicode": "U+1F1F1 U+1F1F8", 1056 | "name": "Lesotho", 1057 | "title": "flag for Lesotho", 1058 | "dialCode": "+266" 1059 | }, 1060 | { 1061 | "code": "LT", 1062 | "emoji": "🇱🇹", 1063 | "unicode": "U+1F1F1 U+1F1F9", 1064 | "name": "Lithuania", 1065 | "title": "flag for Lithuania", 1066 | "dialCode": "+370" 1067 | }, 1068 | { 1069 | "code": "LU", 1070 | "emoji": "🇱🇺", 1071 | "unicode": "U+1F1F1 U+1F1FA", 1072 | "name": "Luxembourg", 1073 | "title": "flag for Luxembourg", 1074 | "dialCode": "+352" 1075 | }, 1076 | { 1077 | "code": "LV", 1078 | "emoji": "🇱🇻", 1079 | "unicode": "U+1F1F1 U+1F1FB", 1080 | "name": "Latvia", 1081 | "title": "flag for Latvia", 1082 | "dialCode": "+371" 1083 | }, 1084 | { 1085 | "code": "LY", 1086 | "emoji": "🇱🇾", 1087 | "unicode": "U+1F1F1 U+1F1FE", 1088 | "name": "Libya", 1089 | "title": "flag for Libya", 1090 | "dialCode": "+218" 1091 | }, 1092 | { 1093 | "code": "MA", 1094 | "emoji": "🇲🇦", 1095 | "unicode": "U+1F1F2 U+1F1E6", 1096 | "name": "Morocco", 1097 | "title": "flag for Morocco", 1098 | "dialCode": "+212" 1099 | }, 1100 | { 1101 | "code": "MC", 1102 | "emoji": "🇲🇨", 1103 | "unicode": "U+1F1F2 U+1F1E8", 1104 | "name": "Monaco", 1105 | "title": "flag for Monaco", 1106 | "dialCode": "+377" 1107 | }, 1108 | { 1109 | "code": "MD", 1110 | "emoji": "🇲🇩", 1111 | "unicode": "U+1F1F2 U+1F1E9", 1112 | "name": "Moldova", 1113 | "title": "flag for Moldova", 1114 | "dialCode": "+373" 1115 | }, 1116 | { 1117 | "code": "ME", 1118 | "emoji": "🇲🇪", 1119 | "unicode": "U+1F1F2 U+1F1EA", 1120 | "name": "Montenegro", 1121 | "title": "flag for Montenegro", 1122 | "dialCode": "+382" 1123 | }, 1124 | { 1125 | "code": "MF", 1126 | "emoji": "🇲🇫", 1127 | "unicode": "U+1F1F2 U+1F1EB", 1128 | "name": "Saint Martin (French Part)", 1129 | "title": "flag for Saint Martin (French Part)", 1130 | "dialCode": "+590" 1131 | }, 1132 | { 1133 | "code": "MG", 1134 | "emoji": "🇲🇬", 1135 | "unicode": "U+1F1F2 U+1F1EC", 1136 | "name": "Madagascar", 1137 | "title": "flag for Madagascar", 1138 | "dialCode": "+261" 1139 | }, 1140 | { 1141 | "code": "MH", 1142 | "emoji": "🇲🇭", 1143 | "unicode": "U+1F1F2 U+1F1ED", 1144 | "name": "Marshall Islands", 1145 | "title": "flag for Marshall Islands", 1146 | "dialCode": "+692" 1147 | }, 1148 | { 1149 | "code": "MK", 1150 | "emoji": "🇲🇰", 1151 | "unicode": "U+1F1F2 U+1F1F0", 1152 | "name": "Macedonia", 1153 | "title": "flag for Macedonia", 1154 | "dialCode": "+389" 1155 | }, 1156 | { 1157 | "code": "ML", 1158 | "emoji": "🇲🇱", 1159 | "unicode": "U+1F1F2 U+1F1F1", 1160 | "name": "Mali", 1161 | "title": "flag for Mali", 1162 | "dialCode": "+223" 1163 | }, 1164 | { 1165 | "code": "MM", 1166 | "emoji": "🇲🇲", 1167 | "unicode": "U+1F1F2 U+1F1F2", 1168 | "name": "Myanmar", 1169 | "title": "flag for Myanmar", 1170 | "dialCode": "+95" 1171 | }, 1172 | { 1173 | "code": "MN", 1174 | "emoji": "🇲🇳", 1175 | "unicode": "U+1F1F2 U+1F1F3", 1176 | "name": "Mongolia", 1177 | "title": "flag for Mongolia", 1178 | "dialCode": "+976" 1179 | }, 1180 | { 1181 | "code": "MO", 1182 | "emoji": "🇲🇴", 1183 | "unicode": "U+1F1F2 U+1F1F4", 1184 | "name": "Macao", 1185 | "title": "flag for Macao", 1186 | "dialCode": "+853" 1187 | }, 1188 | { 1189 | "code": "MP", 1190 | "emoji": "🇲🇵", 1191 | "unicode": "U+1F1F2 U+1F1F5", 1192 | "name": "Northern Mariana Islands", 1193 | "title": "flag for Northern Mariana Islands", 1194 | "dialCode": "+1 670" 1195 | }, 1196 | { 1197 | "code": "MQ", 1198 | "emoji": "🇲🇶", 1199 | "unicode": "U+1F1F2 U+1F1F6", 1200 | "name": "Martinique", 1201 | "title": "flag for Martinique", 1202 | "dialCode": "+596" 1203 | }, 1204 | { 1205 | "code": "MR", 1206 | "emoji": "🇲🇷", 1207 | "unicode": "U+1F1F2 U+1F1F7", 1208 | "name": "Mauritania", 1209 | "title": "flag for Mauritania", 1210 | "dialCode": "+222" 1211 | }, 1212 | { 1213 | "code": "MS", 1214 | "emoji": "🇲🇸", 1215 | "unicode": "U+1F1F2 U+1F1F8", 1216 | "name": "Montserrat", 1217 | "title": "flag for Montserrat", 1218 | "dialCode": "+1664" 1219 | }, 1220 | { 1221 | "code": "MT", 1222 | "emoji": "🇲🇹", 1223 | "unicode": "U+1F1F2 U+1F1F9", 1224 | "name": "Malta", 1225 | "title": "flag for Malta", 1226 | "dialCode": "+356" 1227 | }, 1228 | { 1229 | "code": "MU", 1230 | "emoji": "🇲🇺", 1231 | "unicode": "U+1F1F2 U+1F1FA", 1232 | "name": "Mauritius", 1233 | "title": "flag for Mauritius", 1234 | "dialCode": "+230" 1235 | }, 1236 | { 1237 | "code": "MV", 1238 | "emoji": "🇲🇻", 1239 | "unicode": "U+1F1F2 U+1F1FB", 1240 | "name": "Maldives", 1241 | "title": "flag for Maldives", 1242 | "dialCode": "+960" 1243 | }, 1244 | { 1245 | "code": "MW", 1246 | "emoji": "🇲🇼", 1247 | "unicode": "U+1F1F2 U+1F1FC", 1248 | "name": "Malawi", 1249 | "title": "flag for Malawi", 1250 | "dialCode": "+265" 1251 | }, 1252 | { 1253 | "code": "MX", 1254 | "emoji": "🇲🇽", 1255 | "unicode": "U+1F1F2 U+1F1FD", 1256 | "name": "Mexico", 1257 | "title": "flag for Mexico", 1258 | "dialCode": "+52" 1259 | }, 1260 | { 1261 | "code": "MY", 1262 | "emoji": "🇲🇾", 1263 | "unicode": "U+1F1F2 U+1F1FE", 1264 | "name": "Malaysia", 1265 | "title": "flag for Malaysia", 1266 | "dialCode": "+60" 1267 | }, 1268 | { 1269 | "code": "MZ", 1270 | "emoji": "🇲🇿", 1271 | "unicode": "U+1F1F2 U+1F1FF", 1272 | "name": "Mozambique", 1273 | "title": "flag for Mozambique", 1274 | "dialCode": "+258" 1275 | }, 1276 | { 1277 | "code": "NA", 1278 | "emoji": "🇳🇦", 1279 | "unicode": "U+1F1F3 U+1F1E6", 1280 | "name": "Namibia", 1281 | "title": "flag for Namibia", 1282 | "dialCode": "+264" 1283 | }, 1284 | { 1285 | "code": "NC", 1286 | "emoji": "🇳🇨", 1287 | "unicode": "U+1F1F3 U+1F1E8", 1288 | "name": "New Caledonia", 1289 | "title": "flag for New Caledonia", 1290 | "dialCode": "+687" 1291 | }, 1292 | { 1293 | "code": "NE", 1294 | "emoji": "🇳🇪", 1295 | "unicode": "U+1F1F3 U+1F1EA", 1296 | "name": "Niger", 1297 | "title": "flag for Niger", 1298 | "dialCode": "+227" 1299 | }, 1300 | { 1301 | "code": "NF", 1302 | "emoji": "🇳🇫", 1303 | "unicode": "U+1F1F3 U+1F1EB", 1304 | "name": "Norfolk Island", 1305 | "title": "flag for Norfolk Island", 1306 | "dialCode": "+672" 1307 | }, 1308 | { 1309 | "code": "NG", 1310 | "emoji": "🇳🇬", 1311 | "unicode": "U+1F1F3 U+1F1EC", 1312 | "name": "Nigeria", 1313 | "title": "flag for Nigeria", 1314 | "dialCode": "+234" 1315 | }, 1316 | { 1317 | "code": "NI", 1318 | "emoji": "🇳🇮", 1319 | "unicode": "U+1F1F3 U+1F1EE", 1320 | "name": "Nicaragua", 1321 | "title": "flag for Nicaragua", 1322 | "dialCode": "+505" 1323 | }, 1324 | { 1325 | "code": "NL", 1326 | "emoji": "🇳🇱", 1327 | "unicode": "U+1F1F3 U+1F1F1", 1328 | "name": "Netherlands", 1329 | "title": "flag for Netherlands", 1330 | "dialCode": "+31" 1331 | }, 1332 | { 1333 | "code": "NO", 1334 | "emoji": "🇳🇴", 1335 | "unicode": "U+1F1F3 U+1F1F4", 1336 | "name": "Norway", 1337 | "title": "flag for Norway", 1338 | "dialCode": "+47" 1339 | }, 1340 | { 1341 | "code": "NP", 1342 | "emoji": "🇳🇵", 1343 | "unicode": "U+1F1F3 U+1F1F5", 1344 | "name": "Nepal", 1345 | "title": "flag for Nepal", 1346 | "dialCode": "+977" 1347 | }, 1348 | { 1349 | "code": "NR", 1350 | "emoji": "🇳🇷", 1351 | "unicode": "U+1F1F3 U+1F1F7", 1352 | "name": "Nauru", 1353 | "title": "flag for Nauru", 1354 | "dialCode": "+674" 1355 | }, 1356 | { 1357 | "code": "NU", 1358 | "emoji": "🇳🇺", 1359 | "unicode": "U+1F1F3 U+1F1FA", 1360 | "name": "Niue", 1361 | "title": "flag for Niue", 1362 | "dialCode": "+683" 1363 | }, 1364 | { 1365 | "code": "NZ", 1366 | "emoji": "🇳🇿", 1367 | "unicode": "U+1F1F3 U+1F1FF", 1368 | "name": "New Zealand", 1369 | "title": "flag for New Zealand", 1370 | "dialCode": "+64" 1371 | }, 1372 | { 1373 | "code": "OM", 1374 | "emoji": "🇴🇲", 1375 | "unicode": "U+1F1F4 U+1F1F2", 1376 | "name": "Oman", 1377 | "title": "flag for Oman", 1378 | "dialCode": "+968" 1379 | }, 1380 | { 1381 | "code": "PA", 1382 | "emoji": "🇵🇦", 1383 | "unicode": "U+1F1F5 U+1F1E6", 1384 | "name": "Panama", 1385 | "title": "flag for Panama", 1386 | "dialCode": "+507" 1387 | }, 1388 | { 1389 | "code": "PE", 1390 | "emoji": "🇵🇪", 1391 | "unicode": "U+1F1F5 U+1F1EA", 1392 | "name": "Peru", 1393 | "title": "flag for Peru", 1394 | "dialCode": "+51" 1395 | }, 1396 | { 1397 | "code": "PF", 1398 | "emoji": "🇵🇫", 1399 | "unicode": "U+1F1F5 U+1F1EB", 1400 | "name": "French Polynesia", 1401 | "title": "flag for French Polynesia", 1402 | "dialCode": "+689" 1403 | }, 1404 | { 1405 | "code": "PG", 1406 | "emoji": "🇵🇬", 1407 | "unicode": "U+1F1F5 U+1F1EC", 1408 | "name": "Papua New Guinea", 1409 | "title": "flag for Papua New Guinea", 1410 | "dialCode": "+675" 1411 | }, 1412 | { 1413 | "code": "PH", 1414 | "emoji": "🇵🇭", 1415 | "unicode": "U+1F1F5 U+1F1ED", 1416 | "name": "Philippines", 1417 | "title": "flag for Philippines", 1418 | "dialCode": "+63" 1419 | }, 1420 | { 1421 | "code": "PK", 1422 | "emoji": "🇵🇰", 1423 | "unicode": "U+1F1F5 U+1F1F0", 1424 | "name": "Pakistan", 1425 | "title": "flag for Pakistan", 1426 | "dialCode": "+92" 1427 | }, 1428 | { 1429 | "code": "PL", 1430 | "emoji": "🇵🇱", 1431 | "unicode": "U+1F1F5 U+1F1F1", 1432 | "name": "Poland", 1433 | "title": "flag for Poland", 1434 | "dialCode": "+48" 1435 | }, 1436 | { 1437 | "code": "PM", 1438 | "emoji": "🇵🇲", 1439 | "unicode": "U+1F1F5 U+1F1F2", 1440 | "name": "Saint Pierre and Miquelon", 1441 | "title": "flag for Saint Pierre and Miquelon", 1442 | "dialCode": "+508" 1443 | }, 1444 | { 1445 | "code": "PN", 1446 | "emoji": "🇵🇳", 1447 | "unicode": "U+1F1F5 U+1F1F3", 1448 | "name": "Pitcairn", 1449 | "title": "flag for Pitcairn", 1450 | "dialCode": "+872" 1451 | }, 1452 | { 1453 | "code": "PR", 1454 | "emoji": "🇵🇷", 1455 | "unicode": "U+1F1F5 U+1F1F7", 1456 | "name": "Puerto Rico", 1457 | "title": "flag for Puerto Rico", 1458 | "dialCode": "+1 939" 1459 | }, 1460 | { 1461 | "code": "PS", 1462 | "emoji": "🇵🇸", 1463 | "unicode": "U+1F1F5 U+1F1F8", 1464 | "name": "Palestinian Territory", 1465 | "title": "flag for Palestinian Territory", 1466 | "dialCode": "+970" 1467 | }, 1468 | { 1469 | "code": "PT", 1470 | "emoji": "🇵🇹", 1471 | "unicode": "U+1F1F5 U+1F1F9", 1472 | "name": "Portugal", 1473 | "title": "flag for Portugal", 1474 | "dialCode": "+351" 1475 | }, 1476 | { 1477 | "code": "PW", 1478 | "emoji": "🇵🇼", 1479 | "unicode": "U+1F1F5 U+1F1FC", 1480 | "name": "Palau", 1481 | "title": "flag for Palau", 1482 | "dialCode": "+680" 1483 | }, 1484 | { 1485 | "code": "PY", 1486 | "emoji": "🇵🇾", 1487 | "unicode": "U+1F1F5 U+1F1FE", 1488 | "name": "Paraguay", 1489 | "title": "flag for Paraguay", 1490 | "dialCode": "+595" 1491 | }, 1492 | { 1493 | "code": "QA", 1494 | "emoji": "🇶🇦", 1495 | "unicode": "U+1F1F6 U+1F1E6", 1496 | "name": "Qatar", 1497 | "title": "flag for Qatar", 1498 | "dialCode": "+974" 1499 | }, 1500 | { 1501 | "code": "RE", 1502 | "emoji": "🇷🇪", 1503 | "unicode": "U+1F1F7 U+1F1EA", 1504 | "name": "Réunion", 1505 | "title": "flag for Réunion", 1506 | "dialCode": "+262" 1507 | }, 1508 | { 1509 | "code": "RO", 1510 | "emoji": "🇷🇴", 1511 | "unicode": "U+1F1F7 U+1F1F4", 1512 | "name": "Romania", 1513 | "title": "flag for Romania", 1514 | "dialCode": "+40" 1515 | }, 1516 | { 1517 | "code": "RS", 1518 | "emoji": "🇷🇸", 1519 | "unicode": "U+1F1F7 U+1F1F8", 1520 | "name": "Serbia", 1521 | "title": "flag for Serbia", 1522 | "dialCode": "+381" 1523 | }, 1524 | { 1525 | "code": "RU", 1526 | "emoji": "🇷🇺", 1527 | "unicode": "U+1F1F7 U+1F1FA", 1528 | "name": "Russia", 1529 | "title": "flag for Russia", 1530 | "dialCode": "+7" 1531 | }, 1532 | { 1533 | "code": "RW", 1534 | "emoji": "🇷🇼", 1535 | "unicode": "U+1F1F7 U+1F1FC", 1536 | "name": "Rwanda", 1537 | "title": "flag for Rwanda", 1538 | "dialCode": "+250" 1539 | }, 1540 | { 1541 | "code": "SA", 1542 | "emoji": "🇸🇦", 1543 | "unicode": "U+1F1F8 U+1F1E6", 1544 | "name": "Saudi Arabia", 1545 | "title": "flag for Saudi Arabia", 1546 | "dialCode": "+966" 1547 | }, 1548 | { 1549 | "code": "SB", 1550 | "emoji": "🇸🇧", 1551 | "unicode": "U+1F1F8 U+1F1E7", 1552 | "name": "Solomon Islands", 1553 | "title": "flag for Solomon Islands", 1554 | "dialCode": "+677" 1555 | }, 1556 | { 1557 | "code": "SC", 1558 | "emoji": "🇸🇨", 1559 | "unicode": "U+1F1F8 U+1F1E8", 1560 | "name": "Seychelles", 1561 | "title": "flag for Seychelles", 1562 | "dialCode": "+248" 1563 | }, 1564 | { 1565 | "code": "SD", 1566 | "emoji": "🇸🇩", 1567 | "unicode": "U+1F1F8 U+1F1E9", 1568 | "name": "Sudan", 1569 | "title": "flag for Sudan", 1570 | "dialCode": "+249" 1571 | }, 1572 | { 1573 | "code": "SE", 1574 | "emoji": "🇸🇪", 1575 | "unicode": "U+1F1F8 U+1F1EA", 1576 | "name": "Sweden", 1577 | "title": "flag for Sweden", 1578 | "dialCode": "+46" 1579 | }, 1580 | { 1581 | "code": "SG", 1582 | "emoji": "🇸🇬", 1583 | "unicode": "U+1F1F8 U+1F1EC", 1584 | "name": "Singapore", 1585 | "title": "flag for Singapore", 1586 | "dialCode": "+65" 1587 | }, 1588 | { 1589 | "code": "SH", 1590 | "emoji": "🇸🇭", 1591 | "unicode": "U+1F1F8 U+1F1ED", 1592 | "name": "Saint Helena, Ascension and Tristan Da Cunha", 1593 | "title": "flag for Saint Helena, Ascension and Tristan Da Cunha", 1594 | "dialCode": "+290" 1595 | }, 1596 | { 1597 | "code": "SI", 1598 | "emoji": "🇸🇮", 1599 | "unicode": "U+1F1F8 U+1F1EE", 1600 | "name": "Slovenia", 1601 | "title": "flag for Slovenia", 1602 | "dialCode": "+386" 1603 | }, 1604 | { 1605 | "code": "SJ", 1606 | "emoji": "🇸🇯", 1607 | "unicode": "U+1F1F8 U+1F1EF", 1608 | "name": "Svalbard and Jan Mayen", 1609 | "title": "flag for Svalbard and Jan Mayen", 1610 | "dialCode": "+47" 1611 | }, 1612 | { 1613 | "code": "SK", 1614 | "emoji": "🇸🇰", 1615 | "unicode": "U+1F1F8 U+1F1F0", 1616 | "name": "Slovakia", 1617 | "title": "flag for Slovakia", 1618 | "dialCode": "+421" 1619 | }, 1620 | { 1621 | "code": "SL", 1622 | "emoji": "🇸🇱", 1623 | "unicode": "U+1F1F8 U+1F1F1", 1624 | "name": "Sierra Leone", 1625 | "title": "flag for Sierra Leone", 1626 | "dialCode": "+232" 1627 | }, 1628 | { 1629 | "code": "SM", 1630 | "emoji": "🇸🇲", 1631 | "unicode": "U+1F1F8 U+1F1F2", 1632 | "name": "San Marino", 1633 | "title": "flag for San Marino", 1634 | "dialCode": "+378" 1635 | }, 1636 | { 1637 | "code": "SN", 1638 | "emoji": "🇸🇳", 1639 | "unicode": "U+1F1F8 U+1F1F3", 1640 | "name": "Senegal", 1641 | "title": "flag for Senegal", 1642 | "dialCode": "+221" 1643 | }, 1644 | { 1645 | "code": "SO", 1646 | "emoji": "🇸🇴", 1647 | "unicode": "U+1F1F8 U+1F1F4", 1648 | "name": "Somalia", 1649 | "title": "flag for Somalia", 1650 | "dialCode": "+252" 1651 | }, 1652 | { 1653 | "code": "SR", 1654 | "emoji": "🇸🇷", 1655 | "unicode": "U+1F1F8 U+1F1F7", 1656 | "name": "Suriname", 1657 | "title": "flag for Suriname", 1658 | "dialCode": "+597" 1659 | }, 1660 | { 1661 | "code": "SS", 1662 | "emoji": "🇸🇸", 1663 | "unicode": "U+1F1F8 U+1F1F8", 1664 | "name": "South Sudan", 1665 | "title": "flag for South Sudan" 1666 | }, 1667 | { 1668 | "code": "ST", 1669 | "emoji": "🇸🇹", 1670 | "unicode": "U+1F1F8 U+1F1F9", 1671 | "name": "Sao Tome and Principe", 1672 | "title": "flag for Sao Tome and Principe", 1673 | "dialCode": "+239" 1674 | }, 1675 | { 1676 | "code": "SV", 1677 | "emoji": "🇸🇻", 1678 | "unicode": "U+1F1F8 U+1F1FB", 1679 | "name": "El Salvador", 1680 | "title": "flag for El Salvador", 1681 | "dialCode": "+503" 1682 | }, 1683 | { 1684 | "code": "SX", 1685 | "emoji": "🇸🇽", 1686 | "unicode": "U+1F1F8 U+1F1FD", 1687 | "name": "Sint Maarten (Dutch Part)", 1688 | "title": "flag for Sint Maarten (Dutch Part)" 1689 | }, 1690 | { 1691 | "code": "SY", 1692 | "emoji": "🇸🇾", 1693 | "unicode": "U+1F1F8 U+1F1FE", 1694 | "name": "Syrian Arab Republic", 1695 | "title": "flag for Syrian Arab Republic", 1696 | "dialCode": "+963" 1697 | }, 1698 | { 1699 | "code": "SZ", 1700 | "emoji": "🇸🇿", 1701 | "unicode": "U+1F1F8 U+1F1FF", 1702 | "name": "Swaziland", 1703 | "title": "flag for Swaziland", 1704 | "dialCode": "+268" 1705 | }, 1706 | { 1707 | "code": "TC", 1708 | "emoji": "🇹🇨", 1709 | "unicode": "U+1F1F9 U+1F1E8", 1710 | "name": "Turks and Caicos Islands", 1711 | "title": "flag for Turks and Caicos Islands", 1712 | "dialCode": "+1 649" 1713 | }, 1714 | { 1715 | "code": "TD", 1716 | "emoji": "🇹🇩", 1717 | "unicode": "U+1F1F9 U+1F1E9", 1718 | "name": "Chad", 1719 | "title": "flag for Chad", 1720 | "dialCode": "+235" 1721 | }, 1722 | { 1723 | "code": "TF", 1724 | "emoji": "🇹🇫", 1725 | "unicode": "U+1F1F9 U+1F1EB", 1726 | "name": "French Southern Territories", 1727 | "title": "flag for French Southern Territories" 1728 | }, 1729 | { 1730 | "code": "TG", 1731 | "emoji": "🇹🇬", 1732 | "unicode": "U+1F1F9 U+1F1EC", 1733 | "name": "Togo", 1734 | "title": "flag for Togo", 1735 | "dialCode": "+228" 1736 | }, 1737 | { 1738 | "code": "TH", 1739 | "emoji": "🇹🇭", 1740 | "unicode": "U+1F1F9 U+1F1ED", 1741 | "name": "Thailand", 1742 | "title": "flag for Thailand", 1743 | "dialCode": "+66" 1744 | }, 1745 | { 1746 | "code": "TJ", 1747 | "emoji": "🇹🇯", 1748 | "unicode": "U+1F1F9 U+1F1EF", 1749 | "name": "Tajikistan", 1750 | "title": "flag for Tajikistan", 1751 | "dialCode": "+992" 1752 | }, 1753 | { 1754 | "code": "TK", 1755 | "emoji": "🇹🇰", 1756 | "unicode": "U+1F1F9 U+1F1F0", 1757 | "name": "Tokelau", 1758 | "title": "flag for Tokelau", 1759 | "dialCode": "+690" 1760 | }, 1761 | { 1762 | "code": "TL", 1763 | "emoji": "🇹🇱", 1764 | "unicode": "U+1F1F9 U+1F1F1", 1765 | "name": "Timor-Leste", 1766 | "title": "flag for Timor-Leste", 1767 | "dialCode": "+670" 1768 | }, 1769 | { 1770 | "code": "TM", 1771 | "emoji": "🇹🇲", 1772 | "unicode": "U+1F1F9 U+1F1F2", 1773 | "name": "Turkmenistan", 1774 | "title": "flag for Turkmenistan", 1775 | "dialCode": "+993" 1776 | }, 1777 | { 1778 | "code": "TN", 1779 | "emoji": "🇹🇳", 1780 | "unicode": "U+1F1F9 U+1F1F3", 1781 | "name": "Tunisia", 1782 | "title": "flag for Tunisia", 1783 | "dialCode": "+216" 1784 | }, 1785 | { 1786 | "code": "TO", 1787 | "emoji": "🇹🇴", 1788 | "unicode": "U+1F1F9 U+1F1F4", 1789 | "name": "Tonga", 1790 | "title": "flag for Tonga", 1791 | "dialCode": "+676" 1792 | }, 1793 | { 1794 | "code": "TR", 1795 | "emoji": "🇹🇷", 1796 | "unicode": "U+1F1F9 U+1F1F7", 1797 | "name": "Turkey", 1798 | "title": "flag for Turkey", 1799 | "dialCode": "+90" 1800 | }, 1801 | { 1802 | "code": "TT", 1803 | "emoji": "🇹🇹", 1804 | "unicode": "U+1F1F9 U+1F1F9", 1805 | "name": "Trinidad and Tobago", 1806 | "title": "flag for Trinidad and Tobago", 1807 | "dialCode": "+1 868" 1808 | }, 1809 | { 1810 | "code": "TV", 1811 | "emoji": "🇹🇻", 1812 | "unicode": "U+1F1F9 U+1F1FB", 1813 | "name": "Tuvalu", 1814 | "title": "flag for Tuvalu", 1815 | "dialCode": "+688" 1816 | }, 1817 | { 1818 | "code": "TW", 1819 | "emoji": "", 1820 | "unicode": "U+1F1F9 U+1F1FC", 1821 | "name": "Taiwan", 1822 | "title": "flag for Taiwan", 1823 | "dialCode": "+886" 1824 | }, 1825 | { 1826 | "code": "TZ", 1827 | "emoji": "🇹🇿", 1828 | "unicode": "U+1F1F9 U+1F1FF", 1829 | "name": "Tanzania", 1830 | "title": "flag for Tanzania", 1831 | "dialCode": "+255" 1832 | }, 1833 | { 1834 | "code": "UA", 1835 | "emoji": "🇺🇦", 1836 | "unicode": "U+1F1FA U+1F1E6", 1837 | "name": "Ukraine", 1838 | "title": "flag for Ukraine", 1839 | "dialCode": "+380" 1840 | }, 1841 | { 1842 | "code": "UG", 1843 | "emoji": "🇺🇬", 1844 | "unicode": "U+1F1FA U+1F1EC", 1845 | "name": "Uganda", 1846 | "title": "flag for Uganda", 1847 | "dialCode": "+256" 1848 | }, 1849 | { 1850 | "code": "UM", 1851 | "emoji": "🇺🇲", 1852 | "unicode": "U+1F1FA U+1F1F2", 1853 | "name": "United States Minor Outlying Islands", 1854 | "title": "flag for United States Minor Outlying Islands" 1855 | }, 1856 | { 1857 | "code": "US", 1858 | "emoji": "🇺🇸", 1859 | "unicode": "U+1F1FA U+1F1F8", 1860 | "name": "United States", 1861 | "title": "flag for United States", 1862 | "dialCode": "+1" 1863 | }, 1864 | { 1865 | "code": "UY", 1866 | "emoji": "🇺🇾", 1867 | "unicode": "U+1F1FA U+1F1FE", 1868 | "name": "Uruguay", 1869 | "title": "flag for Uruguay", 1870 | "dialCode": "+598" 1871 | }, 1872 | { 1873 | "code": "UZ", 1874 | "emoji": "🇺🇿", 1875 | "unicode": "U+1F1FA U+1F1FF", 1876 | "name": "Uzbekistan", 1877 | "title": "flag for Uzbekistan", 1878 | "dialCode": "+998" 1879 | }, 1880 | { 1881 | "code": "VA", 1882 | "emoji": "🇻🇦", 1883 | "unicode": "U+1F1FB U+1F1E6", 1884 | "name": "Vatican City", 1885 | "title": "flag for Vatican City", 1886 | "dialCode": "+379" 1887 | }, 1888 | { 1889 | "code": "VC", 1890 | "emoji": "🇻🇨", 1891 | "unicode": "U+1F1FB U+1F1E8", 1892 | "name": "Saint Vincent and The Grenadines", 1893 | "title": "flag for Saint Vincent and The Grenadines", 1894 | "dialCode": "+1 784" 1895 | }, 1896 | { 1897 | "code": "VE", 1898 | "emoji": "🇻🇪", 1899 | "unicode": "U+1F1FB U+1F1EA", 1900 | "name": "Venezuela", 1901 | "title": "flag for Venezuela", 1902 | "dialCode": "+58" 1903 | }, 1904 | { 1905 | "code": "VG", 1906 | "emoji": "🇻🇬", 1907 | "unicode": "U+1F1FB U+1F1EC", 1908 | "name": "Virgin Islands, British", 1909 | "title": "flag for Virgin Islands, British", 1910 | "dialCode": "+1 284" 1911 | }, 1912 | { 1913 | "code": "VI", 1914 | "emoji": "🇻🇮", 1915 | "unicode": "U+1F1FB U+1F1EE", 1916 | "name": "Virgin Islands, U.S.", 1917 | "title": "flag for Virgin Islands, U.S.", 1918 | "dialCode": "+1 340" 1919 | }, 1920 | { 1921 | "code": "VN", 1922 | "emoji": "🇻🇳", 1923 | "unicode": "U+1F1FB U+1F1F3", 1924 | "name": "Viet Nam", 1925 | "title": "flag for Viet Nam", 1926 | "dialCode": "+84" 1927 | }, 1928 | { 1929 | "code": "VU", 1930 | "emoji": "🇻🇺", 1931 | "unicode": "U+1F1FB U+1F1FA", 1932 | "name": "Vanuatu", 1933 | "title": "flag for Vanuatu", 1934 | "dialCode": "+678" 1935 | }, 1936 | { 1937 | "code": "WF", 1938 | "emoji": "🇼🇫", 1939 | "unicode": "U+1F1FC U+1F1EB", 1940 | "name": "Wallis and Futuna", 1941 | "title": "flag for Wallis and Futuna", 1942 | "dialCode": "+681" 1943 | }, 1944 | { 1945 | "code": "WS", 1946 | "emoji": "🇼🇸", 1947 | "unicode": "U+1F1FC U+1F1F8", 1948 | "name": "Samoa", 1949 | "title": "flag for Samoa", 1950 | "dialCode": "+685" 1951 | }, 1952 | { 1953 | "code": "XK", 1954 | "emoji": "🇽🇰", 1955 | "unicode": "U+1F1FD U+1F1F0", 1956 | "name": "Kosovo", 1957 | "title": "flag for Kosovo", 1958 | "dialCode": "+383" 1959 | }, 1960 | { 1961 | "code": "YE", 1962 | "emoji": "🇾🇪", 1963 | "unicode": "U+1F1FE U+1F1EA", 1964 | "name": "Yemen", 1965 | "title": "flag for Yemen", 1966 | "dialCode": "+967" 1967 | }, 1968 | { 1969 | "code": "YT", 1970 | "emoji": "🇾🇹", 1971 | "unicode": "U+1F1FE U+1F1F9", 1972 | "name": "Mayotte", 1973 | "title": "flag for Mayotte", 1974 | "dialCode": "+262" 1975 | }, 1976 | { 1977 | "code": "ZA", 1978 | "emoji": "🇿🇦", 1979 | "unicode": "U+1F1FF U+1F1E6", 1980 | "name": "South Africa", 1981 | "title": "flag for South Africa", 1982 | "dialCode": "+27" 1983 | }, 1984 | { 1985 | "code": "ZM", 1986 | "emoji": "🇿🇲", 1987 | "unicode": "U+1F1FF U+1F1F2", 1988 | "name": "Zambia", 1989 | "title": "flag for Zambia", 1990 | "dialCode": "+260" 1991 | }, 1992 | { 1993 | "code": "ZW", 1994 | "emoji": "🇿🇼", 1995 | "unicode": "U+1F1FF U+1F1FC", 1996 | "name": "Zimbabwe", 1997 | "title": "flag for Zimbabwe", 1998 | "dialCode": "+263" 1999 | }, 2000 | { 2001 | "code": "ZZ", 2002 | "emoji": "🏁", 2003 | "unicode": "", 2004 | "name": "Unknown", 2005 | "title": "flag for Unknown", 2006 | "dialCode": "" 2007 | } 2008 | ] 2009 | -------------------------------------------------------------------------------- /spider/fuzzy.go: -------------------------------------------------------------------------------- 1 | package spider 2 | 3 | import ( 4 | "github.com/metacubex/mihomo/common/convert" 5 | "github.com/metacubex/mihomo/config" 6 | "log" 7 | "regexp" 8 | "strings" 9 | "sync" 10 | "time" 11 | ) 12 | 13 | func init() { 14 | Register(CollectFuzzy, NewFuzzyCollect) 15 | } 16 | 17 | type Fuzzy struct { 18 | Url string 19 | } 20 | 21 | func (c *Fuzzy) Get() []map[string]any { 22 | content := GetBytes(c.Url) 23 | return ComputeFuzzy(content) 24 | } 25 | 26 | func (c *Fuzzy) Get2ChanWG(pc chan []map[string]any, wg *sync.WaitGroup) { 27 | defer wg.Done() 28 | nodes := c.Get() 29 | log.Printf("STATISTIC: Fuzzy count=%d url=%s\n", len(nodes), c.Url) 30 | if len(nodes) > 0 { 31 | pc <- nodes 32 | } 33 | } 34 | 35 | func NewFuzzyCollect(getter Getter) Collect { 36 | return &Fuzzy{Url: getter.Url} 37 | } 38 | 39 | type void struct{} 40 | 41 | var nullValue void 42 | 43 | var re = regexp.MustCompile(`proxies|api|token|raw|subscribe|txt|yaml|yml|sub|uuid`) 44 | var not = regexp.MustCompile(`svg|png|mp4|mp3|jpg|jpeg|m3u8|flv|gif|icon|ktv|mov|webcam`) 45 | var urlRe = regexp.MustCompile("(https|http)://[-A-Za-z0-9\u4e00-\u9ea5+&@#/%?=~_!:,.;]+[-A-Za-z0-9\u4e00-\u9ea5+&@#/%=~_]") 46 | 47 | func grepFuzzy(all []byte) map[string]void { 48 | set := make(map[string]void) // New empty set 49 | 50 | subUrls := urlRe.FindAllString(string(all), -1) 51 | for _, url := range subUrls { 52 | if !re.MatchString(url) || not.MatchString(url) { 53 | continue 54 | } 55 | set[url] = nullValue 56 | } 57 | 58 | return set 59 | } 60 | 61 | func ComputeFuzzy(content []byte) []map[string]any { 62 | 63 | proxies := make([]map[string]any, 0) 64 | if content == nil { 65 | return proxies 66 | } 67 | 68 | // 进行订阅抓取 69 | fuzzy := grepFuzzy(content) 70 | pool := NewTimeoutPoolWithDefaults() 71 | pool.WaitCount(len(fuzzy)) 72 | 73 | var cFlag = regexp.MustCompile(`proxies|clash|yaml|yml`) 74 | lock := sync.Mutex{} 75 | for temp := range fuzzy { 76 | url := temp 77 | pool.SubmitWithTimeout(func(done chan struct{}) { 78 | defer func() { 79 | // 每个协程内部使用recover捕获可能在调用逻辑中发生的panic 80 | if e := recover(); e != nil { 81 | log.Printf("====抓取错误====%s\n", e) 82 | } 83 | done <- struct{}{} 84 | }() 85 | 86 | getter := Getter{Url: url} 87 | var ok []map[string]any 88 | if cFlag.MatchString(url) { 89 | collect, _ := NewCollect(CollectClash, getter) 90 | ok = collect.Get() 91 | } else if strings.Contains(url, "README.md") { 92 | collect, _ := NewCollect(CollectSharelink, getter) 93 | ok = collect.Get() 94 | } else { 95 | all := GetBytes(url) 96 | if all == nil || len(all) < 16 { 97 | return 98 | } 99 | isGo := true 100 | rawCfg, err := config.UnmarshalRawConfig(all) 101 | if err == nil && rawCfg.Proxy != nil { 102 | ok = rawCfg.Proxy 103 | isGo = false 104 | } 105 | if isGo { 106 | v2ray, err := convert.ConvertsV2Ray(all) 107 | if err == nil && v2ray != nil { 108 | ok = v2ray 109 | isGo = false 110 | } 111 | } 112 | if isGo { 113 | builder := strings.Builder{} 114 | for _, link := range grepShareLink(all) { 115 | builder.WriteString(link + "\n") 116 | } 117 | if builder.Len() > 0 { 118 | all = []byte(builder.String()) 119 | v2ray, err := convert.ConvertsV2Ray(all) 120 | if err == nil && v2ray != nil { 121 | ok = v2ray 122 | } 123 | } 124 | } 125 | } 126 | 127 | if ok != nil && len(ok) > 0 { 128 | lock.Lock() 129 | proxies = append(proxies, ok...) 130 | lock.Unlock() 131 | } 132 | }, time.Minute) 133 | } 134 | pool.StartAndWait() 135 | 136 | // 进行分享链接抓取 137 | builder := strings.Builder{} 138 | for _, link := range grepShareLink(content) { 139 | builder.WriteString(link + "\n") 140 | } 141 | if builder.Len() > 0 { 142 | content = []byte(builder.String()) 143 | v2ray, err := convert.ConvertsV2Ray(content) 144 | if err != nil && v2ray != nil { 145 | lock.Lock() 146 | proxies = append(proxies, v2ray...) 147 | lock.Unlock() 148 | } 149 | } 150 | 151 | return proxies 152 | } 153 | -------------------------------------------------------------------------------- /spider/getter.go: -------------------------------------------------------------------------------- 1 | package spider 2 | 3 | import ( 4 | "errors" 5 | "github.com/snakem982/proxypool/tools" 6 | "golang.org/x/net/html" 7 | "strings" 8 | "sync" 9 | ) 10 | 11 | type Getter struct { 12 | Id string `json:"id,omitempty" yaml:"id,omitempty"` 13 | Type string `json:"type" yaml:"type"` 14 | Url string `json:"url" yaml:"url"` 15 | } 16 | 17 | type Collect interface { 18 | Get() []map[string]any 19 | Get2ChanWG(pc chan []map[string]any, wg *sync.WaitGroup) 20 | } 21 | 22 | type collector func(getter Getter) Collect 23 | 24 | var collectorMap = make(map[string]collector) 25 | 26 | func Register(sourceType string, c collector) { 27 | collectorMap[sourceType] = c 28 | } 29 | 30 | var ErrorCreateNotSupported = errors.New("type not supported") 31 | 32 | func NewCollect(sourceType string, getter Getter) (Collect, error) { 33 | if c, ok := collectorMap[sourceType]; ok { 34 | return c(getter), nil 35 | } 36 | 37 | return nil, ErrorCreateNotSupported 38 | } 39 | 40 | func GetBytes(url string) []byte { 41 | all := tools.ConcurrentHttpGet(url) 42 | if all != nil { 43 | temp := html.UnescapeString(string(all)) 44 | temp = strings.Replace(temp, "\"HOST\"", "\"Host\"", -1) 45 | all = []byte(temp) 46 | } 47 | 48 | return all 49 | } 50 | -------------------------------------------------------------------------------- /spider/mypool.go: -------------------------------------------------------------------------------- 1 | package spider 2 | 3 | import ( 4 | "github.com/panjf2000/ants/v2" 5 | "sync" 6 | "time" 7 | ) 8 | 9 | const ( 10 | defaultJobQueueLength = 512 // 默认任务队列长度 11 | ) 12 | 13 | type Job func(chan struct{}) 14 | 15 | type TimeoutPool struct { 16 | antPool *ants.Pool 17 | wg sync.WaitGroup 18 | } 19 | 20 | // NewTimeoutPoolWithDefaults 初始化一个任务队列长度512 21 | func NewTimeoutPoolWithDefaults() *TimeoutPool { 22 | p, _ := ants.NewPool(defaultJobQueueLength, func(opts *ants.Options) { 23 | opts.PreAlloc = true 24 | }) 25 | return &TimeoutPool{p, sync.WaitGroup{}} 26 | } 27 | 28 | // NewTimeoutPool 初始化一个任务队列长度为size 29 | func NewTimeoutPool(size int) *TimeoutPool { 30 | p, _ := ants.NewPool(size, func(opts *ants.Options) { 31 | opts.PreAlloc = true 32 | }) 33 | return &TimeoutPool{p, sync.WaitGroup{}} 34 | } 35 | 36 | // SubmitWithTimeout 提交一个任务到协程池 37 | func (p *TimeoutPool) SubmitWithTimeout(job Job, timeout time.Duration) { 38 | _ = p.antPool.Submit(func() { 39 | done := make(chan struct{}, 1) 40 | go job(done) 41 | select { 42 | case <-done: 43 | case <-time.After(timeout): 44 | } 45 | p.wg.Done() 46 | }) 47 | } 48 | 49 | // StartAndWait 启动并等待协程池内的运行全部运行结束 50 | func (p *TimeoutPool) StartAndWait() { 51 | p.wg.Wait() 52 | p.antPool.Release() 53 | } 54 | 55 | func (p *TimeoutPool) WaitCount(count int) { 56 | p.wg.Add(count) 57 | } 58 | -------------------------------------------------------------------------------- /spider/sharelink.go: -------------------------------------------------------------------------------- 1 | package spider 2 | 3 | import ( 4 | "github.com/metacubex/mihomo/common/convert" 5 | "log" 6 | "regexp" 7 | "strings" 8 | "sync" 9 | ) 10 | 11 | func init() { 12 | Register(CollectSharelink, NewShareLinkCollect) 13 | } 14 | 15 | type ShareLink struct { 16 | Url string 17 | } 18 | 19 | func (c *ShareLink) Get() []map[string]any { 20 | proxies := make([]map[string]any, 0) 21 | 22 | all := GetBytes(c.Url) 23 | if all != nil { 24 | builder := strings.Builder{} 25 | for _, link := range grepShareLink(all) { 26 | builder.WriteString(link + "\n") 27 | } 28 | if builder.Len() > 0 { 29 | v2ray, err := convert.ConvertsV2Ray([]byte(builder.String())) 30 | if err == nil && v2ray != nil { 31 | proxies = v2ray 32 | } 33 | } 34 | } 35 | 36 | return proxies 37 | } 38 | 39 | func (c *ShareLink) Get2ChanWG(pc chan []map[string]any, wg *sync.WaitGroup) { 40 | defer wg.Done() 41 | nodes := c.Get() 42 | log.Printf("STATISTIC: ShareLink count=%d url=%s\n", len(nodes), c.Url) 43 | if len(nodes) > 0 { 44 | pc <- nodes 45 | } 46 | } 47 | 48 | func NewShareLinkCollect(getter Getter) Collect { 49 | return &ShareLink{Url: getter.Url} 50 | } 51 | 52 | var shareLinkReg = regexp.MustCompile("(vless|vmess|trojan|ss|ssr|tuic|hysteria|hysteria2|hy2|juicity)://([A-Za-z0-9+/_&?=@:%.-])+") 53 | 54 | // grepShareLink 55 | // 56 | // @Description: 抓取分享链接 57 | // @param all 58 | // @return []string 59 | func grepShareLink(all []byte) []string { 60 | return shareLinkReg.FindAllString(string(all), -1) 61 | } 62 | -------------------------------------------------------------------------------- /spider/spider.go: -------------------------------------------------------------------------------- 1 | package spider 2 | 3 | import ( 4 | "bytes" 5 | "context" 6 | _ "embed" 7 | "encoding/json" 8 | "fmt" 9 | "github.com/ip2location/ip2location-go/v9" 10 | "github.com/metacubex/mihomo/adapter" 11 | "github.com/metacubex/mihomo/common/utils" 12 | "github.com/metacubex/mihomo/config" 13 | C "github.com/metacubex/mihomo/constant" 14 | "github.com/snakem982/proxypool/tools" 15 | "gopkg.in/yaml.v3" 16 | "log" 17 | "net" 18 | "os" 19 | "path/filepath" 20 | "sort" 21 | "strings" 22 | "sync" 23 | "time" 24 | ) 25 | 26 | const ( 27 | CollectClash = "clash" 28 | CollectV2ray = "v2ray" 29 | CollectSharelink = "share" 30 | CollectFuzzy = "fuzzy" 31 | ) 32 | 33 | //go:embed IP2LOCATION-LITE-DB1.BIN 34 | var fsIp2 []byte 35 | 36 | var db *ip2location.DB 37 | 38 | var emojiMap = make(map[string]string) 39 | 40 | //go:embed flags.json 41 | var fsEmoji []byte 42 | 43 | type dBReader struct { 44 | reader *bytes.Reader 45 | } 46 | 47 | func (d dBReader) Read(p []byte) (n int, err error) { 48 | return d.reader.Read(p) 49 | } 50 | 51 | func (d dBReader) Close() error { 52 | return nil 53 | } 54 | 55 | func (d dBReader) ReadAt(p []byte, off int64) (n int, err error) { 56 | return d.reader.ReadAt(p, off) 57 | } 58 | 59 | func init() { 60 | db, _ = ip2location.OpenDBWithReader(dBReader{reader: bytes.NewReader(fsIp2)}) 61 | 62 | type countryEmoji struct { 63 | Code string `json:"code"` 64 | Emoji string `json:"emoji"` 65 | } 66 | var countryEmojiList = make([]countryEmoji, 0) 67 | _ = json.Unmarshal(fsEmoji, &countryEmojiList) 68 | for _, i := range countryEmojiList { 69 | emojiMap[i.Code] = i.Emoji 70 | } 71 | } 72 | 73 | func Crawl() bool { 74 | // 加载默认配置中的节点 75 | defaultBuf, defaultErr := os.ReadFile(filepath.Join(C.Path.HomeDir(), "uploads/0.yaml")) 76 | proxies := make([]map[string]any, 0) 77 | if defaultErr == nil && len(defaultBuf) > 0 { 78 | rawCfg, err := config.UnmarshalRawConfig(defaultBuf) 79 | if err == nil && len(rawCfg.Proxy) > 0 { 80 | proxies = rawCfg.Proxy 81 | log.Printf("load default config proxies success %d\n", len(rawCfg.Proxy)) 82 | } 83 | } 84 | 85 | // 获取getters 86 | getters := make([]Getter, 0) 87 | //values := cache.GetList(constant.PrefixGetter) 88 | //if len(values) > 0 { 89 | // for _, value := range values { 90 | // getter := Getter{} 91 | // _ = json.Unmarshal(value, &getter) 92 | // getters = append(getters, getter) 93 | // } 94 | //} 95 | 96 | // 进行抓取 97 | if len(getters) > 0 { 98 | wg := &sync.WaitGroup{} 99 | var pc = make(chan []map[string]any) 100 | for _, g := range getters { 101 | collect, err := NewCollect(g.Type, g) 102 | if err != nil { 103 | continue 104 | } 105 | wg.Add(1) 106 | go collect.Get2ChanWG(pc, wg) 107 | } 108 | go func() { 109 | wg.Wait() 110 | close(pc) 111 | }() 112 | for p := range pc { 113 | if p != nil { 114 | proxies = append(proxies, p...) 115 | } 116 | } 117 | } 118 | 119 | // 去重 120 | maps := Unique(proxies, true) 121 | if len(maps) == 0 { 122 | return false 123 | } 124 | 125 | // 转换 126 | nodes := map2proxies(maps) 127 | if len(nodes) == 0 { 128 | return false 129 | } 130 | 131 | // url测速 132 | keys := urlTest(nodes) 133 | if len(keys) == 0 { 134 | return false 135 | } 136 | 137 | // 国家代码查询 138 | proxies = GetCountryName(keys, maps) 139 | 140 | // 排序添加emoji 141 | SortAddEmoji(proxies) 142 | 143 | if len(proxies) > 255 { 144 | proxies = proxies[0:256] 145 | } 146 | 147 | // 存盘 148 | data := make(map[string]any) 149 | data["proxies"] = proxies 150 | all, _ := yaml.Marshal(data) 151 | filePath := C.Path.HomeDir() + "/uploads/0.yaml" 152 | _ = os.Remove(filePath) 153 | _ = os.WriteFile(filePath, all, 0777) 154 | 155 | return true 156 | } 157 | 158 | func Unique(mappings []map[string]any, needTls bool) (maps map[string]map[string]any) { 159 | 160 | maps = make(map[string]map[string]any) 161 | 162 | for _, mapping := range mappings { 163 | proxyType, existType := mapping["type"].(string) 164 | if !existType { 165 | continue 166 | } 167 | 168 | var ( 169 | proxyId string 170 | err error 171 | ) 172 | server := mapping["server"] 173 | port := mapping["port"] 174 | password := mapping["password"] 175 | uuid := mapping["uuid"] 176 | switch proxyType { 177 | case "ss": 178 | proxyId = fmt.Sprintf("%s|%v|%v|%v", "ss", server, port, password) 179 | case "ssr": 180 | proxyId = fmt.Sprintf("%s|%v|%v|%v", "ssr", server, port, password) 181 | case "vmess": 182 | if needTls { 183 | tls, existTls := mapping["tls"].(bool) 184 | if !existTls || !tls { 185 | continue 186 | } 187 | } 188 | proxyId = fmt.Sprintf("%s|%v|%v|%v", "vmess", server, port, uuid) 189 | case "vless": 190 | if needTls { 191 | tls, existTls := mapping["tls"].(bool) 192 | if !existTls || !tls { 193 | continue 194 | } 195 | } 196 | flow, existFlow := mapping["flow"].(string) 197 | if existFlow && flow != "" && flow != "xtls-rprx-vision" { 198 | continue 199 | } 200 | proxyId = fmt.Sprintf("%s|%v|%v|%v", "vless", server, port, uuid) 201 | case "trojan": 202 | if needTls { 203 | _, existSni := mapping["sni"].(string) 204 | if !existSni { 205 | continue 206 | } 207 | } 208 | proxyId = fmt.Sprintf("%s|%v|%v|%v", "trojan", server, port, password) 209 | case "hysteria": 210 | authStr, exist := mapping["auth_str"] 211 | if !exist { 212 | authStr = mapping["auth-str"] 213 | } 214 | proxyId = fmt.Sprintf("%s|%v|%v|%v", "hysteria", server, port, authStr) 215 | case "hysteria2": 216 | proxyId = fmt.Sprintf("%s|%v|%v|%v", "hysteria2", server, port, password) 217 | case "wireguard": 218 | authStr := mapping["private-key"] 219 | proxyId = fmt.Sprintf("%s|%v|%v|%v", "wireguard", server, port, authStr) 220 | case "tuic": 221 | proxyId = fmt.Sprintf("%s|%v|%v|%v|%v", "tuic", server, port, uuid, password) 222 | default: 223 | err = fmt.Errorf("unsupport proxy type: %s", proxyType) 224 | } 225 | 226 | if err != nil { 227 | continue 228 | } 229 | temp := mapping 230 | temp["name"] = proxyId 231 | maps[proxyId] = temp 232 | } 233 | 234 | return 235 | } 236 | 237 | func map2proxies(maps map[string]map[string]any) (proxies []C.Proxy) { 238 | pool := NewTimeoutPoolWithDefaults() 239 | pool.WaitCount(len(maps)) 240 | mutex := sync.Mutex{} 241 | 242 | proxies = make([]C.Proxy, 0) 243 | for _, m := range maps { 244 | proxy := m 245 | pool.SubmitWithTimeout(func(done chan struct{}) { 246 | defer func() { 247 | if e := recover(); e != nil { 248 | log.Printf("===map2proxies===%s\n", e) 249 | } 250 | done <- struct{}{} 251 | }() 252 | proxyT, err := adapter.ParseProxy(proxy) 253 | if err == nil { 254 | mutex.Lock() 255 | proxies = append(proxies, proxyT) 256 | mutex.Unlock() 257 | } 258 | }, 2*time.Second) 259 | } 260 | pool.StartAndWait() 261 | 262 | return 263 | } 264 | 265 | func urlTest(proxies []C.Proxy) []string { 266 | pool := NewTimeoutPoolWithDefaults() 267 | keys := make([]string, 0) 268 | m := sync.Mutex{} 269 | 270 | expectedStatus, _ := utils.NewUnsignedRanges[uint16]("200/204/301/302") 271 | url := "https://www.gstatic.com/generate_204" 272 | 273 | pool.WaitCount(len(proxies)) 274 | for _, p := range proxies { 275 | proxy := p 276 | pool.SubmitWithTimeout(func(done chan struct{}) { 277 | defer func() { 278 | if e := recover(); e != nil { 279 | log.Printf("===urlTest===%s\n", e) 280 | } 281 | done <- struct{}{} 282 | }() 283 | 284 | ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*4500) 285 | defer cancel() 286 | _, err := proxy.URLTest(ctx, url, expectedStatus) 287 | if err == nil { 288 | m.Lock() 289 | keys = append(keys, proxy.Name()) 290 | m.Unlock() 291 | } 292 | }, 5*time.Second) 293 | } 294 | pool.StartAndWait() 295 | 296 | return keys 297 | } 298 | 299 | func GetCountryName(keys []string, maps map[string]map[string]any) []map[string]any { 300 | 301 | r := &net.Resolver{ 302 | PreferGo: true, 303 | Dial: func(ctx context.Context, network, address string) (net.Conn, error) { 304 | d := net.Dialer{ 305 | Timeout: 100 * time.Millisecond, 306 | } 307 | return d.DialContext(ctx, network, "1.1.1.1") 308 | }, 309 | } 310 | 311 | proxies := make([]map[string]any, 0) 312 | ipLock := sync.Mutex{} 313 | wg := sync.WaitGroup{} 314 | wg.Add(len(keys)) 315 | for _, key := range keys { 316 | m := maps[key] 317 | m["name"] = "ZZ" 318 | go func() { 319 | defer wg.Done() 320 | 321 | ipOrDomain := m["server"].(string) 322 | if tools.CheckStringAlphabet(ipOrDomain) { 323 | ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*500) 324 | defer cancel() 325 | iPv4, err := r.LookupIP(ctx, "ip4", ipOrDomain) 326 | if err == nil && iPv4 != nil { 327 | m["name"] = getCountryCode(iPv4[0].String()) 328 | } 329 | } else { 330 | m["name"] = getCountryCode(ipOrDomain) 331 | } 332 | ipLock.Lock() 333 | proxies = append(proxies, m) 334 | ipLock.Unlock() 335 | }() 336 | } 337 | 338 | wg.Wait() 339 | return proxies 340 | } 341 | 342 | func getCountryCode(domain string) string { 343 | countryCode := "ZZ" 344 | record, err := db.Get_country_short(domain) 345 | if err != nil || len(record.Country_short) != 2 { 346 | return countryCode 347 | } 348 | 349 | return record.Country_short 350 | } 351 | 352 | func getIndex(at string) int { 353 | switch at { 354 | case "hysteria2": 355 | return 1 356 | case "hysteria": 357 | return 2 358 | case "tuic": 359 | return 3 360 | case "ss": 361 | return 5 362 | case "vless": 363 | return 6 364 | default: 365 | return 10 366 | } 367 | } 368 | 369 | func SortAddEmoji(proxies []map[string]any) { 370 | sort.Slice(proxies, func(i, j int) bool { 371 | iProtocol := proxies[i]["type"].(string) 372 | jProtocol := proxies[j]["type"].(string) 373 | 374 | if getIndex(iProtocol) != getIndex(jProtocol) { 375 | return getIndex(iProtocol) < getIndex(jProtocol) 376 | } 377 | 378 | if proxies[i]["name"].(string) != proxies[j]["name"].(string) { 379 | return proxies[i]["name"].(string) < proxies[j]["name"].(string) 380 | } 381 | 382 | return tools.Reverse(proxies[i]["server"].(string)) < tools.Reverse(proxies[j]["server"].(string)) 383 | }) 384 | 385 | for i, _ := range proxies { 386 | name := proxies[i]["name"].(string) 387 | name = fmt.Sprintf("%s %s_%+02v", emojiMap[name], name, i+1) 388 | proxies[i]["name"] = strings.TrimSpace(name) 389 | } 390 | } 391 | 392 | func SortAddIndex(proxies []map[string]any) []map[string]any { 393 | // 去重 394 | maps := Unique(proxies, false) 395 | keys := make([]string, 0) 396 | for k := range maps { 397 | keys = append(keys, k) 398 | } 399 | // 国家代码查询 400 | proxies = GetCountryName(keys, maps) 401 | // 排序添加emoji 402 | SortAddEmoji(proxies) 403 | 404 | return proxies 405 | } 406 | -------------------------------------------------------------------------------- /spider/v2ray.go: -------------------------------------------------------------------------------- 1 | package spider 2 | 3 | import ( 4 | "github.com/metacubex/mihomo/common/convert" 5 | "log" 6 | "sync" 7 | ) 8 | 9 | func init() { 10 | Register(CollectV2ray, NewV2rayCollect) 11 | } 12 | 13 | type V2ray struct { 14 | Url string 15 | } 16 | 17 | func (c *V2ray) Get() []map[string]any { 18 | proxies := make([]map[string]any, 0) 19 | 20 | all := GetBytes(c.Url) 21 | if all != nil { 22 | v2ray, err := convert.ConvertsV2Ray(all) 23 | if err == nil && v2ray != nil { 24 | proxies = v2ray 25 | } 26 | } 27 | 28 | return proxies 29 | } 30 | 31 | func (c *V2ray) Get2ChanWG(pc chan []map[string]any, wg *sync.WaitGroup) { 32 | defer wg.Done() 33 | nodes := c.Get() 34 | log.Printf("STATISTIC: V2ray count=%d url=%s\n", len(nodes), c.Url) 35 | if len(nodes) > 0 { 36 | pc <- nodes 37 | } 38 | } 39 | 40 | func NewV2rayCollect(getter Getter) Collect { 41 | return &V2ray{Url: getter.Url} 42 | } 43 | -------------------------------------------------------------------------------- /tools/httpclient.go: -------------------------------------------------------------------------------- 1 | package tools 2 | 3 | import ( 4 | "crypto/tls" 5 | "fmt" 6 | C "github.com/metacubex/mihomo/constant" 7 | "golang.org/x/net/context" 8 | "io" 9 | "log" 10 | "net" 11 | "net/http" 12 | "net/url" 13 | "sync" 14 | "time" 15 | ) 16 | 17 | var dialerBaidu = &net.Dialer{ 18 | Resolver: &net.Resolver{ 19 | PreferGo: true, 20 | Dial: func(ctx context.Context, network, address string) (net.Conn, error) { 21 | d := net.Dialer{ 22 | Timeout: time.Duration(5000) * time.Millisecond, 23 | } 24 | return d.DialContext(ctx, "udp", "180.76.76.76:53") 25 | }, 26 | }, 27 | } 28 | 29 | var dialBaiduContext = func(ctx context.Context, network, addr string) (net.Conn, error) { 30 | return dialerBaidu.DialContext(ctx, network, addr) 31 | } 32 | 33 | // HttpGetByProxy 使用代理访问指定的URL并返回响应数据 34 | func HttpGetByProxy(requestUrl, httpProxyUrl string) ([]byte, error) { 35 | // 拼接代理地址 36 | uri, _ := url.Parse(httpProxyUrl) 37 | 38 | // 创建一个带代理的HTTP客户端 39 | client := http.Client{ 40 | Transport: &http.Transport{ 41 | TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, 42 | Proxy: http.ProxyURL(uri), 43 | }, 44 | Timeout: 20 * time.Second, 45 | } 46 | 47 | // 创建一个GET请求 48 | req, err := http.NewRequest(http.MethodGet, requestUrl, nil) 49 | if err != nil { 50 | log.Printf("HttpGetByProxy http.NewRequest %s %v\n", requestUrl, err) 51 | return nil, err 52 | } 53 | req.Header.Set("Accept-Encoding", "utf-8") 54 | req.Header.Set("Accept", "*/*") 55 | req.Header.Set("User-Agent", C.UA) 56 | 57 | // 发送请求并获取响应 58 | resp, err := client.Do(req) 59 | if err != nil { 60 | log.Printf("HttpGetByProxy client.Do %s %v\n", requestUrl, err) 61 | return nil, err 62 | } 63 | defer func(Body io.ReadCloser) { 64 | err := Body.Close() 65 | if err != nil { 66 | // 处理异常情况 67 | } 68 | }(resp.Body) 69 | // 读取响应数据 70 | data, err := io.ReadAll(resp.Body) 71 | if err != nil { 72 | log.Printf("HttpGetByProxy io.ReadAll %s %v\n", requestUrl, err) 73 | return nil, err 74 | } 75 | 76 | if resp.StatusCode != http.StatusOK { 77 | log.Printf("HttpGetByProxy StatusCode %s %d\n", requestUrl, resp.StatusCode) 78 | return nil, fmt.Errorf("StatusCode %d", resp.StatusCode) 79 | } 80 | 81 | return data, nil 82 | } 83 | 84 | // HttpGet 使用HTTP GET方法请求指定的URL,并返回响应的数据和可能的错误。 85 | func HttpGet(requestUrl string) ([]byte, error) { 86 | timeOut := 15 * time.Second 87 | return HttpGetWithTimeout(requestUrl, timeOut, true) 88 | } 89 | 90 | // HttpGetWithTimeout 使用HTTP GET方法请求指定的URL,并返回响应的数据和可能的错误。 91 | func HttpGetWithTimeout(requestUrl string, outTime time.Duration, needDail bool) ([]byte, error) { 92 | client := http.Client{ 93 | Timeout: outTime, // 请求超时时间 94 | } 95 | 96 | if needDail { 97 | client.Transport = &http.Transport{ 98 | TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // 安全证书验证关闭 99 | DialContext: dialBaiduContext, 100 | } 101 | } 102 | 103 | req, err := http.NewRequest(http.MethodGet, requestUrl, nil) // 创建一个新的GET请求 104 | if err != nil { 105 | log.Printf("HttpGetWithTimeout http.NewRequest %s %v\n", requestUrl, err) 106 | return nil, err 107 | } 108 | req.Header.Set("Accept-Encoding", "utf-8") // 设置响应内容编码为utf-8 109 | req.Header.Set("Accept", "*/*") // 设置响应内容类型为全部 110 | req.Header.Set("User-Agent", C.UA) // 设置用户代理为C.UA 111 | 112 | resp, err := client.Do(req) // 发送请求并获取响应 113 | if err != nil { 114 | log.Printf("HttpGetWithTimeout client.Do %s %v\n", requestUrl, err) 115 | return nil, err 116 | } 117 | defer func(Body io.ReadCloser) { 118 | err := Body.Close() 119 | if err != nil { 120 | // 处理关闭响应体的错误 121 | } 122 | }(resp.Body) 123 | data, err := io.ReadAll(resp.Body) // 读取响应体的数据 124 | if err != nil { 125 | log.Printf("HttpGetWithTimeout io.ReadAll %s %v\n", requestUrl, err) 126 | return nil, err 127 | } 128 | 129 | if resp.StatusCode != http.StatusOK { 130 | log.Printf("HttpGetWithTimeout StatusCode %s %d\n", requestUrl, resp.StatusCode) 131 | return nil, fmt.Errorf("StatusCode %d", resp.StatusCode) 132 | } 133 | 134 | return data, nil // 返回响应数据和无错误 135 | } 136 | 137 | // ConcurrentHttpGet 并发获取指定URL的HTTP内容 138 | func ConcurrentHttpGet(url string) (all []byte) { 139 | // 开启多线程请求 140 | cLock := sync.Mutex{} 141 | done := make(chan bool, 1) 142 | length := 128 143 | wg := sync.WaitGroup{} 144 | go func() { 145 | wg.Add(1) 146 | defer wg.Done() 147 | 148 | content, err := HttpGetByProxy(url, "") 149 | if err == nil { 150 | cLock.Lock() 151 | if all == nil && len(content) > length { 152 | all = content 153 | } 154 | cLock.Unlock() 155 | done <- true 156 | } 157 | }() 158 | go func() { 159 | wg.Add(1) 160 | defer wg.Done() 161 | 162 | content, err := HttpGet(url) 163 | if err == nil { 164 | cLock.Lock() 165 | if all == nil && len(content) > length { 166 | all = content 167 | } 168 | cLock.Unlock() 169 | done <- true 170 | } 171 | }() 172 | 173 | go func() { 174 | time.Sleep(5 * time.Second) 175 | wg.Wait() 176 | done <- true 177 | }() 178 | 179 | select { 180 | case <-done: 181 | case <-time.After(20 * time.Second): 182 | } 183 | 184 | return 185 | } 186 | -------------------------------------------------------------------------------- /tools/randstr.go: -------------------------------------------------------------------------------- 1 | package tools 2 | 3 | import ( 4 | "bytes" 5 | "crypto/rand" 6 | "encoding/binary" 7 | ) 8 | 9 | // Bytes generates n random bytes 10 | func Bytes(n int) []byte { 11 | b := make([]byte, n) 12 | _, err := rand.Read(b) 13 | if err != nil { 14 | panic(err) 15 | } 16 | return b 17 | } 18 | 19 | const Base64Chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/" 20 | const Base62Chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 21 | const HexChars = "0123456789abcdef" 22 | const DecChars = "0123456789" 23 | 24 | // Base64 generates a random Base64 string with length of n 25 | // 26 | // Example: X02+jDDF/exDoqPg9/aXlzbUCN93GIQ5 27 | func Base64(n int) string { return String(n, Base64Chars) } 28 | 29 | // Base62 generates a random Base62 string with length of n 30 | // 31 | // Example: 1BsNqB61o4ztSqLC6labKGNf4MYy352X 32 | func Base62(n int) string { return String(n, Base62Chars) } 33 | 34 | // Dec generates a random decimal number string with length of n 35 | // 36 | // Example: 37110235710860781655802098192113 37 | func Dec(n int) string { return String(n, DecChars) } 38 | 39 | // Hex generates a random Hexadecimal string with length of n 40 | // 41 | // Example: 67aab2d956bd7cc621af22cfb169cba8 42 | func Hex(n int) string { return String(n, HexChars) } 43 | 44 | // list of default letters that can be used to make a random string when calling String 45 | // function with no letters provided 46 | var defLetters = []rune(Base62Chars) 47 | 48 | // String generates a random string using only letters provided in the letters parameter. 49 | // 50 | // If user omits letters parameter, this function will use Base62Chars instead. 51 | func String(n int, letters ...string) string { 52 | var letterRunes []rune 53 | if len(letters) == 0 { 54 | letterRunes = defLetters 55 | } else { 56 | letterRunes = []rune(letters[0]) 57 | } 58 | 59 | var bb bytes.Buffer 60 | bb.Grow(n) 61 | l := uint32(len(letterRunes)) 62 | // on each loop, generate one random rune and append to output 63 | for i := 0; i < n; i++ { 64 | bb.WriteRune(letterRunes[binary.BigEndian.Uint32(Bytes(4))%l]) 65 | } 66 | return bb.String() 67 | } 68 | -------------------------------------------------------------------------------- /tools/snowflake.go: -------------------------------------------------------------------------------- 1 | package tools 2 | 3 | import ( 4 | "sync" 5 | "time" 6 | ) 7 | 8 | const ( 9 | epoch = int64(1577808000000) // 设置起始时间(时间戳/毫秒):2020-01-01 00:00:00,有效期69年 10 | timestampBits = uint(41) // 时间戳占用位数 11 | datacenteridBits = uint(5) // 数据中心id所占位数 12 | workeridBits = uint(5) // 机器id所占位数 13 | sequenceBits = uint(12) // 序列所占的位数 14 | timestampMax = int64(-1 ^ (-1 << timestampBits)) // 时间戳最大值 15 | sequenceMask = int64(-1 ^ (-1 << sequenceBits)) // 支持的最大序列id数量 16 | workeridShift = sequenceBits // 机器id左移位数 17 | datacenteridShift = sequenceBits + workeridBits // 数据中心id左移位数 18 | timestampShift = sequenceBits + workeridBits + datacenteridBits // 时间戳左移位数 19 | ) 20 | 21 | type snowflake struct { 22 | sync.Mutex 23 | timestamp int64 24 | workerid int64 25 | datacenterid int64 26 | sequence int64 27 | } 28 | 29 | var s = &snowflake{ 30 | timestamp: 0, 31 | datacenterid: 1, 32 | workerid: 2, 33 | sequence: 0, 34 | } 35 | 36 | func SnowflakeId() int64 { 37 | return s.nextVal() 38 | } 39 | 40 | // nextVal 返回下一个Snowflake ID 41 | func (s *snowflake) nextVal() int64 { 42 | s.Lock() 43 | now := time.Now().UnixNano() / 1000000 // 转毫秒 44 | if s.timestamp == now { 45 | // 当同一时间戳(精度:毫秒)下多次生成id会增加序列号 46 | s.sequence = (s.sequence + 1) & sequenceMask 47 | if s.sequence == 0 { 48 | // 如果当前序列超出12bit长度,则需要等待下一毫秒 49 | // 下一毫秒将使用sequence:0 50 | for now <= s.timestamp { 51 | now = time.Now().UnixNano() / 1000000 52 | } 53 | } 54 | } else { 55 | // 不同时间戳(精度:毫秒)下直接使用序列号:0 56 | s.sequence = 0 57 | } 58 | t := now - epoch 59 | if t > timestampMax { 60 | s.Unlock() 61 | return epoch 62 | } 63 | s.timestamp = now 64 | r := (t)<= "0" && charVariable <= "9" { 47 | return false 48 | } 49 | 50 | return true 51 | } 52 | 53 | // Reverse 54 | // 55 | // @Description: 反转域名字符串 56 | // @param s 57 | // @return string 58 | func Reverse(s string) string { 59 | if !CheckStringAlphabet(s) { 60 | return s 61 | } 62 | r := []rune(s) 63 | for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 { 64 | r[i], r[j] = r[j], r[i] 65 | } 66 | 67 | return string(r) 68 | } 69 | 70 | // GetFreePort 函数用于获取一个可用的随机端口号,并在函数结束后关闭监听器。 71 | func GetFreePort() (int, error) { 72 | return GetFreeWithPort(0) 73 | } 74 | 75 | // GetFreeWithPort 检测端口是否可用 76 | func GetFreeWithPort(port int) (int, error) { 77 | addr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("localhost:%d", port)) 78 | if err != nil { 79 | return 0, err 80 | } 81 | 82 | l, err := net.ListenTCP("tcp", addr) 83 | if err != nil { 84 | return 0, err 85 | } 86 | 87 | defer func(l *net.TCPListener) { 88 | err := l.Close() 89 | if err != nil { 90 | 91 | } 92 | }(l) 93 | return l.Addr().(*net.TCPAddr).Port, nil 94 | } 95 | --------------------------------------------------------------------------------