├── .gitignore ├── LICENSE ├── README.md ├── screenshots ├── RSS.png └── SR.gif └── src ├── build-command.txt ├── favicon.ico ├── libread-tool.py ├── requirements.txt └── utils ├── Prettify.py ├── __init__.py ├── configGenerator.py ├── ffmpegWrapper.py ├── scrapper.py ├── tts.py └── twoSecondSilence.py /.gitignore: -------------------------------------------------------------------------------- 1 | src/Build/ 2 | src/Temp/ 3 | **/__pycache__/ 4 | **/.OPD/ 5 | *.ini 6 | *.html 7 | *.txt 8 | *.mp3 9 | *.vtt 10 | *.jpg 11 | *.code-workspace 12 | 13 | !src/build-command.txt 14 | !src/requirements.txt 15 | -------------------------------------------------------------------------------- /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 |
2 |

LibRead-Tool

3 | Converts online novels into audiobooks 4 |
5 |
6 |
7 | 8 | Introducing LibRead-tool – your go-to for turning online novels into awesome audio! Fetch your favourites and convert them into audiobooks. Say hello to hands-free storytelling! 9 | 10 |

11 | LibRead-Tool Main page 12 | Result 13 |

14 | 15 | ## 🌸 Features 16 | - 🔍 **Search** novels directly within LibRead-Tool 17 | - 📕 Convert novels into one audiobook or **Split it into parts** 18 | - 💾 Embeds **ID3 tags** into the MP3 file 19 | - 🌐 **Scrapes LibRead** to fetch novels 20 | 21 | ## 🔧Installation 22 | #### Using Portable Builds 23 | - This is the recommended method if Python is not installed on your system. 24 | - Download the executable binary files from the release page for your system 25 | - To execute the program, use the following method 26 | - On Windows, double-click on the application to run it. 27 | - On Ubuntu-based distros, open a terminal in the directory where the executable file is saved and execute the following command `./LibRead-Tool_Zorin-OS`.
If you are getting a permission denied error, then you have to execute the command
`chmod +x LibRead-Tool_Zorin-OS` to make it executable. 28 |


29 |

Running from source

30 |
    31 |
  • You need Python, preferably version >= 3.9, to run the script files.
  • 32 |
  • You can obtain the source code files either from the release page or by cloning this repo using git,
  • 33 |
  • Downloading pip to resolve dependecies
      34 |
    • Pip is required to download the packages required for the execution of the script. If your system doesn’t have pip installed, then you can use the following command to install
        35 |
      • On Debian/Ubuntu-Based Distros 36 | sudo apt-get install python3-pip
      • 37 |
      • On Red Hat/Fedora-Based Distros 38 | sudo dnf install python3-pip
      • 39 |
      40 |
    • 41 |
    42 |
  • 43 |
  • Resolving dependencies using pip
      44 |
    • Open a terminal in the src directory and execute the following command to obtain the packages required for the script. 45 |
      pip install -r requirements.txt
    • 46 |
    47 |
  • 48 |
  • Executing the script
      49 |
    • To run the script, execute the following command in the terminal. 50 | python3 ./libread-tool.py 51 |
    • 52 |
    53 |
  • 54 |
55 |
56 |

Installing Optional Dependency

57 |
    58 |
  • FFmpeg is required to merge different sub-parts into one. It is not essential to have it installed, but it increases stability during conversions. If FFmpeg is not found in the system’s path, then it will fetch all the chapters in a single part and convert them at the end.
  • 59 |
  • Use this guide to get it installed on your windows OS.
  • 60 |
  • Most Linux distros come pre-installed with a supported version of FFmpeg. But, if that's not the case, then use the following command to get it installed.
      61 |
    • On Debian/Ubuntu-based distros 62 | sudo apt install ffmpeg
    • 63 |
    • On Fedora-based distros 64 | sudo dnf install ffmpeg
    • 65 |
    66 |
  • 67 |
68 |
69 |

⚙️ Configuring

70 |

Upon initial execution, the program will create a default configuration file inside the same directory named libread-config.ini. You can open that in any text editor, and you might change some options.

71 |


72 |

73 | 74 | 75 |
76 | Packages Used 77 |
78 | beautifulsoup4 79 |
80 | requests 81 |
82 | music-tag 83 |
84 | pynput 85 |
86 | PyWinCtl 87 |
88 | edge-tts 89 |
90 | -------------------------------------------------------------------------------- /screenshots/RSS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Spectre-hidN/LibRead-Tool/513a1d3cf9baa94841f13fd367a410b8024e9d65/screenshots/RSS.png -------------------------------------------------------------------------------- /screenshots/SR.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Spectre-hidN/LibRead-Tool/513a1d3cf9baa94841f13fd367a410b8024e9d65/screenshots/SR.gif -------------------------------------------------------------------------------- /src/build-command.txt: -------------------------------------------------------------------------------- 1 | pyinstaller --onefile --workpath "Temp/" --distpath "Build/" ./libread-tool.py --specpath "Temp/" -n "LibRead-Tool" -i "$pwd/favicon.ico" -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Spectre-hidN/LibRead-Tool/513a1d3cf9baa94841f13fd367a410b8024e9d65/src/favicon.ico -------------------------------------------------------------------------------- /src/libread-tool.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | import shutil 4 | import time 5 | import asyncio 6 | import configparser 7 | from pynput import keyboard 8 | from pywinctl import getActiveWindow 9 | from utils.scrapper import checkConnection, search, getMetadata, getArticle 10 | from utils.Prettify import clearScreen, Prettify, clearLine 11 | from utils.tts import createTTSFromFile, createTTSFromText 12 | from utils.configGenerator import create_default_config 13 | from utils.ffmpegWrapper import performSanityCheck, mergeChunks 14 | 15 | CONFIG_FILE = "libread-config.ini" 16 | 17 | # Global varialbes. Values taken from the config file 18 | DOMAIN_NAME = COVER_IMAGE_NAME = OUTPUT_FILE_NAME = REPLACEMENT_CHARACTER = "" 19 | FORCE_USE_M1 = False 20 | PART_REPLACEMENT = True 21 | 22 | # global function declaration for simplicity 23 | printInf = Prettify.printInf 24 | printWar = Prettify.printWar 25 | printErr = Prettify.printErr 26 | printSuc = Prettify.printSuc 27 | printFeaturedText = Prettify.printFeaturedText 28 | progressBar = Prettify().progressBar 29 | 30 | def _readConfig(): 31 | if(os.path.isfile(CONFIG_FILE)): 32 | try: 33 | config = configparser.ConfigParser() 34 | config.read(CONFIG_FILE) 35 | global DOMAIN_NAME, COVER_IMAGE_NAME, OUTPUT_FILE_NAME, REPLACEMENT_CHARACTER, FORCE_USE_M1, PART_REPLACEMENT 36 | DOMAIN_NAME = config.get("DOMAIN", "domainName") 37 | COVER_IMAGE_NAME = config.get("NOMENCLATURES", "coverImageNomenclature") 38 | OUTPUT_FILE_NAME = config.get("NOMENCLATURES", "outputNomenclature") 39 | REPLACEMENT_CHARACTER = config.get("NOMENCLATURES", "whitespaceReplacementCharacter") 40 | FORCE_USE_M1 = config.getboolean("TTS_CONFIG", "forceGrabFirstThenConvert") 41 | PART_REPLACEMENT = config.getboolean("TTS_CONFIG", "replacePartContents") 42 | except: 43 | printWar("Corrupted config file detected! Re-generating a new one...") 44 | time.sleep(2) 45 | create_default_config(CONFIG_FILE) 46 | _readConfig() 47 | else: 48 | create_default_config(CONFIG_FILE) 49 | _readConfig() 50 | 51 | 52 | if __name__ == "__main__": 53 | if os.name == 'nt': 54 | os.system("title LibRead-Tool") 55 | else: 56 | os.system('echo -en "\033]0;LibRead-Tool\a"') 57 | 58 | clearScreen() 59 | 60 | if os.name == 'nt': 61 | os.system("echo \033[38;5;12m\033[0m\r") 62 | 63 | print("""\033[38;5;78m _ _ _ ______ _ _______ _ \033[0m 64 | \033[38;5;78m(_) (_)| | (_____ \ | | (_______) | | \033[0m 65 | \033[38;5;78m _ _ | |__ _____) ) _____ _____ __| | _____ _ ___ ___ | | \033[0m 66 | \033[38;5;78m| | | || _ \ | __ / | ___ |(____ | / _ |(_____)| | / _ \ / _ \ | | \033[0m 67 | | |_____ | || |_) )| | \ \ | ____|/ ___ |( (_| | | || |_| || |_| || | 68 | |_______)|_||____/ |_| |_||_____)\_____| \____| |_| \___/ \___/ \_) 69 | 70 | """) 71 | 72 | _readConfig() 73 | 74 | if(not PART_REPLACEMENT): 75 | printFeaturedText("Content replacement is disabled! The LibRead Tool will not overwrite the existing parts before converting.") 76 | 77 | print("Checking connection with libread...") 78 | time.sleep(2) 79 | if(checkConnection()): 80 | printSuc("Connection established with libread successfully!") 81 | else: 82 | printErr("Error occured while connecting to libread! Check your Internet connection or firewall settings.") 83 | sys.exit(100) 84 | 85 | canUseM2ForTTS = False 86 | if performSanityCheck(): 87 | canUseM2ForTTS = True 88 | 89 | if(FORCE_USE_M1 or not PART_REPLACEMENT): 90 | canUseM2ForTTS = False 91 | 92 | print("\n") 93 | query = input("Type to search something: ") 94 | results = search(query=query) 95 | selectedIndex = -1 96 | if(len(results) == 0): 97 | printWar(f"No results found for the query '{query}'. Try any other keywords!") 98 | input() 99 | sys.exit(404) 100 | elif(len(results) == 1): 101 | printSuc(f"1 hit found for the query '{query}'. Automatically selecting it...") 102 | selectedIndex = 1 103 | else: 104 | printSuc(f"Multiple hits found for the query '{query}'. Select the desired index...") 105 | i = 0 106 | print("\n\033[38;5;162mIndex\033[0m ---- \033[38;5;183mTitle\033[0m") 107 | for tag in results: 108 | print(f"\033[38;5;162m{i+1}\033[0m ---- \033[38;5;183m{tag['title']}\033[0m") if i < 9 else print(f"\033[38;5;162m{i+1}\033[0m ---- \033[38;5;183m{tag['title']}\033[0m") 109 | i+=1 110 | try: 111 | selectedIndex = int(input("Type the desired index from the above list: ")) 112 | except: 113 | printErr("Invalid integer value! Aborting...") 114 | sys.exit(200) 115 | if(selectedIndex > len(results) or selectedIndex < 0): 116 | printWar("Index doesn't exists! Automatically selecting the last index...") 117 | selectedIndex = len(results) - 1 118 | 119 | selectedIndex-=1 120 | novelLink = f"https://{DOMAIN_NAME}" + results[selectedIndex]['href'] 121 | print(f"\nSelected: {results[selectedIndex]['title']} || URL: {novelLink}") 122 | printInf(f"Getting metadata about {results[selectedIndex]['title']} from libread...") 123 | time.sleep(3) 124 | metadataResult = getMetadata(novelLink) 125 | totalChapters = len(metadataResult['chapters']) 126 | print(f"Total chapters found: \033[38;5;63m{len(metadataResult['chapters'])}\033[0m") 127 | print(f"Status: \033[38;5;51m{metadataResult['status']}\033[0m") 128 | print() 129 | startChapter = 1 130 | endChapter = totalChapters 131 | jump = 10 132 | try: 133 | startChapter = int(input("Mention the starting chapter [default = 1]: ")) 134 | if(startChapter > startChapter): 135 | printWar("Starting chapter number exceeded total chapter found!") 136 | printInf("Setting starting chapter to 1...") 137 | else: 138 | printInf(f"Setting starting chapter to {startChapter}...") 139 | except: 140 | printWar("Invalid input detected!") 141 | printInf("Setting starting chapter to 1...") 142 | 143 | try: 144 | endChapter = int(input(f"Mention the last chapter [default = {totalChapters}]: ")) 145 | if(endChapter < 1): 146 | printWar("Ending chapter number less than the first chapter!") 147 | printInf(f"Setting Ending chapter to {totalChapters}...") 148 | else: 149 | printInf(f"Setting Ending chapter to {endChapter}...") 150 | except: 151 | printWar("Invalid input detected!") 152 | printInf(f"Setting Ending chapter to {totalChapters}...") 153 | 154 | try: 155 | jump = int(input("Mention number of chapters in each part [default = 10]: ")) 156 | if(jump > 30): 157 | printWar("Too many chapters detected in single part! Expect abnormal behaviour.") 158 | except: 159 | pass 160 | isPause = False 161 | pauseInput = input("Do you want to pause after each part? (y/n): ") 162 | isPause = True if pauseInput == "y" else False 163 | 164 | if(isPause): 165 | printInf("Process will pause after each part! Press 'R' to resume.") 166 | 167 | isTTS = False 168 | ttsInput = input("Do you want to convert text to speech? (y/n): ") 169 | isTTS = True if ttsInput == "y" else False 170 | 171 | if(isTTS): 172 | printInf("Texts will be converted to speech.") 173 | 174 | #Create a directory for saving the files 175 | if(not os.path.isdir(results[selectedIndex]['title']) and not os.path.isdir("Articles")): 176 | try: 177 | os.mkdir(results[selectedIndex]['title']) 178 | except: 179 | os.mkdir("Articles") 180 | 181 | #save cover image 182 | imageName = COVER_IMAGE_NAME.replace("!TITLE!", results[selectedIndex]['title']) + '.jpg' 183 | if(REPLACEMENT_CHARACTER != ""): 184 | imageName = imageName.replace(" ", REPLACEMENT_CHARACTER) 185 | if(metadataResult["cover-image"]!=None): 186 | printInf("\nSaving cover image...") 187 | try: 188 | with open(f"{results[selectedIndex]['title']}/{imageName}", 'wb') as bf: 189 | for chunk in metadataResult['cover-image']: 190 | bf.write(chunk) 191 | bf.close() 192 | except: 193 | with open(f"Articles/{imageName}", 'wb') as bf: 194 | for chunk in metadataResult['cover-image']: 195 | bf.write(chunk) 196 | bf.close() 197 | time.sleep(1) 198 | printSuc(f"Cover image saved as {results[selectedIndex]['title']}/{imageName}") 199 | 200 | part = 1 201 | progress = 0 202 | printInf("Getting articles from libread...") 203 | 204 | for i in range(startChapter-2, endChapter, jump): 205 | mergedArticle = "" 206 | for j in range(i+1, i+jump+1): 207 | if(j>endChapter-1): 208 | break 209 | articleLink = f"https://{DOMAIN_NAME}" + metadataResult['chapters'][j]['href'] 210 | article = getArticle(articleLink) 211 | clearLine() 212 | progressBar(total_size=endChapter-startChapter, size_done=progress, fill_symbol="■", length=35, suffix="There") 213 | 214 | # use M2 for TTS 215 | if(isTTS and canUseM2ForTTS): 216 | progressBar(total_size=endChapter-startChapter, size_done=progress, fill_symbol="■", length=35, suffix="There \033[38;5;141m[CONVERTING]\033[0m {Chapter - {0}}".replace("{0}", str(j+1))) 217 | 218 | # Create the enviroment for the current cycle 219 | wd = results[selectedIndex]['title'] + "/.OPD" 220 | if not os.path.isdir(wd): os.mkdir(wd) 221 | 222 | try: 223 | asyncio.run(createTTSFromText(text=article, outputPath=(wd+f"/Chapter-{str(j+1)}.mp3"), coverImagePath=f"{results[selectedIndex]['title']}/{imageName}")) 224 | except Exception as E: 225 | printErr(f"Fatal Exception occured during conversion. Couldn't proceed further with TTS. {E}") 226 | isTTs = False 227 | 228 | mergedArticle += article + "\n\n" 229 | progress += 1 230 | endChapterName = i+jump+1 231 | if(i+jump+1 > endChapter): 232 | endChapterName = endChapter 233 | #results[selectedIndex]['title']} ~ Chapter-{i+2}-{endChapterName} 234 | actualOutputFileName = OUTPUT_FILE_NAME.replace("!TITLE!", results[selectedIndex]['title']).replace("!STARTCHAPTER!", str((i+2))).replace("!ENDCHAPTER!", str(endChapterName)) 235 | if(REPLACEMENT_CHARACTER != ""): 236 | actualOutputFileName = actualOutputFileName.replace(" ", REPLACEMENT_CHARACTER) 237 | if(i+1 < endChapter): 238 | try: 239 | if (not PART_REPLACEMENT and os.path.isfile(f"{results[selectedIndex]['title']}/{actualOutputFileName}.txt")): 240 | pass 241 | else: 242 | with open(f"{results[selectedIndex]['title']}/{actualOutputFileName}.txt", "w", encoding='utf-8') as f: 243 | f.write(mergedArticle) 244 | f.close() 245 | except: 246 | if(not PART_REPLACEMENT and os.path.isfile(f"Articles/{actualOutputFileName}.txt")): 247 | pass 248 | else: 249 | with open(f"Articles/{actualOutputFileName}.txt", "w", encoding='utf-8') as f: 250 | f.write(mergedArticle) 251 | f.close() 252 | 253 | # merge converted chunks and delete the opd folder 254 | if(isTTS and canUseM2ForTTS): 255 | clearLine() 256 | progressBar(total_size=endChapter-startChapter, size_done=progress, fill_symbol="■", length=35, suffix="There \033[38;5;87m[CONCATENATING]\033[0m ") 257 | mergeChunks(chunkFilesDir=results[selectedIndex]['title'] + "/.OPD", 258 | outputFilePrefix=f"{results[selectedIndex]['title']}/{actualOutputFileName}", 259 | coverImagePath=f"{results[selectedIndex]['title']}/{imageName}") 260 | shutil.rmtree(results[selectedIndex]['title'] + "/.OPD") 261 | 262 | if(isTTS and not canUseM2ForTTS): 263 | clearLine() 264 | progressBar(total_size=endChapter-startChapter, size_done=progress, fill_symbol="■", length=35, suffix="There \033[38;5;141m[CONVERTING]\033[0m {Chapter: {startChapter}-{EndChapter}}".replace("{startChapter}", str(i+2)).replace("{EndChapter}", str(endChapterName))) 265 | try: 266 | asyncio.run(createTTSFromFile(filepath=f"{results[selectedIndex]['title']}/{actualOutputFileName}.txt", outputFilePrefix=f"{results[selectedIndex]['title']}/{actualOutputFileName}", coverImagePath=f"{results[selectedIndex]['title']}/{imageName}")) 267 | except: 268 | try: 269 | asyncio.run(createTTSFromFile(filepath=f"Articles/{actualOutputFileName}.txt", outputFilePrefix=f"Articles/{actualOutputFileName}", coverImagePath=f"Articles/{imageName}")) 270 | except Exception as E: 271 | printErr("\nFatal error Occured while converting text to speech! Couldn't proceed further with TTS. {E}") 272 | 273 | # breaks on Windows and wayland 274 | if(isPause and progress != ((endChapter-startChapter))+1): 275 | clearLine() 276 | progressBar(total_size=endChapter-startChapter, size_done=progress, fill_symbol="■", length=35, suffix="There \033[38;5;226m[PAUSED]\033[0m ") 277 | def pause_process(): 278 | with keyboard.Events() as events: 279 | event = events.get(1e6) 280 | if("libread-tool" in (" " + getActiveWindow().title.lower() + " ") or "visual studio code" in getActiveWindow().title.lower()): 281 | if(event.key == keyboard.KeyCode.from_char('r')): 282 | return 283 | else: 284 | event = None 285 | pause_process() 286 | else: 287 | event = None 288 | pause_process() 289 | pause_process() 290 | 291 | clearLine() 292 | progressBar(total_size=endChapter-startChapter, size_done=progress, fill_symbol="■", length=35, suffix="There ") 293 | 294 | 295 | clearLine() 296 | print() 297 | printFeaturedText("Fetched all chapters successfully!", msgColorCode=105, blinkersColorCode=46) 298 | print(f"All chapters are stored inside the {results[selectedIndex]['title']} directory.") 299 | input() 300 | -------------------------------------------------------------------------------- /src/requirements.txt: -------------------------------------------------------------------------------- 1 | beautifulsoup4==4.11.2 2 | edge_tts==6.1.9 3 | hrequests==0.9.2 4 | music_tag==0.4.3 5 | pynput==1.7.6 6 | PyWinCtl==0.3 7 | Requests==2.32.3 8 | urllib3==1.26.14 9 | -------------------------------------------------------------------------------- /src/utils/Prettify.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | import time 4 | 5 | def clearScreen(): 6 | """ 7 | Clears the terminal 8 | """ 9 | if os.name == 'nt': 10 | os.system("cls") 11 | else: 12 | os.system("clear") 13 | 14 | def clearLine(): 15 | """ 16 | Clears the current line 17 | """ 18 | length = os.get_terminal_size()[0] 19 | whiteSpace = " "*length 20 | print(whiteSpace, end="\r") 21 | 22 | class Prettify(): 23 | 24 | def __init__(self): 25 | """Return specified color escape c0des if flushCodes flag is False else flush it to the console.""" 26 | 27 | #For some unknown reason window's command prompt does not recognise any escape code unless it is registered/cache using system calls. The below line will make sure to recognise all escape codes. 28 | if os.name == 'nt': 29 | os.system('echo|set /p="\033[38;5;12m\033[0m"') 30 | 31 | try: 32 | if sys.argv[1] == 'dump_cols': 33 | self.flushCodes = True 34 | else: 35 | self.flushCodes = False 36 | except: 37 | self.flushCodes = False 38 | 39 | try: 40 | if sys.argv[1] == 'dump_bgs': 41 | self.OnlyBG = True 42 | else: 43 | self.OnlyBG = False 44 | except: 45 | self.OnlyBG = False 46 | 47 | def dump_colors(self, code=None, ForBG=False): 48 | for i in range(0, 256): 49 | color_code = str(i) 50 | if not self.OnlyBG: 51 | escape_code = u"\u001b[38;5;" + color_code + "m" 52 | else: 53 | escape_code = "\033[48;5;" + color_code + "m" 54 | if code != None: 55 | if str(code) == color_code: 56 | return escape_code 57 | elif code == None: 58 | if self.OnlyBG or self.flushCodes: 59 | sys.stdout.write(escape_code + color_code.ljust(4) + " ") 60 | 61 | def progressBar(self, total_size: int, size_done: int, prefix="On the way!", suffix="There", length=None, fill_symbol='█', ToBeFill_symbol=' ', static_color=[]): #type: ignore 62 | """ 63 | Simple Progress bar that changes colors upon progress! 64 | 65 | PARAMETERS --> length {DEFAULT: os.get_terminal_size()[0] - len(prefix) - len(suffix)- 11} 66 | prefix {DEFAULT: "On the way!"} 67 | suffix {DEFAULT: "There"} 68 | total_size {DATATYPE: int} [REQUIRED] 69 | size_done {DATATYPE: int} [REQUIRED] 70 | fill_symbol {DEFAULT: '█'} 71 | ToBeFill_symbol {DEFAULT: ' '} 72 | static_color {DEFAULT: []} (Index: [0 -> fill_symbol, 1 -> ToBeFill_symbol]) 73 | 74 | NOTE --> endline (\n) should be provided after the job is completed to bring the cursor to a new line. 75 | When Overriding the 'fill_symbol' or 'ToBeFill_symbol' with characters of different length, then specifying the length manually might required. 76 | """ 77 | decimals = 1 78 | if length == None: 79 | length = os.get_terminal_size()[0] - len(prefix) - len(suffix) - 11 80 | if len(fill_symbol) > 1: 81 | length = length // len(fill_symbol) 82 | total = total_size 83 | ToBeFill_length = len(fill_symbol) // len(ToBeFill_symbol) 84 | 85 | try: 86 | ToBeFill_symbol = self.dump_colors(code=static_color[1]) + ToBeFill_symbol + self.dump_colors(code=7) 87 | except (IndexError, TypeError): 88 | pass 89 | 90 | # Progress Bar Printing Function 91 | def printProgressBar(iteration): 92 | if self.flushCodes == True: 93 | exit(0) 94 | percent = round(float(("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))) + 0.1, 1) 95 | 96 | if percent > float(100): 97 | percent = 100.0 98 | 99 | fill_color_applied = False 100 | try: 101 | fill = self.dump_colors(code=static_color[0]) + fill_symbol + self.dump_colors(code=7) 102 | fill_color_applied = True 103 | except (IndexError, TypeError): 104 | pass 105 | 106 | if not fill_color_applied: 107 | if percent >= float(0) and percent <= float(11): 108 | fill = self.dump_colors( 109 | code=124) + fill_symbol + self.dump_colors(code=7) 110 | elif percent > float(11) and percent <= float(21): 111 | fill = self.dump_colors( 112 | code=196) + fill_symbol + self.dump_colors(code=7) 113 | elif percent > float(21) and percent <= float(31): 114 | fill = self.dump_colors( 115 | code=202) + fill_symbol + self.dump_colors(code=7) 116 | elif percent > float(31) and percent <= float(41): 117 | fill = self.dump_colors( 118 | code=208) + fill_symbol + self.dump_colors(code=7) 119 | elif percent > float(41) and percent <= float(55): 120 | fill = self.dump_colors( 121 | code=220) + fill_symbol + self.dump_colors(code=7) 122 | elif percent > float(55) and percent <= float(71): 123 | fill = self.dump_colors( 124 | code=190) + fill_symbol + self.dump_colors(code=7) 125 | elif percent > float(71) and percent <= float(85): 126 | fill = self.dump_colors( 127 | code=34) + fill_symbol + self.dump_colors(code=7) 128 | elif percent > float(85): 129 | fill = self.dump_colors( 130 | code=46) + fill_symbol + self.dump_colors(code=7) 131 | 132 | filledLength = int(length * iteration // total) + 1 133 | bar = fill * filledLength + (ToBeFill_symbol * ToBeFill_length) * (length - filledLength) 134 | print(f'\r{prefix} |{bar}| {percent}% {suffix}', end="\r") 135 | if self.flushCodes or self.OnlyBG: 136 | exit(0) 137 | else: 138 | printProgressBar(size_done) 139 | 140 | def dump_styles(self, styles=None): 141 | """ 142 | Return esacpe code of specified 143 | *** Tested on Unix terminal *** 144 | """ 145 | 146 | if styles == 'bold': 147 | return "\033[1m" 148 | elif styles == 'faint': 149 | return '\033[2m' 150 | elif styles == 'italic': 151 | return '\033[3m' 152 | elif styles == 'underline': 153 | return '\033[4m' 154 | elif styles == 'blink': 155 | return '\033[5m' 156 | elif styles == 'reverse': 157 | return '\033[7m' 158 | elif styles == 'conceal': 159 | return '\033[8m' 160 | elif styles == 'crossed-out': 161 | return '\033[9m' 162 | elif styles == 'double-underline': 163 | return '\033[21m' 164 | elif styles == 'bold-off' or styles == 'faint-off': 165 | return '\033[22m' 166 | elif styles == 'italic-off': 167 | return '\033[23m' 168 | elif styles == 'underline-off': 169 | return '\033[24m' 170 | elif styles == 'blink-off': 171 | return '\033[25m' 172 | elif styles == 'reverse-off': 173 | return '\033[27m' 174 | elif styles == 'reveal' or styles == 'conceal-off': #type: ignore 175 | return '\033[28m' 176 | elif styles == 'crossed-out-off': 177 | return '\033[29m' 178 | elif styles == "overlined": 179 | return '\033[53m' 180 | elif styles == 'overlined-off': 181 | return '\033[55m' 182 | elif styles == 'reset': 183 | return '\033[0m' 184 | 185 | @staticmethod 186 | def printErr(msg: str, pauseOnError = True) -> None: 187 | obj = Prettify() 188 | print(f"{obj.dump_colors(code=196)}{msg}{obj.dump_styles(styles='reset')}") 189 | input() if pauseOnError else None 190 | 191 | @staticmethod 192 | def printSuc(msg: str) -> None: 193 | obj = Prettify() 194 | print(f"{obj.dump_colors(code=46)}{msg}{obj.dump_styles(styles='reset')}") 195 | 196 | @staticmethod 197 | def printWar(msg: str) -> None: 198 | obj = Prettify() 199 | print(f"{obj.dump_colors(code=208)}{msg}{obj.dump_styles(styles='reset')}") 200 | 201 | @staticmethod 202 | def printInf(msg: str) -> None: 203 | obj = Prettify() 204 | print(f"{obj.dump_colors(code=198)}{msg}{obj.dump_styles(styles='reset')}") 205 | 206 | @staticmethod 207 | def printFeaturedText(msg: str, blinkersColorCode = 196, msgColorCode = 226): 208 | self = Prettify() 209 | print(self.dump_styles(styles='blink') + self.dump_colors(code=blinkersColorCode) + '♦ ' + self.dump_styles(styles='blink-off') + self.dump_colors(code=msgColorCode) + msg + self.dump_styles(styles='blink') + self.dump_colors(code=blinkersColorCode) + ' ♦' + self.dump_styles(styles='reset')) 210 | 211 | if __name__ == "__main__": 212 | """For Debugging and Initial testing purposes""" 213 | 214 | cl = Prettify() 215 | cl.dump_colors() 216 | dump_styles = False 217 | try: 218 | if sys.argv[1] == 'dump_styles': 219 | dump_styles = True 220 | else: 221 | dump_styles = False 222 | except: 223 | pass 224 | if dump_styles: 225 | #show styles 226 | print(cl.dump_styles(styles='underline') + 'Styles' + cl.dump_styles(styles='underline-off') + ' ' + cl.dump_styles(styles='underline') + 'Codename' + cl.dump_styles(styles='underline-off')) 227 | print(cl.dump_styles(styles='bold') + "Bold Text" + cl.dump_styles(styles='bold-off') + ' ' + 'bold, bold-off') 228 | print(cl.dump_styles(styles='faint') + "Faint Text" + cl.dump_styles(styles='faint-off') + ' ' + 'faint, faint-off') 229 | print(cl.dump_styles(styles='italic') + "Italic Text" + cl.dump_styles(styles='italic-off') + ' ' + 'italic, italic-off') 230 | print(cl.dump_styles(styles='underline') + "Underlined Text" + cl.dump_styles(styles='underline-off') + ' ' + 'underline, underline-off') 231 | print(cl.dump_styles(styles='blink') + "Blinking Text" + cl.dump_styles(styles='blink-off') + ' ' + 'blink, blink-off') 232 | print(cl.dump_styles(styles='reverse') + "Inverse FG/BG" + cl.dump_styles(styles='reverse-off') + ' ' + 'reverse, reverse-off') 233 | print(cl.dump_styles(styles='conceal') + "Conceal Text" + cl.dump_styles(styles='reveal') + ' ' + 'conceal, reveal') 234 | print(cl.dump_styles(styles='overlined') + "Overlined Text" + cl.dump_styles(styles='overlined-off') + ' ' + 'overlined, overlined-off') 235 | print(cl.dump_styles(styles='crossed-out') + "Crossed Text" + cl.dump_styles(styles='crossed-out-off') + ' ' + 'crossed-out, crossed-out-off') 236 | print(cl.dump_styles(styles='double-underline') + "Double underlined Text" + cl.dump_styles(styles='underline-off') + ' ' + 'double-underline, underline-off') 237 | print() 238 | print(cl.dump_styles(styles='blink') + cl.dump_colors(code=196) + '♦ ' + cl.dump_styles(styles='blink-off') + cl.dump_colors(code=226) + 'Tested on Unix Terminal. Some styles may not work on other platforms' + cl.dump_styles(styles='blink') + cl.dump_colors(code=196) + ' ♦' + cl.dump_styles(styles='reset')) 239 | else: 240 | for i in range(123452): 241 | time.sleep(0.0001) 242 | cl.progressBar(total_size=123452, size_done=i, fill_symbol=' ☻ ', ToBeFill_symbol=' ☺ ', length=20) 243 | print() 244 | -------------------------------------------------------------------------------- /src/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Spectre-hidN/LibRead-Tool/513a1d3cf9baa94841f13fd367a410b8024e9d65/src/utils/__init__.py -------------------------------------------------------------------------------- /src/utils/configGenerator.py: -------------------------------------------------------------------------------- 1 | def create_default_config(config_name): 2 | 3 | searchResultSelector = "body > div.main > div.wp > div.row-box > div.col-content > div > div > div > div > div.txt > h3 > a" 4 | statusSelectorI = "body > div.main > div > div > div.col-content > div.m-info > div.m-book1 > div.m-imgtxt > div.txt > div:nth-child(6) > div > span" 5 | statusSelectorII = "body > div.main > div > div > div.col-content > div.m-info > div.m-book1 > div.m-imgtxt > div.txt > div:nth-child(5) > div > span" 6 | statusSelectorIII = "body > div.main > div > div > div.col-content > div.m-info > div.m-book1 > div.m-imgtxt > div.txt > div:nth-child(4) > div > span" 7 | totalChaptersSelector = "#idData > li > a" 8 | coverImageDivSelector = "body > div.main > div > div > div.col-content > div.m-info > div.m-book1 > div.m-imgtxt > div.pic > img" 9 | articleDivSelector = "#article > p" 10 | 11 | with open(config_name, 'w', encoding='utf-8') as cf: 12 | cf.write(f"""[DOMAIN] 13 | 14 | ; Change the domain name 15 | 16 | domainName = libread.com 17 | 18 | ; Modify the headers if the server is blocking your requests for being headless. 19 | origin = https://libread.com 20 | referer = https://libread.com/ 21 | authority = libread.com 22 | userAgent = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 23 | 24 | 25 | [SELECTOR_MAPS] 26 | 27 | ; These are the advanced settings to fix if the website changes its document structure. 28 | ; IT IS NOT RECOMMENDED TO MODIFY. 29 | 30 | searchResultSelector = {searchResultSelector} 31 | statusSelectorI = {statusSelectorI} 32 | statusSelectorII = {statusSelectorII} 33 | statusSelectorIII = {statusSelectorIII} 34 | totalChaptersSelector = {totalChaptersSelector} 35 | coverImageDivSelector = {coverImageDivSelector} 36 | articleDivSelector = {articleDivSelector} 37 | 38 | [NOMENCLATURES] 39 | 40 | ; You can only use the below variables to set up a name. use ! at both ends to indicate its a variable. 41 | ; TITLE -> Name of the novel 42 | ; STARTCHAPTER -> Indicates the starting chapter number of the part 43 | ; ENDCHAPTER -> Indicates the ending chapter number of the part 44 | 45 | ; Change the nomenclature for the output file. Affects both .txt and .mp3 file 46 | outputNomenclature = !TITLE! ~ Chapter-!STARTCHAPTER!-!ENDCHAPTER! 47 | 48 | ; Nomenclature for the cover image 49 | coverImageNomenclature = !TITLE! ~ Cover 50 | 51 | ; Replace WHITESPACE 52 | ; By befault it doesn't replace any WHITESPACE. 53 | ; But, if any of the variable has a WHITESPACE then it will be replaced by the given charater 54 | 55 | whitespaceReplacementCharacter = 56 | 57 | 58 | [TTS_CONFIG] 59 | 60 | ; Choose a voice name from the below list 61 | Voice = en-GB-SoniaNeural 62 | 63 | ; Embed unsynced subtitles to the mp3 file 64 | ; 1 = yes, 0 = no 65 | embedSubtitles = 1 66 | 67 | ; Enabling the below switch will force LibRead-Tool to fetch all the articles first in a part, then convert Text-To-Speech. 68 | ; Usually, this happens when FFMPEG is not accessible by LibRead-Tool. 69 | ; 1 = yes, 0 = no 70 | forceGrabFirstThenConvert = 0 71 | 72 | ; If the below switch is enabled, then LibRead-Tool will replace the existing parts with the new ones. 73 | ; However, if you deactivate the switch, LibRead-Tool will not overwrite the material if the part file already exists, even if the contents are only partially available. 74 | ; Disabling this will force the "forceGrabFirstThenConvert" switch to be enabled. 75 | ; 1 = yes, 0 = no 76 | replacePartContents = 1 77 | 78 | ; All Voices are lsited below 79 | ; Name: af-ZA-AdriNeural 80 | ; Gender: Female 81 | ; 82 | ; Name: af-ZA-WillemNeural 83 | ; Gender: Male 84 | ; 85 | ; Name: am-ET-AmehaNeural 86 | ; Gender: Male 87 | ; 88 | ; Name: am-ET-MekdesNeural 89 | ; Gender: Female 90 | ; 91 | ; Name: ar-AE-FatimaNeural 92 | ; Gender: Female 93 | ; 94 | ; Name: ar-AE-HamdanNeural 95 | ; Gender: Male 96 | ; 97 | ; Name: ar-BH-AliNeural 98 | ; Gender: Male 99 | ; 100 | ; Name: ar-BH-LailaNeural 101 | ; Gender: Female 102 | ; 103 | ; Name: ar-DZ-AminaNeural 104 | ; Gender: Female 105 | ; 106 | ; Name: ar-DZ-IsmaelNeural 107 | ; Gender: Male 108 | ; 109 | ; Name: ar-EG-SalmaNeural 110 | ; Gender: Female 111 | ; 112 | ; Name: ar-EG-ShakirNeural 113 | ; Gender: Male 114 | ; 115 | ; Name: ar-IQ-BasselNeural 116 | ; Gender: Male 117 | ; 118 | ; Name: ar-IQ-RanaNeural 119 | ; Gender: Female 120 | ; 121 | ; Name: ar-JO-SanaNeural 122 | ; Gender: Female 123 | ; 124 | ; Name: ar-JO-TaimNeural 125 | ; Gender: Male 126 | ; 127 | ; Name: ar-KW-FahedNeural 128 | ; Gender: Male 129 | ; 130 | ; Name: ar-KW-NouraNeural 131 | ; Gender: Female 132 | ; 133 | ; Name: ar-LB-LaylaNeural 134 | ; Gender: Female 135 | ; 136 | ; Name: ar-LB-RamiNeural 137 | ; Gender: Male 138 | ; 139 | ; Name: ar-LY-ImanNeural 140 | ; Gender: Female 141 | ; 142 | ; Name: ar-LY-OmarNeural 143 | ; Gender: Male 144 | ; 145 | ; Name: ar-MA-JamalNeural 146 | ; Gender: Male 147 | ; 148 | ; Name: ar-MA-MounaNeural 149 | ; Gender: Female 150 | ; 151 | ; Name: ar-OM-AbdullahNeural 152 | ; Gender: Male 153 | ; 154 | ; Name: ar-OM-AyshaNeural 155 | ; Gender: Female 156 | ; 157 | ; Name: ar-QA-AmalNeural 158 | ; Gender: Female 159 | ; 160 | ; Name: ar-QA-MoazNeural 161 | ; Gender: Male 162 | ; 163 | ; Name: ar-SA-HamedNeural 164 | ; Gender: Male 165 | ; 166 | ; Name: ar-SA-ZariyahNeural 167 | ; Gender: Female 168 | ; 169 | ; Name: ar-SY-AmanyNeural 170 | ; Gender: Female 171 | ; 172 | ; Name: ar-SY-LaithNeural 173 | ; Gender: Male 174 | ; 175 | ; Name: ar-TN-HediNeural 176 | ; Gender: Male 177 | ; 178 | ; Name: ar-TN-ReemNeural 179 | ; Gender: Female 180 | ; 181 | ; Name: ar-YE-MaryamNeural 182 | ; Gender: Female 183 | ; 184 | ; Name: ar-YE-SalehNeural 185 | ; Gender: Male 186 | ; 187 | ; Name: az-AZ-BabekNeural 188 | ; Gender: Male 189 | ; 190 | ; Name: az-AZ-BanuNeural 191 | ; Gender: Female 192 | ; 193 | ; Name: bg-BG-BorislavNeural 194 | ; Gender: Male 195 | ; 196 | ; Name: bg-BG-KalinaNeural 197 | ; Gender: Female 198 | ; 199 | ; Name: bn-BD-NabanitaNeural 200 | ; Gender: Female 201 | ; 202 | ; Name: bn-BD-PradeepNeural 203 | ; Gender: Male 204 | ; 205 | ; Name: bn-IN-BashkarNeural 206 | ; Gender: Male 207 | ; 208 | ; Name: bn-IN-TanishaaNeural 209 | ; Gender: Female 210 | ; 211 | ; Name: bs-BA-GoranNeural 212 | ; Gender: Male 213 | ; 214 | ; Name: bs-BA-VesnaNeural 215 | ; Gender: Female 216 | ; 217 | ; Name: ca-ES-EnricNeural 218 | ; Gender: Male 219 | ; 220 | ; Name: ca-ES-JoanaNeural 221 | ; Gender: Female 222 | ; 223 | ; Name: cs-CZ-AntoninNeural 224 | ; Gender: Male 225 | ; 226 | ; Name: cs-CZ-VlastaNeural 227 | ; Gender: Female 228 | ; 229 | ; Name: cy-GB-AledNeural 230 | ; Gender: Male 231 | ; 232 | ; Name: cy-GB-NiaNeural 233 | ; Gender: Female 234 | ; 235 | ; Name: da-DK-ChristelNeural 236 | ; Gender: Female 237 | ; 238 | ; Name: da-DK-JeppeNeural 239 | ; Gender: Male 240 | ; 241 | ; Name: de-AT-IngridNeural 242 | ; Gender: Female 243 | ; 244 | ; Name: de-AT-JonasNeural 245 | ; Gender: Male 246 | ; 247 | ; Name: de-CH-JanNeural 248 | ; Gender: Male 249 | ; 250 | ; Name: de-CH-LeniNeural 251 | ; Gender: Female 252 | ; 253 | ; Name: de-DE-AmalaNeural 254 | ; Gender: Female 255 | ; 256 | ; Name: de-DE-ConradNeural 257 | ; Gender: Male 258 | ; 259 | ; Name: de-DE-FlorianMultilingualNeural 260 | ; Gender: Male 261 | ; 262 | ; Name: de-DE-KatjaNeural 263 | ; Gender: Female 264 | ; 265 | ; Name: de-DE-KillianNeural 266 | ; Gender: Male 267 | ; 268 | ; Name: de-DE-SeraphinaMultilingualNeural 269 | ; Gender: Female 270 | ; 271 | ; Name: el-GR-AthinaNeural 272 | ; Gender: Female 273 | ; 274 | ; Name: el-GR-NestorasNeural 275 | ; Gender: Male 276 | ; 277 | ; Name: en-AU-NatashaNeural 278 | ; Gender: Female 279 | ; 280 | ; Name: en-AU-WilliamNeural 281 | ; Gender: Male 282 | ; 283 | ; Name: en-CA-ClaraNeural 284 | ; Gender: Female 285 | ; 286 | ; Name: en-CA-LiamNeural 287 | ; Gender: Male 288 | ; 289 | ; Name: en-GB-LibbyNeural 290 | ; Gender: Female 291 | ; 292 | ; Name: en-GB-MaisieNeural 293 | ; Gender: Female 294 | ; 295 | ; Name: en-GB-RyanNeural 296 | ; Gender: Male 297 | ; 298 | ; Name: en-GB-SoniaNeural 299 | ; Gender: Female 300 | ; 301 | ; Name: en-GB-ThomasNeural 302 | ; Gender: Male 303 | ; 304 | ; Name: en-HK-SamNeural 305 | ; Gender: Male 306 | ; 307 | ; Name: en-HK-YanNeural 308 | ; Gender: Female 309 | ; 310 | ; Name: en-IE-ConnorNeural 311 | ; Gender: Male 312 | ; 313 | ; Name: en-IE-EmilyNeural 314 | ; Gender: Female 315 | ; 316 | ; Name: en-IN-NeerjaExpressiveNeural 317 | ; Gender: Female 318 | ; 319 | ; Name: en-IN-NeerjaNeural 320 | ; Gender: Female 321 | ; 322 | ; Name: en-IN-PrabhatNeural 323 | ; Gender: Male 324 | ; 325 | ; Name: en-KE-AsiliaNeural 326 | ; Gender: Female 327 | ; 328 | ; Name: en-KE-ChilembaNeural 329 | ; Gender: Male 330 | ; 331 | ; Name: en-NG-AbeoNeural 332 | ; Gender: Male 333 | ; 334 | ; Name: en-NG-EzinneNeural 335 | ; Gender: Female 336 | ; 337 | ; Name: en-NZ-MitchellNeural 338 | ; Gender: Male 339 | ; 340 | ; Name: en-NZ-MollyNeural 341 | ; Gender: Female 342 | ; 343 | ; Name: en-PH-JamesNeural 344 | ; Gender: Male 345 | ; 346 | ; Name: en-PH-RosaNeural 347 | ; Gender: Female 348 | ; 349 | ; Name: en-SG-LunaNeural 350 | ; Gender: Female 351 | ; 352 | ; Name: en-SG-WayneNeural 353 | ; Gender: Male 354 | ; 355 | ; Name: en-TZ-ElimuNeural 356 | ; Gender: Male 357 | ; 358 | ; Name: en-TZ-ImaniNeural 359 | ; Gender: Female 360 | ; 361 | ; Name: en-US-AnaNeural 362 | ; Gender: Female 363 | ; 364 | ; Name: en-US-AndrewNeural 365 | ; Gender: Male 366 | ; 367 | ; Name: en-US-AriaNeural 368 | ; Gender: Female 369 | ; 370 | ; Name: en-US-AvaNeural 371 | ; Gender: Female 372 | ; 373 | ; Name: en-US-BrianNeural 374 | ; Gender: Male 375 | ; 376 | ; Name: en-US-ChristopherNeural 377 | ; Gender: Male 378 | ; 379 | ; Name: en-US-EmmaNeural 380 | ; Gender: Female 381 | ; 382 | ; Name: en-US-EricNeural 383 | ; Gender: Male 384 | ; 385 | ; Name: en-US-GuyNeural 386 | ; Gender: Male 387 | ; 388 | ; Name: en-US-JennyNeural 389 | ; Gender: Female 390 | ; 391 | ; Name: en-US-MichelleNeural 392 | ; Gender: Female 393 | ; 394 | ; Name: en-US-RogerNeural 395 | ; Gender: Male 396 | ; 397 | ; Name: en-US-SteffanNeural 398 | ; Gender: Male 399 | ; 400 | ; Name: en-ZA-LeahNeural 401 | ; Gender: Female 402 | ; 403 | ; Name: en-ZA-LukeNeural 404 | ; Gender: Male 405 | ; 406 | ; Name: es-AR-ElenaNeural 407 | ; Gender: Female 408 | ; 409 | ; Name: es-AR-TomasNeural 410 | ; Gender: Male 411 | ; 412 | ; Name: es-BO-MarceloNeural 413 | ; Gender: Male 414 | ; 415 | ; Name: es-BO-SofiaNeural 416 | ; Gender: Female 417 | ; 418 | ; Name: es-CL-CatalinaNeural 419 | ; Gender: Female 420 | ; 421 | ; Name: es-CL-LorenzoNeural 422 | ; Gender: Male 423 | ; 424 | ; Name: es-CO-GonzaloNeural 425 | ; Gender: Male 426 | ; 427 | ; Name: es-CO-SalomeNeural 428 | ; Gender: Female 429 | ; 430 | ; Name: es-CR-JuanNeural 431 | ; Gender: Male 432 | ; 433 | ; Name: es-CR-MariaNeural 434 | ; Gender: Female 435 | ; 436 | ; Name: es-CU-BelkysNeural 437 | ; Gender: Female 438 | ; 439 | ; Name: es-CU-ManuelNeural 440 | ; Gender: Male 441 | ; 442 | ; Name: es-DO-EmilioNeural 443 | ; Gender: Male 444 | ; 445 | ; Name: es-DO-RamonaNeural 446 | ; Gender: Female 447 | ; 448 | ; Name: es-EC-AndreaNeural 449 | ; Gender: Female 450 | ; 451 | ; Name: es-EC-LuisNeural 452 | ; Gender: Male 453 | ; 454 | ; Name: es-ES-AlvaroNeural 455 | ; Gender: Male 456 | ; 457 | ; Name: es-ES-ElviraNeural 458 | ; Gender: Female 459 | ; 460 | ; Name: es-ES-XimenaNeural 461 | ; Gender: Female 462 | ; 463 | ; Name: es-GQ-JavierNeural 464 | ; Gender: Male 465 | ; 466 | ; Name: es-GQ-TeresaNeural 467 | ; Gender: Female 468 | ; 469 | ; Name: es-GT-AndresNeural 470 | ; Gender: Male 471 | ; 472 | ; Name: es-GT-MartaNeural 473 | ; Gender: Female 474 | ; 475 | ; Name: es-HN-CarlosNeural 476 | ; Gender: Male 477 | ; 478 | ; Name: es-HN-KarlaNeural 479 | ; Gender: Female 480 | ; 481 | ; Name: es-MX-DaliaNeural 482 | ; Gender: Female 483 | ; 484 | ; Name: es-MX-JorgeNeural 485 | ; Gender: Male 486 | ; 487 | ; Name: es-NI-FedericoNeural 488 | ; Gender: Male 489 | ; 490 | ; Name: es-NI-YolandaNeural 491 | ; Gender: Female 492 | ; 493 | ; Name: es-PA-MargaritaNeural 494 | ; Gender: Female 495 | ; 496 | ; Name: es-PA-RobertoNeural 497 | ; Gender: Male 498 | ; 499 | ; Name: es-PE-AlexNeural 500 | ; Gender: Male 501 | ; 502 | ; Name: es-PE-CamilaNeural 503 | ; Gender: Female 504 | ; 505 | ; Name: es-PR-KarinaNeural 506 | ; Gender: Female 507 | ; 508 | ; Name: es-PR-VictorNeural 509 | ; Gender: Male 510 | ; 511 | ; Name: es-PY-MarioNeural 512 | ; Gender: Male 513 | ; 514 | ; Name: es-PY-TaniaNeural 515 | ; Gender: Female 516 | ; 517 | ; Name: es-SV-LorenaNeural 518 | ; Gender: Female 519 | ; 520 | ; Name: es-SV-RodrigoNeural 521 | ; Gender: Male 522 | ; 523 | ; Name: es-US-AlonsoNeural 524 | ; Gender: Male 525 | ; 526 | ; Name: es-US-PalomaNeural 527 | ; Gender: Female 528 | ; 529 | ; Name: es-UY-MateoNeural 530 | ; Gender: Male 531 | ; 532 | ; Name: es-UY-ValentinaNeural 533 | ; Gender: Female 534 | ; 535 | ; Name: es-VE-PaolaNeural 536 | ; Gender: Female 537 | ; 538 | ; Name: es-VE-SebastianNeural 539 | ; Gender: Male 540 | ; 541 | ; Name: et-EE-AnuNeural 542 | ; Gender: Female 543 | ; 544 | ; Name: et-EE-KertNeural 545 | ; Gender: Male 546 | ; 547 | ; Name: fa-IR-DilaraNeural 548 | ; Gender: Female 549 | ; 550 | ; Name: fa-IR-FaridNeural 551 | ; Gender: Male 552 | ; 553 | ; Name: fi-FI-HarriNeural 554 | ; Gender: Male 555 | ; 556 | ; Name: fi-FI-NooraNeural 557 | ; Gender: Female 558 | ; 559 | ; Name: fil-PH-AngeloNeural 560 | ; Gender: Male 561 | ; 562 | ; Name: fil-PH-BlessicaNeural 563 | ; Gender: Female 564 | ; 565 | ; Name: fr-BE-CharlineNeural 566 | ; Gender: Female 567 | ; 568 | ; Name: fr-BE-GerardNeural 569 | ; Gender: Male 570 | ; 571 | ; Name: fr-CA-AntoineNeural 572 | ; Gender: Male 573 | ; 574 | ; Name: fr-CA-JeanNeural 575 | ; Gender: Male 576 | ; 577 | ; Name: fr-CA-SylvieNeural 578 | ; Gender: Female 579 | ; 580 | ; Name: fr-CA-ThierryNeural 581 | ; Gender: Male 582 | ; 583 | ; Name: fr-CH-ArianeNeural 584 | ; Gender: Female 585 | ; 586 | ; Name: fr-CH-FabriceNeural 587 | ; Gender: Male 588 | ; 589 | ; Name: fr-FR-DeniseNeural 590 | ; Gender: Female 591 | ; 592 | ; Name: fr-FR-EloiseNeural 593 | ; Gender: Female 594 | ; 595 | ; Name: fr-FR-HenriNeural 596 | ; Gender: Male 597 | ; 598 | ; Name: fr-FR-RemyMultilingualNeural 599 | ; Gender: Male 600 | ; 601 | ; Name: fr-FR-VivienneMultilingualNeural 602 | ; Gender: Female 603 | ; 604 | ; Name: ga-IE-ColmNeural 605 | ; Gender: Male 606 | ; 607 | ; Name: ga-IE-OrlaNeural 608 | ; Gender: Female 609 | ; 610 | ; Name: gl-ES-RoiNeural 611 | ; Gender: Male 612 | ; 613 | ; Name: gl-ES-SabelaNeural 614 | ; Gender: Female 615 | ; 616 | ; Name: gu-IN-DhwaniNeural 617 | ; Gender: Female 618 | ; 619 | ; Name: gu-IN-NiranjanNeural 620 | ; Gender: Male 621 | ; 622 | ; Name: he-IL-AvriNeural 623 | ; Gender: Male 624 | ; 625 | ; Name: he-IL-HilaNeural 626 | ; Gender: Female 627 | ; 628 | ; Name: hi-IN-MadhurNeural 629 | ; Gender: Male 630 | ; 631 | ; Name: hi-IN-SwaraNeural 632 | ; Gender: Female 633 | ; 634 | ; Name: hr-HR-GabrijelaNeural 635 | ; Gender: Female 636 | ; 637 | ; Name: hr-HR-SreckoNeural 638 | ; Gender: Male 639 | ; 640 | ; Name: hu-HU-NoemiNeural 641 | ; Gender: Female 642 | ; 643 | ; Name: hu-HU-TamasNeural 644 | ; Gender: Male 645 | ; 646 | ; Name: id-ID-ArdiNeural 647 | ; Gender: Male 648 | ; 649 | ; Name: id-ID-GadisNeural 650 | ; Gender: Female 651 | ; 652 | ; Name: is-IS-GudrunNeural 653 | ; Gender: Female 654 | ; 655 | ; Name: is-IS-GunnarNeural 656 | ; Gender: Male 657 | ; 658 | ; Name: it-IT-DiegoNeural 659 | ; Gender: Male 660 | ; 661 | ; Name: it-IT-ElsaNeural 662 | ; Gender: Female 663 | ; 664 | ; Name: it-IT-GiuseppeNeural 665 | ; Gender: Male 666 | ; 667 | ; Name: it-IT-IsabellaNeural 668 | ; Gender: Female 669 | ; 670 | ; Name: ja-JP-KeitaNeural 671 | ; Gender: Male 672 | ; 673 | ; Name: ja-JP-NanamiNeural 674 | ; Gender: Female 675 | ; 676 | ; Name: jv-ID-DimasNeural 677 | ; Gender: Male 678 | ; 679 | ; Name: jv-ID-SitiNeural 680 | ; Gender: Female 681 | ; 682 | ; Name: ka-GE-EkaNeural 683 | ; Gender: Female 684 | ; 685 | ; Name: ka-GE-GiorgiNeural 686 | ; Gender: Male 687 | ; 688 | ; Name: kk-KZ-AigulNeural 689 | ; Gender: Female 690 | ; 691 | ; Name: kk-KZ-DauletNeural 692 | ; Gender: Male 693 | ; 694 | ; Name: km-KH-PisethNeural 695 | ; Gender: Male 696 | ; 697 | ; Name: km-KH-SreymomNeural 698 | ; Gender: Female 699 | ; 700 | ; Name: kn-IN-GaganNeural 701 | ; Gender: Male 702 | ; 703 | ; Name: kn-IN-SapnaNeural 704 | ; Gender: Female 705 | ; 706 | ; Name: ko-KR-HyunsuNeural 707 | ; Gender: Male 708 | ; 709 | ; Name: ko-KR-InJoonNeural 710 | ; Gender: Male 711 | ; 712 | ; Name: ko-KR-SunHiNeural 713 | ; Gender: Female 714 | ; 715 | ; Name: lo-LA-ChanthavongNeural 716 | ; Gender: Male 717 | ; 718 | ; Name: lo-LA-KeomanyNeural 719 | ; Gender: Female 720 | ; 721 | ; Name: lt-LT-LeonasNeural 722 | ; Gender: Male 723 | ; 724 | ; Name: lt-LT-OnaNeural 725 | ; Gender: Female 726 | ; 727 | ; Name: lv-LV-EveritaNeural 728 | ; Gender: Female 729 | ; 730 | ; Name: lv-LV-NilsNeural 731 | ; Gender: Male 732 | ; 733 | ; Name: mk-MK-AleksandarNeural 734 | ; Gender: Male 735 | ; 736 | ; Name: mk-MK-MarijaNeural 737 | ; Gender: Female 738 | ; 739 | ; Name: ml-IN-MidhunNeural 740 | ; Gender: Male 741 | ; 742 | ; Name: ml-IN-SobhanaNeural 743 | ; Gender: Female 744 | ; 745 | ; Name: mn-MN-BataaNeural 746 | ; Gender: Male 747 | ; 748 | ; Name: mn-MN-YesuiNeural 749 | ; Gender: Female 750 | ; 751 | ; Name: mr-IN-AarohiNeural 752 | ; Gender: Female 753 | ; 754 | ; Name: mr-IN-ManoharNeural 755 | ; Gender: Male 756 | ; 757 | ; Name: ms-MY-OsmanNeural 758 | ; Gender: Male 759 | ; 760 | ; Name: ms-MY-YasminNeural 761 | ; Gender: Female 762 | ; 763 | ; Name: mt-MT-GraceNeural 764 | ; Gender: Female 765 | ; 766 | ; Name: mt-MT-JosephNeural 767 | ; Gender: Male 768 | ; 769 | ; Name: my-MM-NilarNeural 770 | ; Gender: Female 771 | ; 772 | ; Name: my-MM-ThihaNeural 773 | ; Gender: Male 774 | ; 775 | ; Name: nb-NO-FinnNeural 776 | ; Gender: Male 777 | ; 778 | ; Name: nb-NO-PernilleNeural 779 | ; Gender: Female 780 | ; 781 | ; Name: ne-NP-HemkalaNeural 782 | ; Gender: Female 783 | ; 784 | ; Name: ne-NP-SagarNeural 785 | ; Gender: Male 786 | ; 787 | ; Name: nl-BE-ArnaudNeural 788 | ; Gender: Male 789 | ; 790 | ; Name: nl-BE-DenaNeural 791 | ; Gender: Female 792 | ; 793 | ; Name: nl-NL-ColetteNeural 794 | ; Gender: Female 795 | ; 796 | ; Name: nl-NL-FennaNeural 797 | ; Gender: Female 798 | ; 799 | ; Name: nl-NL-MaartenNeural 800 | ; Gender: Male 801 | ; 802 | ; Name: pl-PL-MarekNeural 803 | ; Gender: Male 804 | ; 805 | ; Name: pl-PL-ZofiaNeural 806 | ; Gender: Female 807 | ; 808 | ; Name: ps-AF-GulNawazNeural 809 | ; Gender: Male 810 | ; 811 | ; Name: ps-AF-LatifaNeural 812 | ; Gender: Female 813 | ; 814 | ; Name: pt-BR-AntonioNeural 815 | ; Gender: Male 816 | ; 817 | ; Name: pt-BR-FranciscaNeural 818 | ; Gender: Female 819 | ; 820 | ; Name: pt-BR-ThalitaNeural 821 | ; Gender: Female 822 | ; 823 | ; Name: pt-PT-DuarteNeural 824 | ; Gender: Male 825 | ; 826 | ; Name: pt-PT-RaquelNeural 827 | ; Gender: Female 828 | ; 829 | ; Name: ro-RO-AlinaNeural 830 | ; Gender: Female 831 | ; 832 | ; Name: ro-RO-EmilNeural 833 | ; Gender: Male 834 | ; 835 | ; Name: ru-RU-DmitryNeural 836 | ; Gender: Male 837 | ; 838 | ; Name: ru-RU-SvetlanaNeural 839 | ; Gender: Female 840 | ; 841 | ; Name: si-LK-SameeraNeural 842 | ; Gender: Male 843 | ; 844 | ; Name: si-LK-ThiliniNeural 845 | ; Gender: Female 846 | ; 847 | ; Name: sk-SK-LukasNeural 848 | ; Gender: Male 849 | ; 850 | ; Name: sk-SK-ViktoriaNeural 851 | ; Gender: Female 852 | ; 853 | ; Name: sl-SI-PetraNeural 854 | ; Gender: Female 855 | ; 856 | ; Name: sl-SI-RokNeural 857 | ; Gender: Male 858 | ; 859 | ; Name: so-SO-MuuseNeural 860 | ; Gender: Male 861 | ; 862 | ; Name: so-SO-UbaxNeural 863 | ; Gender: Female 864 | ; 865 | ; Name: sq-AL-AnilaNeural 866 | ; Gender: Female 867 | ; 868 | ; Name: sq-AL-IlirNeural 869 | ; Gender: Male 870 | ; 871 | ; Name: sr-RS-NicholasNeural 872 | ; Gender: Male 873 | ; 874 | ; Name: sr-RS-SophieNeural 875 | ; Gender: Female 876 | ; 877 | ; Name: su-ID-JajangNeural 878 | ; Gender: Male 879 | ; 880 | ; Name: su-ID-TutiNeural 881 | ; Gender: Female 882 | ; 883 | ; Name: sv-SE-MattiasNeural 884 | ; Gender: Male 885 | ; 886 | ; Name: sv-SE-SofieNeural 887 | ; Gender: Female 888 | ; 889 | ; Name: sw-KE-RafikiNeural 890 | ; Gender: Male 891 | ; 892 | ; Name: sw-KE-ZuriNeural 893 | ; Gender: Female 894 | ; 895 | ; Name: sw-TZ-DaudiNeural 896 | ; Gender: Male 897 | ; 898 | ; Name: sw-TZ-RehemaNeural 899 | ; Gender: Female 900 | ; 901 | ; Name: ta-IN-PallaviNeural 902 | ; Gender: Female 903 | ; 904 | ; Name: ta-IN-ValluvarNeural 905 | ; Gender: Male 906 | ; 907 | ; Name: ta-LK-KumarNeural 908 | ; Gender: Male 909 | ; 910 | ; Name: ta-LK-SaranyaNeural 911 | ; Gender: Female 912 | ; 913 | ; Name: ta-MY-KaniNeural 914 | ; Gender: Female 915 | ; 916 | ; Name: ta-MY-SuryaNeural 917 | ; Gender: Male 918 | ; 919 | ; Name: ta-SG-AnbuNeural 920 | ; Gender: Male 921 | ; 922 | ; Name: ta-SG-VenbaNeural 923 | ; Gender: Female 924 | ; 925 | ; Name: te-IN-MohanNeural 926 | ; Gender: Male 927 | ; 928 | ; Name: te-IN-ShrutiNeural 929 | ; Gender: Female 930 | ; 931 | ; Name: th-TH-NiwatNeural 932 | ; Gender: Male 933 | ; 934 | ; Name: th-TH-PremwadeeNeural 935 | ; Gender: Female 936 | ; 937 | ; Name: tr-TR-AhmetNeural 938 | ; Gender: Male 939 | ; 940 | ; Name: tr-TR-EmelNeural 941 | ; Gender: Female 942 | ; 943 | ; Name: uk-UA-OstapNeural 944 | ; Gender: Male 945 | ; 946 | ; Name: uk-UA-PolinaNeural 947 | ; Gender: Female 948 | ; 949 | ; Name: ur-IN-GulNeural 950 | ; Gender: Female 951 | ; 952 | ; Name: ur-IN-SalmanNeural 953 | ; Gender: Male 954 | ; 955 | ; Name: ur-PK-AsadNeural 956 | ; Gender: Male 957 | ; 958 | ; Name: ur-PK-UzmaNeural 959 | ; Gender: Female 960 | ; 961 | ; Name: uz-UZ-MadinaNeural 962 | ; Gender: Female 963 | ; 964 | ; Name: uz-UZ-SardorNeural 965 | ; Gender: Male 966 | ; 967 | ; Name: vi-VN-HoaiMyNeural 968 | ; Gender: Female 969 | ; 970 | ; Name: vi-VN-NamMinhNeural 971 | ; Gender: Male 972 | ; 973 | ; Name: zh-CN-XiaoxiaoNeural 974 | ; Gender: Female 975 | ; 976 | ; Name: zh-CN-XiaoyiNeural 977 | ; Gender: Female 978 | ; 979 | ; Name: zh-CN-YunjianNeural 980 | ; Gender: Male 981 | ; 982 | ; Name: zh-CN-YunxiNeural 983 | ; Gender: Male 984 | ; 985 | ; Name: zh-CN-YunxiaNeural 986 | ; Gender: Male 987 | ; 988 | ; Name: zh-CN-YunyangNeural 989 | ; Gender: Male 990 | ; 991 | ; Name: zh-CN-liaoning-XiaobeiNeural 992 | ; Gender: Female 993 | ; 994 | ; Name: zh-CN-shaanxi-XiaoniNeural 995 | ; Gender: Female 996 | ; 997 | ; Name: zh-HK-HiuGaaiNeural 998 | ; Gender: Female 999 | ; 1000 | ; Name: zh-HK-HiuMaanNeural 1001 | ; Gender: Female 1002 | ; 1003 | ; Name: zh-HK-WanLungNeural 1004 | ; Gender: Male 1005 | ; 1006 | ; Name: zh-TW-HsiaoChenNeural 1007 | ; Gender: Female 1008 | ; 1009 | ; Name: zh-TW-HsiaoYuNeural 1010 | ; Gender: Female 1011 | ; 1012 | ; Name: zh-TW-YunJheNeural 1013 | ; Gender: Male 1014 | ; 1015 | ; Name: zu-ZA-ThandoNeural 1016 | ; Gender: Female 1017 | ; 1018 | ; Name: zu-ZA-ThembaNeural 1019 | ; Gender: Male""") 1020 | cf.close() 1021 | -------------------------------------------------------------------------------- /src/utils/ffmpegWrapper.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | import re 3 | import os 4 | import configparser 5 | from .configGenerator import create_default_config 6 | from .Prettify import Prettify, clearLine 7 | from .twoSecondSilence import getFileBytes 8 | import music_tag 9 | 10 | printSuc = Prettify.printSuc 11 | printWar = Prettify.printWar 12 | printErr = Prettify.printErr 13 | printFeaturedText = Prettify.printFeaturedText 14 | 15 | CONFIG_FILE = "libread-config.ini" 16 | global EMBED_SUBS 17 | 18 | def _sorted_alphanumeric(data): 19 | convert = lambda text: int(text) if text.isdigit() else text.lower() 20 | alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 21 | return sorted(data, key=alphanum_key) 22 | 23 | def _readConfig(): 24 | if(os.path.isfile(CONFIG_FILE)): 25 | try: 26 | config = configparser.ConfigParser() 27 | config.read(CONFIG_FILE) 28 | global EMBED_SUBS 29 | EMBED_SUBS = config.getboolean("TTS_CONFIG", "embedSubtitles") 30 | except: 31 | printWar("Corrupted config file detected! Re-generating a new one...") 32 | create_default_config(CONFIG_FILE) 33 | _readConfig() 34 | else: 35 | create_default_config(CONFIG_FILE) 36 | _readConfig() 37 | 38 | def performSanityCheck() -> bool: 39 | try: 40 | result = subprocess.check_output(["ffmpeg", "-version"]).decode() 41 | except: 42 | printFeaturedText(msg="FFMPEG not found in the path! LibRead-Tool will download all articles before converting them.") 43 | return False 44 | 45 | ffmpegVersion = re.search("ffmpeg version (.*) Copyright", result).group(1) 46 | printSuc(f"FFMPEG version {ffmpegVersion} found!") 47 | return True 48 | 49 | # Will merge all mp3 files into one and embed the subtitles from subs.txt 50 | def mergeChunks(chunkFilesDir: str, outputFilePrefix: str, coverImagePath = None) -> None: 51 | _readConfig() 52 | 53 | allMP3Files = _sorted_alphanumeric([f for f in os.listdir(chunkFilesDir) if (os.path.isfile(os.path.join(chunkFilesDir, f)) and (f.split(".")[-1] == "mp3"))]) 54 | 55 | with open(f'{chunkFilesDir}/2s-delay.mp3', 'wb') as df: 56 | df.write(getFileBytes()) 57 | 58 | ffmpegfileList = "".join(f"file '{f}'\nfile '2s-delay.mp3'\n" for f in allMP3Files) 59 | 60 | with open(f'{chunkFilesDir}/inputFiles.txt', 'w', encoding="utf=8") as cf: 61 | cf.write(ffmpegfileList) 62 | 63 | retCode = os.system(f'ffmpeg -f concat -safe 0 -i "{chunkFilesDir}/inputFiles.txt" -c copy -map_metadata 0 "{outputFilePrefix}.mp3" -loglevel panic') 64 | if(retCode != 0): 65 | clearLine() 66 | printErr(f"Merge Error occured! FFMPEG ReturnCode: {str(retCode)}") 67 | return 68 | 69 | # Add ID3 tags 70 | f = music_tag.load_file(f'{outputFilePrefix}.mp3') 71 | 72 | if(EMBED_SUBS): 73 | with open(f"{chunkFilesDir}/subs.txt", 'r', encoding="utf-8") as sf: 74 | f["lyrics"] = sf.read() 75 | 76 | if(coverImagePath): 77 | with open(coverImagePath, 'rb') as If: 78 | f["artwork"] = If.read() 79 | 80 | f.save() -------------------------------------------------------------------------------- /src/utils/scrapper.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import hrequests 3 | from bs4 import BeautifulSoup 4 | import os 5 | import configparser 6 | from .Prettify import Prettify 7 | from .configGenerator import create_default_config 8 | from requests.packages.urllib3.exceptions import InsecureRequestWarning #type: ignore 9 | import urllib3 10 | 11 | CONFIG_FILE = "libread-config.ini" 12 | global DOMAIN_NAME 13 | global SEARCH_PAGE_SELECTOR, STATUS_SELECTOR_I, STATUS_SELECTOR_II, STATUS_SELECTOR_III, CHAPTER_SELECTOR, IMAGE_URL_SELECTOR, ARTICLE_DIV_SELECTOR 14 | global HEADERS 15 | 16 | printWar = Prettify.printWar 17 | printSuc = Prettify.printSuc 18 | printErr = Prettify.printErr 19 | 20 | 21 | def _readConfig(): 22 | requests.packages.urllib3.disable_warnings(InsecureRequestWarning) 23 | urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) 24 | 25 | if(os.path.isfile(CONFIG_FILE)): 26 | try: 27 | config = configparser.ConfigParser() 28 | config.read(CONFIG_FILE) 29 | 30 | global SEARCH_PAGE_SELECTOR, STATUS_SELECTOR_I, STATUS_SELECTOR_II, STATUS_SELECTOR_III, CHAPTER_SELECTOR, IMAGE_URL_SELECTOR, ARTICLE_DIV_SELECTOR 31 | SEARCH_PAGE_SELECTOR = config.get("SELECTOR_MAPS", "searchResultSelector") 32 | STATUS_SELECTOR_I = config.get("SELECTOR_MAPS", "statusSelectorI") 33 | STATUS_SELECTOR_II = config.get("SELECTOR_MAPS", "statusSelectorII") 34 | STATUS_SELECTOR_III = config.get("SELECTOR_MAPS", "statusSelectorIII") 35 | CHAPTER_SELECTOR = config.get("SELECTOR_MAPS", "totalChaptersSelector") 36 | IMAGE_URL_SELECTOR = config.get("SELECTOR_MAPS", "coverImageDivSelector") 37 | ARTICLE_DIV_SELECTOR = config.get("SELECTOR_MAPS", "articleDivSelector") 38 | 39 | global HEADERS 40 | HEADERS = { 41 | 'authority': config.get("DOMAIN", "authority"), 42 | 'User-Agent' : config.get("DOMAIN", "userAgent"), 43 | 'origin': config.get("DOMAIN", "origin"), 44 | 'referer': config.get("DOMAIN", "referer")} 45 | 46 | global DOMAIN_NAME 47 | DOMAIN_NAME = config.get("DOMAIN", "domainName") 48 | 49 | except: 50 | printWar("Corrupted config file detected! Re-generating a new one...") 51 | create_default_config(CONFIG_FILE) 52 | _readConfig() 53 | else: 54 | create_default_config(CONFIG_FILE) 55 | _readConfig() 56 | 57 | 58 | def checkConnection(): 59 | _readConfig() 60 | url = f"https://{DOMAIN_NAME}/" 61 | try: 62 | con = requests.get(url, timeout=10, verify=False) 63 | if(con.status_code == 200): 64 | return True 65 | else: 66 | print("Connection established with Status code " + con.status_code) 67 | return False 68 | except: 69 | return False 70 | 71 | def search(query: str): 72 | _readConfig() 73 | 74 | payload = {"searchkey": query} 75 | res = requests.post(f"https://{DOMAIN_NAME}/search", data=payload, headers=HEADERS, verify=False) 76 | soup = BeautifulSoup(res.content, 'html.parser') 77 | 78 | #For Debugging purposes 79 | with open("searchResultDump.html", 'w', encoding='utf-8') as f: 80 | f.write(res.content.decode()) 81 | 82 | results = soup.select(SEARCH_PAGE_SELECTOR) 83 | return results 84 | 85 | def getMetadata(url: str): 86 | _readConfig() 87 | 88 | try: 89 | res = requests.get(url, headers=HEADERS, verify=False) 90 | except: 91 | try: 92 | res = requests.get(url, headers=HEADERS) 93 | except Exception as E: 94 | printErr(f"Error occured while fetching {url}. | Error: {E} |") 95 | soup = BeautifulSoup(res.content, 'html.parser') 96 | 97 | #For Debugging purposes 98 | with open("novelPageDump.html", 'w', encoding='utf-8') as f: 99 | f.write(res.content.decode()) 100 | 101 | metadata = {'chapters': [], 'status' : None, 'cover-image': None} 102 | 103 | chapters = soup.select(CHAPTER_SELECTOR) 104 | metadata.update({'chapters' : chapters}) 105 | status = "Unknow" 106 | try: 107 | status = soup.select(STATUS_SELECTOR_I)[0].text 108 | except: 109 | try: 110 | status = soup.select(STATUS_SELECTOR_II)[0].text 111 | except: 112 | try: 113 | status = soup.select(STATUS_SELECTOR_III)[0].text 114 | except: 115 | pass 116 | 117 | metadata.update({'status' : status}) 118 | 119 | try: 120 | imageUrl = f"https://{DOMAIN_NAME}/" + soup.select(IMAGE_URL_SELECTOR)[0]["src"] 121 | 122 | image = requests.get(imageUrl, headers=HEADERS, stream=True) 123 | metadata.update({'cover-image':image}) 124 | except: 125 | pass 126 | 127 | return metadata 128 | 129 | def getArticle(url: str): 130 | _readConfig() 131 | 132 | try: 133 | res = hrequests.get(url, headers=HEADERS, verify=False) 134 | except: 135 | try: 136 | res = hrequests.get(url, headers=HEADERS) 137 | except Exception as E: 138 | printErr(f"Error occured while fetching {url}. | Error: {E} |") 139 | 140 | soup = BeautifulSoup(res.content, 'html.parser') 141 | 142 | #For Debugging purposes 143 | with open('articlePageDump.html', 'w', encoding='utf-8') as f: 144 | f.write(res.content.decode()) 145 | 146 | articleDiv = soup.select(ARTICLE_DIV_SELECTOR) 147 | articleDiv = articleDiv[0:len(articleDiv)-1] 148 | articleStr = "" 149 | for article in articleDiv: 150 | if(article.text == "…" or article.text == "..."): 151 | continue 152 | #filter out words that can break tts 153 | articleStr += article.text.replace("𝙡𝓲𝒃𝓻𝓮𝙖𝒅.𝙘𝓸𝒎", "").replace("…", "").replace("...", "").replace("𝓵𝙞𝙗𝙧𝙚𝒂𝙙.𝓬𝒐𝒎", "").replace("“", "").replace("”", "").replace("𝒍𝒊𝙗𝒓𝒆𝒂𝒅.𝓬𝒐𝓶", "").replace("*", "") 154 | articleStr += "\n" 155 | return articleStr -------------------------------------------------------------------------------- /src/utils/tts.py: -------------------------------------------------------------------------------- 1 | import edge_tts 2 | import os 3 | import configparser 4 | import re 5 | from .Prettify import Prettify 6 | from .configGenerator import create_default_config 7 | import music_tag 8 | 9 | 10 | CONFIG_FILE = "libread-config.ini" 11 | global EMBED_SUBS 12 | global VOICE_NAME 13 | 14 | printWar = Prettify.printWar 15 | 16 | def _readConfig(): 17 | if(os.path.isfile(CONFIG_FILE)): 18 | try: 19 | config = configparser.ConfigParser() 20 | config.read(CONFIG_FILE) 21 | global VOICE_NAME 22 | VOICE_NAME = config.get("TTS_CONFIG", "Voice") 23 | global EMBED_SUBS 24 | EMBED_SUBS = config.getboolean("TTS_CONFIG", "embedSubtitles") 25 | except: 26 | printWar("Corrupted config file detected! Re-generating a new one...") 27 | create_default_config(CONFIG_FILE) 28 | _readConfig() 29 | else: 30 | create_default_config(CONFIG_FILE) 31 | _readConfig() 32 | 33 | async def createTTSFromFile(filepath: str, outputFilePrefix: str, coverImagePath = None): 34 | _readConfig() 35 | 36 | inputFile = open(filepath, 'r', encoding='utf-8') 37 | communicate = edge_tts.Communicate(inputFile.read(), VOICE_NAME) 38 | submaker = edge_tts.SubMaker() 39 | with open(outputFilePrefix+".mp3", "wb") as f: 40 | async for chunk in communicate.stream(): 41 | if chunk["type"] == "audio": 42 | f.write(chunk["data"]) 43 | elif chunk["type"] == "WordBoundary": 44 | submaker.create_sub((chunk["offset"], chunk["duration"]), chunk["text"]) 45 | 46 | subs = submaker.generate_subs() 47 | with open(outputFilePrefix+".vtt", "w", encoding="utf-8") as sf: 48 | sf.write(subs) 49 | 50 | subs = subs.replace("""WEBVTT""", "") 51 | subs = re.sub("[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3} --> [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}", "", subs) 52 | subs = re.sub(r'(\n\s*)+', "\n", subs) 53 | 54 | f = music_tag.load_file(outputFilePrefix+".mp3") 55 | 56 | if(EMBED_SUBS): 57 | f["lyrics"] = subs 58 | 59 | if(coverImagePath): 60 | with open(coverImagePath, 'rb') as img_in: 61 | f["artwork"] = img_in.read() 62 | 63 | f.save() 64 | 65 | async def createTTSFromText(text: str, outputPath: str, coverImagePath = None, embedSubtitles = False): 66 | _readConfig() 67 | 68 | if(os.path.isfile(outputPath)): os.remove(outputPath) 69 | 70 | communicate = edge_tts.Communicate(text, VOICE_NAME) 71 | subFile = open(os.path.dirname(outputPath)+"/subs.txt", "a+", encoding="utf-8") 72 | submaker = edge_tts.SubMaker() 73 | 74 | with open(outputPath, "ab") as ttsFile: 75 | async for chunk in communicate.stream(): 76 | if(chunk["type"] == "audio"): 77 | ttsFile.write(chunk["data"]) 78 | elif(chunk["type"] == "WordBoundary"): 79 | submaker.create_sub((chunk["offset"], chunk["duration"]), chunk["text"]) 80 | 81 | subs = submaker.generate_subs() 82 | subs = subs.replace("""WEBVTT""", "") 83 | subs = re.sub("[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3} --> [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}", "", subs) 84 | subs = re.sub(r'(\n\s*)+', "\n", subs) 85 | 86 | subFile.write(f"{subs}\n") 87 | subFile.close() 88 | 89 | # Add ID3 tags 90 | f = music_tag.load_file(outputPath) 91 | if(embedSubtitles): f["lyrics"] = subs 92 | if(coverImagePath): 93 | with open(coverImagePath, 'rb') as img_in: 94 | f["artwork"] = img_in.read() 95 | 96 | f.save() -------------------------------------------------------------------------------- /src/utils/twoSecondSilence.py: -------------------------------------------------------------------------------- 1 | import binascii 2 | 3 | """ 4 | Get the raw bytes for the file https://github.com/anars/blank-audio/blob/master/2-seconds-of-silence.mp3 5 | 6 | NOTE -> This is a ridiculous way to extract data. But, I didn't want to include the file as a resource 7 | """ 8 | def getFileBytes(): 9 | xxdDump = """49443304000000021805544954320000001500000032205365636f6e6473 10 | 206f662053696c656e63655450453100000012000000416e617220536f66 11 | 7477617265204c4c4354414c420000000c000000426c616e6b2041756469 12 | 6f4150494300020f02000000696d6167652f6a70656700030089504e470d 13 | 0a1a0a0000000d4948445200000438000004380806000000ec106c8f0000 14 | 0006624b474400ff00ff00ffa0bda79300000009704859730000083d0000 15 | 083d01059555b60000000774494d4507df0a0b051c31036f047600002000 16 | 4944415478daecdd7b945565dd07f0df300c3701012f28ea8089572c53b0 17 | 34b1a2326f81562ade354d5108336995a6a6a879ebe22d35afa4af809acb 18 | d4340d0d4359bd967929bca46472d11004811161b88cf3fed15b0b9c9973 19 | ce9e3967e63c339fcf5aef7a6bef673f7befdfb3cf70ceb767ef5d1111f5 20 | 0100000090b04e4a00000000a44ec001000000244fc001000000244fc001 21 | 000000244fc001000000244fc001000000244fc001000000244fc0010000 22 | 00244fc001000000244fc001000000244fc001000000244fc00100000024 23 | 4fc001000000244fc001000000244fc001000000244fc001000000244fc0 24 | 01000000244fc001000000244fc001000000244fc001000000244fc00100 25 | 0000244fc001000000244fc001000000244fc001000000244fc001000000 26 | 244fc001000000244fc001000000244fc001000000244fc001000000244f 27 | c001000000244fc001000000244fc001000000244fc001000000244fc001 28 | 000000244fc001000000244fc001000000244fc001000000244fc0010000 29 | 00244fc001000000244fc001000000244fc001000000244fc00100000024 30 | 4fc001000000244fc001000000244fc001000000244fc001000000244fc0 31 | 01000000244fc001000000244fc001000000244fc001000000244fc00100 32 | 0000244fc001000000244fc001000000244fc001000000244fc001000000 33 | 244fc001000000244fc001000000244fc001000000244fc001000000244f 34 | c001000000244fc001000000244fc001000000244fc001000000244fc001 35 | 000000244fc001000000244fc001000000244fc001000000244fc0010000 36 | 00244fc001000000244fc001000000244fc001000000244fc00100000024 37 | 4fc001000000244fc001000000244fc001000000244fc001000000244fc0 38 | 01000000244fc001000000244fc001000000244fc001000000244fc00100 39 | 0000244fc001000000244fc001000000244fc001000000244fc001000000 40 | 244fc001000000244fc001000000244fc001000000244fc001000000244f 41 | c001000000244fc001000000244fc001000000244fc001000000244fc001 42 | 000000244fc001000000244fc001000000244fc001000000244fc0010000 43 | 00244fc001000000244fc001000000244fc001000000244fc00100000024 44 | 4fc001000000244fc001000000244fc001000000244fc001000000244fc0 45 | 01000000244fc001000000244fc001000000244fc001000000244fc00100 46 | 0000244fc001000000244fc001000000244fc001000000244fc001000000 47 | 244fc001000000244fc001000000244fc001000000244fc001000000244f 48 | c001000000244fc001000000244fc001000000244fc001000000244fc001 49 | 000000244fc001000000244fc001000000244fc001000000244fc0010000 50 | 00244fc001000000244fc001000000244fc001000000244fc00100000024 51 | 4fc001000000244fc001000000244fc001000000244fc001000000244fc0 52 | 01000000244fc001000000244fc001000000244fc001000000244fc00100 53 | 0000244fc001000000244fc001000000244fc001000000244fc001000000 54 | 244fc001000000244fc001000000244fc001000000244fc001000000244f 55 | c001000000244fc001000000244fc001000000244fc001000000244fc001 56 | 000000244fc001000000244fc001000000244fc001000000244fc0010000 57 | 00244fc001000000244fc001000000244fc001000000244fc00100000024 58 | 4fc001000000244fc001000000244fc001000000244fc001000000244fc0 59 | 01000000244fc001000000244fc001000000244fc001000000244fc00100 60 | 0000244fc001000000244fc001000000244fc001000000244fc001000000 61 | 244fc001000000244fc001000000244fc001000000244fc001000000244f 62 | c001000000244fc001000000244fc001000000244fc001000000244fc001 63 | 000000244fc001000000244fc001000000244fc001000000244fc0010000 64 | 00244fc001000000244fc001000000244fc001000000244fc00100000024 65 | 4fc001000000244fc001000000244fc001000000244fc001000000244fc0 66 | 01000000244fc001000000244fc001000000244fc001000000244fc00100 67 | 0000244fc001000000244fc001000000244fc001000000244fc001000000 68 | 244fc001000000244fc001000000244fc001000000244fc001000000244f 69 | c001000000244fc001000000244fc001000000244fc001000000244fc001 70 | 000000244fc001000000244fc001000000244fc001000000244fc0010000 71 | 00244fc001000000244fc001000000244fc001000000244fc00100000024 72 | 4fc001000000244fc001000000244fc001000000244fc001000000244fc0 73 | 01000000244fc001000000244fc001000000244fc001000000244fc00100 74 | 0000244fc001000000244fc001000000244fc001000000244fc001000000 75 | 244fc001000000244fc001000000244fc001000000244fc001000000244f 76 | c001000000244fc001000000244fc001000000244fc001000000244fc001 77 | 000000244fc001000000244fc001000000244fc001000000244fc0010000 78 | 00244fc001000000244fc001000000244fc001000000244fc00100000024 79 | 4fc001000000244fc001000000244fc001000000244fc001000000244fc0 80 | 01000000244fc001000000244fc001000000244fc001000000244fc00100 81 | 0000244fc001000000244fc001000000244fc001000000244fc001000000 82 | 244fc001000000244fc001000000244fc001000000244fc001000000244f 83 | c001000000244fc001000000244fc001000000244fc001000000244fc001 84 | 000000244fc001000000244fc001000000244fc001000000244fc0010000 85 | 00244fc001000000244fc001000000244fc001000000244fc00100000024 86 | 4fc001000000244fc001000000244fc001000000244fc001000000244fc0 87 | 01000000244fc001000000244fc001000000244fc001000000244fc00100 88 | 0000244fc001000000244fc001000000244fc001000000244fc001000000 89 | 244fc001000000244fc001000000244fc001000000244fc001000000244f 90 | c001000000244fc001000000244fc001000000244fc001000000244fc001 91 | 000000244fc001000000244fc001000000244fc001000000244fc0010000 92 | 00244fc001000000244fc001000000244fc001000000244fc00100000024 93 | 4fc001000000244fc001000000244fc001000000244fc001000000244fc0 94 | 01000000244fc001000000244fc001000000244fc001000000244fc00100 95 | 0000244fc001000000244fc001000000244fc001000000244fc001000000 96 | 244fc001000000244fc001000000244fc001000000244fc001000000244f 97 | c001000000244fc001000000244fc001000000244fc001000000244fc001 98 | 000000244fc001000000244fc001000000244fc001000000244fc0010000 99 | 00244fc001000000244fc001000000244fc001000000244fc041abda6cb3 100 | cd62e2c4893174e850c5000000a0682a22a25e19680d7beeb967dc7cf3cd 101 | d1bf7fffa8a9a989c30f3f3c66cd9aa530000000b498191cb48a934e3a29 102 | eebbefbee8dfbf7f4444f4eedd3ba64e9d1ad5d5d58a030000408b99c141 103 | c99d7beeb9316edcb846d7bdf8e28b71c82187c4dab56b150a00008066ab 104 | 8c880b958152a8a8a8881ffde84771eaa9a736d9668b2db6885ebd7ac593 105 | 4f3ea96000000034ff376898c14109545656c64f7ef293183d7a7441ed8f 106 | 3aeaa898316386c2010000d02c020e8aae53a74e71c30d37c4a851a30ade 107 | 66ce9c393162c48858bd7ab50202000090995b5428ba0b2fbc308e3efae8 108 | 4cdbf4e9d3273efcf0c3f8e31fffa880000000646606074575f2c927c7c5 109 | 175fdcac6dd7ac591323468c8837df7c5321010000c8c46b62299afdf7df 110 | 3f264e9cd8ecedbb74e9d2a2ed010000e8b8cce0a02876df7df7b8efbefb 111 | a27bf7ee2deeeb4b5ffa52bcf2ca2b8a0a000040c1cce0a0c5b6da6aabb8 112 | e38e3b8a126e44448c1b374e51010000c8c40c0e5aa453a74e71df7df7c5 113 | 5e7bed55b43eebeaeae2339ff94ccc9f3f5f8101000028ecf7a912d012a7 114 | 9f7e7a51c38d8888cacaca38edb4d314170000808299c141b3edbaebaef1 115 | c8238f44555555d1fbaeadad8d3df7dc33962c59a2d0000000e4650607cd 116 | d2ad5bb7b8fefaeb4b126efca7ffaf7ffdeb0a0d00004041041c34cbf9e7 117 | 9f1fdb6fbf7d49f7316ad42885060000a020020e32fbc217be10dff8c637 118 | 4abe9f3df6d823aaabab151c000080bc041c6452555515975e7a69d1fb5d 119 | ba7469a3cbcde2000000a010020e3239f6d8638b3eabe299679e89cf7dee 120 | 73b168d1a206eb0e39e41045070000202f010705ebd1a3479c79e69945ed 121 | f3a1871e8a238f3c32162f5e1c53a74e6db07ec89021b1dd76db293e0000 122 | 0039093828d837bff9cdd86cb3cd8ad6df33cf3c13e3c68d8b356bd64444 123 | c4e4c993a3bebee15b8bcde2000000201f010705e9d3a74f8c1d3bb668fd 124 | 2d5dba34c68e1d1b757575ff5df6d65b6fc5ac59b31ab41d316284010000 125 | 002027010705f9d6b7be15bd7bf72e5a7f679e7966bcf3ce3b0d963ffef8 126 | e30d967de2139f88ae5dbb1a040000009a24e020affefdfbc749279d54b4 127 | fe6ebbedb646838c888869d3a63558565555159ff8c4270c040000004d12 128 | 7090d7d8b163a35bb76e45e9ebdd77df8dcb2fbfbcc9f5b366cd6a7466c7 129 | 9e7bee692000000068928083dc1748a74e316ad4a8a2f5f7d39ffe343ef8 130 | e0839c6d1a9bdd21e000000020e7ef57252097bdf6da2bfaf7ef5f94bede 131 | 78e38d9832654ade768d051cc3860d33180000003449c0414e23478e2c5a 132 | 5f3ffad18f62ddba7579db3dfdf4d3b16ad5aa0d966db2c926b1edb6db1a 133 | 100000001a25e0a04995959571f0c10717a5af679f7d361e7becb182daae 134 | 5ebd3a5e7cf1c506cb3ff5a94f19140000001a25e0a0497befbd776cbae9 135 | a645e9eba28b2ecad4fe95575e69b06c8f3df63028000000344ac041930e 136 | 39e490a2f4f3c8238fc473cf3d97699b975f7eb9c1b28103071a14000000 137 | 1a25e0a0519d3b778e830e3aa8c5fdac5bb72e2ebdf4d2ccdb35368363ab 138 | adb63230000000344ac041a3f6d9679fe8dbb76f8bfbf99ffff99f78f3cd 139 | 37336ff7da6baf457d7dfd06cb060c186060000000689480834615e3819e 140 | 2b56ac88abaebaaa59dbae5ebd3ade7ffffd0d9675efdebd28a10b000000 141 | ed8f808346edbaebae2deee3a69b6e8ac58b17377bfba54b973658e63615 142 | 0000001a23e0a05143860c69d1f66bd7ae8d5ffef2972dea63d9b2650d96 143 | b94d05000080c6083868a04f9f3e2d0e121e7ae8a158b264498bfa682ce0 144 | 308303000080c608386860f0e0c12deea3a5b33722223ef8e08306cb041c 145 | 0000003446c04103fdfaf56bd1f6b366cd8ae79e7baec5c7d1d80345051c 146 | 0000003446c041032d7d53c9a449938a721c9b6fbe7983659ec101000040 147 | 63041c34d092191ccb962d8b071e78a028c7b1d9669b3558d6b3674f0304 148 | 00004003020e1ae8d3a74fb3b7bdfbeebba3b6b6b6c5c7d0a54b97e8ddbb 149 | 7783e59d3b7736400000003420e0a081cacaca666d575f5f1f77de796751 150 | 8e61bbedb62beab1010000d0be09386860e5ca95cdda6efaf4e93167ce9c 151 | a21cc3fefbefdfe87201070000008d1170d04073038e62bc1af63f0e3cf0 152 | c04697bb4505000080c6083868e0830f3ec8bccddcb973e3c9279f2ccafe 153 | b7da6aabf8f8c73fdee83a01070000008d1170d0407366704c9e3c393efc 154 | f0c3a2ecffa0830e6a729d5b54000000688c8083069a13703cf6d86345d9 155 | 778f1e3d62ecd8b14dae1770000000d01801070d64bd4565ce9c39f18f7f 156 | fca328fb1e3f7e7cf4efdfbfc9f5020e0000001a23e0a081ac3338a64d9b 157 | 5694fd6ebdf5d671da69a7e56ce3191c0000003446c041035967703cfef8 158 | e345d9ef79e79d175dbb76cdd9a658cff9000000a07d1170d04096191c35 159 | 3535f1a73ffda9c5fbdc73cf3d63d4a85179db2d5ab4c800010000d08080 160 | 8306de79e79da8afaf2fa8edf4e9d363ddba752dda5f4545454c9c38b1a0 161 | b6fffad7bf0c100000000d08386860f5ead5b170e1c282da16e3f91b871d 162 | 76587cf2939f2ca8ed82050b0c100000000d083868d49c3973f2b659b76e 163 | 5d4c9f3ebd45fbe9d1a347fce0073f28b8bd8003000080c6083868d4dcb9 164 | 73f3b6f9f39fff1c3535352ddacfb871e372be16f6a3041c0000003446c0 165 | 41a30a09385e7ffdf516ed63abadb68ad34f3f3dd3369ec1010000406304 166 | 1c34aa905b54962f5fdea27d5c79e595d1ad5bb74cdb98c1010000406304 167 | 1c346adebc7979dbb424e038eeb8e362c4881199b71370000000d098ce4a 168 | 40630a99c1b16cd9b266f53d70e0c0b8e0820b326fb766cd9a78efbdf70c 169 | 0e0000d0aa2a2a2a9abd2c6bdb42b75fb76e5d7cf8e18706673d028ef5ec 170 | b4d34eb1e38e3bb6ca855baaed5bfa615a7f796d6d6dce5b4876df7df7e8 171 | dcb973a67d555454c4983163a2478f1e99c767c1820571e2892796e45ccb 172 | 655ccbe10f6a29f695a55d4ae79ad27595ca35e85cdbe7e7adadc7aa5ccf 173 | b51463d5debe8b3857df457c17f15da45c3e03e5e8e4934f8e471f7dd40f 174 | f9f5c73422ea95e1df264c981013264c5008000000cada29a79c128f3cf2 175 | 8842acc70c8e2259bc7871a3b76cd4d7379e1f65599eb58fa664edbbbaba 176 | 3a7af7eedd647f0b162c88c58b17177c8cddba758b1d76d8a1d949e9ecd9 177 | b3e3fdf7df6fd6f9b7c538a430c6e55c9354c732eb3e8b719e298c71b9d4 178 | dbe7358cb1cfabb1ec40df178cb1b16c0fdfa13af2f7fb030e3820c68d1b 179 | d7e4fa4e9d3c5253c05122d75d775ddc72cb2dedea9cbef7bdefc599679e 180 | d9e4fa7befbd37aeb8e28a82faaaaaaa8adffef6b7cd0e37d6ac59135ffe 181 | f29763f5ead52e360000a0dddb69a79d72ae4ffd169b5210f9d0a4bffded 182 | 6f39d7f7e9d3a7e0bece3aebac18326448b38fe52f7ff98b70030000e830 183 | f23d40d40c8e466aa2043465d6ac5939d7f7eddbb7a07ef6d8638ff8d6b7 184 | bed5a263f9e31fff68400000800e43c0919d8ad0a4b7df7e3be76b590b99 185 | c1d1ad5bb7b8f6da6ba3b2b2b245c73273e64c030200007418f99ed721e0 186 | 68a4264a402eb96671545757e7ddfebcf3ce8b8f7dec632d3a8655ab56c5 187 | 0b2fbc60300000800ec30c8eec54849c723d87a3baba3aba76eddae4fae1 188 | c387c737bef18d161fc3cc993363eddab506030000e830f2cde0f090d186 189 | 041ce4942be0e8d4a95393b33336d96493b8e69a6b8af2a1bbf3ce3b0d04 190 | 0000d0a1e49bc1d1d2c700b447020e72caf7a0d1edb7dfbed10fda8d37de 191 | 185b6eb9658bf73f67ce9c983e7dba810000003a14b7a864a722e4346fde 192 | bc58be7c7993eb1b0b38ce39e79c183e7c7851f67fc71d77e49d9a050000 193 | d0de78c868762a425eb966717c34e038f8e08363ecd8b145d9efaa55ab62 194 | ead4a906000000e870cce0c84e45c82bd77338d60f38060f1e1c575d7555 195 | d1f67bfffdf7474d4d8d010000003a9c7c0187878c36d45909c82757c0b1 196 | dd76db4565656574efde3d6ebffdf6e8d9b367d1f63b69d224c50700003a 197 | 243338b25311f2ca157074e9d225aaababe3aaabae8ac18307176d9f7ffa 198 | d39fe295575e517c0000a043127064a722e43577eedc9cb78a5c7ef9e571 199 | f0c10717759f37de78a3c20300001d96878c66a72214f4c17ae9a5979a5c 200 | bfefbefb16757f4f3df5544c9b364de10100800efd3b2ce78f790147c39a 201 | 280185c8759b4a31ad5bb72ece3fff7c050700003a34b7a864a7221424d7 202 | ab628be9f6db6f8fd9b3672b380000d0a10938b253110ad21a3338162f5e 203 | 1c3ffbd9cf141b0000e8f0041cd9a9080579f3cd3763c58a1525ddc7a597 204 | 5e9af361a60000001d8580233b15a1e00fd7cb2fbf5cb2fe5f7cf1c5b8e7 205 | 9e7b141a0000203c64b439548482bdf2ca2b25fbe09e77de79793fc00000 206 | 001d45be191c1515158af411020e0a3264c89038ecb0c34ad2f74d37dd14 207 | cf3fffbc22030000fc3fb7a864a722e43568d0a09832654af4ead5abe87d 208 | bff8e28b71d9659729320000c07a041cd9a90839f5efdf3feeb9e79ed86c 209 | b3cd8adef7fbefbf1fa79f7e7aac5dbb56a1010000d623e0c84e4568d2c6 210 | 1b6f1c53a74e8d6db6d9a624fd7fef7bdf8bb973e72a34000040d61ff302 211 | 8e863551021ad3bd7bf7b8ebaebb62a79d762a49ff53a74e8d071f7c50a1 212 | 0100001a610647762a420355555571ebadb7c6d0a1434bd2ffebafbf1ee7 213 | 9d779e420300003441c0919d8ab0818a8a8ab8e69a6b62c4881125e97ff5 214 | ead571da69a7c5aa55ab141b0000a009028eec54840d5c72c92571e8a187 215 | 96acff73cf3d37fefef7bf2b340000400e028eec3a2b0111ff9eb971e9a5 216 | 97c609279c50b27ddc78e38d3165ca14c5060000c8235fc0515151a1481f 217 | 21e0203a75ea143ffde94f63f4e8d125dbc7238f3c12975c728962030000 218 | 14a0bebe3eefef383624e0e8e81740e7ce71edb5d796f4b694e79f7f3ec6 219 | 8f1f9ff7030a0000c0bfb945a519bf6f95a0e3aaaaaa8a1b6fbc310e3ae8 220 | a092ed63debc7971e28927466d6dad8203000065a5b1db3c9abaf5a358cb 221 | 0b6ddbb973ee9feb028e86041c45326cd8b058bd7a759b7f080a5d5e5555 222 | 15a3478f8e1d76d8a16435a9adad8d871f7e380e3ffcf0669f63d6f32ce5 223 | 1fa3721dcb72ac4929cfb39c6a552eff50a63ac6a97e5edbdb18fbbc1a4b 224 | 636c8cfd1be33b6147f84ed81e0938041c253372e4c8183972a442aca75b 225 | b76e3176ec58850000002832014743028e2259bc78712c5bb6acc1f2c69e 226 | 3bd1d4b3285adab629ebb7ada8a888810307468f1e3d4a5a8f79f3e6c5d2 227 | a54b4b5e872cb569cdb128d7732b87f3cd726ea98da5736bfde33596cead 228 | bd9d9b7fefdad7b9f90ca6f73dc567d0b995d3f794be7dfbc6bdf7de2be0 229 | 1070b4beebaebb2e6eb9e596b23ec6debd7bc79429534a1e6e44441c7cf0 230 | c1b164c9121706000040336cb2c92639d70b381aa98912740cfdfaf58bfb 231 | eebb2ff6d8638f56d95f6bed070000a03df21695ec54a403e8ddbb77dc7b 232 | efbdb1ebaebbb6da3e870f1faef0000000cd24e0c84e45dab96eddbac51d 233 | 77dc11bbecb24babee57c0010000d07cf99e2dd291de18532801473bd6b9 234 | 73e7b8e9a69be2d39ffe74abef7ba79d768a4d37ddd4200000003483191c 235 | d9a9483b555151113ffbd9cf62bffdf66bb3fd9bc5010000d03c028eec54 236 | a49dbaf0c20be3b0c30e2be93e66ce9c193535354daedf77df7d0d040000 237 | 40330838b253917668fcf8f171ca29a794741fcf3df75c9c78e289f1d7bf 238 | feb5c936020e000080e6c917705456562ad2470838da992f7ef18b71f6d9 239 | 6797741fafbefa6a1c7becb1b172e5ca78fef9e79b6cb7f5d65bc7a04183 240 | 0c0a000040461e329a9d80a31d19387060fcfce73f2fe9853e77eedc38fa 241 | e8a363f9f2e51111f1c20b2fe46cef391c000000d9b945253b156927ba75 242 | eb16b7de7a6b6cbcf1c625dbc7a2458be2a8a38e8a850b17fe7759be80c3 243 | 6d2a000000d90938b2539176e2f2cb2f8f21438694acff9a9a9a38eaa8a3 244 | 62ce9c391b2c7ff7dd77e3adb7de6a72bb7df6d9c7d4290000808cf2dda2 245 | 22e068a4264a90bee38f3f3e8e38e28892f55f5b5b1bc71f7f7cbcfaeaab 246 | 8daecf358ba35fbf7e250d5e000000daab5cb338041c8dd44409d2b6c71e 247 | 7bc4c5175f5cb2fed7ad5b17a79e7a6afcf9cf7f6eb28ddb540000008a2f 248 | 57c061a67c43028e8475e9d225aebdf6daa8aaaa2a49fff5f5f571e69967 249 | c6134f3c91b35dae37a94478d028000040737f9335f963de0c8e86355182 250 | 748d1f3f3e3ef6b18f95acff1ffef08771fffdf7e76d376bd6ac58b76e5d 251 | 93ebf7da6baf928530000000ed555d5d5dd33fe6051c0d6ba20469da76db 252 | 6d63fcf8f125ebffe73fff79dc76db6d05b55db56a55bcf6da6b4daeefde 253 | bd7b0c1d3ad4a00100006490eb1695caca4a05fa080147a2aeb8e28ae8d2 254 | a54b49fafefdef7f1f975f7e79a66df2dda6e2391c000000d9780647369d 255 | 95203d5ffbdad74af65c8b37df7c33c68d1b97f79dcb1ff5fcf3cfc771c7 256 | 1dd7e4fae1c387c78f7ffce38888d864934d62cf3df78c5d76d925faf5eb 257 | 177dfbf6dde0fff7e9d32756ae5c194b962c89c58b17c7e2c58bfffb9fe7 258 | ce9d1b3366cc8865cb96b91000008076cd5b54b2117024a677efde71e185 259 | 1796a4ef0f3ef820bef18d6f444d4d4de66d5f7cf1c59ceb77db6db7f8d9 260 | cf7e169ffad4a70a7a6e48cf9e3d63f3cd376f745d5d5d5d3cfbecb3f1f8 261 | e38fc7b469d3e28d37de7061000000ed8e878c6623e048ccb9e79e1b9b6e 262 | ba69493e38679c7146bcfefaebcdda7ef6ecd9b162c58ae8d9b367a3ebbb 263 | 74e912471e7964518eb5b2b232f6da6bafd86bafbde2fcf3cf8f37df7c33 264 | 1e7becb1b8f9e69b63e1c2852e120000a05d3083231b1549c8a04183e298 265 | 638e2949dfd75c734d3cfae8a32dfae0e59bc5512adb6ebb6d9c7efae931 266 | 73e6cc183f7e7cc99e4d020000d09a041cd9a848424e39e594925cc44f3c 267 | f144fce4273f69f6f615151571c41147c4e0c183dbb43e1b6db4519c73ce 268 | 393163c68c38f0c0035d30000040d2041cd9a8482236de78e3183d7a74d1 269 | fb7df3cd37e35bdffa56e6878afec72ebbec120f3ef8605c7df5d5b1c516 270 | 5b9445ad060e1c18b7dd765bdc7befbdb1f3ce3bbb7800008024798b4a36 271 | 028e441c77dc71d1a3478fa27f58ce38e38c663d54b457af5e71f1c517c7 272 | ef7ef7bb18366c5859d66cf8f0e1f1d8638fc511471ce10202000092e321 273 | a3d9a84802aaaaaae2e4934f2e7abf37df7c733cf7dc7399b7fbea57bf1a 274 | 4f3ffd749c7cf2c951595959f6b5bbfaeaab63c284092e24000020296e51 275 | c946451270c8218744fffefd8bdae73ffff9cfb8f2ca2b336d5359591997 276 | 5e7a695c7ffdf54dbec2b55c4d983021aebaeaaaa8aaaa724101000049c8 277 | 157094fbffd8dc16041c091833664cd13f24dff9ce77a2b6b6b6e06d7af7 278 | ee1d77dd75579c78e289c9d671f4e8d171d75d7745af5ebd5c54000040d9 279 | f30c8e6c041c656ef8f0e13164c890a2f679fbedb7c7b3cf3e5b70fb8103 280 | 07c66f7ef39bf8dce73e977c3df7dd77df78e081078a3e23060000a0d8dc 281 | a2928d8a94b9af7ef5ab45ed6fce9c3971d9659715dcfed39ffe743cf2c8 282 | 23b1fdf6dbb79b9aeebcf3cef1cb5ffe32ba75ebe602030000ca96878c66 283 | d35909ca5bb1674d7cf7bbdf8d55ab5615d4f6939ffc644c9d3ab55d0601 284 | bbedb65b5c75d55571fae9a7bbc80080926b6a2a793196679da65e8cbedb 285 | e27c8a719ee574dcc538cf148ebb3d5db36d3196b99e2128e0107094cc81 286 | 071e18db6cb34d513f041b6fbc710c1830a068c7387ffefc18356a548c1a 287 | 352aefb1f4ecd9330e38e080763dcbe190430e89c18307c7dffffef776fd 288 | 8f5639fdf1f78f56fbf96292ea172d636c8cfd30f26f4c5bfd8d00283601 289 | 47237f9723a23b29086400002000494441545e19fe6dc284095e270a0000 290 | 40d95bb87061ecbefbee0ab11e33388ae4d5575f8db973e73658ded83d53 291 | 4ddd47f5d1e5c3860d2bdac330e7cf9f1f2fbcf042de6388f8f77337b6d8 292 | 628b0e33766bd7ae8dc71f7f3c962d5b5694712b65dba694e2185afb7cb3 293 | d4a05cc7c7b975cc733396cecdb915ffdf95f6fc19f4f7c5b9b94e9d5b96 294 | b64f3cf1446cb7dd768db6378343c0513277df7d77dc72cb2d45ebafaaaa 295 | 2a5e79e595a2fd803ffcf0c363debc7979db4e9c38b143851bffa9f5aebb 296 | ee1a5ff8c21762e5ca952e660000a02cd4d5d535b94ec0d1484d94a03c0d 297 | 1d3a3436da68a3a2f475d75d7715146eecbdf7de71ca29a774c87a575757 298 | c719679ce1c2030000ca46aed7c45656562ad0470838cad4673ffbd9a2f4 299 | b372e5cab8faeaabf35f089d3ac5c489133b74cd4f3bedb4183468908b0f 300 | 0000280b5e139b8d8a94a962bd1ef6de7bef8d77df7d376fbbd1a347c7ae 301 | bbeedaa16bdea54b970e1ff2000000e523d70c0e6f726a48c051a676da69 302 | a7a2f43379f2e4bc6d7af6ec19679f7db6a247c47efbed175ffce2171502 303 | 00006873b9020e33381aa98912949f5ebd7a45f7eedd5bdccf5ffffad778 304 | f9e597f3b6fbf6b7bf1d9b6db699c2ffbf8b2eba28aaaaaa140200006853 305 | 028e6c54a40c6dbef9e645e967ca942979db6cb9e5961df6c1a24dd976db 306 | 6de3d4534f55080000a04d0938b2f19ad832d4bf7fff16f7b172e5caf8f5 307 | af7f9db7dda851a3a24b972e6d729eafbefa6adc7aebad515d5d1d03070e 308 | 8ceaeaeaa8aeae8e4d37ddb4cdc760cc983171f3cd37c7dab56b5d900000 309 | 409b10706423e02843c5b85de4a1871e8a152b56e46d77f0c10717fdf8eb 310 | eaeae2c9279f8cbe7dfbc6d0a1439b6cd7a74f9f983a756a83e583060d8a 311 | 638e3926468f1edd6661c7a69b6e1a071c7040fce637bf71410200006d22 312 | d75b543c64b421914f192ac60c8e427e98f7efdf3f670091d5bc79f3e2ca 313 | 2baf8c3df7dc338e3ffef878ecb1c772b6df72cb2da367cf9e0d96cf9933 314 | 277ef4a31fc5d0a143e3d4534f8da79e7a2ae707bb548e3bee3817230000 315 | d066cce0c84645ca504b9fc1b176edda78e69967f2b63be8a0838a92facd 316 | 9a352b8e3cf2c8d87befbde3eaabaf8e77de792722225e7ffdf5bcdbeeb0 317 | c30e39cfe3e1871f8e238f3c323ef399cfc4e38f3fdeaae3b0cf3efbc4a0 318 | 41835c900000409b107064a32265a8a501c75ffef29758b56a55de76071e 319 | 78608bf653535313e79e7b6e1c74d0418dceb278edb5d7f2f6b1fdf6db17 320 | b4afb973e7c689279e1813274e6cb5e762545454c4b1c71eeb82040000da 321 | 44ae802342c8d1a01e4a507e5a7a8bcad34f3f9db74dbf7efd62efbdf76e 322 | f63e7efffbdfc7673ffbd998346952d4d5d535da66fefcf9b172e5ca9cfd 323 | e49ac1f151f5f5f571d34d37c521871c12f3e6cd6b95b1183d7ab457c602 324 | 00006d42c0918d6a94a196cee02824e0d86fbffda2b2b2b259fd5f7bedb5 325 | 71c20927c4a2458b72b6abafaf8fd9b367e76c9325e0f88f175f7c31befc 326 | e52fb7ca034037d9649338e080035c94000040abcbf72c420f1add9080a3 327 | 9d79fffdf7e3c5175fccdb6edb6db7cddcf7dab56b63cc983171f9e597e7 328 | 4d12ff23df6d2acd093822fe7d7bcc983163e2eebbef2e794df7d9671f17 329 | 160000d0eacce0c84635cad0e2c58b9bbdeddffffef7266f19595fdfbe7d 330 | 33f77de18517669e3591ef41a35b6fbd75f4e8d1a3d9e77bf6d967c773cf 331 | 3d57d2f1d8638f3d5c94000040ab137064a31a6568c99225cddef68d37de 332 | 28a85d9f3e7d32f57befbdf7c6a44993321f4fbe191c1515153178f0e066 333 | 9fef9a356be29bdffc662c5cb8b064e3b1d34e3b45f7eedd5d98000040ab 334 | 127064a31a65a82501c73ffef18f82da6599c1f1b7bffd2dbefffdef37eb 335 | 780a79934a736f53f98f850b17c6c9279f1c6bd6ac29c97874eedc3976db 336 | 6d3717260000d0aa041cd9a846196ac92d2ac50e38962c5912279f7c72ac 337 | 5ebdba59c7f3f6db6fc7071f7c90b34d4b038e8888e79f7fbed9214c21dc 338 | a6020000b4360f19cd46c05186cae91695091326c4db6fbfdda20f64bee7 339 | 701423e08888b8e79e7be2f7bfff7d49c644c0010000b4b67c014773df8c 340 | d95e0938ca507367707cf8e1873177eedc82daf6eedd3b6f9b79f3e6c5e3 341 | 8f3fdee2f329d59b541a73d34d3795644c76df7d7717260000d0aadca292 342 | 8d6a94a1f9f3e7376bbb152b56c4ba75eb0a6abb74e9d2bc6da64c999237 343 | 312c44be80a3baba3aba76ed5a94dacd9c39335e7ef9e5a28f49d687b202 344 | 0000b49480231bd528432fbffc724101c4472d5bb6ace0b6f3e6cdcbb97e 345 | ddba7571cf3df714e57cf2051c9d3a758aedb6dbae68f52bc52c8e2e5dba 346 | b8300100805625e0c84635caf4227efae9a7336fb77cf9f282dbe69b25f2 347 | c4134f14edd5abadf12695f53df8e083f1ce3bef14754c2a2b2bdddf0600 348 | 00b42a0f19cd46c051a666cc9891799b2c0147be6775fcf6b7bf2ddab92c 349 | 58b020de7ffffd9c6d8a1970ac5dbb366ebbedb6a28f89591c0000406b32 350 | 83231bd52853cd09388a798bca82050b8a7a3eadf52695ff983c7972519e 351 | 1fb23e01070000d09a041cd9a84699fad7bffe15b367cfceb44d5d5d5dc1 352 | 6df3dda252ec5b3ce6cc9993737d319fc111f1efb0a725afb76d4cb11e84 353 | 0a00005008014736aa51c6b2cee2e8d7af5fc16d67cf9e9df38d2b8b162d 354 | 2aeab9e4bb25669b6db6297afd0a79f647a60f8b3f1e0000402b127064fc 355 | cda604e5ebc9279fccd43e4bc051535313cf3cf34ca3eb56ad5a95f79919 356 | 59e5bb25a6478f1eb1c9269b14759fc50c38d6ad5b178b172f7651020000 357 | adc64346b3117094b1a79e7a2ad36d1659028e888869d3a6b5da8724df0c 358 | 8e88e2cfe2c8f7dc8f2cde7aebad9c335e0000008a2ddf0c0e6f7adc9080 359 | a38cd5d5d5c51d77dc5170fbac33209a0a38ba75eb169b6db65951cfa590 360 | 80a3bababaa8fb2ce60c8e7ccf100100002836b7a864d35909cadb942953 361 | e2bbdffd6e416ff0e8d2a54b6cb4d146f1c1071f14d4f7bc79f3e2d5575f 362 | 8d9d77deb9c1ba6db6d926de7df7dda29dc7c2850b63cd9a3539cf63ebad 363 | b72e6aed66cf9e1df5f5f5459991f2e69b6fba1801801669ec3b4953df53 364 | 8ab5bc547d97f2b88b718e299f4f6b8f655b5d9baed9c2daf7e9d347c021 365 | e0687d071e7860a3b75814e303336fdebc183c787041c771f5d55737f9ac 366 | 88c6fa6eeab68bb3cf3ebbd1590b2d399fdadada9c01c791471e19db6fbf 367 | 7d51bf24ac5cb93236da68a3168fefd0a143e3faebaf4ff28f7939fd91ef 368 | c85f40523e9f8efc05c418fb92e98751c7fa37a6d4d71540b1f93bf4917a 369 | 4444bd32fcdb84091362c284090a01000040d9db6fbffde2e5975f5688ff 370 | 67064791bcf4d24bf1c61b6f3458ded8536f9b7a126eaeb623468c28e821 371 | a24b962c89e9d3a7673a86bdf6da2b060e1cb8c1faa54b97fef7191dcd39 372 | dec696efb9e79eb1c30e3b3479ec353535f1d0430f15ad661111871d7658 373 | f4ecd9b3c5e37bcf3df7c48a152b8a5287d66adb94723dde2cdb67a9414a 374 | e7ebdcd23db7f6fa19cc726eae53e7e6dcd2f9fb622c9d9b736bdb73cbb2 375 | fd65975d16279c704293c7e21615014749fcea57bf8a5b6eb9a564fd7ff5 376 | ab5f6df21689f5f5eddb372eb8e08258b66c59c17defb8e38e317dfaf40d 377 | a637f5eddb377efce31fc7bffef5afa29dc3983163e2820b2e68727dd7ae 378 | 5de3fbdfff7ea63f2ef98c1c39b2c501c7ebafbf1edff9ce775ce4000040 379 | abf290d16c5423110f3ef860bcfaeaabf907b453a7f8ec673f9ba9efd75e 380 | 7b2d1e7becb106cbf7df7fffa29e43be37a974edda3536df7cf3a2eeb347 381 | 8f1e2dee63c68c192e400000a0d5e5fb1f7f051c1fa98712a4e1c30f3f8c 382 | 8b2fbeb8a0b623468cc8dcffd5575fdd60d949279d54d4f72a17f2aad862 383 | be4965c08001d1bd7bf716f723e0000000da425d5d5dee1ff4028e0deba1 384 | 04e9f8c31ffe104f3df554de76fbedb75fe61ff6b366cd8ac993276fb06c 385 | bbedb68b430f3db468c73f7ffefcbc6daaabab8bb6bfdd77dfbdc57dac59 386 | b326fef77fffd7c5070000b43ab7a864a31a89b9e8a28bf25ee4fdfaf58b 387 | e38f3fbe597dbffdf6db1b2cfbfef7bf5fd0c34d0bb162c58a58b26449ce 388 | 36e51670fcf9cf7f8e55ab56b9f00000805627e0c8463512f3ca2bafc47d 389 | f7dd97b7dde9a79f1eddba75cbd4f7fbefbf1fdffdee773758b6f5d65bc7 390 | 19679c51b4e39f376f5ecef5db6cb34dd1f6558c80e3fefbef77d1010000 391 | 6dc23338b2518d045d71c515515b5b9bb3cde69b6f1ec71e7b6ce6be67cc 392 | 9811b7df7efb06cb962e5d5ab463cf1770146b0647f7eedd63b7dd766b51 393 | 1f8b172f16700000006dc63338b2518d042d58b020aebbeebabcedc68d1b 394 | 175dbb76cddcff0f7ff8c3b8e79e7bfefbdfdf7aebada21d7bbe078d16eb 395 | 21a35ff9ca575afc06953beeb823d6ac59e382030000da44be5b542a2a2a 396 | 14693d028e445d77dd75f1b7bffd2d679bfefdfbc731c71cd3ac0fd18409 397 | 1362d2a449b166cd9a06cfe568897c01c7565b6d559414f2c8238f6cd1f6 398 | 6bd6ac893befbcd385060000b419cfe0c8463512b56eddbaf8f6b7bf9d77 399 | 86c1f8f1e363e38d376ed607e9dc73cf8d214386c40b2fbc50b4e3ce778b 400 | 4a5555556cb1c5162ddac7a0418362afbdf66a511fbffef5afe3dd77df75 401 | a10100006d46c0918d6a24ecb5d75e8b2bafbc32679bfefdfbc7d5575fdd 402 | ec7d7cf0c107b17af5eaa21d73be191c112d7f0ec7e8d1a35b34556bedda 403 | b571c30d37b8c00000803625e0c8463512f78b5ffc22fef297bfe46cb3ff 404 | fefbc7a9a79e5a16c7bb60c18258bb766dce362d79934aaf5ebd9a755bce 405 | fa7efef39fc7ecd9b35d5c0000409b127064a31aede0823fe38c3362d5aa 406 | 5539db9d7beeb945796d6a4bd5d5d5e57da6474b66704c98302136dd74d3 407 | 666f3f7bf6ec16cd7801000028e6efbd9c3fe8051c1bd64309d23767ce9c 408 | 38fffcf373b6a9aaaa8a5ffce217d1bb77ef363fde7ccfe168ee9b5476dc 409 | 71c738e9a4935af4c7e3acb3ceca3bc3040000a035784d6c36aad14e4c99 410 | 3225264f9e9cb3cd36db6c5316b313f23d8763c08001cdeaf7e28b2f8ece 411 | 9d3b37fbb8264d9a14cf3df79c8b090000280bf5f5f5b97fd00b3836ac87 412 | 12b41f3ff8c10fe2f9e79fcfd9e680030e884b2eb9a44d3f08f9028ee6dc 413 | 623272e4c8183e7c78b38fe9a5975e8acb2ebbcc45040000940db7a864a3 414 | 1aedc8dab56be39bdffc66ded79b9e74d24971e38d3746972e5ddae438f3 415 | dda2b2d9669b65ea6fc71d77ccfb36995ce6cc9913c71c734cac5cb9d245 416 | 040000940db7a864a31aedcc3befbc1363c68c8975ebd6e56c3772e4c898 417 | 3a756a9b3c9323df0c8e7efdfa15fc41dd6aabad62ead4a9b1f1c61b37eb 418 | 58162e5c18471e7964de50080000a0b5e59bc1515151a148eb1170b443cf 419 | 3cf34c9c73ce3979efd7da7befbde3d7bffe756cb1c516ad7a7cf9028e4e 420 | 9d3a45bf7efdf2f6d3b76fdf983a756ab38fbfa6a6268e3efae8bc334a00 421 | 0000da82677064a31aedd4e4c993e3dc73cfcddb6ee79d778e871f7e3876 422 | d86187563bb69a9a9a58be7c79ce36f96e53e9debd7bdc79e79d3178f0e0 423 | 661dc38a152be284134e88575f7dd5c50200009425cfe0c84635dab15ffe 424 | f29705851c03060c88dffce6373166cc98a8aaaa6a95636bc98346070c18 425 | 1053a64c89a14387366bdf73e6cc89af7ce52bf1a73ffdc945020000942d 426 | cfe0c84635dab9499326151472f4ead52b2eb8e08298316346ecbffffe25 427 | 3fae7c01475333380e3df4d0983e7d7a7cfad39f6ed67e67cc9811071e78 428 | 60bcfefaeb2e0e0000a0ac99c1918d6a740093264d8af3ce3bafa0b68306 429 | 0d8a499326c5af7ef5abd865975d4a764cf3e7cfcfb9fea333387af7ee1d 430 | 37dc7043dc70c30dcd7e30ea4d37dd14c71e7b6cdedb63000000ca818023 431 | 1bd5e8206ebffdf638fffcf30b6ebfcf3efbc4b469d3e2273ff949e6d7b6 432 | 1622cb0c8ecf7ffef3f1e4934fc6a1871edaac7dd5d4d4c4f8f1e363e2c4 433 | 8979a778010000940b0147369d95a0e3b8edb6dba2a2a2222ebae8a282da 434 | 77ead4298e3efae8f8fad7bf1e4f3df554fcee77bf8b279e7822162d5ad4 435 | e263c917700c1e3c384e3bedb438eaa8a362fbedb76ff67e1e78e081b8f0 436 | c20b8b72cc000000ad49c0918d80a383b9f5d65be3fdf7df8f8b2eba287a 437 | f5ea55d0365dbb768dfdf6db2ff6db6fbfa8afaf8fe79f7f3ea64d9b16d3 438 | a64d8bd75e7bad59c7f1eebbefe65cbffffefbb7e85920fffce73fe3ecb3 439 | cf8e9933671a7400002049028e6c041c1dd03df7dc134f3df5545c71c515 440 | f1a52f7d29d3b61515153174e8d0183a74689c73ce393167ce9c78fcf1c7 441 | e3a5975e8a3973e6c4dcb973f3ce96a8acac8cae5dbb96e4dc56af5e1dd7 442 | 5e7b6d5c7ffdf5b166cd1a830d0000244bc0918d80a3835ab060411c7ffc 443 | f1f1b5af7d2dbef7bdef45757575b3fa193468509c72ca291b2c5bb97265 444 | 2c58b02056ad5a15ab57af8edadadaa8adad8daaaaaaa8aeae8eadb6daaa 445 | e8afa3adadad8da953a7c68d37de186fbdf5960106000092972fe0a8a8a8 446 | 50a4f508383ab8fbefbf3f1e7cf0c1183972648c1b372e860c19d2e23e7b 447 | f4e811db6db75dab1c7f4d4d4d4c9a34296ebdf5d658b2648901050000da 448 | 0d3338b2117010757575f1c0030fc4030f3c109ffffce7e3d4534f8de1c3 449 | 8747e7cee57b792c5cb8306eb9e596b8f3ce3b63c58a1506110000687704 450 | 1cd90838d8c01ffef087f8c31ffe10fdfaf58b030f3c30468e1c199ff9cc 451 | 67ca22ec58b162454c9f3e3d1e7df4d178f4d1473d6303000068d7eaeaea 452 | 72ae17706c48c041a3de7befbd983c79724c9e3cf9bf61c7befbee1bc386 453 | 0d8b010306b4da712c5ab4287ef7bbdfc5638f3d163367ce8cb56bd71a1c 454 | 0000a0433083231b010779ad1f7644446cb1c516316cd8b0183a74680c1b 455 | 362c860c1912ddba752bfa7e2fbef8e2f8c52f7e11f5f5f506010000e870 456 | f2fd1612706c48c04166efbcf34e3cfcf0c3f1f0c30fff7759bf7efd62cb 457 | 2db78c010306c4965b6ef9dfffdcb367cfa8abab6bf4ff76dc71c718366c 458 | 5893fba9adad156e00000025d3d45b488ab13ceb1b4e1a6b9f2fc010706c 459 | 48c05124c3860d8bd5ab5797ec03532e1fc642972f5fbe3c962f5f9eb3ef 460 | 8d37de38e7f97de94b5f8aeeddbbb7ea71b746df59c63385f369ed6bb6d4 461 | c75daa7f9c8c714592b5ea2863ecef92bf4bc6d8df257f97fc5dea08d76c 462 | 7b24e0107094c4c8912363e4c8910a514423468c88112346280400004023 463 | 041c1b1270ace7bdf7de8b7ffce31f0d9637759b44a99737a594fb6dcd73 464 | dd68a38d62c71d776cf23c172d5a14f3e7cf6fd73568ebf16eab1a38d7b6 465 | bbce4a598314ce550d8c77473bd7ac3570ae699fab1a643f5fe7ea5c533f 466 | d7b7df7edb0ff9f5544484871cd026060d1a147ffce31f9b5c7ff7dd77c7 467 | 59679da550000000e4653e0b6de6bdf7decbb9be478f1e8a040000404104 468 | 1cb499dadada9ceb051c000000144ac0419b59bb766dcef51b6db4912201 469 | 0000501001076da6bebe3ed6ac59d3e47a33380000002894808336b57af5 470 | ea26d799c101000040a1041cb4290107000000c520e0a04de5ba4545c001 471 | 000040a1041cb4a95c3338ba77efae400000001444c0419bca1570545555 472 | 455555952201000090576725683faaaaaa62d75d778ddd77df3d3efef18f 473 | 47efdebda34b972ed1b56bd7a8a9a989b973e7c6bc79f3e2d9679f8d575e 474 | 79a52c8e3957c01111d1a54b97bcaf930500000001473b3078f0e038edb4 475 | d3e2eb5fff7a74eddab5a06dfef9cf7fc6030f3c10b7dc724b2c5fbebccd 476 | 8e3dd7333822226a6b6b0d3000000079b94525615b6cb145dc7efbed3163 477 | c68c38fae8a30b0e3722223ef6b18fc559679d153367ce8cc30f3fbccdce 478 | 21d70c8e356bd6445d5d9d81060000202f0147a2468c18114f3cf1441c70 479 | c001515151d1ec7e36d96493b8e69a6be29a6bae894e9dcaeb7258b56a95 480 | 81060000a020028e048d1d3b36eebaebaee8d7af5fd1fa3cfcf0c3e3ca2b 481 | af6c5158d21cb95e05bb72e54a830d00004041041c8939eaa8a3e2bcf3ce 482 | 2b491071f4d147c7d8b1635bf57c72051c66700000005028014742bef8c5 483 | 2fc695575e59d27d9c75d659b1f5d65bb7da39f5ecd9b3c9756670000000 484 | 50280147227af6ec193ffde94fa3b2b2b2a4fbe9debd7b5c72c925ad765e 485 | 6e51010000a018041c89f8f6b7bf1d9b6fbe79abecebcb5ffe720c1c38b0 486 | 55f6d5a3478f26d7b9450500008042093812b0cd36dbc4a9a79edaaafb1c 487 | 356a54c9f7d1a54b97a8aaaa6a72fdd2a54b0d3e00000005117024e08823 488 | 8ec8190494c2a1871e5af27de4ba3d2522e2a5975e32f80000f07fecdd79 489 | 784c77e3ffff57f6d86289885d82d6d216adaab65ab52fb5f6638f5d8ba2 490 | d45545d1e2a6d6a2b5961b75aba5aa949bdaf7d6de1bb56fb5546d114122 491 | 2511497e7ff899af314b66929998c3f3715dbd2ae73d73ce9973cecc39e7 492 | 75de0b00871070184046840d8f2b55aa94424242dcba0c7b1d8c4ad2c183 493 | 07d9f9000000000087107078b8175e7841c58a157b22cb2e51a2845be76f 494 | 2fe0484949d1e1c387390000000000000e21e0f070e5cb977f62cb7677c0 495 | 61af23d3f3e7cf2b363696030000000000e010020e0f171e1efec4965db2 496 | 6449b7cebf54a95236cb689e020000000070060187872b5ab4e8135b76b6 497 | 6cd9dc3a7f7b010a010700000000c019041c1ecedd1d7dda131717e7d6f9 498 | 972e5dda66d9810307d8f90000000000871170783877870cf6dcbe7ddb6d 499 | f30e080850585898d5b2e8e868eddbb78f9d0f0000000070180187877b92 500 | 1d6dba335c79fef9e7e5e3e363b56ccd9a354a4a4a62e703000000001c46 501 | c0e1e1dc598b2235c78e1d73dbbced7530facb2fbfb0e301000000004e21 502 | e0f070870f1f7e22cbbd7bf7aeb66cd9e2b6f9972953c6eaf49b376f6ae7 503 | ce9dec7800000000805308383cdcb66ddb9ec872376fdeacf8f878b7ccdb 504 | d7d7570d1a34b05ab676ed5addbf7f9f1d0f00000000700a0187873b73e6 505 | 8c2e5ebc98e1cb5db16285dbe65db3664d9ba3c3d03c0500000000901604 506 | 1c06b079f3e60c5dde912347b46ad52ab7cdbf55ab5656a7c7c4c468fbf6 507 | edec700000000080d308380c60ce9c394a4949c9b0e50d1e3c58c9c9c96e 508 | 9977debc7955b56a55ab656bd7ae556262223b1c00000000e034020e0338 509 | 79f2a4d6ac599321cb5ab972a576efdeedb6f9b76cd9d2e6f0b0f3e6cd63 510 | 670300000000d2c44b520a9bc1f3bdf0c20bdab061835b9771fefc79d5a9 511 | 5347b1b1b16e997f962c59b475eb56152850c0a26cdfbe7d363b1e050000 512 | 00002035d4e03088a3478fba35e0888b8b53870e1ddc166e787979e99b6f 513 | beb11a6e48d2cc9933d9c900000000803423e03090cf3fff5c7171712e9f 514 | 6f7c7cbcba76edaa53a74eb96ddd7bf5eaa57af5ea592dbb72e58a56af5e 515 | cd0e0600000000a419018781fcfdf7dffae28b2f5c3acf989818b568d142 516 | 5bb66c71db7ad7a851437dfbf6b5593e69d224ddbf7f9f1d0c0000000048 517 | 33fae030a0efbefb4e75ead449f77c2e5fbeac888808b7d6dc2855aa9496 518 | 2d5ba6a0a020abe5bb77ef5693264d3274941800000000c0d38780c38082 519 | 8383b579f366858484a4791e274f9e54444484ae5cb9e2b6f56cdab4a9c6 520 | 8c19a34c9932592d8f8f8f57b56ad574fefc79762a00000000205d68a262 521 | 40d1d1d1ead0a183fef9e79f34bdffc71f7f54c3860ddd166ef8fbfb6bec 522 | d8b19a346992cd704392c68e1d4bb8010000000070096a7018d8db6fbfad 523 | f9f3e7cbcfcfcfe1f76cdbb64d6ddab4515252925bd6a94489129a3c79b2 524 | 5e7cf145bbaf5bbf7ebd3a75eaa4e4e46476240000000020dd08380cae5e 525 | bd7a9a3e7dba7c7c7c1c7ecf9e3d7bf4e1871f2a3232d265eb9133674e7d 526 | fae9a76ad7ae5daaebb26bd72e454444282121811d080000000070091f49 527 | 43d90cc675faf4695dbd7a55356bd69497979743ef2958b0a09a356ba6b3 528 | 67cfeacc9933e95a7e6060a03a74e8a0d9b367ebf5d75f97b7b7fd564f87 529 | 0f1f56444484eedcb9c3ce0300000000b80c35389e12356bd6d494295394 530 | 2d5b36a7de77f4e8514d9e3c59ab56ad72aad94aa952a5d4ba756b356dda 531 | d4e60829d696d5b2654b454747b3c300000000002e45c0f114295ebcb8e6 532 | ce9dabf0f070a7df7be1c205fdf6db6ffadffffea7fdfbf7ebafbffe5272 533 | 72b2a98f8ca2458baa4c99327ae9a59754b16245952b57cea9f9cf9b374f 534 | 83070fa6590a00000000c02d08389e32414141faf6db6f55b56a558f589f 535 | 7ffef9477dfbf6d5f2e5cbd9390000000000b7a10f8ea74c424282962f5f 536 | ae989818952f5f5e0101014f6c5dd6af5faf0f3ef840bb77ef66c7000000 537 | 0000dc8a1a1c4fb1e0e060f5efdf5f111111a976fee94abb76edd2c89123 538 | b56fdf3e760200000000204310703c035e7cf1450d1b364cafbffebadb96 539 | 919898a86ddbb669ce9c39dab2650b1b1d0000000090a108389e21254a94 540 | 50e3c68dd5b8716315295224ddf34b4a4ad2ce9d3bb57cf972ad5ebd5a31 541 | 31316c6400000000c01341c0f18c7ae59557d4b87163952d5b56050b1654 542 | 6868a8dd662c2929293a77ee9c0e1f3eacc3870febd0a1433a7cf830a106 543 | 00000000c02310704092e4e7e7a7fcf9f3ab60c182ca9e3dbb6edfbeaddb 544 | b76f2b363656b76fdf564c4c8ceeddbbc78602000000007824020e000000 545 | 00006078de6c0200000000006074041c0000000000c0f008380000000000 546 | 80e11170000000000000c323e00000000000008647c00100000000000c8f 547 | 80030000000000181e01070000000000303c020e00000000006078041c00 548 | 00000000c0f00838000000000080e11170000000000000c323e000000000 549 | 00008647c00100000000000c8f80030000000000181e0107000000000030 550 | 3c020e00000000006078041c0000000000c0f00838000000000080e11170 551 | 000000000000c323e00000000000008647c00100000000000c8f80030000 552 | 000000181e01070000000000303c020e00000000006078041c0000000000 553 | c0f00838000000000080e11170000000000000c323e00000000000008647 554 | c00100000000000c8f80030000000000181e01070000000000303c020e00 555 | 000000006078041c0000000000c0f00838000000000080e1117000000000 556 | 0000c323e00000000000008647c00100000000000c8f8003000000000018 557 | 1e01070000000000303c020e00000000006078041c0000000000c0f00838 558 | 000000000080e11170000000000000c323e00000000000008647c0010000 559 | 0000000c8f80030000000000181e01070000000000303c020e0000000000 560 | 6078041c0000000000c0f00838000000000080e11170000000000000c323 561 | e00000000000008647c00100000000000c8f80030000000000181e010700 562 | 00000000303c020e00000000006078041c000000ae0f107c000020004944 563 | 41540000c0f00838000000000080e11170000000000000c323e000000000 564 | 00008647c00100000000000ccf974d00000090baac59b32a383858bebebe 565 | ba7efdba626363959292c2860100c043107000f0387e7e7e6adebcb95e79 566 | e515ddbd7b577bf7eed5ca952bb99180c71da7414141ca962d9bcdff8282 567 | 8294356b5605050569f8f0e1ba72e50a1bce40fbf7f5d75f57b56ad554a5 568 | 4a15858787cbdfdfdfec358989898a8e8ed6eeddbbb576ed5a6dd9b245b7 569 | 6fdf4e75decd9a35d3bbefbe2b499a3973a676eedce9d4ba65cf9e5d2d5b 570 | b654e9d2a575f1e245ad5cb952274e9c706a1e010101ca962d9bb266cd6a 571 | 3a5e1ffd77962c59cca66fddba55cb962de3c0000078342f49dc31e09914 572 | 1a1aaa6ddbb619667d870d1ba6850b173ef5fb25242444f3e6cd53993265 573 | cca66fdbb64deddbb7d7bd7bf738789f0273e7ce55c58a150db3beb76edd 574 | d2ebafbf2e49ca952b97f6efdf6f71b39b9a2a55aae8d4a953ec7c03041b 575 | 111111eaddbbb74243439d7a6f6262a2962e5daaafbefaca669855a24409 576 | ad5dbb5601010192a4debd7b6bf1e2c50e2fa374e9d29a3b77ae0a142860 577 | 9a76efde3d0d1c38d0a173c4ebafbfae1f7ffc517e7e7e4e7db6c993276b 578 | d4a8511c2000008f460d0e3cb3bcbdbd1514146498f5cd9d3bf733b15fc6 579 | 8e1d6b116e48d23befbca34f3ffd5423478ee4e07d0ae4cb97cf50dfbf4c 580 | 993299feede5e5e574b8016378f3cd37356edc388585855994ddbc795397 581 | 2f5fd68d1b37949292a2909010e5c99347b972e592979797a407e148cb96 582 | 2dd5b87163cd9e3d5b93264d32abd1e1efefaf69d3a699c28d87e72247f9 583 | fbfb6bfaf4e966e1c6c3e9a3468dd2e1c38775f8f061bbf3f0f1f1713adc 584 | 0000c0280838f0cc4a4a4ad2c58b17cda6f9f9f9294f9e3ca68b55472427 585 | 27ebf2e5cb0ebf3e2828284d377646ba194cabe0e060d5ae5ddb6679a346 586 | 8d08389e12ce1ccfc9c9c9dab3678fce9d3ba7cb972fcbcbcb4bc58a15d3 587 | bbefbeeb50d0101717a79f7ffe5967cf9e556262a2f2e5cba742850aa96a 588 | d5aa0eaf879f9f9ffcfcfc949898a8fbf7efebd8b1630f4ea2bebe2a54a8 589 | 90590002636ad3a68d468c186176f31f1919a9d9b3676bd3a64d3a71e284 590 | d56672a1a1a1aa59b3a66ad5aaa56ad5aac9dbdb5b818181ead1a387ead5 591 | aba7ae5dbb9a4287810307aa54a952168183a3aa54a9a2e2c58bdb3c46db 592 | b469a3fefdfbdb9dc73ffffc633a7e1ffeee3a7bde0300808003f030d7ae 593 | 5dd36bafbd66313d303050ad5ab5d2f0e1c3537db23674e8502d5fbe5cd7 594 | ae5d736ad90101012a58b0a0de79e71dd5ae5d5b6fbffd36018764f5a9e9 595 | a3f2e7cf2f6f6f6f25272773003f0301c79d3b77346dda34fdf0c30f56ab 596 | fb87858569cd9a35ca9e3dbbcd79c4c4c4a86ad5aaba7af5aad5ef7addba 597 | 75d5b76fdf548f3de9410793376fde544c4c8c6ad4a8615656a244090d1c 598 | 3850356bd664e71ad0c08103f5d1471f99fe4e4c4cd4983163346bd6ac54 599 | 9bc54546466afefcf99a3f7fbec571101616a6952b57ea5ffffa97ce9e3d 600 | abce9d3b5bbcdf9980c356b8f1d0f3cf3f9fea3cfef8e30f8be3374b962c 601 | fae0830ff4f1c71f2b30309003020060580c130b3c263e3e5e73e6cc49b5 602 | 4df4d1a347f5ef7fffdbe970439212121274e6cc197df7dd776ad1a2851a 603 | 366c986ab5e26721e03873e68cddf2bffffe9b70e329912d5b36bbe5870f 604 | 1f56eddab53561c2049b7d199c3f7f5e3ffdf493ddf9fcf2cb2f56c38d87 605 | dff565cb96a9468d1a9a3f7f7eaaeb9c254b169b65274f9e54fbf6edb57d 606 | fb7676aec1b46cd9d22cdcb87af5aa1a366ca869d3a639dde7cfc3e3a07d 607 | fbf68a8b8b93f4a0f9c8881123f4fdf7df5bad25e14c1395d46a0bda3ad6 608 | 53f3cf3fff68e2c4891a306000070400808003781aeddbb7cf6ef9860d1b 609 | 5cb6acfffdef7faa5fbfbe56ac5861f335cf42c071ebd62dbbdb60e9d2a5 610 | 1c984f812c59b2d87d6abd77ef5e356cd830d5c04b92ce9e3d9bae1b42e9 611 | 414d917efdfa69fcf8f1765f97356bd654e7356edc3876b081942f5f5ea3 612 | 478f36fd1d1b1bab56ad5ae9e0c183e99aef860d1bd4a851235dba74c934 613 | cd56bf17ce041cdbb76fd7ad5bb76c96af5cb9325debfde38f3f5a34dd04 614 | 00c0480838001be2e3e3ed96c7c6c6ba7479898989ead1a387cd0bd4d49e 615 | 783f2d060e1ca8fdfbf75b4c5fb76e9d264d9ac481f914b0772c9f3e7d5a 616 | eddbb75742428243f34aad468f334fe0c78f1f6f77140a7b35381e629414 617 | 035d00797b6bc2840966fdb8f4eedd5b274f9e74c9fc8f1f3fae468d1ae9 618 | faf5eb765fe74c1395ebd7afebe38f3f36d50e79d48c1933b47af5ea74af 619 | 37c73000c0c8e88303f020494949eadbb7af5e7bed358be109edf533f034 620 | b971e3861a376eacfffbbfff53d9b26575f7ee5dedd9b3c7a53566f064d9 621 | 3a96efdfbfafae5dbb2a2626e689addb800103f4e69b6f5aed93c3911a1c 622 | b76edd52424282d92819f04c4d9a34d173cf3d67fa7bfbf6ed5abb76ad4b 623 | 9771f9f26575e9d2458b172f96afaff54b2e67020ee941ed902a55aaa855 624 | ab567afef9e775e5ca15ad5bb74ebb76ed72c93a5b0b4f0000300a020ec0 625 | c3c4c6c6eab3cf3ed39c3973cca63f0b4d541ebdd15dbc7871aafda0c098 626 | 6cd5e0983b77ae4e9c38f144d72d31315143860cd1dcb9732dca1ca9c121 627 | 897e620cc0c7c7479f7cf289d9b4efbefbce2dcbdabd7bb7befcf24b0d1d 628 | 3ad46ab9334d541eba7cf972aa4daa00007816d14405f040ebd6adb36803 629 | fe2c051c78ba59abc171ebd62d7df5d5571eb17e1b366cd08e1d3b2ca63b 630 | 528303c650ae5c39152952c4f477424282b66eddeab6e5cd9a35cb6c6856 631 | b30b316f2ec500007015ceaa8087faf6db6fcdfe0e0c0cb4d9491d6024d6 632 | 6a702c5ab4c8e5fddaa4c7ecd9b32da6395a83039eaf5ab56a667f5fba74 633 | 29d57e97d22339395943860cb15ae66c13150000601b0107e0a156ad5a65 634 | 310204b538f03478fc384e4949d1bc79f33c6a1d376cd8a0c8c848b36904 635 | 1c4f8f2a55aa98fd9d5a47a0aeb063c70ead5bb7ce623a01070000ae43c0 636 | 0178a8a4a4248b1ef10938f03478fc38deb16387ce9d3be771dfbf1f7ef8 637 | c16c1a4d549e1ec58b1737fb3b73e6cc19b2dce9d3a75b5e88d144050000 638 | 97e1ac0a78b0356bd6d8bd31048ce8f1e3d815435bbac3e34fdb09389e0e 639 | fefefe16cda41e1fb5ca5df6ecd963d1912e01070000aec35915c84079f3 640 | e6d5c68d1bb571e346454444a4fafabd7bf7eac68d1b366f0c01237afc38 641 | debc79b347aee7e1c38775ebd62dd3df3451793a0407075b4c0b09095178 642 | 7878862cfff1117a68a2020080eb1070001928478e1c2a5dbab44a972ead 643 | 909090545f9f9494a4df7fffddf4b7b5d12700a37934e03873e68c2e5cb8 644 | e091eb999c9caceddbb79bfe26e0783a64ca94c9eaf4060d1a64c8f2972e 645 | 5daac4c444d3df041c0000b80e01079081d252c57ddfbe7da67f5b1b7d02 646 | 309a47038e6ddbb679f4ba3e3a5c2c4d549e0e71717156a777efde5db972 647 | e5ca90e5efdab5ebff5d88d14405000097e1ac0a64a062c58a39fd9efdfb 648 | f79bfe4d0d0e3c0d1e0d380e1f3eecd1eb7aecd831d3bf09389e0eb68623 649 | 0e0a0ad2d4a953336438ee8d1b379afe4d0d0e00005c878003c84065ca94 650 | 71fa3d7ffcf18766cd9aa559b36659744e0718d1a335911e0d103cd1c993 651 | 274dffa689cad3213e3e5e57ae5cb15af6ce3bef68ce9c39ca9d3bb75bd7 652 | e1d180831a1c0000b88e2f9b00c83855ab5675fa3d77eedcd1e0c1831d7a 653 | adbfbfbfb266cd6af5bf2c59b2286bd6ac5ab870a1fef9e79f54e7151414 654 | a482050b9afebb7fffbea2a2a274fefc799d3871422929292ed9265e5e5e 655 | ca9429933267ce6cfabfad7f5fb972456bd7ae75c972cb952ba73a75ea28 656 | 3c3c5c79f2e4514848887c7d7d151515a5ebd7afebd2a54bdab2658b7efb 657 | ed37ddbb778f83d7851ed6444a4a4ad2a953a73c7a5d63636375f9f265e5 658 | cf9fdfed0147484888ead5aba7b0b030152a5448050b16d4bd7bf7141d1d 659 | ad3367ce68e3c68ddabb77af929292dcfeb9b364c9a2ead5abeb8d37de50 660 | be7cf9141a1aaadcb9732b363656515151ba76ed9afef8e30fad5bb74e97 661 | 2e5d32dc31b86fdf3ed5af5fdf6a59b56ad5f4db6fbf69f2e4c95ab46891 662 | 5947cfae72fefc790d1e3c588181813a74e850aaaff7f3f333fd1edafbef 663 | 9f7ffed192254b0cb10ffcfdfdf5f6db6feb9d77de51fefcf9151a1aaad0 664 | d050ddb973475151518a8a8ad2b163c7b46edd3a9d3e7d3a5dcbf2f3f3b3 665 | 7a3e7cf8ef6cd9b269e5ca958a8c8c74e8bbf1f0fb59b0604149d2f5ebd7 666 | 75e1c2051d397244c9c9c919b60dc3c3c355a74e1d9528514279f2e45168 667 | 68a8b267cfae989818ddb87143c78e1dd39e3d7bf4ebafbfda6c9a959e6d 668 | fac61b6fa84a952a2a54a890f2e6cdab3c79f228212141d7ae5d53545494 669 | 4e9d3aa575ebd6797c900d808003401a54ac58516161612e9f6f8f1e3dd4 670 | a3470f65c992c5a1aad57ffcf18759c7a58f0a080850e3c68dd5b16347bb 671 | b54da2a2a2b476ed5a7df3cd37369f84daf3d9679fa94d9b36ca9c39b302 672 | 03031d7edffaf5ebd3157064c992453d7af450b366cd54a04001abaf295c 673 | b8b0e9df9d3a75d23ffffca30d1b3668fcf8f13a73e68c53fba57dfbf6e9 674 | dab70d1b36d4d5ab57ad968d183142356bd6747a9e870f1fd6fbefbfff44 675 | bf0b7ffffdb76edcb8a18b172f2a2121c1e3bfbb1b376ed4abafbeaa9b37 676 | 6fbaedb7a143870e7af7dd77ed7e87bb75eba64b972e69d8b0615ab972a5 677 | 5bd6e5e5975f56efdebdf5ce3befc8dfdfdfa2bc4081022a55aa9424a969 678 | d3a6faf2cb2f75f4e8514d9b364dcb962d33cceff18e1d3b6c061cd28310 679 | eef3cf3f57bf7efdb46ad52aad5ab54a5bb76ed59d3b775cb60eb366cdb2 680 | 5b7ee0c00153b8ebebebd8e5dad1a3473d3ee0080f0fd7a79f7eaa9a356b 681 | da6cf6f5fcf3cf4b921a376eac810307eadcb9739a33678efef39fffe8fe 682 | fdfb0e2da769d3a61a3a74a8b265cbe6d0b9312a2a4afffdef7fad5f2cfb 683 | faaa4e9d3aead8b1a3de78e30d9bf3888989d1e6cd9b3561c204a7ce17ce 684 | 080c0c54e7ce9dd5a44913d3767a5cfefcf92549952a5552e7ce9d151b1b 685 | ab050b1668dab4698a8e8e4ed7f20b1428a04f3ffd5475ebd6b539b25bf1 686 | e2c54dffeedbb7affefefb6fcd9f3f5fd3a74f37eb60170008380083f2f1 687 | f1d1e79f7fee967907050529478e1c0ebfbe4489121601879797977af4e8 688 | a16eddba2967ce9ca9ce232424446ddbb655b366cd347af468fdfbdfff76 689 | 6a9db367cf9e219df93dfaf99a3469a2418306293434d4a23c212141972f 690 | 5f567c7cbc4243439533674e797979994291c68d1bab5ebd7a9a3b77aec6 691 | 8f1faf98989854979923470ed3d3bd34ff40dbb9a9090e0e4ed3fc1d7942 692 | e96e8d1a3532d4f7f7b3cf3e73db7777cc98314e6d8f02050a68c68c197a 693 | f7dd77d5b3674f876ff652131c1cac810307aa65cb96a6635f92eedfbfaf 694 | 6ddbb6e9c489138a8c8c54f6ecd9f5dc73cfa97af5eaa61a2d2fbcf082a6 695 | 4e9daa366dda68e0c08166cd7a3cd5f2e5cb3574e850050404d87d9dbfbf 696 | bfde7bef3dbdf7de7b4a4848d06fbffda65f7ffd553b77eed4891327dcf6 697 | b4decbcbcbea6f959165ce9c591f7ffcb13efcf043b3c0212525457bf6ec 698 | d11f7ffca1ab57af2a53a64c0a0b0b53ad5ab54ce7a3f0f0700d1b364cad 699 | 5ab5d2c08103b567cf9e549797254b16a7ce33254b96b41a70b46edd5a7d 700 | faf451debc791d3ab7bdf7de7b6ad0a08166cc98a1912347bab4b663e3c6 701 | 8d3568d0205380f1a8e4e46453cd971c3972283434d4b49d838282d4ad5b 702 | 37356bd64c7dfaf4d1860d1b9c5ebebfbfbfba77efae9e3d7b5a8c44b46f 703 | df3eeddbb74f57ae5c91bfbfbf8a1429a21a356a284f9e3c92a442850a69 704 | c080016ad9b2a5060d1aa4ad5bb772610880800330b2be7dfbaa7cf9f26e 705 | 99f7810307346fde3c050404a870e1c22a5dbab4cda72a0f038e4765cd9a 706 | 5553a64c51ad5ab59c5e766060a0860e1daafcf9f36be8d0a10ebfefca95 707 | 2ba62aabdededea650c11dfcfcfc3479f264356cd8d06c7a525292962c59 708 | a2f9f3e79b8d542349a1a1a16ad1a2853a75ea64ba40f3f3f3d3071f7ca0 709 | 3a75ea282222427ffef9a7dde55ebe7c59b1b1b176f7c5e392929274f2e4 710 | 49538062af76c3993367f4e79f7f2a2424c4e1ce67232323535d6f648c8a 711 | 152b6af2e4c9690ec11a356aa4c0c040bdfffefbe9bec92e55aa94162d5a 712 | 643174f5bc79f3347efc785dbb76cde23d99326552b76eddd4ab572f534d 713 | 8f37de78436bd6ac51c78e1d3d7e749c9898182d59b244ad5bb776f83d01 714 | 0101aa51a3866ad4a8619ac7eeddbbb56bd72eeddcb953c78e1d7359e091 715 | 929262d634ce5a6d1a23c99b37af7efcf1473df7dc7366d3376cd8a02143 716 | 86e8fcf9f3567fbb1fde103ffc1d2d55aa94962e5daabe7dfbea871f7eb0 717 | bbcc93274f6adebc79f2f3f353c1820555b26449bb7dab3c7e6ef4f3f3d3 718 | a851a3141111e1fcc5b5afaf7af4e8a182050bba24880c0c0cd4f4e9d3ad 719 | 9ea7376cd8a01f7ef8419b366d32ab1de1ebebabfaf5ebab57af5e2a59b2 720 | a4242977eedc9a3b77aebefcf24b4d9b36cde1e5e7ca954b0b172eb4a8d9 721 | b97dfb767dfef9e7569b1afaf8f8e8bdf7ded3902143141c1c6c0aaa162e 722 | 5ca861c38669faf4e99c0800b88597a414360360a94993269a3c79b2cd72 723 | 474ed07e7e7eead7af9f7af4e861513666cc184d9c38d1e5eb9d2d5b367d 724 | f6d967ead8b1a3d5f2eddbb7ab79f3e692a4b0b030cd9d3bd7eca2f3f6ed 725 | db3a75ea942e5fbe2c5f5f5fe5c9934765ca9449b58a6ffffefd356fdebc 726 | 34af77505090dab66dab9e3d7bda0c05d6af5faf0e1d3a387551386bd62c 727 | 55ab56cde246bf7bf7ee6643355a131c1caca953a7aa72e5ca66d36fdebc 728 | a976edda590423d6942d5b569f7cf249aacd49c68c19a3993367a6a90a7c 729 | f9f2e5d5a3470fd5a953c76af992254b3465ca148fefef222ddab56ba7d1 730 | a347db2c1f316284a64e9d9aa1eb74e6cc198b279c9254a54a159d3a754a 731 | 8d1a35d2942953cc46cf3874e89076edda650a13f2e6cdabca952b5bdc74 732 | 3d6ec890219a3973669ad7f5e5975fd6c2850bcd42b2c4c44475ebd64dab 733 | 57af76e8d8fbe1871fcc9a1adcbb774f5dba74d1faf5eb3dfad8090a0ad2 734 | b66ddb5c5653223636567bf6ecd16fbffda60d1b36e8afbffe72d9ba66ce 735 | 9c59050a1450c3860dd5a54b179b43861f3d7a344d4dd71e357dfa748b40 736 | 5892264f9eac51a346393dbfc2850b6bf1e2c566cdff24e95ffffa9766cc 737 | 9891eafbc3c2c2f4f3cf3f9bd5a0484949d1175f7ca1efbefbcee1f57858 738 | 03a16fdfbe66b5941e3a77ee9c2a55aa640a02befbee3bbdfaeaaba6f2f8 739 | f8781d3f7e5c57ae5c517272b2e9dc985a33cb499326d9fd8d4a4df6ecd9 740 | 356fde3cb3757978bcf5e9d347ab56ad4af5d89933678ede7efb6db3e95f 741 | 7cf18566cf9e9deaf2434343f5e38f3f5a3487f9faebaf356edcb8546ba8 742 | 8486866ad9b265164d74bffaea2b7dfdf5d75c6c0220e0008c1070848484 743 | a876eddaeadebdbbcd7e37dc15703cf4d34f3f992ed6ac5dc465c992456b 744 | d7ae350d5d7be4c8117dfdf5d7dabc79b345cd81a0a020b56ad54a9f7efa 745 | a9cd8e16e3e3e355ad5a35ab4fe29c51a54a152d58b0c0ea05a8330187b7 746 | b7b7162e5c68114ec4c6c6aa4e9d3a0eafa78f8f8f162c5860319fbb77ef 747 | aa4183060e759ee6e5e5a5f1e3c7ab65cb9656cbaf5dbba60a152aa4ab6d 748 | b2b7b7b7e6cd9b67d191edc891233565ca94a7f67b6ab480237ffefc9a3b 749 | 77ae2930fcf5d75f3564c8109bcd3ade7cf34d8d1e3ddaac4dfbe3c761e5 750 | ca95d3d4d167e9d2a5b57cf9728b7e107af7eeadc58b173b3c9f4a952a69 751 | d1a2456681cdfdfbf7d5b87163b361ae3d51c58a15b570e142abfb2bbd4e 752 | 9e3ca9f5ebd76bd9b2652e1d01ebe5975fd68a152bac0e2feb6901479e3c 753 | 79b476ed5a8be61ddf7cf38dc68e1debf07c8a152ba6d5ab575b043b1f7e 754 | f8a156ac58e1d43a4d9c3851cd9a35b3989e9090a0f0f070f9fafa6ac992 755 | 257aedb5d7243de81076c284095ab3668d4507dd99336756c3860d3568d0 756 | 20532d85c7252727ab71e3c6fadffffee7f4bec8962d9b56ac58611174de 757 | b973470d1a34d0f1e3c71d9a4f850a152c9adf242424a866cd9a766bf505 758 | 050569eddab516d73173e6ccd1a041831cfe1cf9f3e7d7ba75eb2cb6d167 759 | 9f7da6efbfff9e0b4e002ec5d864401a75edda551b376e34fb6fdbb66d3a 760 | 7cf8b0fef8e30f8d1d3bd62d9d8a3acad6939987d5d0c78f1faf62c58a29 761 | 252545a3468d52ddba75b566cd1aabcd226263633563c60cd5aa55cb6a75 762 | 75e9416d892e5dbaa47bbdb76eddea50fbead4f4ead5cb229490a49e3d7b 763 | 3a15c2242525a96bd7ae164f633365caa41933663834b2464a4a8a060f1e 764 | 6cb3ff0b5f5fdf7477bc969c9c6cf1c47dc3860d4f75b86134afbcf28a66 765 | cd9a253f3f3f2527276bd0a0416ad9b2a5dd3e2b76eedca9860d1bda0cd2 766 | 3265caa4b66ddb3abd2e8181819a366d9a45b8b174e952a7c20de941879d 767 | 8f3f89f5f5f5d5a44993dc121cb8d29e3d7bd4be7d7b87fad57156891225 768 | d4b3674f6ddebc59ab57af56dbb66d9dea54d99603070eb8ad935957f2f2 769 | f2d237df7c63116eecdbb7cfa970437a101af6efdfdf62fa9831639cae81 770 | 63ab73d780800005050569c08001a67063d6ac59aa5ab5aa962c596275f4 771 | b13b77ee68d1a245aa56ad9acd4e45bdbdbdd5b367cf346dc39123475aad 772 | c5f5f1c71f3b1c6e480fc24c6b9fb757af5e76df67ed3ae6d4a9530e8fec 773 | f6d0e5cb97d5ab572f8bda1e43860c51787838270700041c8027080d0d55 774 | e9d2a5cdfe7beeb9e7141c1c6cb5f64146b335ac5ed6ac59d5bd7b77356c 775 | d850292929ead7af9f264f9eecd0d093e7ce9d53fbf6ed6db6336fdebcb9 776 | cd5ef19de1cc859b35152a54509f3e7d2ca66fdab4294d9dabc5c4c468e4 777 | c89116d38b152be6f013cdb8b8384d9a34c96a59ae5cb9f4d65b6fa57bbb 778 | 3ddacefbfefdfbfae28b2ff8a27a903163c62873e6cc4a494951cf9e3d35 779 | 67ce1c87de77ebd62dd3883ed6b468d1c2ead37c7b060f1e6c51e53c3e3e 780 | deea71ee88c993275b8cf853b46851b775aeec4adbb76f57b56ad5b47dfb 781 | 76b72da35cb9721a33668c76eddaa5f6eddb3b3c2a8a2d870f1ff6f8edda 782 | b9736755a952c562ba33fd353d6af9f2e516cd02b367cfee7433873367ce 783 | d86c56d1b66d5b75ebd64d923461c2040d1e3cd8a1919ea2a2a2d4aa552b 784 | ddbd7bd76a79f5ead52d9ae8a4e6fffeefffd4a449138be90f47f5715481 785 | 02056c9e0bead7af6fb37f97e6cd9b5badc9336cd8b0340d55bd65cb166d 786 | dab4c96c5aa64c993469d224797b733b0280800378e2121212141b1b6bf6 787 | 5f5a4efaee12151565b3ec61d5d27ffffbdf5ab0608153f33d78f0a0cd27 788 | bc993367b668279c16e919c6cecbcb4b63c78eb57ac33761c28434cff797 789 | 5f7ed1d1a3472da6376dda54afbffeba43f3f8e1871f74e3c60dab651f7d 790 | f451bab7dba34f4ad7ac59a30b172ef045f5200f9ba54c9c38d1e921552f 791 | 5cb860b3495b6868a8a9134147942f5fde6a53af9f7ffe394dc33e4b0ffa 792 | edb0d61f42bb76ed6c0ec9ec49ae5cb9a2e6cd9bab43870ee90e58ed090d 793 | 0dd5a851a3b464c9125307c6695d5f4f161a1aaa8103075a4cdfb56b9743 794 | 7d17d962adcf8e2a55aad81dbaf57177eedc515c5c9cd5b287ebfccb2fbf 795 | 68dcb8714eaddbc58b176d76dce9ededed54889d23470eabe1797272b2d3 796 | b55f9a3469a2cc99335b2d0b0c0c54be7cf92ca607050569f8f0e116d38f 797 | 1f3faecd9b37a779ff591b71ad7cf9f2aa5dbb36270800041cc0933666cc 798 | 18952c59d2ecbf22458ae8a5975e52dbb66db560c102879efcb88bbd8ebf 799 | bcbcbc74eedcb934777c3677ee5cbb374f4f52f5ead5ad56e93d71e2840e 800 | 1c3890aeedb970e142ab65a955f37d283e3ede66d3a1ca952beba5975e4a 801 | d7677ff422df91cee390f10e1c38e0f48dd3430b162c301b59e3518f8f6e 802 | 604fd7ae5dad4e5fba7469ba3edbe34f67a5077dd838d331f093b67efd7a 803 | d5a85143ad5bb7d6faf5ebdd165abff6da6b5ab76e9d4b02614fd4a95327 804 | ab3503d27b8c6dddbad5ea8824efbfffbe4bd6dbcbcb4b376edcd0800103 805 | d2f4fef9f3e7dbace1e8ccbe6edfbebdd58e64376dda64b376a62d75ebd6 806 | b55b6e6da8e4366dda585d7e7af7dfeeddbbadd644ebd4a913270700041c 807 | 80274a4e4e567474b4366ddaa4be7dfbaa72e5ca6eadf69c1e53a64c4973 808 | 0073f0e0415dbc78d16ad9e3c30066b4eeddbb5b9dbe65cb1697dcfc5853 809 | a54a1587c389efbefbce6653036ba3ed382a7bf6eca680e3c89123dabb77 810 | 2f5f480ff4cd37dfa47928d19b376fda0ce95e7cf14587e651b87061ab37 811 | 3cd1d1d1dabd7b77ba3edb891327ac3e198f8888b07a13e5a9525252b465 812 | cb1675e8d041152a54d0c08103b575ebd674f793f3b8d0d0502d5dba5415 813 | 2a5478aa8ef1cc9933ab5dbb7656cb1c1999c79eb8b838ab7dd6d4ae5ddb 814 | 653585e6cc9993e65a84919191fafdf7dfad96d9ea28d85ae060eb863f2d 815 | 4d2c1f1ffef951f7efdfd7b973e7cca6f9fafada0c8c9c691a636b797ffc 816 | f187c5f44a952a39550b0d0008388027e4efbfff569b366dd255a5d31d6e 817 | ddbae57415f9c71d3a74c8e68df69352ac58319bcd45b66ddb96eef95fba 818 | 74c966f5f5d6ad5b3b348f989818cd9f3fdf6a59fdfaf5d3dc316dcb962d 819 | 4d4d20a8bde199ce9f3faf8d1b37bae57b676b0487c7b56ddbd66af3ade3 820 | c78fa73adca323c1c0f5ebd72da6e7cc99d36a87bf4670f5ea55fde73fff 821 | 514444845e78e10575e9d2454b962cb1e86f24adfcfcfc3463c60c87f79f 822 | 11346ad4c8ea79e0d2a54bba75eb56bae76fada36b1f1f1fd5ab572fddf3 823 | be7fffbecddfe7f47e4773e4c8e1d0fb1b376e6c339448cbef87bdd15b56 824 | af5e6d11dcd5aa55cb6ab395b8b838970c7d6caba3f2060d1a70920040c0 825 | 0118c1bd7bf7f4d1471fe9e6cd9b1eb34edbb76f577c7c7cbae6616be407 826 | 472fe2dcc1dab0b88fdec0b982adf938d3be7ac68c19569f067b7b7b9b3a 827 | b87386979797dab76f2fe9c193f8e5cb97f3c5f340dbb66d4b778860ebc6 828 | 3a2828c8a1f7db3a4e5d358ca9adda49e5ca9533fcfe8b8b8bd32fbffca2 829 | 5ebd7ae995575ed11b6fbca1debd7b6bd1a245164fc19d91376f5e4d9932 830 | c5233aa77685b7df7efb891c632fbffc72bae77df8f0619ba35d65d4b9d1 831 | 5ac7acd28380282dc1dae8d1a3ad767e7afdfa75ab1dbedafa8db037da93 832 | 2bf6df2bafbcc249020001076014b76edd72baa777774a4f276f0fd90a6c 833 | 6cf5c89e11de7cf34dabd3636363ed76baea8c53a74e599d5eb468518787 834 | 2bbc7af5aacdb6cc2d5ab470baf3c12a55aa986a7e3ce9be5f609b2b863f 835 | b6d549adb5f6f28fcb9a35abcda62cb69a9c39cbd6b1fb34debcfcf5d75f 836 | 5abc78b13ec4707d00002000494441543ef9e41355aa5449e5ca9553d7ae 837 | 5d3567ce1ca7038f77de79c7e6ef97d1d8aa45e7ee63cc1501873bcf8d0f 838 | 6bd8a5a662c58a56a7fff9e79f695a9ff3e7cfab6eddbadab2658beedebd 839 | abdbb76f6bddba75aa59b3a6d5c0c4ddfbcfd679b25cb9724f4dc8078080 840 | 037826fcf4d34f2e6fc39d56c78e1d4bf73c6c0d87f724d9ba303c7bf6ac 841 | cb9671e6cc199b65cef4e43f6dda34ab4ff3fdfdfdd5b97367a7d6e96127 842 | 8ef7efdfd77ffef31fbe6c1eca15219bad4e2f1d1926b642850a365f676b 843 | 540967942a55ca66d5faa7a106476aae5dbba6952b576ad0a041aa54a992 844 | 2a55aaa4091326385c23a0458b1686df0661616166a3393dcad6937b67e4 845 | c891c3667f47850b1756ce9c390d7d6e2c5cb8b0cded97d680437a10ccb7 846 | 6edd5acf3fffbc4a962ca98e1d3b5a3d2e73e6cc69b5936e57fd4664ca94 847 | c96667abd9b3675791224538510020e0008c222626265dfd4054ad5a559d 848 | 3b7756e7ce9dd35d4bc215cd653c25ac79c8cfcfcfe6932157b4fb7e743f 849 | dae24c27777ffef9a7d6ae5d6bb5ac6ddbb60e3d9197a442850aa97af5ea 850 | 921eb4a77655df0070cf6fc09364af03e0f4debce4cf9f5f5f7df595cdf2 851 | ecd9b32b53a64c1eb11fa64e9daae9d3a7ab5fbf7e6e5dceb973e7346edc 852 | 38bdf6da6b1a3e7c78aa37f8f5ead553d6ac590d7d8cbbf3180b0a0ad2d7 853 | 5f7f6df738b2d6778491ce8df63aab76450d8aa4a424bbcde48a172f6eb3 854 | 16457af75f962c593476ec58bb219411869406e0f97cd90440c63978f0a0 855 | 6ad4a891a6f7f6eedddbd4dbfebc79f3d2b51eaeb8e14f6f5f02ae66af7d 856 | f39d3b775cb61c7b4fe79c7d7a3865ca14ab235a040505a95dbb769a3a75 857 | 6aaaf368d7ae9dbcbd1f64d5742eead96c0df1ea09df91a14387aa6fdfbe 858 | 699a6f6060a04337263972e4f0889a5f0d1a3490afafafeedebdabafbffe 859 | daed616d6262a2befdf65bad59b346f3e6cd53b162c5acbeeee1d3edad5b 860 | b71af618b7778cbdfffefb6ad2a449da2e567d7d55a85021d36f9dab7e83 861 | dd1170a487bdce665d5183223dfbaf79f3e669be7ef1f1f151a1428552ad 862 | 69f6243b290740c001200d8e1e3d9ae6f73efffcf3921e0c459bde0e423d 863 | adf685bb2fcc5c5135fa217b6189b317d7070e1cd08e1d3bac768edab973 864 | 67cd9c39d3ee4db1bfbfbf5ab56a25e941e778b686270452fb8ed8aa16ef 865 | eae55fb972c563b647a64c99f4d24b2f69fffefd19b2bcf3e7cfab7efdfa 866 | 5ab16285cd9a0ef9f3e77f6a8fb1e0e060b78f1693de1be4277d6eb4770e 867 | b97dfbf6135d7ece9c39d31d20b97bff018044c00164a8b4361f080d0d35 868 | 9df85d591be169626f14095bfd16a485bd79393a92c5a3a64c996235e0c8 869 | 93278f9a376f6e77c8c2468d1a2957ae5c92a8bd81f4ddbc242626babd56 870 | 96a3cdae32d26bafbd96610187f4a09952dbb66db569d32665c992c5a23c 871 | bd4d2c9e347b01c7fdfbf7959c9cfccc1d63ce78f87b6e4d469cfbededbf 872 | a4a424979e4bad317a132d009e818003c84069bd4079b4d32f57d6467856 873 | b6ad2bdbfe67ce9cd966595af6cdb66ddb74e4c811aba35b74efde5d0b17 874 | 2eb47953f07068d8ebd7af33342c52656f8482eeddbb6bd5aa55cfdc3679 875 | ebadb7347dfaf40c5de6850b17347dfa74f5e9d3c7a2cce80187bd262463 876 | c78ed5942953f822da612df47ac8d15158dcf51b3163c60c7df9e597ec24 877 | 009e7f2e62130019e7c68d1b5ab76e9dd6ad5be7d4c81e952b5736fddb13 878 | 472ff1946d9b9650c259f6e6656f1decb175d11f1616a67af5ea592d2b53 879 | a68c69e8cdf9f3e73ff1fe1de0f9ecf52f101010f04c6e9377de79e78984 880 | 0af3e7cfb75a63c6e8433c738ca54f6c6caccdb2b4d41074e5fe0b0c0c64 881 | 07013004020e20035dbf7e5d1d3b7654c78e1db572e54a87df57b3664dd3 882 | bf69a2629dbd8e5333aa06477474749ae6b96ad52a9d3f7fde6a598f1e3d 883 | ac4eefd8b1a3a4074d0be6ce9dcb018054d90be03c6584938ce6e3e3a388 884 | 88880c5f6e6464a44e9e3c69f51c6164f66e909fd563cc55db2f239a6f10 885 | 7000781a1070001e2e2c2cccac433a9aa85897909060f3e9579e3c795cb6 886 | 1c7b4f7baf5dbb96a679262525e9db6fbfb55a56a64c19bdfdf6db66d372 887 | e4c8a1468d1a497a30346c6464240700d275f3626b88e56741444444aaa3 888 | 3bb8c3a54b972ca6193de0b017a23dcbc7982bbea31951d3c8defe73e579 889 | 1400dc898003f0708d1b3736fb9b1a1cb6edddbbd7eaf4b0b0b054871774 890 | 547878b8cdb2f48c62b278f1629b0149cf9e3dcdfe6ed9b2a5e969daac59 891 | b3d8f170c8e1c3876d963932ccebd32a5fbe7c6adebc79862fd7da6ff95f 892 | 7ffdc531f60cbb78f1a2cdb2d2a54bbb7df9274e9cb039920cfb0f805110 893 | 70001e2c303050efbfff7eaa17c57860d7ae5d56a7fbfbfbbb6cf8455b01 894 | c7e5cb976d36337144424282cdb0e2adb7de52993265243de804ae5dbb76 895 | 92a483070f6adfbe7dec783864fffefd367f3f1e0e43fdac1a346890dd11 896 | 24dce1f127e2f1f1f1dab3678fa1b7e3b56bd7ac36bde11873ccefbfffae 897 | fbf7ef5b2d2b55aa94db97ffcf3fffe8c0810356cb8a162d9a211d9d0240 898 | 7a1170001e2c222242c1c1c1161720b06ee7ce9d36cb5c7571f8306878dc 899 | f6eddbd33defefbfff5eb76fdfb65af6d1471f4992aa56adaab0b030490c 900 | 0d0be72426266af7eedd368f6b77f4919023470e356fdedce33b98cc952b 901 | 97060e1c98a1cb2c54a890d9df3b76ec307c27a3f67e0b73e5ca65d6dcd2 902 | 55fcfcfcd4ba75eb0ce9843323028683070f5a2d0b0d0d55f1e2c55db6ac 903 | 3265ca58fd5efef6db6f565f1f1010a0b265cbbafc337b7979292222c2ee 904 | 30d600e00c020ec04365cf9edda26982440d0e7b0e1d3aa4d3a74f5b2d7b 905 | e79d77d23dff12254ad86c07ed8a615a636363f5fdf7df5b2d7bf7dd7715 906 | 1e1eae0e1d3a4892a2a2a2f4dffffe979d0ea7ac59b3c6e64d62952a555c 907 | bebce1c387eb9b6fbed1be7dfb54a142058fde36ad5bb7b6e8efc65d4a96 908 | 2c6951ab6cddba754ff53126997798ed2a3d7bf6d4575f7da5fdfbf79bfa 909 | 2632b25f7ffdd56699ab3e5fd1a245b57af56a1d3b76cc5423d091fd57ab 910 | 562d977fde8e1d3b6adcb871dabf7fbfdab469c38f34807423e0003cd4d8 911 | b163ad76ca46c0615b4a4a8aa64f9f6eb5ecd1a176d3aa6ad5aa56a71f3a 912 | 74485bb76e75c967983973a6d5215fbdbdbdf5e5975faa5ab56a92a479f3 913 | e6d96c2b0dd8f2d34f3fd9ecebe5e1c83cae52a3460d3569d24492141717 914 | 67f3c9b4a7f0f2f2d2cc9933dd52cb20b51bd54b972e69f1e2c54fc531b6 915 | 73e74e9bcd1cdab56be7b2fe90a40741d1c71f7f2c494a4e4eb6d94cd148 916 | ecfdb6bff7de7b2ed97ebd7bf796b7b7b73265caa43ffef8c3acecd8b163 917 | 36cf67ad5ab592bfbfbfcb3e6ba142854c35a7bcbdbd5d52133273e6ccf2 918 | f2f2caf81baaff7f7b3e099932657a229f1920e000e0b056ad5aa9418306 919 | 56cb68a262dfd2a54baddec0152f5e5cafbcf24aba2e5e6c3d5d9a346992 920 | cbd6ffdab56bfaf1c71fad9655ad5a55dedede4a4c4cd4bc79f3d8d970da 921 | bd7bf7f4ef7fffdb6ad95b6fbde5b227ecd9b265d3d8b1634d7f0f1f3edc 922 | 6a70e769828282346fde3ce5ce9ddb6dcbc89b37af3a77ee6c366ddcb871 923 | 86d83e8e9a32658ad5e9850b17d6071f7ce09265f8f8f868c28409a67e21 924 | 264d9a94e691ac3cc9d5ab576d865d458b1655ab56add235fff0f070bdf7 925 | de7b92a423478ee8d0a1430eefbfe0e06053a0e40ae3c78f370dbd3e73e6 926 | cc34f763e5e5e5a56eddba69d7ae5d3a7dfab44e9c38a1d9b367bbf57bfc 927 | 50585898162e5ca893274feacf3fffd4ce9d3bd5ac5933b72fd7cbcb4b9d 928 | 3b77d6ce9d3bf5e79f7feae4c9939a33678e42424238d18180834d007896 929 | 0e1d3a98dd183ceeeeddbb6ca4546ee0468e1c69b5ac57af5e699e6f8306 930 | 0d54b468518be93b77eeb45ba5372dbefdf65b252727db2cffe5975f181a 931 | d6934facde9e7d6afdfefbef6d8ed6306edc38e5ca952b5df3cf92258b66 932 | cf9eadbc79f34a9256ae5ca955ab561966ff152e5c583ffef8a3451f19ae 933 | ba29193972a4e9a64e7a30f2c892254b9eaaefc0dab56b6d76803c60c080 934 | 74d79279186e942b574e9274e0c001cd9831c325fbc79d37a48e9a3a75aa 935 | cdc0ebb3cf3e4b7387b8bebebe1a3d7ab46958e471e3c6597dddce9d3b6d 936 | d6e2e8d9b3a75e7ef9e5746f8b2fbffc526fbdf59624e9f4e9d31a3f7e7c 937 | 9ae7376dda347df1c5172a52a488bcbcbc942d5b36d5ad5b576bd7ae756b 938 | e7c12fbdf492d6af5faf2a55aa284b962cf2f2f252585898264e9c68ea37 939 | cb5d264d9aa47ffdeb5f0a0b0b93979797b266cdaadab56b6bfdfaf5167d 940 | b701041c002429d50ecb5c7d13131010a021438668e4c891a68b0f6b1c6d 941 | a262afb773578c676feb04ea0927d6c58b176bd9b26516d36bd6aca937de 942 | 78c3e9f965cd9a55fdfbf7b7987eedda3575ebd64d2929292e5dfff3e7cf 943 | eb975f7eb1594ee7a28edf34f8fafa66e8fa64cf9edd66879aaeb8d0b6f5 944 | fdca9e3dbbc3f3888b8b53d7ae5dad56830f0909d1c489134dc3103b2b47 945 | 8e1c5abc78b1e9c6e5c2850beadbb7afe18eab52a54a69cd9a357af3cd37 946 | 5d3adfc18307ab4e9d3aa6bfa3a2a2d4b1634725252539351f5b1d32bae2 947 | 78b71570d93b2f3d2e2525451f7ef8a16eddba65f55c376ddab4340769fe 948 | fefe9a3973a6e929f9eddbb7d5bd7b77a79aecd9da4eee3c3766cb96cde1 949 | e61de7cf9fd7a041836cce7fce9c39696a2af2d5575f99fa99d9b3678fd6 950 | af5f6ff3b53d7bf6d4d5ab57ad6ebb2953a69802ccb4842c13274e54a74e 951 | 9d243d1841ecc30f3f4cf3c39b66cd9ad9ec9b247ffefc1a3264885b7e23 952 | fcfcfc3479f26465cd9ad56a79dfbe7dad3e147185c68d1b9b9aff3d2e34 953 | 345443870ee5e200041c002ca5d6d99cab86bcf3f6f656b366cdb47dfb76 954 | 75edda35d5d73bda44e5e1932d6bd2fbf4c5dbdb5bd5ab57b75a161212e2 955 | b22159d3a37ffffe16d55dbdbcbc346dda34a7abad8e1a35ca3472c94349 956 | 4949ead6ad9ba2a2a2dcb2feb6aa081f387040fbf7efe70bfaff7bedb5d7 957 | ec9667447f0a8faa5dbbb6cdb292254ba63bccb1f5bd2b5cb8b0d53e7b6c 958 | 3970e080860d1b66b5ac7af5ea5ab66c9953f37bf89bb86cd932d3efcbcd 959 | 9b37d5b16347c5c6c61ae2583a77ee9cd9f73957ae5c5ab468913efef8e3 960 | 748f02e3e7e7a711234698fdc6dfbb774f9d3a75d2e5cb979d9e5fc58a15 961 | 6dee8382050ba6793db365cba6175f7cd16a59ddba759d0af62f5dbaa45e 962 | bd7a590d805f78e105ad5ebddae9ef44be7cf9347ffe7c534874efde3d75 963 | e9d2457ffdf597c3f32851a284cdbe12d27b6e946c77a4eae5e5a5975e7a 964 | c9e1f92c58b0408b162db2b9ff67ce9ce9f0c8313e3e3e1a3060805ab468 965 | 21e9c183923e7dfad87d4f7474b43efcf043abc3d68687876bcd9a354e6f 966 | af909010cd9e3d5b4d9b36359d473ffae8231d3f7e3ccddbfb61731b5b6c 967 | fd66a6d70b2fbc60f73ad0cfcfcf259d9ba7e533d7a851838b0310700030 968 | 3f010f1932c4ec299b354d9a3451cb962d9d1e17decbcb4b3973e654ad5a 969 | b5347af468edd9b34713274e548102051c7a7f6a3538bcbcbcf4d65b6f69 970 | f4e8d1365ff3c9279fa4f9c45bb264494d9d3a55952a55b2b9fcb163c73a 971 | fc79dc252e2e4ecd9b37d7993367cca6878686eaa79f7e72e8c98abfbfbf 972 | c68e1d6bf1a4e4eeddbbfae0830fdcdaa1dd912347b46ddb368be9d4de78 973 | c0d7d757952b57d6bbefbe6bf7758d1b37569b366d9cfe9e3acbc7c7472d 974 | 5ab4d0f0e1c36dbea677efde2a5fbe7c9ae69f3f7f7e4d9830c15433c2da 975 | f2bffdf65ba79a55cc9e3ddb66b5f0b265cb6addba75eadebd7baa354f8a 976 | 172fae69d3a669f3e6cd2a51a284a4072302b56cd9325d372e1929262646 977 | ad5bb756f5ead5b565cb16b3e3ac7ffffedab973a79a376f9ea69a7b65cb 978 | 96d58a152bcc3a718d898951bb76ed6c36e3b077dc77ecd8d1661f4d5e5e 979 | 5eeadfbf7f9a9e1c172a544853a74eb5b9bfc3c3c33570e040a702ec8d1b 980 | 37ea934f3eb15abba270e1c25ab972a5faf7ef6f7374aa87f2e6cdab1123 981 | 4668d7ae5da6ef406262a23a77ee6cf577d296575e794553a74eb559fefe 982 | fbefab41830669dacf458a14d18811236c3e5997a461c3863915ba0e1830 983 | 401b366cb019a46cdcb851d5ab57b7bbbe6fbdf596d6af5f6f362adb679f 984 | 7da6b367cfa6bafcbd7bf7eac30f3f547c7cbc45596868a87efef9670d1e 985 | 3c58458a14b13b9fe0e0607df1c517dabd7bb729004a4e4ed6c71f7f9cee 986 | e66b8f3f7c785ceedcb9cd9a84b94a6acb7d784cb8437878b8ddf2ecd9b3 987 | 3f15c3260369e5252985cd806735c8f8e1871fcc2e0c73e7ceaddcb9733b 988 | d556f6eeddbb8a8c8c742878c8952b97828383d3558db875ebd66617e045 989 | 8b1635751a181010a0fcf9f33bdc93f79d3b7714191969aa1adaa74f1f8b 990 | 910e5ab468a1ce9d3b2b202040f9f2e573f84221252545d1d1d18a8a8a52 991 | 4a4a8aeeddbb97eacde8a301cca79f7e6a317dfdfaf5a661521d952b572e 992 | cd9f3fdfa2464b5c5c9ca64d9ba6458b165954c3f5f7f757fdfaf5d5a347 993 | 0f952a55caac2c2a2a4aeddbb7b7e879de1d2a55aaa49f7efac9f4f7b56b 994 | d754a142856766f494575f7dd5665057a04001a79a65242424e8e2c58b4a 995 | 4848b0281b3c78b076eedce9f4fa2d5ab4c874f15ca040018743949b376f 996 | eaead5aba627db5f7df595c510a123468c50c58a15e5ededad3c79f22867 997 | ce9c0efd2ea5a4a428323252376edc30fb0e474747db7c4fd3a64d357efc 998 | 789beb1f1f1faf8d1b37eafcf9f3ba74e99262626254a85021152d5a5445 999 | 8b1655f9f2e5cd6eb0ce9c39a38e1d3beacf3ffff4c8e3eac2850b66bfc1 1000 | 4949496ad3a68de946d9cbcb4b5dba74d1c081032db6c9c58b17b561c306 1001 | ad5fbf5e3b77eeb4f95dcc9d3bb7de7cf34d454444588ce074fcf87175ea 1002 | d429d55a07152a54d0a851a3cc7e970a172eec54338747cf4b73e7ce3575 1003 | 4efcf9e79f9b0d0b1c1212e270e784292929faf3cf3fcd3e7bc3860ded9e 1004 | 03df7aeb2dcd9a35cbe64d57525292b66cd9a2d3a74febf2e5cbba7efdba 1005 | f2e7cfaff0f070858787ebd5575f35ab45131515a5ce9d3b6befdebd3697 1006 | 99356b56d3f0dd7e7e7eca972f9fcde604d67e2fae5ebd6aaa313966cc18 1007 | 8ba0a16ad5aa1a3468907c7d7d952f5f3e65cb96cde163f0d6ad5b8a8c8c 1008 | 34354d6adab4a9d5e63cd2831a9383070f56972e5d6cceefca952b5abb76 1009 | adfefaeb2f4546462a6fdebc7afef9e755ba7469952d5bd62264b135da98 1010 | bd60e83ffff98fcdda8fc9c9c9dabe7dbb8e1f3faecb972febdab56b0a0d 1011 | 0d557878b8e937e2d16b8798981875efdeddec5a26ad162d5a647794b42b 1012 | 57aea43958b6a77cf9f25ab972a5ddd7f4ebd74ff3e7cf77f9b2e7cd9b67 1013 | b7664a545494c57e079e25be6c023cb307bfafaf4a972e9deef964ca94c9 1014 | a124df551e6fa212101090e6cf91397366b32701d62efe828383d334ff47 1015 | 0323492eb9294fcb10b9376edc50d3a64dd5bb776f75e9d2c5747390356b 1016 | 56f5ebd74f7dfaf4d1d9b367f5f7df7febce9d3b2a58b0a08a152b66f562 1017 | 75f9f2e51a366c98d576c9eeb063c70e1d3870c0540df8591b1a365bb66c 1018 | 2ef98e3efc9e142b56cce672d2a24489124e37e3901ef49ff0681f0ad6fa 1019 | 53285cb8709abf7779f3e6356b1f9f5aa0ba64c9129d3d7b56fffad7bfac 1020 | de08040606aa7efdfaa92e3b3939598b172fd690214374fbf66dc31c6723 1021 | 478e34ab05909292a219336668e5ca95ead1a3872222224c37d7050b1654 1022 | c78e1dd5b16347ddbb774f57af5ed5b56bd74cbf09b973e756debc79ad9e 1023 | 13e2e2e23467ce1c4d9c38d1a1dfb2f41eff8fafc3a3fd4b142c5830cdf3 1024 | f6f2f2b2a885905aff1cdbb76f57ddba753574e850ab4d387c7c7c54a346 1025 | 0d87aad66fd8b041fdfbf74ff577d8c7c727cd9f312020c0ece9bbb55a2d 1026 | d9b3674ff3fc73e4c861364f7bdfd1e4e4640d1d3a54870e1dd2a04183ac 1027 | d676c9972f5faac33cc7c7c7eb8b2fbed082050b9c5edffdfbf7ab6eddba 1028 | 1a3c78b0d5da43dededeaa5cb9b243c3b16fdfbe5dfdfaf54bf388298fdb 1029 | b46993dde5daebcf2a3d8e1e3daaab57afdaec8be4ce9d3bdabc79b35b96 1030 | bd79f366bb0187bb3e3360143451010c262d37f94f8b9b376fa6799b8d1c 1031 | 3952952b57d68a152bcc7aa7f7f1f1d173cf3da76ad5aaa97efdfa2a57ae 1032 | 9cd90d6f4a4a8a76eddaa5060d1aa87bf7ee19166e3c74e4c8115340f4fd 1033 | f7dff305805becdfbf5f0d1a3450e7ce9d9d6e56929898a8b56bd7aa4e9d 1034 | 3afae4934f0c156efcfcf3cffaf6db6fad965dbe7c5983060d52c58a1535 1035 | 75ea548b1bb287352a5e7df555d5af5f5ff5ebd7d7ebafbf6e112c444747 1036 | 6bf2e4c9aa58b1a2468d1af5ccfe869f3b774eeddbb75793264db467cf1e 1037 | a73a674e4949d1f6eddbd5a2450bb56fdf3ec37f873de5587df3cd37356c 1038 | d830a786c34d4949d1a64d9b54ab56ad34851b0f5dba74495dbb7655bd7a 1039 | f5f4ebafbfda1de9cb9adf7fff5d1d3a7450f3e6cd5d166e48d29c39736c 1040 | d6a83c73e68cdd51e9d2233e3e5e03060cb0da41704a4a8a860f1f9ea6fe 1041 | 751cf1fdf7dfdb6cde76fefc79bb4d948167014d5400781c5b4d54c68f1f 1042 | 9faea1e41eca9a35abaa55aba6dab56bab68d1a2ca93278fa969527474b4 1043 | ae5dbba60b172e68f3e6cddab871a3db3a124d4dbe7cf9b46bd72ef9fbfb 1044 | 6be9d2a5666da801772a52a4886ad6aca9ca952bab4081020a090951ae5c 1045 | b9949292a2d8d858454646eae0c183fadffffea7356bd6983589f17453a7 1046 | 4e958f8f8f6edfbeadcf3fffdc6ab3255b0a172eacb7df7e5b952a5552fe 1047 | fcf94db5d4828282141f1fafe8e868454747ebead5abdabd7bb77efbed37 1048 | 1d3b76cce5232d3d0df2e4c9a31a356aa85ab56a2a54a890f2e4c9a3e0e0 1049 | 60797b7b2b2e2e4ed7af5fd7a14387b47fff7ead59b346972e5d62a33dbc 1050 | 78f7f252d9b26555bd7a75bdf1c61ba66d9723470eddbf7f5f3131313a7d 1051 | fab476ecd8a1952b57eaf4e9d32e5f875cb97299f65f585898691d7c7d7d 1052 | 75fbf66dddb87143870f1fd6810307b476ed5a97861a8ff3f7f757cf9e3d 1053 | d5a041038587872b3232529b376fd6975f7ea9b8b838b7ee8b975e7a499f 1054 | 7df699ca962dab4c9932e9f8f1e31a3f7ebc4b9adfd8e3e7e7a71e3d7aa8 1055 | 51a3462a5ab4a8222323b575eb560d1f3edc50213340c001e099d0af5f3f 1056 | f5eedddb627a9f3e7dccfa4d71f505a3248fba11193d7ab4dab56b2749aa 1057 | 53a78e0e1d3ac4c18127c6dbdbdbe9a7b6cf0a1f1f1fa7877a85317e87f9 1058 | 8e3ab7ffbcbcbc9ef83a3ca9e3e7492dfb497e66c013d10707008f63ab23 1059 | badf7fffdd6dcbf4b48b8342850aa955ab56921eb45926dcc09346b8611b 1060 | e1c6d3f93bcc77d4f9fdf7a4f7e1935cfe935a36df1bc01c7d7000f038d6 1061 | 028ee8e8688f1d95c11d3ef9e413d3080e93264de2a0000000005241c001 1062 | c0e3580b387efbedb767e6f3878787ab69d3a692a403070e68fbf6ed1c14 1063 | 000000402a68a202c0e3581b7ad3a82388f8f9f9a944891292a453a74e99 1064 | 8de062cba041834cc32e8e183182030200000070000107800c933f7f7eb5 1065 | 6ad54a050b16d4eeddbbb56edd3addba75cbec350101012a5dbab4d9b4e3 1066 | c78f6bf7eedd86fbbcb56ad5d2f8f1e3151c1c2ce9ff0db3b77fff7e9bef 1067 | a95ab5aade7df75d49d2860d1bb473e74e0e1c000000c0018ca2022043bc 1068 | f2ca2b5ab06081b267cf6e9a76e4c811d5ad5bd7ac83be575f7d552b56ac 1069 | 307b6fd7ae5db572e54a437dded0d050edd8b143993367369b7ef9f265bd 1070 | f1c61b4a4c4cb4788fbfbfbfb66eddaab0b030252424a8468d1a3a73e60c 1071 | 070f000000e000fae000e0763e3e3efafaebafcdc20d497af1c517d5a143 1072 | 07b3696fbef9a6d9df2b56ac305cb82149efbefbae45b8213da8c552bc78 1073 | 71abefe9d7af9fc2c2c2243d1822967003000000701c010700b70b0b0bd3 1074 | 73cf3d67b5ac71e3c6a67f67ce9c59efbfffbee9ef6bd7ae69c0800186fc 1075 | cc850a1572eaf5cd9b3757f7eedd25493b76ecd0cc993339700000000027 1076 | 10700070bb7cf9f2d92c2b57ae9c4a972e2d6f6f6ff5e9d34721212192a4 1077 | 7ffef947eddbb7d7cd9b370df999fffaeb2f9b6557af5efd7f3fc2dedeea 1078 | ddbbb7264c982049ba70e182ba76edaae4e4640e1c000000c00974320ac0 1079 | edec35b5f0f1f1d17ffffb5f5dba7449cf3fffbc24293131511d3b76d4c1 1080 | 83070dfb99f7eeddab9494147979795994f5e8d1437bf6ec518912251411 1081 | 11616a9672fdfa75b56fdf5e376edce0a0010000009c4427a30032c4a64d 1082 | 9b54aa54a9545f77e9d225f5e8d1437bf7ee35fc671e3a74a8ba74e9e2d0 1083 | 6bcf9c39a3366ddad8adf901000000c0361f4943d90c00dc6defdebd6adc 1084 | b8b1020303ad962726266ac99225ead4a993ce9e3dfb547ce61d3b762867 1085 | ce9c7ae9a597e4ed6dbd45e0bd7bf7346dda34f5ecd9535151511c280000 1086 | 00401a5183034086090a0a52e7ce9d55b66c59152a544877eedcd1df7fff 1087 | ad43870e69f1e2c5ba7efdfa53f9b94b952aa5a64d9baa78f1e20a0b0b53 1088 | 6c6cac2e5dbaa46ddbb669fdfaf58a8e8ee6e000000000d2898003000000 1089 | 0000181ea3a8000000000000c323e00000000000008647c0010000000000 1090 | 0c8f80030000000000181e01070000000000303c020e0000000000607804 1091 | 1c0000000000c0f00838000000000080e11170000000000000c323e00000 1092 | 000000008647c00100000000000c8f80030000000000181e010700000000 1093 | 00303c020e00000000006078041c0000000000c0f00838000000000080e1 1094 | 1170000000000000c323e00000000000008647c00100000000000c8f8003 1095 | 0000000000181e01070000000000303c020e00000000006078041c000000 1096 | 0000c0f00838000000000080e11170000000000000c323e0000000000000 1097 | 8647c00100000000000c8f80030000000000181e01070000000000303c02 1098 | 0e00000000006078041c0000000000c0f00838000000000080e111700000 1099 | 00000000c323e00000000000008647c00100000000000c8f800300000000 1100 | 00181e01070000000000303c020e00000000006078041c0000000000c0f0 1101 | 0838000000000080e11170000000000000c323e00000000000008647c001 1102 | 00000000000c8f80030000000000181e01070000000000303c020e000000 1103 | 00006078041c0000000000c0f00838000000000080e11170000000000000 1104 | c323e00000000000008647c00100000000000c8f80030000000000181e01 1105 | 070000000000303c020e00000000006078041c0000000000c0f008380000 1106 | 00000080e11170000000000000c323e00000000000008647c00100000000 1107 | 000c8f8003c0ffd78e1d900000000008faffba1d81ce100000604f700000 1108 | 00007b8203000000d8131c000000c09ee000000000f60407000000b02738 1109 | 000000803dc101000000ec090e000000604f1d1f119a000006d149444154 1110 | 70000000007b8203000000d8131c000000c09ee000000000f60407000000 1111 | b02738000000803dc101000000ec090e000000604f70000000007b820300 1112 | 0000d8131c000000c09ee000000000f60407000000b02738000000803dc1 1113 | 01000000ec090e000000604f70000000007b8203000000d8131c000000c0 1114 | 9ee000000000f60407000000b02738000000803dc101000000ec090e0000 1115 | 00604f70000000007b8203000000d8131c000000c09ee000000000f60407 1116 | 000000b02738000000803dc101000000ec090e000000604f70000000007b 1117 | 8203000000d8131c000000c09ee000000000f60407000000b02738000000 1118 | 803dc101000000ec090e000000604f70000000007b8203000000d8131c00 1119 | 0000c09ee000000000f60407000000b02738000000803dc101000000ec09 1120 | 0e000000604f70000000007b8203000000d8131c000000c09ee000000000 1121 | f60407000000b02738000000803dc101000000ec090e000000604f700000 1122 | 00007b8203000000d8131c000000c09ee000000000f60407000000b02738 1123 | 000000803dc101000000ec090e000000604f70000000007b8203000000d8 1124 | 131c000000c09ee000000000f60407000000b02738000000803dc1010000 1125 | 00ec090e000000604f70000000007b8203000000d8131c000000c09ee000 1126 | 000000f60407000000b02738000000803dc101000000ec090e000000604f 1127 | 70000000007b8203000000d8131c000000c09ee000000000f60407000000 1128 | b02738000000803dc101000000ec090e000000604f70000000007b820300 1129 | 0000d8131c000000c09ee000000000f60407000000b02738000000803dc1 1130 | 01000000ec090e000000604f70000000007b8203000000d8131c000000c0 1131 | 9ee000000000f60407000000b02738000000803dc101000000ec090e0000 1132 | 00604f70000000007b8203000000d8131c000000c09ee000000000f60407 1133 | 000000b02738000000803dc101000000ec090e000000604f70000000007b 1134 | 8203000000d8131c000000c09ee000000000f60407000000b02738000000 1135 | 803dc101000000ec090e000000604f70000000007b8203000000d8131c00 1136 | 0000c09ee000000000f60407000000b02738000000803dc101000000ec09 1137 | 0e000000604f70000000007b8203000000d8131c000000c09ee000000000 1138 | f60407000000b02738000000803dc101000000ec090e000000604f700000 1139 | 00007b8203000000d8131c000000c09ee000000000f60407000000b02738 1140 | 000000803dc101000000ec090e000000604f70000000007b8203000000d8 1141 | 131c000000c09ee000000000f60407000000b02738000000803dc1010000 1142 | 00ec090e000000604f70000000007b8203000000d8131c000000c09ee000 1143 | 000000f60407000000b02738000000803dc101000000ec090e000000604f 1144 | 70000000007b8203000000d8131c000000c09ee000000000f60407000000 1145 | b02738000000803dc101000000ec090e000000604f70000000007b820300 1146 | 0000d8131c000000c09ee000000000f60407000000b02738000000803dc1 1147 | 01000000ec090e000000604f70000000007b8203000000d8131c000000c0 1148 | 9ee000000000f60407000000b02738000000803dc101000000ec090e0000 1149 | 00604f70000000007b8203000000d8131c000000c09ee000000000f60407 1150 | 000000b02738000000803dc101000000ec090e000000604f70000000007b 1151 | 8203000000d8131c000000c09ee000000000f60407000000b02738000000 1152 | 803dc101000000ec090e000000604f70000000007b8203000000d8131c00 1153 | 0000c09ee000000000f60407000000b02738000000803dc101000000ec09 1154 | 0e000000604f70000000007b8203000000d8131c000000c09ee000000000 1155 | f60407000000b02738000000803dc101000000ec090e000000604f700000 1156 | 00007b8203000000d8131c000000c09ee000000000f60407000000b02738 1157 | 000000803dc101000000ec090e000000604f70000000007b8203000000d8 1158 | 131c000000c09ee000000000f60407000000b02738000000803dc1010000 1159 | 00ec090e000000604f70000000007b8203000000d8131c000000c09ee000 1160 | 000000f60407000000b02738000000803dc101000000ec090e000000604f 1161 | 70000000007b8203000000d8131c000000c09ee000000000f60407000000 1162 | b02738000000803dc101000000ec090e000000604f70000000007b820300 1163 | 0000d8131c000000c09ee000000000f60407000000b02738000000803dc1 1164 | 01000000ec090e000000604f70000000007b8203000000d8131c000000c0 1165 | 9ee000000000f60407000000b02738000000803dc101000000ec090e0000 1166 | 00604f70000000007b8203000000d8131c000000c09ee000000000f60407 1167 | 000000b02738000000803dc101000000ec090e000000604f70000000007b 1168 | 01d8970ed570eeaed50000000049454e44ae42608254434d500000000200 1169 | 0003305450453200000012000003416e617220536f667477617265204c4c 1170 | 430000000000000000000000000000000000000000000000000000000000 1171 | 000000000000000000000000000000000000000000000000000000000000 1172 | 000000000000000000000000000000000000000000000000000000000000 1173 | 000000000000000000000000000000000000000000000000000000000000 1174 | 000000000000000000000000000000000000000000000000000000000000 1175 | 000000000000000000000000000000000000000000000000000000000000 1176 | 000000000000000000000000000000000000000000000000000000000000 1177 | 000000000000000000000000000000000000000000000000000000000000 1178 | 000000000000000000000000000000000000000000000000000000000000 1179 | 000000000000000000000000000000000000000000000000000000000000 1180 | 000000000000000000000000000000000000000000000000000000000000 1181 | 000000000000000000000000000000000000000000000000000000000000 1182 | 000000000000000000000000000000000000000000000000000000000000 1183 | 000000000000000000000000000000000000000000000000000000000000 1184 | 000000000000000000000000000000000000000000000000000000000000 1185 | 000000000000000000000000000000000000000000000000000000000000 1186 | 000000000000000000000000000000000000000000000000000000000000 1187 | 000000000000000000000000000000000000000000000000000000000000 1188 | 000000000000000000000000000000000000000000000000000000000000 1189 | 000000000000000000000000000000000000000000000000000000000000 1190 | 000000000000000000000000000000000000000000000000000000000000 1191 | 000000000000000000000000000000000000000000000000000000000000 1192 | 000000000000000000000000000000000000000000000000000000000000 1193 | 000000000000000000000000000000000000000000000000000000000000 1194 | 000000000000000000000000000000000000000000000000000000000000 1195 | 000000000000000000000000000000000000000000000000000000000000 1196 | 000000000000000000000000000000000000000000000000000000000000 1197 | 000000000000000000000000000000000000000000000000000000000000 1198 | 000000000000000000000000000000000000000000000000000000000000 1199 | 000000000000000000000000000000000000000000000000000000000000 1200 | 000000000000000000000000000000000000000000000000000000000000 1201 | 000000000000000000000000000000000000000000000000000000000000 1202 | 000000000000000000000000000000000000000000000000000000000000 1203 | 000000000000000000000000000000000000000000000000000000000000 1204 | 0000000000ffe318c4000b2361f800014d4d427d5fbfd4f39ce7a64177e8 1205 | 4a1ce7febd3ffffce465e46a11ba13c4ce739c60062fffec41518780c075 1206 | 84ee757b793647ea8bb3ddfe6457f4dd3affe318c40e0a9b621800008d4d 1207 | afffffd75d7ecae7643cdb215412828a239fad056a3d036ca148a4728a1f 1208 | ffdf4db5ebfba26d4ffffffffb7dfcc7abbc4bcce62d1100124ebbae0dff 1209 | e318c41e08f3662008008d4ce24e959587ae1fdeb3baf45fca93553eb95a 1210 | 94f5ffffff5d5bd28fb29d8fb624414053e398eaa6d81a883c38d2d5027f 1211 | fe5ffd96477eba9fffffffffe318c43509cb62200801474df95cafea6473 1212 | 20b2a071da250a169d67353a64af371d0084aae56753eb51cf3add7a7fb8 1213 | fffffffaccf7fd12a332040ec1453953ba59c5f7b0b064ffe318c448094b 1214 | 66241000474804551f97e7f167e6b2fcbfff5fffffe967f5bb6525fd4f21 1215 | 2a62d8505c50776121c7670302360a612a1ffd6a9feff45fa7e9fffffffb 1216 | 7eef499d98ffe318c45d08cb621c00004d4d6aea3d4a7651c50b50cd3b87 1217 | 97e603e1a1c0cf1c997a1fff6b7eff4ff5ffa7d2c99694dbfffffbb66f93 1218 | b218ce6d6851408107535453c6c60ead6cffe318c474099b5e2008004749 1219 | adc616993af51dbebffffff5ca9ffffffffeeb4f3a154e256c6b9ca531ca 1220 | 3145158c1984863217465a3e00043101bffbb7a2153fe9ff54ee9a6befff 1221 | e318c48809e3622008014d4dfffff64bbce4a68a880851d5c6086769bf22 1222 | b240d3242342b2a0e858e399d5fff97cebe7be104f4078493429774b3a6c 1223 | 1ef79ffdfffff6eff6bc7bffe318c49b0a9b661c08009330b66bf78ea40f 1224 | e943184cbd06420f98480fdc8511f2a706ffe7cfffefb94bffd52fbbff7f 1225 | dfabd8c6ae3bb1d852d0dd4350b7902cf456c8ab8a9001ffe318c4ab09b3 1226 | 6a2408008d4e4f4c8c3d5294fa16612a01bfad77fad93efa2ebf5d5356aa 1227 | fffffe7e5c94bdddae33231ce96087193380aaed5580a0aca1889ed512e5 1228 | aa364e663fffe318c4bf0b236e1c1000934cd149063e69a32919cc200118 1229 | f159c59ffe5ffc8b25ee7bb739cbb573929af7bfdecfa60ccd9b504cda87 1230 | 18569b11b4a22150d3e807a57de6aa41c9ffe318c4cd0c83621400004d10 1231 | 12cc89d7f3f6225cafcb97cbfec3fafb0f19a55f502cd924ad8384aafa8b 1232 | 60f32448cb0faf03a2c848c85411287594b503b29fcfc995e165f36ff5ff 1233 | e318c4d60b8b622010005349affe5ffffa94b3ca6efd6d49bc5a4b399204 1234 | 063ae6ec805313409aa84bacd13942c490203042a89044660a00b9fe3cbd 1235 | fcbfffcbdce445d6f3ff9effe318c4e20a6b621c10008d4d7e7ab3ff14ec 1236 | 7f75949d49fa923d66f1307b671e4f0155595c96483e2f95170751a4408a 1237 | 84c414da17bcbd73813c3ce709feca87839f1a996e65efffe318c4f30ec3 1238 | 5e100800532cf9fec2eea519316deb5ad49eb8510c2c8c9923844113e4a8 1239 | c422e2c4658c01c4a85720a7ac4d310604c7ff315a7f8320b18b66ee64f2 1240 | 3afe72fe7fffe318c4f30db36a1c10005348f3d4adf389dc9a932880b944 1241 | 2a878d38e96d8a0424407120408da21422048a035a7646cd1625892a0547 1242 | f244f2a2e7a6e82cc8e48f3330338c8907ffe318c4f70d5b6a1c10005348 1243 | 7eab95ffa6f521972f0b0c74ed1f8e68e167cc09056365ca8ac7232b407a 1244 | b5751d2b949c2e96cc44b32108d5a76a0793fbd06673445d2e7ed59176ff 1245 | e318c4fc0d236220180059494622f47ffff2ec6bdff4bec6f3607f54d408 1246 | 575c4c48449a5d0a264e235174497442ea28d0f449a90d0947e8d0e17ac6 1247 | 40ce7ae475fffe5d9cacc3ffe318c4ff0e33621c100053494d6edf559669 1248 | 94cd315d58e3cc9d2f121135012f58d82ab6e708476db03c0dcece9dba62 1249 | 0a6a2aaa00c5c2c7cdc9851e877f05039c3f24ce5c66efffe318c4ff0ea3 1250 | 5e1c180053495fe7e176ab16d7e395eae358a912a619192e66f83a1319b3 1251 | e7d19d9bfd917995d5201755bc9d1b0742d2f755fede47f2bb58afa22958 1252 | ca8f2b833bffe318c4ff10136a1c18005948a1d9a8311102c523b9d4c577 1253 | 629e88142196c55b2cdb3b17f5d7c72ffbaa7d5da72eb78cd741947e2f48 1254 | 9d736c283e98a454dbd43cd9a0b60d2634ffe318c4f90d6b621c10005349 1255 | 75ee1f9fefd7cfed32ffbf1ffffffefffbf2b61baa664bcd7fd7cedcc9d0 1256 | 9766d12cc29275ee90879a3caa14715d2949ffaebfbb04791613b15eb9ff 1257 | e318c4fe0d2b6a2418005964d3fffcbfdaacba8e3550c6a50f1b425fa491 1258 | 88c4d85c8ca1429b24334e852322122325c05b645486952949e9d9c11b9c 1259 | e799d70d9cd99201959545ffe318c4ff0f8b6a181800594844fa7ffefb38 1260 | ff5539ca979ad3f2dc4d0a183dd534cf0ae19d864d983afb138a8509922a 1261 | 9de9882a027fec5e79b23275f2c8425320949991ab5095ffe318c4fb1303 1262 | 6a08000093108577c8f23ffff2fb4fcf7518abdeb5356b4d44926e5678b9 1263 | 64a998aee992bc4aaa56b8b0b940d4ed9fffffffffcecfe77e4684c25326 1264 | 1c984d7f09ffe318c4ea0af362200800534b3091d87342351108d7f34230 1265 | 908986cecfffff7ca796ae7168d579cac3964540c9849489c91b252444cc 1266 | fa88a3c25894aa4c414d45332e39382e32ffe318c4f90d536a2818005348 1267 | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 1268 | aaaaaaaaaaaaaaaaaaaa4c414d45332e39382e32aaaaaaaaaaaaaaaaaaff 1269 | e318c4fe0ddb5e2418005348aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 1270 | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 1271 | aaaaaaaaaaaaaaaaaaaaaaffe318c4ff0eab5e101000532caaaaaaaaaaaa 1272 | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 1273 | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaffe318c4ff10cb 1274 | 65dc00004cbcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 1275 | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 1276 | aaaaaaaaaaffe318c4f60000034800000000aaaaaaaaaaaaaaaaaaaaaaaa 1277 | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 1278 | aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa54414732205365636f6e647320 1279 | 6f662053696c656e636500000000000000000000416e617220536f667477 1280 | 617265204c4c4300000000000000000000000000426c616e6b2041756469 1281 | 6f0000000000000000000000000000000000000000000000000000000000 1282 | 000000000000000000000000000000000000000000000000ff 1283 | """ 1284 | 1285 | xxdDump = xxdDump.replace("\n", "") 1286 | return binascii.unhexlify(xxdDump) --------------------------------------------------------------------------------