From 0a5f88d75afdd64fd081eb5d87ac92e50fda58f0 Mon Sep 17 00:00:00 2001 From: Christoph Califice Date: Thu, 9 Oct 2025 20:05:31 -0300 Subject: [PATCH] stash --- .../CommunityScriptsUILibrary.yml | 6 + .../CommunityScriptsUILibrary/README.md | 90 + .../CommunityScriptsUILibrary/cs-ui-lib.js | 141 + .../CommunityScriptsUILibrary/manifest | 12 + .../DupFileManager/DupFileManager.log | 12 + .../DupFileManager_config.cpython-312.pyc | Bin 0 -> 2621 bytes ...pFileManager_report_config.cpython-312.pyc | Bin 0 -> 18815 bytes .../ModulesValidate.cpython-312.pyc | Bin 0 -> 5728 bytes .../StashPluginHelper.cpython-312.pyc | Bin 0 -> 62898 bytes .../community/LocalVisage/LocalVisage.py | 371 + .../community/LocalVisage/LocalVisage.yml | 57 + .../community/LocalVisage/frontend.css | 136 + .../plugins/community/LocalVisage/frontend.js | 14579 +++++++++++++++ .../plugins/community/LocalVisage/manifest | 25 + .../plugins/community/LocalVisage/readme.md | 69 + .../community/LocalVisage/requirements.txt | 129 + .../community/LocalVisage/stashface/app.py | 38 + .../LocalVisage/stashface/models/__init__.py | 1 + .../stashface/models/data_manager.py | 116 + .../stashface/models/face_recognition.py | 90 + .../stashface/models/image_processor.py | 159 + .../LocalVisage/stashface/utils/__init__.py | 1 + .../LocalVisage/stashface/utils/vtt_parser.py | 44 + .../LocalVisage/stashface/web/__init__.py | 1 + .../LocalVisage/stashface/web/interface.py | 174 + .../PythonDepManager/PythonDepManager.yml | 12 + .../community/PythonDepManager/README.md | 121 + .../community/PythonDepManager/__init__.py | 3 + .../community/PythonDepManager/deps.py | 540 + .../community/PythonDepManager/flush.py | 15 + .../plugins/community/PythonDepManager/log.py | 30 + .../community/PythonDepManager/manifest | 15 + .../StashUserscriptLibrary.yml | 6 + .../community/StashUserscriptLibrary/manifest | 12 + .../stashUserscriptLibrary.js | 1606 ++ .../plugins/community/cjCardTweaks/README.md | 22 + .../community/cjCardTweaks/cjCardTweaks.js | 272 + .../community/cjCardTweaks/cjCardTweaks.yml | 26 + .../plugins/community/cjCardTweaks/manifest | 12 + .../ModulesValidate.cpython-312.pyc | Bin 0 -> 5725 bytes .../StashPluginHelper.cpython-312.pyc | Bin 0 -> 65113 bytes .../filemonitor_config.cpython-312.pyc | Bin 0 -> 1845 bytes ...filemonitor_self_unit_test.cpython-312.pyc | Bin 0 -> 2549 bytes .../filemonitor_task_examples.cpython-312.pyc | Bin 0 -> 1699 bytes .../community/filemonitor/filemonitor.log | 285 + .../community/filenameParser/README.md | 3 + .../filenameParser/filenameParser.js | 427 + .../filenameParser/filenameParser.yml | 13 + .../plugins/community/filenameParser/manifest | 12 + .../community/star_identifier/README.md | 94 + .../plugins/community/star_identifier/log.py | 52 + .../community/star_identifier/manifest | 17 + .../star_identifier/requirements.txt | 3 + .../star_identifier/star_identifier.py | 314 + .../star_identifier/star_identifier.yml | 21 + .../star_identifier/star_identifier_config.py | 27 + .../star_identifier_interface.py | 302 + .../plugins/community/stashai/README.md | 3 + .../config/plugins/community/stashai/manifest | 13 + .../plugins/community/stashai/stashai.css | 155 + .../plugins/community/stashai/stashai.js | 4134 +++++ .../plugins/community/stashai/stashai.yml | 14 + .../stashdb-performer-gallery/README.md | 3 + .../stashdb-performer-gallery/manifest | 17 + .../requirements.txt | 2 + .../stashdb-performer-gallery.py | 470 + .../stashdb-performer-gallery.yml | 41 + .../config/plugins/community/visage/manifest | 12 + .../plugins/community/visage/visage.css | 132 + .../config/plugins/community/visage/visage.js | 15313 ++++++++++++++++ .../plugins/community/visage/visage.yml | 14 + .../scrapers/community/10Musume/10Musume.yml | 55 + .../scrapers/community/10Musume/manifest | 9 + .../1passforallsites/1passforallsites.yml | 35 + .../community/1passforallsites/manifest | 9 + .../scrapers/community/1pondo/1pondo.yml | 53 + .../config/scrapers/community/1pondo/manifest | 9 + .../community/21Naturals/21Naturals.yml | 31 + .../scrapers/community/21Naturals/manifest | 9 + .../scrapers/community/21Roles/21Roles.yml | 61 + .../scrapers/community/21Roles/manifest | 9 + .../community/21Sextreme/21Sextreme.yml | 31 + .../scrapers/community/21Sextreme/manifest | 9 + .../community/21Sextury/21Sextury.yml | 40 + .../scrapers/community/21Sextury/manifest | 9 + .../3rdDegreeFilms/3rdDegreeFilms.yml | 49 + .../community/3rdDegreeFilms/manifest | 9 + .../scrapers/community/5KTeens/5KTeens.yml | 54 + .../scrapers/community/5KTeens/manifest | 9 + stash/config/scrapers/community/AD4X/AD4X.yml | 22 + stash/config/scrapers/community/AD4X/manifest | 9 + stash/config/scrapers/community/AEBN/AEBN.yml | 116 + stash/config/scrapers/community/AEBN/manifest | 9 + .../community/AMAMultimedia/AMAMultimedia.yml | 89 + .../scrapers/community/AMAMultimedia/manifest | 9 + .../community/APOVStory/APOVStory.yml | 37 + .../scrapers/community/APOVStory/manifest | 9 + .../community/AShemaleTube/AShemaleTube.yml | 123 + .../scrapers/community/AShemaleTube/manifest | 9 + .../community/ATKExotics/ATKExotics.yml | 55 + .../scrapers/community/ATKExotics/manifest | 9 + .../ATKGirlfriends/ATKGirlfriends.py | 70 + .../ATKGirlfriends/ATKGirlfriends.yml | 90 + .../community/ATKGirlfriends/manifest | 10 + .../scrapers/community/ATKHairy/ATKHairy.yml | 39 + .../scrapers/community/ATKHairy/manifest | 9 + stash/config/scrapers/community/AVE/AVE.yml | 69 + stash/config/scrapers/community/AVE/manifest | 9 + .../scrapers/community/AVJiali/AVJiali.yml | 168 + .../scrapers/community/AVJiali/manifest | 9 + .../community/AbbyWinters/AbbyWinters.yml | 30 + .../scrapers/community/AbbyWinters/manifest | 9 + .../scrapers/community/AbuseMe/AbuseMe.yml | 44 + .../scrapers/community/AbuseMe/manifest | 9 + .../community/ActiveDuty/ActiveDuty.yml | 31 + .../scrapers/community/ActiveDuty/manifest | 9 + .../AddictedToGirls/AddictedToGirls.yml | 40 + .../community/AddictedToGirls/manifest | 9 + .../community/AdultDoorway/AdultDoorway.yml | 69 + .../scrapers/community/AdultDoorway/manifest | 9 + .../AdultDvdMarketPlace.yml | 73 + .../community/AdultDvdMarketPlace/manifest | 9 + .../community/AdultEmpire/AdultEmpire.yml | 205 + .../scrapers/community/AdultEmpire/manifest | 9 + .../AdultEmpireCash/AdultEmpireCash.yml | 160 + .../community/AdultEmpireCash/manifest | 9 + .../AdultFilmIndex/AdultFilmIndex.yml | 86 + .../community/AdultFilmIndex/manifest | 9 + .../community/AdultPrime/AdultPrime.yml | 71 + .../scrapers/community/AdultPrime/manifest | 9 + .../AdultSiteRunner/AdultSiteRunner.yml | 134 + .../community/AdultSiteRunner/manifest | 9 + .../scrapers/community/Adultime/Adultime.yml | 120 + .../scrapers/community/Adultime/manifest | 9 + .../AkiraLaneProductions.yml | 55 + .../community/AkiraLaneProductions/manifest | 9 + .../scrapers/community/Algolia/Algolia.py | 1026 ++ .../scrapers/community/Algolia/manifest | 9 + .../AllAnalAllTheTime/AllAnalAllTheTime.yml | 38 + .../community/AllAnalAllTheTime/manifest | 9 + .../AllGirlMassage/AllGirlMassage.yml | 40 + .../community/AllGirlMassage/manifest | 9 + .../scrapers/community/Alterpic/Alterpic.yml | 33 + .../scrapers/community/Alterpic/manifest | 9 + .../community/AmateurAllure/AmateurAllure.yml | 66 + .../scrapers/community/AmateurAllure/manifest | 9 + .../community/AmateurBoxxx/AmateurBoxxx.yml | 27 + .../scrapers/community/AmateurBoxxx/manifest | 9 + .../AmateureExtreme/AmateureExtreme.yml | 32 + .../community/AmateureExtreme/manifest | 9 + .../community/AmelieLou/AmelieLou.yml | 37 + .../scrapers/community/AmelieLou/manifest | 9 + .../community/AmourAngels/AmourAngels.yml | 47 + .../scrapers/community/AmourAngels/manifest | 9 + .../scrapers/community/AnalVids/AnalVids.py | 62 + .../scrapers/community/AnalVids/AnalVids.yml | 60 + .../scrapers/community/AnalVids/manifest | 10 + .../scrapers/community/Andomark/Andomark.yml | 298 + .../scrapers/community/Andomark/manifest | 9 + .../community/AngelaWhite/AngelaWhite.yml | 60 + .../scrapers/community/AngelaWhite/manifest | 9 + .../config/scrapers/community/AniDB/AniDB.yml | 233 + .../config/scrapers/community/AniDB/manifest | 9 + .../scrapers/community/Anime-DB/Anime-DB.yml | 129 + .../scrapers/community/Anime-DB/manifest | 9 + .../AnimeCharactersDatabase.py | 267 + .../AnimeCharactersDatabase.yml | 20 + .../AnimeCharactersDatabase/manifest | 10 + .../AntonioSuleiman/AntonioSuleiman.yml | 67 + .../community/AntonioSuleiman/manifest | 9 + .../ArchAngelVideo/ArchAngelVideo.yml | 34 + .../community/ArchAngelVideo/manifest | 9 + stash/config/scrapers/community/Arx/Arx.py | 202 + stash/config/scrapers/community/Arx/Arx.yml | 18 + stash/config/scrapers/community/Arx/manifest | 10 + .../AsianStreetMeat/AsianStreetMeat.yml | 53 + .../community/AsianStreetMeat/manifest | 9 + .../AssumeThePositionStudios.py | 118 + .../AssumeThePositionStudios.yml | 56 + .../AssumeThePositionStudios/manifest | 10 + .../scrapers/community/Assylum/Assylum.yml | 42 + .../scrapers/community/Assylum/manifest | 9 + .../scrapers/community/AuntJudys/AuntJudys.py | 120 + .../community/AuntJudys/AuntJudys.yml | 12 + .../scrapers/community/AuntJudys/manifest | 10 + .../community/AussieAss/AussieAss.yml | 25 + .../scrapers/community/AussieAss/manifest | 9 + .../AussieFelatioQueens.yml | 25 + .../community/AussieFelatioQueens/manifest | 9 + .../scrapers/community/AyloAPI/domains.py | 67 + .../scrapers/community/AyloAPI/manifest | 11 + .../scrapers/community/AyloAPI/scrape.py | 951 + .../scrapers/community/AyloAPI/slugger.py | 82 + .../scrapers/community/Aziani/Aziani.yml | 35 + .../config/scrapers/community/Aziani/manifest | 9 + .../scrapers/community/BaDoink/BaDoink.yml | 157 + .../scrapers/community/BaDoink/manifest | 9 + .../community/Babepedia/Babepedia.yml | 149 + .../scrapers/community/Babepedia/manifest | 9 + .../community/Baberotica/Baberotica.yml | 208 + .../scrapers/community/Baberotica/manifest | 9 + .../community/Babes&Stars/Babes&Stars.yml | 85 + .../scrapers/community/Babes&Stars/manifest | 9 + .../config/scrapers/community/Babes/Babes.yml | 72 + .../config/scrapers/community/Babes/manifest | 9 + .../scrapers/community/BadPuppy/BadPuppy.yml | 51 + .../scrapers/community/BadPuppy/manifest | 9 + .../community/BamVisions/BamVisions.yml | 30 + .../scrapers/community/BamVisions/manifest | 9 + stash/config/scrapers/community/Bang/Bang.yml | 136 + stash/config/scrapers/community/Bang/manifest | 9 + .../scrapers/community/BangBros/BangBros.py | 94 + .../scrapers/community/BangBros/BangBros.yml | 78 + .../scrapers/community/BangBros/manifest | 10 + .../BathroomCreepers/BathroomCreepers.yml | 57 + .../community/BathroomCreepers/manifest | 9 + .../scrapers/community/BelAmi/BelAmi.yml | 52 + .../config/scrapers/community/BelAmi/manifest | 9 + .../scrapers/community/Bellesa/Bellesa.yml | 45 + .../scrapers/community/Bellesa/manifest | 9 + .../community/BeltBound/BeltBound.yml | 35 + .../scrapers/community/BeltBound/manifest | 9 + .../BigBootyTGirls/BigBootyTGirls.yml | 26 + .../community/BigBootyTGirls/manifest | 9 + .../scrapers/community/Biphoria/Biphoria.yml | 40 + .../scrapers/community/Biphoria/manifest | 9 + .../community/BlackFoxBound/BlackFoxBound.yml | 31 + .../scrapers/community/BlackFoxBound/manifest | 9 + .../community/BlakeMason/BlakeMason.yml | 41 + .../scrapers/community/BlakeMason/manifest | 9 + .../community/BlowBangGirls/BlowBangGirls.yml | 54 + .../scrapers/community/BlowBangGirls/manifest | 9 + .../scrapers/community/Blowpass/Blowpass.yml | 36 + .../scrapers/community/Blowpass/manifest | 9 + .../scrapers/community/BluMedia/BluMedia.yml | 185 + .../scrapers/community/BluMedia/manifest | 9 + .../community/BlurredMedia/BlurredMedia.yml | 47 + .../scrapers/community/BlurredMedia/manifest | 9 + .../community/BondageCafe/BondageCafe.yml | 31 + .../scrapers/community/BondageCafe/manifest | 9 + .../BondageLiberation/BondageLiberation.yml | 32 + .../community/BondageLiberation/manifest | 9 + .../community/Boobpedia/Boobpedia.yml | 447 + .../scrapers/community/Boobpedia/manifest | 9 + .../community/BoundHeat/BoundHeat.yml | 69 + .../scrapers/community/BoundHeat/manifest | 9 + .../community/Boundhoneys/Boundhoneys.yml | 31 + .../scrapers/community/Boundhoneys/manifest | 9 + .../community/Boundlife/Boundlife.yml | 28 + .../scrapers/community/Boundlife/manifest | 9 + .../community/BoxTruckSex/BoxTruckSex.yml | 34 + .../scrapers/community/BoxTruckSex/manifest | 9 + .../scrapers/community/BoyCrush/BoyCrush.yml | 52 + .../scrapers/community/BoyCrush/manifest | 9 + .../scrapers/community/BoyFun/BoyFun.yml | 30 + .../config/scrapers/community/BoyFun/manifest | 9 + .../community/BradMontana/BradMontana.yml | 26 + .../scrapers/community/BradMontana/manifest | 9 + .../BrandNewAmateurs/BrandNewAmateurs.yml | 22 + .../community/BrandNewAmateurs/manifest | 9 + .../scrapers/community/Brazzers/Brazzers.py | 80 + .../scrapers/community/Brazzers/Brazzers.yml | 76 + .../scrapers/community/Brazzers/manifest | 10 + .../community/BreedItRaw/BreedItRaw.yml | 73 + .../scrapers/community/BreedItRaw/manifest | 9 + .../BrokenLatinaWhores/BrokenLatinaWhores.py | 70 + .../BrokenLatinaWhores/BrokenLatinaWhores.yml | 42 + .../community/BrokenLatinaWhores/manifest | 10 + .../config/scrapers/community/Bromo/Bromo.py | 52 + .../config/scrapers/community/Bromo/Bromo.yml | 74 + .../config/scrapers/community/Bromo/manifest | 10 + .../community/BurningAngel/BurningAngel.yml | 31 + .../scrapers/community/BurningAngel/manifest | 9 + .../config/scrapers/community/CJXXX/CJXXX.yml | 92 + .../config/scrapers/community/CJXXX/manifest | 9 + .../community/CamWhorestv/CamWhorestv.yml | 23 + .../scrapers/community/CamWhorestv/manifest | 9 + .../config/scrapers/community/Carib/Carib.yml | 75 + .../config/scrapers/community/Carib/manifest | 9 + .../community/CarnalPlus/CarnalPlus.yml | 260 + .../scrapers/community/CarnalPlus/manifest | 9 + .../community/Catalina Cruz/Catalina Cruz.yml | 26 + .../scrapers/community/Catalina Cruz/manifest | 9 + .../scrapers/community/ChaosMen/ChaosMen.yml | 31 + .../scrapers/community/ChaosMen/manifest | 9 + .../community/CherryPimps/CherryPimps.yml | 65 + .../scrapers/community/CherryPimps/manifest | 9 + .../community/ChickPass/ChickPass.yml | 144 + .../scrapers/community/ChickPass/manifest | 9 + .../community/ClassLesbians/ClassLesbians.yml | 29 + .../scrapers/community/ClassLesbians/manifest | 9 + .../community/ClaudiaMarie/ClaudiaMarie.yml | 27 + .../scrapers/community/ClaudiaMarie/manifest | 9 + .../community/Clips4Sale/Clips4Sale.yml | 108 + .../scrapers/community/Clips4Sale/manifest | 9 + .../ClubElegantAngel/ClubElegantAngel.yml | 92 + .../community/ClubElegantAngel/manifest | 9 + .../ClubInfernoDungeon/ClubInfernoDungeon.yml | 40 + .../community/ClubInfernoDungeon/manifest | 9 + .../community/ClubSeventeen/ClubSeventeen.yml | 71 + .../scrapers/community/ClubSeventeen/manifest | 9 + .../scrapers/community/Cockhero/Cockhero.yml | 39 + .../scrapers/community/Cockhero/manifest | 9 + .../community/CocksureMen/CocksureMen.yml | 32 + .../scrapers/community/CocksureMen/manifest | 9 + .../community/CockyBoys/CockyBoys.yml | 48 + .../scrapers/community/CockyBoys/manifest | 9 + .../community/ColbyKnox/ColbyKnox.yml | 31 + .../scrapers/community/ColbyKnox/manifest | 9 + .../scrapers/community/Colette/Colette.yml | 69 + .../scrapers/community/Colette/manifest | 9 + .../CollegeUniform/CollegeUniform.yml | 46 + .../community/CollegeUniform/manifest | 9 + .../community/CombatZone/CombatZone.yml | 81 + .../scrapers/community/CombatZone/manifest | 9 + .../community/ComicInfoXML/ComicInfoXML.py | 88 + .../community/ComicInfoXML/ComicInfoXML.yml | 12 + .../scrapers/community/ComicInfoXML/manifest | 10 + .../community/CopyFromScene/CopyFromScene.py | 59 + .../community/CopyFromScene/CopyFromScene.yml | 11 + .../scrapers/community/CopyFromScene/manifest | 10 + .../community/CopyToGallery/CopyToGallery.py | 132 + .../community/CopyToGallery/CopyToGallery.yml | 10 + .../scrapers/community/CopyToGallery/manifest | 10 + .../community/CopyToImages/CopyToImages.py | 151 + .../community/CopyToImages/CopyToImages.yml | 10 + .../scrapers/community/CopyToImages/manifest | 10 + .../community/CorbinFisher/CorbinFisher.yml | 62 + .../scrapers/community/CorbinFisher/manifest | 9 + .../scrapers/community/Cospuri/Cospuri.yml | 74 + .../scrapers/community/Cospuri/manifest | 9 + .../CrashpadSeries/CrashpadSeries.yml | 31 + .../community/CrashpadSeries/manifest | 9 + .../CruelGirlfriend/CruelGirlfriend.yml | 56 + .../community/CruelGirlfriend/manifest | 9 + .../community/Cumlouder/Cumlouder.yml | 20 + .../scrapers/community/Cumlouder/manifest | 9 + .../community/CutlersDen/CutlersDen.yml | 34 + .../scrapers/community/CutlersDen/manifest | 9 + .../community/CzechHunter/CzechHunter.py | 72 + .../community/CzechHunter/CzechHunter.yml | 84 + .../scrapers/community/CzechHunter/manifest | 10 + .../scrapers/community/CzechVR/CzechVR.yml | 89 + .../scrapers/community/CzechVR/manifest | 9 + .../scrapers/community/Czechav/Czechav.yml | 71 + .../scrapers/community/Czechav/manifest | 9 + .../community/DDFNetwork/DDFNetwork.yml | 28 + .../scrapers/community/DDFNetwork/manifest | 9 + .../scrapers/community/DEMedia/DEMedia.yml | 29 + .../scrapers/community/DEMedia/manifest | 9 + stash/config/scrapers/community/DFB/DFB.yml | 49 + stash/config/scrapers/community/DFB/manifest | 9 + .../scrapers/community/DLsite/DLsite.yml | 124 + .../config/scrapers/community/DLsite/manifest | 9 + stash/config/scrapers/community/DMM/DMM.yml | 115 + stash/config/scrapers/community/DMM/manifest | 9 + .../config/scrapers/community/Danni/Danni.yml | 25 + .../config/scrapers/community/Danni/manifest | 9 + .../community/DarkRoomVR/DarkRoomVR.yml | 29 + .../scrapers/community/DarkRoomVR/manifest | 9 + .../DartTechStudios/DartTechStudios.yml | 67 + .../community/DartTechStudios/manifest | 9 + .../DesperateAmateurs/DesperateAmateurs.yml | 31 + .../community/DesperateAmateurs/manifest | 9 + .../DesperatePleasuresXXX.yml | 48 + .../community/DesperatePleasuresXXX/manifest | 9 + .../scrapers/community/Deviante/Deviante.py | 92 + .../scrapers/community/Deviante/Deviante.yml | 99 + .../scrapers/community/Deviante/manifest | 10 + .../community/Dickdrainers/Dickdrainers.yml | 34 + .../scrapers/community/Dickdrainers/manifest | 9 + .../community/DigitalDesire/DigitalDesire.yml | 29 + .../scrapers/community/DigitalDesire/manifest | 9 + .../DigitalPlayground/DigitalPlayground.py | 66 + .../DigitalPlayground/DigitalPlayground.yml | 79 + .../community/DigitalPlayground/manifest | 10 + .../community/DirtyFlix/DirtyFlix.yml | 62 + .../scrapers/community/DirtyFlix/manifest | 9 + .../DogfartNetwork/DogfartNetwork.yml | 68 + .../community/DogfartNetwork/manifest | 9 + .../scrapers/community/DollsHub/DollsHub.yml | 42 + .../scrapers/community/DollsHub/manifest | 9 + .../community/DorcelClub/DorcelClub.yml | 78 + .../scrapers/community/DorcelClub/manifest | 9 + .../community/DorcelVision/DorcelVision.yml | 88 + .../scrapers/community/DorcelVision/manifest | 9 + .../community/DreamTranny/DreamTranny.yml | 79 + .../scrapers/community/DreamTranny/manifest | 9 + .../DreamsOfSpanking/DreamsOfSpanking.yml | 44 + .../community/DreamsOfSpanking/manifest | 9 + .../scrapers/community/EastBoys/EastBoys.yml | 44 + .../scrapers/community/EastBoys/manifest | 9 + .../community/EliteBabes/EliteBabes.yml | 44 + .../scrapers/community/EliteBabes/manifest | 9 + .../community/EmilyBloom/EmilyBloom.yml | 46 + .../scrapers/community/EmilyBloom/manifest | 9 + .../community/EnglishLads/EnglishLads.yml | 154 + .../scrapers/community/EnglishLads/manifest | 9 + .../scrapers/community/EnjoyX/EnjoyX.yml | 31 + .../config/scrapers/community/EnjoyX/manifest | 9 + .../scrapers/community/Eporner/Eporner.yml | 28 + .../scrapers/community/Eporner/manifest | 9 + .../EricJohnsSexAdventures.yml | 27 + .../community/EricJohnsSexAdventures/manifest | 9 + .../community/EricVideos/EricVideos.yml | 67 + .../scrapers/community/EricVideos/manifest | 9 + .../config/scrapers/community/Erito/Erito.yml | 72 + .../config/scrapers/community/Erito/manifest | 9 + .../community/EroProfile/EroProfile.yml | 21 + .../scrapers/community/EroProfile/manifest | 9 + .../community/EvilAngel/EvilAngel.yml | 61 + .../scrapers/community/EvilAngel/manifest | 9 + .../EvilAngelStore/EvilAngelStore.yml | 49 + .../community/EvilAngelStore/manifest | 9 + .../community/ExpliciteArt/ExpliciteArt.yml | 49 + .../scrapers/community/ExpliciteArt/manifest | 9 + .../community/ExploitedX/ExploitedX.yml | 93 + .../scrapers/community/ExploitedX/manifest | 9 + .../community/ExtraPackage/ExtraPackage.yml | 76 + .../scrapers/community/ExtraPackage/manifest | 9 + .../config/scrapers/community/FFCSH/FFCSH.yml | 54 + .../config/scrapers/community/FFCSH/manifest | 9 + .../community/FFstockings/FFstockings.yml | 24 + .../scrapers/community/FFstockings/manifest | 9 + stash/config/scrapers/community/FILF/FILF.yml | 24 + stash/config/scrapers/community/FILF/manifest | 9 + stash/config/scrapers/community/FTV/FTV.yml | 33 + stash/config/scrapers/community/FTV/manifest | 9 + .../scrapers/community/FakeHub/FakeHub.py | 77 + .../scrapers/community/FakeHub/FakeHub.yml | 89 + .../scrapers/community/FakeHub/manifest | 10 + .../community/FalconStudios/FalconStudios.yml | 32 + .../scrapers/community/FalconStudios/manifest | 9 + .../FamilySexMassage/FamilySexMassage.yml | 37 + .../community/FamilySexMassage/manifest | 9 + .../FamilyTherapyXXX/FamilyTherapyXXX.yml | 49 + .../community/FamilyTherapyXXX/manifest | 9 + .../FantasyMassage/FantasyMassage.yml | 40 + .../community/FantasyMassage/manifest | 9 + .../scrapers/community/FapHouse/FapHouse.yml | 28 + .../scrapers/community/FapHouse/manifest | 9 + .../scrapers/community/Femanic/Femanic.yml | 25 + .../scrapers/community/Femanic/manifest | 9 + .../community/FemdomEmpire/FemdomEmpire.yml | 65 + .../scrapers/community/FemdomEmpire/manifest | 9 + .../scrapers/community/Femjoy/Femjoy.yml | 73 + .../config/scrapers/community/Femjoy/manifest | 9 + .../community/FetishNetwork/FetishNetwork.yml | 80 + .../scrapers/community/FetishNetwork/manifest | 9 + .../community/FetishPro/FetishPro.yml | 26 + .../scrapers/community/FetishPro/manifest | 9 + .../community/FileMetadata/FileMetadata.py | 83 + .../community/FileMetadata/FileMetadata.yml | 9 + .../scrapers/community/FileMetadata/manifest | 10 + .../FileMetadata_Windows.ps1 | 119 + .../FileMetadata_Windows.yml | 11 + .../community/FileMetadata_Windows/manifest | 10 + .../scrapers/community/Filename/Filename.py | 57 + .../scrapers/community/Filename/Filename.yml | 10 + .../scrapers/community/Filename/manifest | 10 + .../community/FilthFlix/FilthFlix.yml | 27 + .../scrapers/community/FilthFlix/manifest | 9 + .../community/FilthyFamily/FilthyFamily.yml | 43 + .../scrapers/community/FilthyFamily/manifest | 9 + .../FinishesTheJob/FinishesTheJob.yml | 44 + .../community/FinishesTheJob/manifest | 9 + .../Firstanalquest/Firstanalquest.yml | 34 + .../community/Firstanalquest/manifest | 9 + .../community/Fistertwister/Fistertwister.yml | 25 + .../scrapers/community/Fistertwister/manifest | 9 + .../FistingInferno/FistingInferno.yml | 40 + .../community/FistingInferno/manifest | 9 + .../config/scrapers/community/Fit18/Fit18.py | 208 + .../config/scrapers/community/Fit18/Fit18.yml | 12 + .../config/scrapers/community/Fit18/manifest | 10 + .../community/FittingRoom/FittingRoom.yml | 42 + .../scrapers/community/FittingRoom/manifest | 9 + .../FootFetishDaily/FootFetishDaily.yml | 159 + .../community/FootFetishDaily/manifest | 9 + .../community/FragileSlave/FragileSlave.yml | 40 + .../scrapers/community/FragileSlave/manifest | 9 + .../FrankfurtSexStories.yml | 41 + .../community/FrankfurtSexStories/manifest | 9 + .../config/scrapers/community/FratX/FratX.py | 160 + .../config/scrapers/community/FratX/FratX.yml | 18 + .../config/scrapers/community/FratX/manifest | 10 + .../FreeonesCommunity/FreeonesCommunity.yml | 204 + .../community/FreeonesCommunity/manifest | 9 + .../community/FreeonesStore/FreeonesStore.yml | 70 + .../scrapers/community/FreeonesStore/manifest | 9 + .../community/Frenchtwinks/Frenchtwinks.yml | 26 + .../scrapers/community/Frenchtwinks/manifest | 9 + .../scrapers/community/Freshmen/Freshmen.yml | 23 + .../scrapers/community/Freshmen/manifest | 9 + .../scrapers/community/FrolicMe/FrolicMe.yml | 38 + .../scrapers/community/FrolicMe/manifest | 9 + .../community/FuckedHard18/FuckedHard18.yml | 32 + .../scrapers/community/FuckedHard18/manifest | 9 + .../community/Fuckermate/Fuckermate.yml | 26 + .../scrapers/community/Fuckermate/manifest | 9 + .../FuckingAwesome/FuckingAwesome.yml | 30 + .../community/FuckingAwesome/manifest | 9 + .../community/Futanarica/Futanarica.yml | 26 + .../scrapers/community/Futanarica/manifest | 9 + stash/config/scrapers/community/GASM/GASM.yml | 29 + stash/config/scrapers/community/GASM/manifest | 9 + stash/config/scrapers/community/GEVI/GEVI.py | 300 + stash/config/scrapers/community/GEVI/GEVI.yml | 47 + stash/config/scrapers/community/GEVI/manifest | 10 + stash/config/scrapers/community/GIGA/GIGA.yml | 135 + stash/config/scrapers/community/GIGA/manifest | 9 + .../GammaEntertainment/GammaEntertainment.yml | 202 + .../community/GammaEntertainment/manifest | 9 + .../GangBangCreampie/GangBangCreampie.yml | 40 + .../community/GangBangCreampie/manifest | 9 + .../GayAdultEmpire/GayAdultEmpire.yml | 104 + .../community/GayAdultEmpire/manifest | 9 + .../scrapers/community/GayWire/GayWire.py | 89 + .../scrapers/community/GayWire/GayWire.yml | 76 + .../scrapers/community/GayWire/manifest | 10 + .../community/GenderXFilms/GenderXFilms.yml | 49 + .../scrapers/community/GenderXFilms/manifest | 9 + .../Girlfriendsfilms/Girlfriendsfilms.yml | 49 + .../community/Girlfriendsfilms/manifest | 9 + .../community/GirlsOfPB/GirlsOfPB.yml | 97 + .../scrapers/community/GirlsOfPB/manifest | 9 + .../community/GirlsOutWest/GirlsOutWest.yml | 96 + .../scrapers/community/GirlsOutWest/manifest | 9 + .../community/GirlsRimming/GirlsRimming.yml | 33 + .../scrapers/community/GirlsRimming/manifest | 9 + .../GirlsUnderArrest/GirlsUnderArrest.yml | 39 + .../community/GirlsUnderArrest/manifest | 9 + .../scrapers/community/Girlsway/Girlsway.yml | 40 + .../scrapers/community/Girlsway/manifest | 9 + .../scrapers/community/Glamose/Glamose.yml | 105 + .../scrapers/community/Glamose/manifest | 9 + .../GloryHoleSwallow/GloryHoleSwallow.yml | 40 + .../community/GloryHoleSwallow/manifest | 9 + .../Gloryholesecrets/Gloryholesecrets.yml | 40 + .../community/Gloryholesecrets/manifest | 9 + .../GlossTightsGlamour/GlossTightsGlamour.yml | 31 + .../community/GlossTightsGlamour/manifest | 9 + .../community/GoddessSnow/GoddessSnow.yml | 81 + .../scrapers/community/GoddessSnow/manifest | 9 + .../community/GroobyClub/GroobyClub.yml | 78 + .../scrapers/community/GroobyClub/manifest | 9 + .../GroobyNetwork-Brazilian.yml | 37 + .../GroobyNetwork-Brazilian/manifest | 9 + .../GroobyNetwork-Partial.yml | 104 + .../community/GroobyNetwork-Partial/manifest | 9 + .../GuysInSweatpants/GuysInSweatpants.yml | 97 + .../community/GuysInSweatpants/manifest | 9 + .../scrapers/community/GymRotic/GymRotic.yml | 39 + .../scrapers/community/GymRotic/manifest | 9 + .../scrapers/community/HDPorn/HDPorn.yml | 25 + .../config/scrapers/community/HDPorn/manifest | 9 + .../scrapers/community/HQPorner/HQPorner.yml | 43 + .../scrapers/community/HQPorner/manifest | 9 + .../HandDomination/HandDomination.yml | 33 + .../community/HandDomination/manifest | 9 + .../community/HarmonyVision/HarmonyVision.yml | 43 + .../scrapers/community/HarmonyVision/manifest | 9 + .../HeavyOnHotties/HeavyOnHotties.yml | 32 + .../community/HeavyOnHotties/manifest | 9 + .../config/scrapers/community/Hegre/Hegre.yml | 152 + .../config/scrapers/community/Hegre/manifest | 9 + .../community/HelixStudios/HelixStudios.yml | 143 + .../scrapers/community/HelixStudios/manifest | 9 + .../community/HentaiPros/HentaiPros.yml | 64 + .../scrapers/community/HentaiPros/manifest | 9 + .../scrapers/community/Hentaied/Hentaied.yml | 55 + .../scrapers/community/Hentaied/manifest | 9 + .../config/scrapers/community/Heyzo/Heyzo.yml | 53 + .../config/scrapers/community/Heyzo/manifest | 9 + .../community/HimerosTV/HimerosTV.yml | 38 + .../scrapers/community/HimerosTV/manifest | 9 + .../community/Hitzefrei/Hitzefrei.yml | 71 + .../scrapers/community/Hitzefrei/manifest | 9 + .../scrapers/community/HmvMania/HmvMania.yml | 59 + .../scrapers/community/HmvMania/manifest | 9 + .../community/HobbyPorn/HobbyPorn.yml | 40 + .../scrapers/community/HobbyPorn/manifest | 9 + .../community/HollyRandall/HollyRandall.yml | 35 + .../scrapers/community/HollyRandall/manifest | 9 + .../community/Hotmovies/Hotmovies.yml | 151 + .../scrapers/community/Hotmovies/manifest | 9 + .../community/HouseOfGord/HouseOfGord.yml | 43 + .../scrapers/community/HouseOfGord/manifest | 9 + .../scrapers/community/Hucows/Hucows.yml | 31 + .../config/scrapers/community/Hucows/manifest | 9 + .../scrapers/community/Hustler/Hustler.yml | 71 + .../scrapers/community/Hustler/manifest | 9 + .../community/Hypnotube/Hypnotube.yml | 49 + .../scrapers/community/Hypnotube/manifest | 9 + stash/config/scrapers/community/IAFD/IAFD.py | 480 + stash/config/scrapers/community/IAFD/IAFD.yml | 34 + stash/config/scrapers/community/IAFD/manifest | 10 + .../community/IFeelMyself/IFeelMyself.py | 298 + .../community/IFeelMyself/IFeelMyself.yml | 30 + .../scrapers/community/IFeelMyself/manifest | 10 + .../community/IKissGirls/IKissGirls.yml | 36 + .../scrapers/community/IKissGirls/manifest | 9 + stash/config/scrapers/community/IMDB/IMDB.yml | 145 + stash/config/scrapers/community/IMDB/manifest | 9 + .../community/IWantClips/IWantClips.yml | 94 + .../scrapers/community/IWantClips/manifest | 9 + .../community/IafdStreaming/IafdStreaming.yml | 54 + .../scrapers/community/IafdStreaming/manifest | 9 + .../community/InTheCrack/InTheCrack.yml | 51 + .../scrapers/community/InTheCrack/manifest | 9 + .../community/IncestFlix/IncestFlix.yml | 34 + .../scrapers/community/IncestFlix/manifest | 9 + .../scrapers/community/InnOfSin/InnOfSin.yml | 53 + .../scrapers/community/InnOfSin/manifest | 9 + .../InterracialPass/InterracialPass.yml | 31 + .../community/InterracialPass/manifest | 9 + .../Interracialvision/Interracialvision.yml | 50 + .../community/Interracialvision/manifest | 9 + .../scrapers/community/ItsPOV/ItsPOV.yml | 106 + .../config/scrapers/community/ItsPOV/manifest | 9 + .../config/scrapers/community/Iwara/Iwara.yml | 41 + .../config/scrapers/community/Iwara/manifest | 9 + .../scrapers/community/JBVideo/JBVideo.yml | 25 + .../scrapers/community/JBVideo/manifest | 9 + .../JacquieEtMichelElite.yml | 87 + .../community/JacquieEtMichelElite/manifest | 9 + .../JacquieEtMichelTV/JacquieEtMichelTV.py | 98 + .../JacquieEtMichelTV/JacquieEtMichelTV.yml | 18 + .../community/JacquieEtMichelTV/manifest | 10 + .../scrapers/community/JapanHDV/JapanHDV.yml | 88 + .../scrapers/community/JapanHDV/manifest | 9 + .../community/JapornXXX/JapornXXX.yml | 30 + .../scrapers/community/JapornXXX/manifest | 9 + .../scrapers/community/JavBus/JavBus.yml | 104 + .../config/scrapers/community/JavBus/manifest | 9 + .../config/scrapers/community/JavHD/JavHD.yml | 63 + .../config/scrapers/community/JavHD/manifest | 9 + .../scrapers/community/JavHub/JavHub.yml | 60 + .../config/scrapers/community/JavHub/manifest | 9 + .../scrapers/community/JavLand/JavLand.yml | 61 + .../scrapers/community/JavLand/manifest | 9 + .../community/JavLibrary/JavLibrary.yml | 102 + .../scrapers/community/JavLibrary/manifest | 9 + .../JavLibrary_python/JavLibrary_python.py | 938 + .../JavLibrary_python/JavLibrary_python.yml | 21 + .../community/JavLibrary_python/manifest | 10 + .../community/JaxSlayher/JaxSlayher.yml | 70 + .../scrapers/community/JaxSlayher/manifest | 9 + .../scrapers/community/Jeedoo/Jeedoo.yml | 82 + .../config/scrapers/community/Jeedoo/manifest | 9 + .../scrapers/community/Jellyfin/Jellyfin.py | 296 + .../scrapers/community/Jellyfin/Jellyfin.yml | 56 + .../scrapers/community/Jellyfin/manifest | 10 + stash/config/scrapers/community/Jhdv/Jhdv.yml | 45 + stash/config/scrapers/community/Jhdv/manifest | 9 + .../JimWeathersArchives.yml | 47 + .../community/JimWeathersArchives/manifest | 9 + .../community/Johnnyrapid/Johnnyrapid.yml | 40 + .../scrapers/community/Johnnyrapid/manifest | 9 + .../scrapers/community/JoyBear/JoyBear.yml | 43 + .../scrapers/community/JoyBear/manifest | 9 + .../community/JulesJordan/JulesJordan.yml | 158 + .../scrapers/community/JulesJordan/manifest | 9 + .../community/KBProductions/KBProductions.py | 315 + .../community/KBProductions/KBProductions.yml | 154 + .../scrapers/community/KBProductions/manifest | 10 + .../Karissa-Diamond/Karissa-Diamond.yml | 57 + .../community/Karissa-Diamond/manifest | 9 + .../scrapers/community/Karups/Karups.yml | 55 + .../config/scrapers/community/Karups/manifest | 9 + .../KellyMadisonMedia/KellyMadisonMedia.yml | 61 + .../community/KellyMadisonMedia/manifest | 9 + .../community/Killergram/Killergram.yml | 67 + .../scrapers/community/Killergram/manifest | 9 + .../community/KimHolland/KimHolland.yml | 64 + .../scrapers/community/KimHolland/manifest | 9 + .../community/Kin8tengoku/Kin8tengoku.yml | 35 + .../scrapers/community/Kin8tengoku/manifest | 9 + stash/config/scrapers/community/Kink/Kink.yml | 231 + stash/config/scrapers/community/Kink/manifest | 9 + .../scrapers/community/KinkBomb/KinkBomb.yml | 42 + .../scrapers/community/KinkBomb/manifest | 9 + .../scrapers/community/KinkMen/KinkMen.yml | 95 + .../scrapers/community/KinkMen/manifest | 9 + .../KinkyMistresses/KinkyMistresses.yml | 27 + .../community/KinkyMistresses/manifest | 9 + .../scrapers/community/Kpopping/Kpopping.yml | 82 + .../scrapers/community/Kpopping/manifest | 9 + .../community/KristenBjorn/KristenBjorn.yml | 117 + .../scrapers/community/KristenBjorn/manifest | 9 + .../community/LadyboyGold/LadyboyGold.yml | 88 + .../scrapers/community/LadyboyGold/manifest | 9 + .../community/Lasublime/Lasublime.yml | 26 + .../scrapers/community/Lasublime/manifest | 9 + .../community/LetThemWatch/LetThemWatch.yml | 38 + .../scrapers/community/LetThemWatch/manifest | 9 + .../community/LetsDoeIt/LetsDoeIt.yml | 59 + .../scrapers/community/LetsDoeIt/manifest | 9 + .../community/LewRubens/LewRubens.yml | 22 + .../scrapers/community/LewRubens/manifest | 9 + .../scrapers/community/LexiDona/LexiDona.yml | 25 + .../scrapers/community/LexiDona/manifest | 9 + .../LittleCapriceDreams.yml | 41 + .../community/LittleCapriceDreams/manifest | 9 + .../community/LoneStarAngel/LoneStarAngel.yml | 30 + .../scrapers/community/LoneStarAngel/manifest | 9 + .../community/LordAardvark/LordAardvark.yml | 94 + .../scrapers/community/LordAardvark/manifest | 9 + .../community/LoveHerFilms/LoveHerFilms.yml | 170 + .../scrapers/community/LoveHerFilms/manifest | 9 + .../scrapers/community/Loyalfans/Loyalfans.py | 179 + .../community/Loyalfans/Loyalfans.yml | 12 + .../scrapers/community/Loyalfans/manifest | 11 + .../community/Loyalfans/requirements.txt | 3 + .../LucasEntertainment/LucasEntertainment.yml | 88 + .../community/LucasEntertainment/manifest | 9 + .../community/LustCinema/LustCinema.yml | 39 + .../scrapers/community/LustCinema/manifest | 9 + .../scrapers/community/Lustery/Lustery.yml | 109 + .../scrapers/community/Lustery/manifest | 9 + stash/config/scrapers/community/MFC/MFC.yml | 82 + stash/config/scrapers/community/MFC/manifest | 9 + .../community/MMP_Network/MMP_Network.yml | 50 + .../scrapers/community/MMP_Network/manifest | 9 + .../community/MPLStudios/MPLStudios.yml | 64 + .../scrapers/community/MPLStudios/manifest | 9 + stash/config/scrapers/community/MVG/MVG.yml | 47 + stash/config/scrapers/community/MVG/manifest | 9 + stash/config/scrapers/community/MYLF/MYLF.yml | 11 + .../config/scrapers/community/MYLF/MYLFAPI.py | 124 + stash/config/scrapers/community/MYLF/manifest | 10 + .../community/MadeInCanada/MadeInCanada.yml | 25 + .../scrapers/community/MadeInCanada/manifest | 9 + .../config/scrapers/community/Madou/Madou.yml | 32 + .../config/scrapers/community/Madou/manifest | 9 + .../community/Mandyflores/Mandyflores.yml | 29 + .../scrapers/community/Mandyflores/manifest | 9 + .../scrapers/community/ManyVids/ManyVids.yml | 139 + .../scrapers/community/ManyVids/manifest | 9 + .../scrapers/community/MariskaX/MariskaX.yml | 39 + .../scrapers/community/MariskaX/manifest | 9 + .../community/MarsMedia/MarsMedia.yml | 54 + .../scrapers/community/MarsMedia/manifest | 9 + .../scrapers/community/Masqulin/Masqulin.yml | 26 + .../scrapers/community/Masqulin/manifest | 9 + .../scrapers/community/MatureNL/MatureNL.yml | 75 + .../scrapers/community/MatureNL/manifest | 9 + .../community/MaxHardcore/MaxHardcore.yml | 33 + .../scrapers/community/MaxHardcore/manifest | 9 + .../community/MeanBitches/MeanBitches.yml | 58 + .../scrapers/community/MeanBitches/manifest | 9 + .../community/MeanaWolf/MeanaWolf.yml | 32 + .../scrapers/community/MeanaWolf/manifest | 9 + .../community/MelonJuggler/MelonJuggler.yml | 35 + .../scrapers/community/MelonJuggler/manifest | 9 + stash/config/scrapers/community/Men/Men.py | 85 + stash/config/scrapers/community/Men/Men.yml | 113 + stash/config/scrapers/community/Men/manifest | 10 + .../community/MenAtPlay/MenAtPlay.yml | 29 + .../scrapers/community/MenAtPlay/manifest | 9 + .../community/MenOver30/MenOver30.yml | 42 + .../scrapers/community/MenOver30/manifest | 9 + .../community/MetalBondage/MetalBondage.yml | 40 + .../scrapers/community/MetalBondage/manifest | 9 + .../scrapers/community/MetroHD/MetroHD.py | 83 + .../scrapers/community/MetroHD/MetroHD.yml | 92 + .../scrapers/community/MetroHD/manifest | 10 + .../MileHighMedia_BiandTrans.py | 76 + .../MileHighMedia_BiandTrans.yml | 79 + .../MileHighMedia_BiandTrans/manifest | 10 + .../MileHighMedia_Gay/MileHighMedia_Gay.py | 70 + .../MileHighMedia_Gay/MileHighMedia_Gay.yml | 79 + .../community/MileHighMedia_Gay/manifest | 10 + .../MileHighMedia_Straight.py | 96 + .../MileHighMedia_Straight.yml | 109 + .../community/MileHighMedia_Straight/manifest | 10 + .../scrapers/community/MilfTugs/MilfTugs.yml | 73 + .../scrapers/community/MilfTugs/manifest | 9 + .../scrapers/community/Milovana/Milovana.yml | 66 + .../scrapers/community/Milovana/manifest | 9 + .../community/Minnano-AV/Minnano-AV.py | 379 + .../community/Minnano-AV/Minnano-AV.yml | 19 + .../scrapers/community/Minnano-AV/manifest | 11 + .../community/Minnano-AV/requirements.txt | 2 + .../community/MissAV_en/MissAV_en.yml | 50 + .../scrapers/community/MissAV_en/manifest | 9 + .../community/MissAV_jp/MissAV_jp.yml | 50 + .../scrapers/community/MissAV_jp/manifest | 9 + .../MissMedeaMortelle/MissMedeaMortelle.yml | 32 + .../community/MissMedeaMortelle/manifest | 9 + .../scrapers/community/MissaX/MissaX.py | 136 + .../scrapers/community/MissaX/MissaX.yml | 14 + .../config/scrapers/community/MissaX/manifest | 10 + .../ModelCentroAPI/ModelCentroAPI.py | 150 + .../ModelCentroAPI/ModelCentroAPI.yml | 23 + .../community/ModelCentroAPI/manifest | 10 + .../community/ModelMediaUS/ModelMediaUS.yml | 51 + .../scrapers/community/ModelMediaUS/manifest | 9 + .../scrapers/community/Modelhub/Modelhub.yml | 115 + .../scrapers/community/Modelhub/manifest | 9 + .../config/scrapers/community/Mofos/Mofos.py | 76 + .../config/scrapers/community/Mofos/Mofos.yml | 94 + .../config/scrapers/community/Mofos/manifest | 10 + .../community/Mormongirlz/Mormongirlz.yml | 34 + .../scrapers/community/Mormongirlz/manifest | 9 + .../community/Motherless/Motherless.yml | 26 + .../scrapers/community/Motherless/manifest | 9 + .../community/Mousouzoku/Mousouzoku.yml | 95 + .../scrapers/community/Mousouzoku/manifest | 9 + .../community/MrBigFatDick/MrBigFatDick.yml | 68 + .../scrapers/community/MrBigFatDick/manifest | 9 + .../community/MugFucked/MugFucked.yml | 24 + .../scrapers/community/MugFucked/manifest | 9 + .../community/MyCherryCrush/MyCherryCrush.yml | 59 + .../scrapers/community/MyCherryCrush/manifest | 9 + .../community/MyDirtyHobby/MyDirtyHobby.yml | 101 + .../scrapers/community/MyDirtyHobby/manifest | 9 + .../community/MySweetApple/MySweetApple.yml | 31 + .../scrapers/community/MySweetApple/manifest | 9 + .../community/Mypervmom/Mypervmom.yml | 46 + .../scrapers/community/Mypervmom/manifest | 9 + .../community/NVGNetwork/NVGNetwork.yml | 51 + .../scrapers/community/NVGNetwork/manifest | 9 + .../community/NakedSword/NakedSword.yml | 83 + .../scrapers/community/NakedSword/manifest | 9 + .../community/NaughtyAlysha/NaughtyAlysha.yml | 35 + .../scrapers/community/NaughtyAlysha/manifest | 9 + .../NaughtyAmerica/NaughtyAmerica.yml | 35 + .../community/NaughtyAmerica/manifest | 9 + .../NaughtyAmericaVR/NaughtyAmericaVR.yml | 38 + .../community/NaughtyAmericaVR/manifest | 9 + .../NaughtyNatural/NaughtyNatural.yml | 53 + .../community/NaughtyNatural/manifest | 9 + .../NewSensationsMain/NewSensationsMain.yml | 55 + .../community/NewSensationsMain/manifest | 9 + .../NewSensationsNetworkSites.yml | 58 + .../NewSensationsNetworkSites/manifest | 9 + .../community/Newgrounds/Newgrounds.yml | 49 + .../scrapers/community/Newgrounds/manifest | 9 + .../NextDoorStudios/NextDoorStudios.yml | 49 + .../community/NextDoorStudios/manifest | 9 + .../community/NikkiAndTera/NikkiAndTera.yml | 38 + .../scrapers/community/NikkiAndTera/manifest | 9 + .../community/NoelAlejandro/NoelAlejandro.yml | 36 + .../scrapers/community/NoelAlejandro/manifest | 9 + .../community/Noodledude/Noodledude.yml | 41 + .../scrapers/community/Noodledude/manifest | 9 + .../scrapers/community/Nubiles/Nubiles.yml | 244 + .../scrapers/community/Nubiles/manifest | 9 + .../community/OldGoesYoung/OldGoesYoung.yml | 29 + .../scrapers/community/OldGoesYoung/manifest | 9 + .../scrapers/community/OldNanny/OldNanny.yml | 39 + .../scrapers/community/OldNanny/manifest | 9 + .../config/scrapers/community/Oldje/Oldje.yml | 54 + .../config/scrapers/community/Oldje/manifest | 9 + .../community/Only3xGirls/Only3xGirls.yml | 42 + .../scrapers/community/Only3xGirls/manifest | 9 + .../community/OnlyTarts/OnlyTarts.yml | 33 + .../scrapers/community/OnlyTarts/manifest | 9 + .../community/OopsFamily/OopsFamily.yml | 35 + .../scrapers/community/OopsFamily/manifest | 9 + .../scrapers/community/Oreno3d/Oreno3d.yml | 56 + .../scrapers/community/Oreno3d/manifest | 9 + .../community/PKFStudios/PKFStudios.yml | 57 + .../scrapers/community/PKFStudios/manifest | 9 + .../scrapers/community/PMVHaven/PMVHaven.py | 122 + .../scrapers/community/PMVHaven/PMVHaven.yml | 20 + .../scrapers/community/PMVHaven/manifest | 10 + stash/config/scrapers/community/POVR/POVR.yml | 116 + stash/config/scrapers/community/POVR/manifest | 9 + .../scrapers/community/POVTrain/POVTrain.yml | 58 + .../scrapers/community/POVTrain/manifest | 9 + stash/config/scrapers/community/Paco/Paco.yml | 50 + stash/config/scrapers/community/Paco/manifest | 9 + .../scrapers/community/PacoJp/PacoJp.yml | 48 + .../config/scrapers/community/PacoJp/manifest | 9 + .../PaperStreetMedia/PaperStreetMedia.yml | 144 + .../community/PaperStreetMedia/manifest | 9 + .../community/Passionxxx/Passionxxx.yml | 32 + .../scrapers/community/Passionxxx/manifest | 9 + .../PegasProductions/PegasProductions.yml | 119 + .../community/PegasProductions/manifest | 9 + .../community/Penthouse/Penthouse.yml | 30 + .../scrapers/community/Penthouse/manifest | 9 + .../community/PerfectGonzo/PerfectGonzo.py | 101 + .../community/PerfectGonzo/PerfectGonzo.yml | 64 + .../scrapers/community/PerfectGonzo/manifest | 10 + .../scrapers/community/PervCity/PervCity.yml | 59 + .../scrapers/community/PervCity/manifest | 9 + .../community/Philavise/Philavise.yml | 30 + .../scrapers/community/Philavise/manifest | 9 + .../community/PinkLabelTV/PinkLabelTV.yml | 80 + .../scrapers/community/PinkLabelTV/manifest | 9 + .../community/PinkVisual/PinkVisual.yml | 32 + .../scrapers/community/PinkVisual/manifest | 9 + .../community/Pinkoclub/Pinkoclub.yml | 44 + .../scrapers/community/Pinkoclub/manifest | 9 + .../community/PinupDollars/PinupDollars.yml | 38 + .../scrapers/community/PinupDollars/manifest | 9 + .../scrapers/community/PissPlay/PissPlay.yml | 33 + .../scrapers/community/PissPlay/manifest | 9 + .../community/PissyNetwork/PissyNetwork.yml | 27 + .../scrapers/community/PissyNetwork/manifest | 9 + .../community/PlayboyPlus/PlayboyPlus.yml | 53 + .../scrapers/community/PlayboyPlus/manifest | 9 + .../community/PlayboyTV/PlayboyTV.yml | 30 + .../scrapers/community/PlayboyTV/manifest | 9 + .../community/PlumperPass/PlumperPass.yml | 41 + .../scrapers/community/PlumperPass/manifest | 9 + .../scrapers/community/Plushies/Plushies.yml | 60 + .../scrapers/community/Plushies/manifest | 9 + .../PornDudeCasting/PornDudeCasting.yml | 91 + .../community/PornDudeCasting/manifest | 9 + .../scrapers/community/PornHex/PornHex.yml | 49 + .../scrapers/community/PornHex/manifest | 9 + .../scrapers/community/Pornbox/Pornbox.yml | 80 + .../scrapers/community/Pornbox/manifest | 9 + .../scrapers/community/Porncz/Porncz.yml | 70 + .../config/scrapers/community/Porncz/manifest | 9 + .../community/Pornditos/Pornditos.yml | 63 + .../scrapers/community/Pornditos/manifest | 9 + .../scrapers/community/Pornhub/Pornhub.yml | 143 + .../scrapers/community/Pornhub/manifest | 9 + .../PornhubPremium/PornhubPremium.yml | 124 + .../community/PornhubPremium/manifest | 9 + .../PornsiteManager/PornsiteManager.yml | 140 + .../community/PornsiteManager/manifest | 9 + .../PornstarPlatinum/PornstarPlatinum.yml | 32 + .../community/PornstarPlatinum/manifest | 9 + .../PortaGloryhole/PortaGloryhole.yml | 52 + .../community/PortaGloryhole/manifest | 9 + .../PremiumBukkake/PremiumBukkake.py | 123 + .../PremiumBukkake/PremiumBukkake.yml | 10 + .../community/PremiumBukkake/manifest | 10 + .../scrapers/community/Private/Private.yml | 165 + .../scrapers/community/Private/manifest | 9 + .../community/ProducersFun/ProducersFun.yml | 27 + .../scrapers/community/ProducersFun/manifest | 9 + .../community/PropertySex/PropertySex.py | 69 + .../community/PropertySex/PropertySex.yml | 79 + .../scrapers/community/PropertySex/manifest | 10 + .../PuffyNetworkSite/PuffyNetworkSite.yml | 41 + .../community/PuffyNetworkSite/manifest | 9 + .../community/Puffynetwork/Puffynetwork.yml | 38 + .../scrapers/community/Puffynetwork/manifest | 9 + .../community/PureMedia/PureMedia.yml | 37 + .../scrapers/community/PureMedia/manifest | 9 + .../community/Putalocura/Putalocura.yml | 46 + .../scrapers/community/Putalocura/manifest | 9 + .../community/Queensnake/Queensnake.yml | 61 + .../scrapers/community/Queensnake/manifest | 9 + .../scrapers/community/R18.dev/R18.dev.yml | 430 + .../scrapers/community/R18.dev/manifest | 9 + .../community/RachelSteele/RachelSteele.yml | 56 + .../scrapers/community/RachelSteele/manifest | 9 + .../RagingStallion/RagingStallion.yml | 31 + .../community/RagingStallion/manifest | 9 + .../community/RandyBlue/RandyBlue.yml | 33 + .../scrapers/community/RandyBlue/manifest | 9 + .../community/RawFuckClub/RawFuckClub.yml | 30 + .../scrapers/community/RawFuckClub/manifest | 9 + .../community/RawRoadNation/RawRoadNation.yml | 28 + .../scrapers/community/RawRoadNation/manifest | 9 + .../community/RealJamVR/RealJamVR.yml | 50 + .../scrapers/community/RealJamVR/manifest | 9 + .../community/RealityDudes/RealityDudes.py | 69 + .../community/RealityDudes/RealityDudes.yml | 84 + .../scrapers/community/RealityDudes/manifest | 10 + .../community/RealityKings/RealityKings.py | 74 + .../community/RealityKings/RealityKings.yml | 185 + .../scrapers/community/RealityKings/manifest | 10 + .../community/RealityLovers/RealityLovers.py | 192 + .../community/RealityLovers/RealityLovers.yml | 41 + .../scrapers/community/RealityLovers/manifest | 10 + .../RedHotStraightBoys/RedHotStraightBoys.yml | 41 + .../community/RedHotStraightBoys/manifest | 9 + .../scrapers/community/Reddit/Reddit.yml | 40 + .../config/scrapers/community/Reddit/manifest | 9 + .../scrapers/community/Redgifs/Redgifs.py | 185 + .../scrapers/community/Redgifs/Redgifs.yml | 33 + .../scrapers/community/Redgifs/manifest | 10 + .../ReflectiveDesire/ReflectiveDesire.yml | 48 + .../community/ReflectiveDesire/manifest | 9 + .../RestrictedSenses/RestrictedSenses.yml | 29 + .../community/RestrictedSenses/manifest | 9 + .../community/RiggsFilms/RiggsFilms.yml | 33 + .../scrapers/community/RiggsFilms/manifest | 9 + .../community/RoccoSiffredi/RoccoSiffredi.yml | 49 + .../scrapers/community/RoccoSiffredi/manifest | 9 + .../RoyalFetishFilms/RoyalFetishFilms.yml | 40 + .../community/RoyalFetishFilms/manifest | 9 + .../community/Rule34Video/Rule34Video.yml | 77 + .../scrapers/community/Rule34Video/manifest | 9 + .../scrapers/community/SARJ-LLC/SARJ-LLC.py | 355 + .../scrapers/community/SARJ-LLC/SARJ-LLC.yml | 95 + .../scrapers/community/SARJ-LLC/manifest | 10 + .../community/SLRoriginals/SLRoriginals.yml | 62 + .../scrapers/community/SLRoriginals/manifest | 9 + .../scrapers/community/Sayuncle/Sayuncle.yml | 29 + .../scrapers/community/Sayuncle/manifest | 9 + .../community/ScrapeWithURL/ScrapeWithURL.py | 89 + .../community/ScrapeWithURL/ScrapeWithURL.yml | 10 + .../scrapers/community/ScrapeWithURL/manifest | 10 + .../scrapers/community/SeanCody/SeanCody.py | 54 + .../scrapers/community/SeanCody/SeanCody.yml | 74 + .../scrapers/community/SeanCody/manifest | 10 + .../community/SeeMomSuck/SeeMomSuck.yml | 33 + .../scrapers/community/SeeMomSuck/manifest | 9 + .../community/SelfieSuck/SelfieSuck.yml | 31 + .../scrapers/community/SelfieSuck/manifest | 9 + .../community/SexBabesVR/SexBabesVR.yml | 33 + .../scrapers/community/SexBabesVR/manifest | 9 + .../community/SexLikeReal/SexLikeReal.yml | 78 + .../scrapers/community/SexLikeReal/manifest | 9 + .../scrapers/community/SexMex/SexMex.yml | 42 + .../config/scrapers/community/SexMex/manifest | 9 + .../community/SexSelector/SexSelector.yml | 33 + .../scrapers/community/SexSelector/manifest | 9 + .../config/scrapers/community/SexVR/SexVR.yml | 86 + .../config/scrapers/community/SexVR/manifest | 9 + .../scrapers/community/SexyHub/SexyHub.py | 74 + .../scrapers/community/SexyHub/SexyHub.yml | 84 + .../scrapers/community/SexyHub/manifest | 10 + .../community/ShinyBound/ShinyBound.yml | 40 + .../scrapers/community/ShinyBound/manifest | 9 + .../scrapers/community/ShokoAPI/ShokoAPI.py | 196 + .../scrapers/community/ShokoAPI/ShokoAPI.yml | 11 + .../scrapers/community/ShokoAPI/config.py | 9 + .../scrapers/community/ShokoAPI/manifest | 11 + .../community/ShowyBeauty/ShowyBeauty.yml | 46 + .../scrapers/community/ShowyBeauty/manifest | 9 + .../scrapers/community/ShylaJ/ShylaJ.yml | 40 + .../config/scrapers/community/ShylaJ/manifest | 9 + .../community/Sinematica/Sinematica.yml | 55 + .../scrapers/community/Sinematica/manifest | 9 + .../scrapers/community/SinsLife/SinsLife.yml | 29 + .../scrapers/community/SinsLife/manifest | 9 + .../community/SlaveMouth/SlaveMouth.yml | 45 + .../scrapers/community/SlaveMouth/manifest | 9 + .../scrapers/community/Slim4k/Slim4k.yml | 43 + .../config/scrapers/community/Slim4k/manifest | 9 + .../community/SmokingMina/SmokingMina.yml | 29 + .../scrapers/community/SmokingMina/manifest | 9 + .../community/SmutPuppet/SmutPuppet.yml | 67 + .../scrapers/community/SmutPuppet/manifest | 9 + .../community/SpankBang/SpankBang.yml | 42 + .../scrapers/community/SpankBang/manifest | 9 + .../community/SpermMania/SpermMania.yml | 30 + .../scrapers/community/SpermMania/manifest | 9 + .../scrapers/community/Spizoo/Spizoo.yml | 81 + .../config/scrapers/community/Spizoo/manifest | 9 + .../scrapers/community/Spritzz/Spritzz.yml | 38 + .../scrapers/community/Spritzz/manifest | 9 + .../community/SpunkWorthy/SpunkWorthy.yml | 73 + .../scrapers/community/SpunkWorthy/manifest | 9 + .../scrapers/community/Squirted/Squirted.yml | 72 + .../scrapers/community/Squirted/manifest | 9 + .../scrapers/community/StasyQ/StasyQ.yml | 129 + .../config/scrapers/community/StasyQ/manifest | 9 + .../scrapers/community/StasyQVR/StasyQVR.yml | 33 + .../scrapers/community/StasyQVR/manifest | 9 + .../scrapers/community/Staxus/Staxus.yml | 395 + .../config/scrapers/community/Staxus/manifest | 9 + .../community/StrapOnCum/StrapOnCum.yml | 30 + .../scrapers/community/StrapOnCum/manifest | 9 + .../StraponDreamer/StraponDreamer.yml | 21 + .../community/StraponDreamer/manifest | 9 + .../scrapers/community/StripzVR/StripzVR.yml | 54 + .../scrapers/community/StripzVR/manifest | 9 + .../scrapers/community/Strokies/Strokies.yml | 42 + .../scrapers/community/Strokies/manifest | 9 + .../community/StudioFOW/StudioFOW.yml | 37 + .../scrapers/community/StudioFOW/manifest | 9 + .../community/SubbyHubby/SubbyHubby.yml | 72 + .../scrapers/community/SubbyHubby/manifest | 9 + .../community/SubmissiveX/SubmissiveX.yml | 27 + .../scrapers/community/SubmissiveX/manifest | 9 + .../community/SubspaceLand/SubspaceLand.yml | 34 + .../scrapers/community/SubspaceLand/manifest | 9 + .../community/SwallowBay/SwallowBay.yml | 33 + .../scrapers/community/SwallowBay/manifest | 9 + .../community/SweetFemdom/SweetFemdom.yml | 28 + .../scrapers/community/SweetFemdom/manifest | 9 + .../scrapers/community/SweetyX/SweetyX.yml | 31 + .../scrapers/community/SweetyX/manifest | 9 + .../community/SwingerBlog/SwingerBlog.yml | 27 + .../scrapers/community/SwingerBlog/manifest | 9 + .../community/TACAmateurs/TACAmateurs.yml | 28 + .../scrapers/community/TACAmateurs/manifest | 9 + stash/config/scrapers/community/TMDB/TMDB.yml | 96 + stash/config/scrapers/community/TMDB/manifest | 9 + .../community/TSPlayground/TSPlayground.yml | 35 + .../scrapers/community/TSPlayground/manifest | 9 + .../community/TabooHeat/TabooHeat.yml | 40 + .../scrapers/community/TabooHeat/manifest | 9 + .../TadpolexStudio/TadpolexStudio.yml | 42 + .../community/TadpolexStudio/manifest | 9 + .../scrapers/community/TakeVan/TakeVan.yml | 30 + .../scrapers/community/TakeVan/manifest | 9 + .../community/TaraTainton/TaraTainton.yml | 25 + .../scrapers/community/TaraTainton/manifest | 9 + .../community/Teamskeet/Teamskeet.yml | 11 + .../community/Teamskeet/TeamskeetAPI.py | 124 + .../scrapers/community/Teamskeet/manifest | 10 + .../community/TeenDreams/TeenDreams.yml | 43 + .../scrapers/community/TeenDreams/manifest | 9 + .../community/TeenMegaWorld/TeenMegaWorld.yml | 109 + .../scrapers/community/TeenMegaWorld/manifest | 9 + .../community/Teencoreclub/Teencoreclub.yml | 77 + .../scrapers/community/Teencoreclub/manifest | 9 + .../community/TeenyTaboo/TeenyTaboo.yml | 40 + .../scrapers/community/TeenyTaboo/manifest | 9 + .../community/Tenshigao/Tenshigao.yml | 170 + .../scrapers/community/Tenshigao/manifest | 9 + .../TesteDeFudelidade/TesteDeFudelidade.yml | 59 + .../community/TesteDeFudelidade/manifest | 9 + .../community/TexasBukkake/TexasBukkake.yml | 27 + .../scrapers/community/TexasBukkake/manifest | 9 + .../community/TheBroNetwork/TheBroNetwork.yml | 27 + .../scrapers/community/TheBroNetwork/manifest | 9 + .../community/TheFlourish/TheFlourish.yml | 41 + .../scrapers/community/TheFlourish/manifest | 9 + .../community/TheHabibShow/TheHabibShow.yml | 19 + .../scrapers/community/TheHabibShow/manifest | 9 + .../scrapers/community/TheNude/TheNude.yml | 99 + .../scrapers/community/TheNude/manifest | 9 + .../community/ThePornDBJAV/ThePornDBJAV.yml | 111 + .../scrapers/community/ThePornDBJAV/manifest | 9 + .../ThePornDBMovies/ThePornDBMovies.yml | 111 + .../community/ThePornDBMovies/manifest | 9 + .../community/TheScoreGroup/TheScoreGroup.py | 145 + .../community/TheScoreGroup/TheScoreGroup.yml | 249 + .../scrapers/community/TheScoreGroup/manifest | 10 + .../community/ThirdRockEnt/ThirdRockEnt.yml | 109 + .../scrapers/community/ThirdRockEnt/manifest | 9 + .../community/ThirdSexXXX/ThirdSexXXX.yml | 33 + .../scrapers/community/ThirdSexXXX/manifest | 9 + .../scrapers/community/ThisVid/ThisVid.yml | 54 + .../scrapers/community/ThisVid/manifest | 9 + .../scrapers/community/TimTales/TimTales.yml | 72 + .../scrapers/community/TimTales/manifest | 9 + .../Timestamp.trade/Timestamp.trade.yml | 92 + .../community/Timestamp.trade/manifest | 9 + .../scrapers/community/TitanMen/TitanMen.yml | 77 + .../scrapers/community/TitanMen/manifest | 9 + .../scrapers/community/Tokyohot/Tokyohot.py | 371 + .../scrapers/community/Tokyohot/Tokyohot.yml | 32 + .../scrapers/community/Tokyohot/manifest | 10 + .../Tonightsgirlfriend/Tonightsgirlfriend.yml | 37 + .../community/Tonightsgirlfriend/manifest | 9 + .../scrapers/community/Trans500/Trans500.yml | 74 + .../scrapers/community/Trans500/manifest | 9 + .../community/TransAngels/TransAngels.py | 60 + .../community/TransAngels/TransAngels.yml | 78 + .../scrapers/community/TransAngels/manifest | 10 + .../TransModelDatabase/TransModelDatabase.yml | 56 + .../community/TransModelDatabase/manifest | 9 + .../community/Transerotica/Transerotica.yml | 39 + .../scrapers/community/Transerotica/manifest | 9 + .../scrapers/community/Traxxx/Traxxx.py | 117 + .../scrapers/community/Traxxx/Traxxx.yml | 51 + .../config/scrapers/community/Traxxx/manifest | 11 + .../community/Traxxx/traxxx_interface.py | 608 + .../TreasureIslandMedia.yml | 34 + .../community/TreasureIslandMedia/manifest | 9 + .../community/TrikePatrol/TrikePatrol.yml | 90 + .../scrapers/community/TrikePatrol/manifest | 9 + .../community/TripForFuck/TripForFuck.yml | 36 + .../scrapers/community/TripForFuck/manifest | 9 + .../community/TrueAmateurs/TrueAmateurs.yml | 72 + .../scrapers/community/TrueAmateurs/manifest | 9 + .../scrapers/community/Tube8Vip/Tube8Vip.py | 61 + .../scrapers/community/Tube8Vip/Tube8Vip.yml | 74 + .../scrapers/community/Tube8Vip/manifest | 10 + .../scrapers/community/TugPass/TugPass.yml | 128 + .../scrapers/community/TugPass/manifest | 9 + .../community/TukTukPatrol/TukTukPatrol.yml | 77 + .../scrapers/community/TukTukPatrol/manifest | 9 + .../scrapers/community/Twistys/Twistys.py | 82 + .../scrapers/community/Twistys/Twistys.yml | 79 + .../scrapers/community/Twistys/manifest | 10 + .../community/TwoTGirls/TwoTGirls.yml | 23 + .../scrapers/community/TwoTGirls/manifest | 9 + .../community/UltraFilms/UltraFilms.yml | 33 + .../scrapers/community/UltraFilms/manifest | 9 + .../community/UnderHentai/UnderHentai.yml | 63 + .../scrapers/community/UnderHentai/manifest | 9 + .../scrapers/community/VNAGirls/VNAGirls.yml | 85 + .../scrapers/community/VNAGirls/manifest | 9 + .../community/VRBangers/VRBangers.yml | 97 + .../scrapers/community/VRBangers/manifest | 9 + .../scrapers/community/VRHush/VRHush.yml | 62 + .../config/scrapers/community/VRHush/manifest | 9 + .../scrapers/community/VRLatina/VRLatina.yml | 83 + .../scrapers/community/VRLatina/manifest | 9 + .../scrapers/community/VRPorn/VRPorn.yml | 36 + .../config/scrapers/community/VRPorn/manifest | 9 + .../VegasDreamsLLC/VegasDreamsLLC.yml | 64 + .../community/VegasDreamsLLC/manifest | 9 + .../VegasDreamworks/VegasDreamworks.yml | 28 + .../community/VegasDreamworks/manifest | 9 + .../VelvetVeronica/VelvetVeronica.yml | 36 + .../community/VelvetVeronica/manifest | 9 + .../config/scrapers/community/Vip4K/Vip4K.yml | 60 + .../config/scrapers/community/Vip4K/manifest | 9 + .../scrapers/community/Vipissy/Vipissy.yml | 61 + .../scrapers/community/Vipissy/manifest | 9 + .../community/VirtualPee/VirtualPee.yml | 31 + .../scrapers/community/VirtualPee/manifest | 9 + .../community/VirtualPorn/VirtualPorn.yml | 37 + .../scrapers/community/VirtualPorn/manifest | 9 + .../VirtualRealPorn/VirtualRealPorn.yml | 99 + .../community/VirtualRealPorn/manifest | 9 + .../community/VirtualTaboo/VirtualTaboo.yml | 58 + .../scrapers/community/VirtualTaboo/manifest | 9 + .../scrapers/community/Visit-X/Visit-X.yml | 26 + .../scrapers/community/Visit-X/manifest | 9 + .../config/scrapers/community/Vivid/Vivid.yml | 48 + .../config/scrapers/community/Vivid/manifest | 9 + .../community/Voyeurweb/Voyeurweb.yml | 28 + .../scrapers/community/Voyeurweb/manifest | 9 + stash/config/scrapers/community/Voyr/Voyr.yml | 72 + stash/config/scrapers/community/Voyr/manifest | 9 + .../config/scrapers/community/VrxDB/VrxDB.yml | 26 + .../config/scrapers/community/VrxDB/manifest | 9 + .../config/scrapers/community/WAPdB/WAPdB.py | 245 + .../config/scrapers/community/WAPdB/WAPdB.yml | 25 + .../config/scrapers/community/WAPdB/manifest | 10 + .../community/WOWGirlsBlog/WOWGirlsBlog.yml | 34 + .../scrapers/community/WOWGirlsBlog/manifest | 9 + .../community/WakeUpnFuck/WakeUpnFuck.yml | 63 + .../scrapers/community/WakeUpnFuck/manifest | 9 + .../community/WankItNow/WankItNow.yml | 52 + .../scrapers/community/WankItNow/manifest | 9 + .../community/Watch4Beauty/Watch4Beauty.yml | 129 + .../scrapers/community/Watch4Beauty/manifest | 9 + .../community/Watch4Fetish/Watch4Fetish.yml | 35 + .../scrapers/community/Watch4Fetish/manifest | 9 + .../community/WatchMyGF/WatchMyGF.yml | 22 + .../scrapers/community/WatchMyGF/manifest | 9 + .../community/WatchYouJerk/WatchYouJerk.yml | 31 + .../scrapers/community/WatchYouJerk/manifest | 9 + .../scrapers/community/Waybig/Waybig.yml | 84 + .../config/scrapers/community/Waybig/manifest | 9 + .../community/WeAreHairy/WeAreHairy.yml | 69 + .../scrapers/community/WeAreHairy/manifest | 9 + .../WeFuckBlackGirls/WeFuckBlackGirls.yml | 63 + .../community/WeFuckBlackGirls/manifest | 9 + .../community/WhisparrWDTV/WhisparrWDTV.py | 84 + .../community/WhisparrWDTV/WhisparrWDTV.yml | 8 + .../scrapers/community/WhisparrWDTV/manifest | 10 + .../scrapers/community/WhyNotBi/WhyNotBi.py | 57 + .../scrapers/community/WhyNotBi/WhyNotBi.yml | 74 + .../scrapers/community/WhyNotBi/manifest | 10 + .../scrapers/community/Wicked/Wicked.yml | 49 + .../config/scrapers/community/Wicked/manifest | 9 + .../community/WickedMovies/WickedMovies.yml | 23 + .../scrapers/community/WickedMovies/manifest | 9 + .../scrapers/community/WikiData/WikiData.yml | 153 + .../scrapers/community/WikiData/manifest | 9 + .../Williamhiggins/Williamhiggins.yml | 87 + .../community/Williamhiggins/manifest | 9 + .../WoodmancastingX/WoodmancastingX.yml | 66 + .../community/WoodmancastingX/manifest | 9 + .../WowNetworkVenus/WowNetworkVenus.py | 270 + .../WowNetworkVenus/WowNetworkVenus.yml | 24 + .../community/WowNetworkVenus/manifest | 11 + .../WowNetworkVenus/requirements.txt | 2 + .../scrapers/community/WowPorn/WowPorn.yml | 35 + .../scrapers/community/WowPorn/manifest | 9 + .../scrapers/community/Wtfpass/Wtfpass.yml | 47 + .../scrapers/community/Wtfpass/manifest | 9 + .../scrapers/community/X-artcom/X-artcom.yml | 52 + .../scrapers/community/X-artcom/manifest | 9 + .../community/XConfessions/XConfessions.yml | 65 + .../scrapers/community/XConfessions/manifest | 9 + .../scrapers/community/XVirtual/XVirtual.yml | 59 + .../scrapers/community/XVirtual/manifest | 9 + .../XXXJobInterviews/XXXJobInterviews.yml | 35 + .../community/XXXJobInterviews/manifest | 9 + .../scrapers/community/XXXPawn/XXXPawn.yml | 48 + .../scrapers/community/XXXPawn/manifest | 9 + .../scrapers/community/Xartxxx/Xartxxx.yml | 22 + .../scrapers/community/Xartxxx/manifest | 9 + stash/config/scrapers/community/Xes/Xes.yml | 25 + stash/config/scrapers/community/Xes/manifest | 9 + .../scrapers/community/Xhamster/Xhamster.yml | 69 + .../scrapers/community/Xhamster/manifest | 9 + stash/config/scrapers/community/Xnxx/Xnxx.yml | 22 + stash/config/scrapers/community/Xnxx/manifest | 9 + .../scrapers/community/Xrares/Xrares.yml | 29 + .../config/scrapers/community/Xrares/manifest | 9 + .../scrapers/community/Xslist/Xslist.yml | 80 + .../config/scrapers/community/Xslist/manifest | 9 + .../config/scrapers/community/Xtube/Xtube.yml | 28 + .../config/scrapers/community/Xtube/manifest | 9 + .../scrapers/community/Xvideos/Xvideos.yml | 56 + .../scrapers/community/Xvideos/manifest | 9 + stash/config/scrapers/community/YNGR/YNGR.yml | 36 + stash/config/scrapers/community/YNGR/manifest | 9 + .../config/scrapers/community/Yanks/Yanks.yml | 35 + .../config/scrapers/community/Yanks/manifest | 9 + .../scrapers/community/YouPorn/YouPorn.yml | 26 + .../scrapers/community/YouPorn/manifest | 9 + .../community/ZentaiDolls/ZentaiDolls.yml | 34 + .../scrapers/community/ZentaiDolls/manifest | 9 + .../scrapers/community/ZexyVR/ZexyVR.yml | 72 + .../config/scrapers/community/ZexyVR/manifest | 9 + .../config/scrapers/community/Zishy/Zishy.yml | 54 + .../config/scrapers/community/Zishy/manifest | 9 + .../community/angelasommers/angelasommers.yml | 31 + .../scrapers/community/angelasommers/manifest | 9 + .../community/auntykathy/auntykathy.yml | 30 + .../scrapers/community/auntykathy/manifest | 9 + .../community/bellapass/bellapass.yml | 51 + .../scrapers/community/bellapass/manifest | 9 + .../community/brandibelle/brandibelle.yml | 18 + .../scrapers/community/brandibelle/manifest | 9 + .../community/brickyates/brickyates.yml | 33 + .../scrapers/community/brickyates/manifest | 9 + .../bruceandmorgan/bruceandmorgan.yml | 20 + .../community/bruceandmorgan/manifest | 9 + .../community/chastitybabes/chastitybabes.yml | 42 + .../scrapers/community/chastitybabes/manifest | 9 + .../community/czechcasting/czechcasting.yml | 25 + .../scrapers/community/czechcasting/manifest | 9 + .../scrapers/community/data18/data18.yml | 134 + .../config/scrapers/community/data18/manifest | 9 + .../disruptivefilms/disruptivefilms.yml | 40 + .../community/disruptivefilms/manifest | 9 + .../evolvedfightslez/evolvedfightslez.yml | 33 + .../community/evolvedfightslez/manifest | 9 + .../community/filthykings/filthykings.yml | 40 + .../scrapers/community/filthykings/manifest | 9 + .../scrapers/community/hanime/hanime.yml | 46 + .../config/scrapers/community/hanime/manifest | 9 + .../community/hentai2read/hentai2read.yml | 31 + .../scrapers/community/hentai2read/manifest | 9 + .../scrapers/community/hushpass/hushpass.yml | 30 + .../scrapers/community/hushpass/manifest | 9 + .../community/hussiemodels/hussiemodels.yml | 97 + .../scrapers/community/hussiemodels/manifest | 9 + .../config/scrapers/community/insex/insex.yml | 115 + .../config/scrapers/community/insex/manifest | 9 + .../scrapers/community/insexOL/insexOL.yml | 39 + .../scrapers/community/insexOL/manifest | 9 + .../config/scrapers/community/javdb/javdb.yml | 161 + .../config/scrapers/community/javdb/manifest | 9 + .../community/karatmedia/karatmedia.yml | 68 + .../scrapers/community/karatmedia/manifest | 9 + .../community/kinkyfamily/kinkyfamily.yml | 24 + .../scrapers/community/kinkyfamily/manifest | 9 + .../community/lethalpass/lethalpass.yml | 32 + .../scrapers/community/lethalpass/manifest | 9 + .../scrapers/community/mgstage/manifest | 9 + .../scrapers/community/mgstage/mgstage.yml | 36 + .../scrapers/community/multiscrape/manifest | 10 + .../community/multiscrape/multiscrape.py | 258 + .../community/multiscrape/multiscrape.yml | 17 + .../scrapers/community/my-slavegirl/manifest | 9 + .../community/my-slavegirl/my-slavegirl.yml | 26 + .../scrapers/community/mypervyfamily/manifest | 9 + .../community/mypervyfamily/mypervyfamily.yml | 40 + .../scrapers/community/nhentai/manifest | 9 + .../scrapers/community/nhentai/nhentai.yml | 38 + .../scrapers/community/pantyjobs/manifest | 9 + .../community/pantyjobs/pantyjobs.yml | 23 + .../scrapers/community/peeonher/manifest | 9 + .../scrapers/community/peeonher/peeonher.yml | 28 + .../performer-image-by-scene/manifest | 10 + .../performer-image-by-scene.py | 113 + .../performer-image-by-scene.yml | 18 + .../community/performer-image-dir/manifest | 10 + .../performer-image-dir.py | 83 + .../performer-image-dir.yml | 17 + .../scrapers/community/pjgirls/manifest | 9 + .../scrapers/community/pjgirls/pjgirls.yml | 37 + .../scrapers/community/pornworld/manifest | 9 + .../community/pornworld/pornworld.yml | 78 + .../community/privatecastings/manifest | 9 + .../privatecastings/privatecastings.yml | 21 + .../scrapers/community/purgatoryx/manifest | 9 + .../community/purgatoryx/purgatoryx.yml | 48 + .../scrapers/community/py_common/config.py | 153 + .../scrapers/community/py_common/graphql.py | 1240 ++ .../scrapers/community/py_common/log.py | 39 + .../scrapers/community/py_common/manifest | 13 + .../scrapers/community/py_common/types.py | 118 + .../scrapers/community/py_common/util.py | 676 + .../scrapers/community/rb_common/README.md | 32 + .../community/rb_common/configs/README.md | 42 + .../rb_common/configs/config_base.rb | 15 + .../rb_common/configs/stash_config.rb | 14 + .../rb_common/configs/stashdb_config.rb | 13 + .../community/rb_common/graphql/README.md | 53 + .../rb_common/graphql/graphql_base.rb | 71 + .../community/rb_common/graphql/stash.rb | 684 + .../scrapers/community/rb_common/logger.rb | 49 + .../scrapers/community/rb_common/manifest | 18 + .../scrapers/community/rb_common/rb_common.rb | 9 + .../scrapers/community/sapphix/manifest | 9 + .../scrapers/community/sapphix/sapphix.yml | 35 + .../scrapers/community/sexuria/manifest | 9 + .../scrapers/community/sexuria/sexuria.yml | 51 + .../scrapers/community/shagmag/manifest | 9 + .../scrapers/community/shagmag/shagmag.yml | 34 + .../scrapers/community/stash-sqlite/manifest | 10 + .../community/stash-sqlite/stash-sqlite.py | 100 + .../community/stash-sqlite/stash-sqlite.yml | 17 + .../scrapers/community/sugarcookie/manifest | 9 + .../community/sugarcookie/sugarcookie.yml | 25 + .../scrapers/community/superbemodels/manifest | 9 + .../community/superbemodels/superbemodels.yml | 29 + .../scrapers/community/taboopov/manifest | 9 + .../scrapers/community/taboopov/taboopov.yml | 39 + .../scrapers/community/torrent/manifest | 10 + .../scrapers/community/torrent/torrent.py | 150 + .../scrapers/community/torrent/torrent.yml | 25 + .../scrapers/community/touchmywife/manifest | 9 + .../community/touchmywife/touchmywife.yml | 40 + .../scrapers/community/toughlovex/manifest | 9 + .../community/toughlovex/toughlovex.yml | 19 + .../scrapers/community/trafficpimps/manifest | 9 + .../community/trafficpimps/trafficpimps.yml | 40 + .../config/scrapers/community/vTubie/manifest | 9 + .../scrapers/community/vTubie/vTubie.yml | 48 + .../scrapers/community/vixenNetwork/manifest | 10 + .../community/vixenNetwork/vixenNetwork.py | 578 + .../community/vixenNetwork/vixenNetwork.yml | 41 + .../config/scrapers/community/vogov/manifest | 9 + .../config/scrapers/community/vogov/vogov.yml | 24 + .../config/scrapers/community/wankz/manifest | 9 + .../config/scrapers/community/wankz/wankz.yml | 27 + .../scrapers/community/xEmpire/manifest | 9 + .../scrapers/community/xEmpire/xEmpire.yml | 50 + .../scrapers/community/xSinsVR/manifest | 9 + .../scrapers/community/xSinsVR/xSinsVR.yml | 43 + .../config/scrapers/community/xbvrdb/manifest | 10 + .../scrapers/community/xbvrdb/xbvrdb.py | 92 + .../scrapers/community/xbvrdb/xbvrdb.yml | 15 + .../community/zerotolerancefilms/manifest | 9 + .../zerotolerancefilms/zerotolerancefilms.yml | 51 + 1442 files changed, 101562 insertions(+) create mode 100644 stash/config/plugins/community/CommunityScriptsUILibrary/CommunityScriptsUILibrary.yml create mode 100644 stash/config/plugins/community/CommunityScriptsUILibrary/README.md create mode 100644 stash/config/plugins/community/CommunityScriptsUILibrary/cs-ui-lib.js create mode 100755 stash/config/plugins/community/CommunityScriptsUILibrary/manifest create mode 100644 stash/config/plugins/community/DupFileManager/DupFileManager.log create mode 100644 stash/config/plugins/community/DupFileManager/__pycache__/DupFileManager_config.cpython-312.pyc create mode 100644 stash/config/plugins/community/DupFileManager/__pycache__/DupFileManager_report_config.cpython-312.pyc create mode 100644 stash/config/plugins/community/DupFileManager/__pycache__/ModulesValidate.cpython-312.pyc create mode 100644 stash/config/plugins/community/DupFileManager/__pycache__/StashPluginHelper.cpython-312.pyc create mode 100644 stash/config/plugins/community/LocalVisage/LocalVisage.py create mode 100644 stash/config/plugins/community/LocalVisage/LocalVisage.yml create mode 100644 stash/config/plugins/community/LocalVisage/frontend.css create mode 100644 stash/config/plugins/community/LocalVisage/frontend.js create mode 100755 stash/config/plugins/community/LocalVisage/manifest create mode 100644 stash/config/plugins/community/LocalVisage/readme.md create mode 100644 stash/config/plugins/community/LocalVisage/requirements.txt create mode 100644 stash/config/plugins/community/LocalVisage/stashface/app.py create mode 100644 stash/config/plugins/community/LocalVisage/stashface/models/__init__.py create mode 100644 stash/config/plugins/community/LocalVisage/stashface/models/data_manager.py create mode 100644 stash/config/plugins/community/LocalVisage/stashface/models/face_recognition.py create mode 100644 stash/config/plugins/community/LocalVisage/stashface/models/image_processor.py create mode 100644 stash/config/plugins/community/LocalVisage/stashface/utils/__init__.py create mode 100644 stash/config/plugins/community/LocalVisage/stashface/utils/vtt_parser.py create mode 100644 stash/config/plugins/community/LocalVisage/stashface/web/__init__.py create mode 100644 stash/config/plugins/community/LocalVisage/stashface/web/interface.py create mode 100644 stash/config/plugins/community/PythonDepManager/PythonDepManager.yml create mode 100644 stash/config/plugins/community/PythonDepManager/README.md create mode 100644 stash/config/plugins/community/PythonDepManager/__init__.py create mode 100644 stash/config/plugins/community/PythonDepManager/deps.py create mode 100644 stash/config/plugins/community/PythonDepManager/flush.py create mode 100644 stash/config/plugins/community/PythonDepManager/log.py create mode 100755 stash/config/plugins/community/PythonDepManager/manifest create mode 100644 stash/config/plugins/community/StashUserscriptLibrary/StashUserscriptLibrary.yml create mode 100755 stash/config/plugins/community/StashUserscriptLibrary/manifest create mode 100644 stash/config/plugins/community/StashUserscriptLibrary/stashUserscriptLibrary.js create mode 100644 stash/config/plugins/community/cjCardTweaks/README.md create mode 100644 stash/config/plugins/community/cjCardTweaks/cjCardTweaks.js create mode 100644 stash/config/plugins/community/cjCardTweaks/cjCardTweaks.yml create mode 100755 stash/config/plugins/community/cjCardTweaks/manifest create mode 100644 stash/config/plugins/community/filemonitor/__pycache__/ModulesValidate.cpython-312.pyc create mode 100644 stash/config/plugins/community/filemonitor/__pycache__/StashPluginHelper.cpython-312.pyc create mode 100644 stash/config/plugins/community/filemonitor/__pycache__/filemonitor_config.cpython-312.pyc create mode 100644 stash/config/plugins/community/filemonitor/__pycache__/filemonitor_self_unit_test.cpython-312.pyc create mode 100644 stash/config/plugins/community/filemonitor/__pycache__/filemonitor_task_examples.cpython-312.pyc create mode 100644 stash/config/plugins/community/filemonitor/filemonitor.log create mode 100644 stash/config/plugins/community/filenameParser/README.md create mode 100644 stash/config/plugins/community/filenameParser/filenameParser.js create mode 100644 stash/config/plugins/community/filenameParser/filenameParser.yml create mode 100755 stash/config/plugins/community/filenameParser/manifest create mode 100644 stash/config/plugins/community/star_identifier/README.md create mode 100644 stash/config/plugins/community/star_identifier/log.py create mode 100755 stash/config/plugins/community/star_identifier/manifest create mode 100644 stash/config/plugins/community/star_identifier/requirements.txt create mode 100644 stash/config/plugins/community/star_identifier/star_identifier.py create mode 100644 stash/config/plugins/community/star_identifier/star_identifier.yml create mode 100644 stash/config/plugins/community/star_identifier/star_identifier_config.py create mode 100644 stash/config/plugins/community/star_identifier/star_identifier_interface.py create mode 100644 stash/config/plugins/community/stashai/README.md create mode 100755 stash/config/plugins/community/stashai/manifest create mode 100644 stash/config/plugins/community/stashai/stashai.css create mode 100644 stash/config/plugins/community/stashai/stashai.js create mode 100644 stash/config/plugins/community/stashai/stashai.yml create mode 100644 stash/config/plugins/community/stashdb-performer-gallery/README.md create mode 100755 stash/config/plugins/community/stashdb-performer-gallery/manifest create mode 100644 stash/config/plugins/community/stashdb-performer-gallery/requirements.txt create mode 100644 stash/config/plugins/community/stashdb-performer-gallery/stashdb-performer-gallery.py create mode 100644 stash/config/plugins/community/stashdb-performer-gallery/stashdb-performer-gallery.yml create mode 100755 stash/config/plugins/community/visage/manifest create mode 100644 stash/config/plugins/community/visage/visage.css create mode 100644 stash/config/plugins/community/visage/visage.js create mode 100644 stash/config/plugins/community/visage/visage.yml create mode 100644 stash/config/scrapers/community/10Musume/10Musume.yml create mode 100755 stash/config/scrapers/community/10Musume/manifest create mode 100644 stash/config/scrapers/community/1passforallsites/1passforallsites.yml create mode 100755 stash/config/scrapers/community/1passforallsites/manifest create mode 100644 stash/config/scrapers/community/1pondo/1pondo.yml create mode 100755 stash/config/scrapers/community/1pondo/manifest create mode 100644 stash/config/scrapers/community/21Naturals/21Naturals.yml create mode 100755 stash/config/scrapers/community/21Naturals/manifest create mode 100644 stash/config/scrapers/community/21Roles/21Roles.yml create mode 100755 stash/config/scrapers/community/21Roles/manifest create mode 100644 stash/config/scrapers/community/21Sextreme/21Sextreme.yml create mode 100755 stash/config/scrapers/community/21Sextreme/manifest create mode 100644 stash/config/scrapers/community/21Sextury/21Sextury.yml create mode 100755 stash/config/scrapers/community/21Sextury/manifest create mode 100644 stash/config/scrapers/community/3rdDegreeFilms/3rdDegreeFilms.yml create mode 100755 stash/config/scrapers/community/3rdDegreeFilms/manifest create mode 100644 stash/config/scrapers/community/5KTeens/5KTeens.yml create mode 100755 stash/config/scrapers/community/5KTeens/manifest create mode 100644 stash/config/scrapers/community/AD4X/AD4X.yml create mode 100755 stash/config/scrapers/community/AD4X/manifest create mode 100644 stash/config/scrapers/community/AEBN/AEBN.yml create mode 100755 stash/config/scrapers/community/AEBN/manifest create mode 100644 stash/config/scrapers/community/AMAMultimedia/AMAMultimedia.yml create mode 100755 stash/config/scrapers/community/AMAMultimedia/manifest create mode 100644 stash/config/scrapers/community/APOVStory/APOVStory.yml create mode 100755 stash/config/scrapers/community/APOVStory/manifest create mode 100644 stash/config/scrapers/community/AShemaleTube/AShemaleTube.yml create mode 100755 stash/config/scrapers/community/AShemaleTube/manifest create mode 100644 stash/config/scrapers/community/ATKExotics/ATKExotics.yml create mode 100755 stash/config/scrapers/community/ATKExotics/manifest create mode 100644 stash/config/scrapers/community/ATKGirlfriends/ATKGirlfriends.py create mode 100644 stash/config/scrapers/community/ATKGirlfriends/ATKGirlfriends.yml create mode 100755 stash/config/scrapers/community/ATKGirlfriends/manifest create mode 100644 stash/config/scrapers/community/ATKHairy/ATKHairy.yml create mode 100755 stash/config/scrapers/community/ATKHairy/manifest create mode 100644 stash/config/scrapers/community/AVE/AVE.yml create mode 100755 stash/config/scrapers/community/AVE/manifest create mode 100644 stash/config/scrapers/community/AVJiali/AVJiali.yml create mode 100755 stash/config/scrapers/community/AVJiali/manifest create mode 100644 stash/config/scrapers/community/AbbyWinters/AbbyWinters.yml create mode 100755 stash/config/scrapers/community/AbbyWinters/manifest create mode 100644 stash/config/scrapers/community/AbuseMe/AbuseMe.yml create mode 100755 stash/config/scrapers/community/AbuseMe/manifest create mode 100644 stash/config/scrapers/community/ActiveDuty/ActiveDuty.yml create mode 100755 stash/config/scrapers/community/ActiveDuty/manifest create mode 100644 stash/config/scrapers/community/AddictedToGirls/AddictedToGirls.yml create mode 100755 stash/config/scrapers/community/AddictedToGirls/manifest create mode 100644 stash/config/scrapers/community/AdultDoorway/AdultDoorway.yml create mode 100755 stash/config/scrapers/community/AdultDoorway/manifest create mode 100644 stash/config/scrapers/community/AdultDvdMarketPlace/AdultDvdMarketPlace.yml create mode 100755 stash/config/scrapers/community/AdultDvdMarketPlace/manifest create mode 100644 stash/config/scrapers/community/AdultEmpire/AdultEmpire.yml create mode 100755 stash/config/scrapers/community/AdultEmpire/manifest create mode 100644 stash/config/scrapers/community/AdultEmpireCash/AdultEmpireCash.yml create mode 100755 stash/config/scrapers/community/AdultEmpireCash/manifest create mode 100644 stash/config/scrapers/community/AdultFilmIndex/AdultFilmIndex.yml create mode 100755 stash/config/scrapers/community/AdultFilmIndex/manifest create mode 100644 stash/config/scrapers/community/AdultPrime/AdultPrime.yml create mode 100755 stash/config/scrapers/community/AdultPrime/manifest create mode 100644 stash/config/scrapers/community/AdultSiteRunner/AdultSiteRunner.yml create mode 100755 stash/config/scrapers/community/AdultSiteRunner/manifest create mode 100644 stash/config/scrapers/community/Adultime/Adultime.yml create mode 100755 stash/config/scrapers/community/Adultime/manifest create mode 100644 stash/config/scrapers/community/AkiraLaneProductions/AkiraLaneProductions.yml create mode 100755 stash/config/scrapers/community/AkiraLaneProductions/manifest create mode 100644 stash/config/scrapers/community/Algolia/Algolia.py create mode 100755 stash/config/scrapers/community/Algolia/manifest create mode 100644 stash/config/scrapers/community/AllAnalAllTheTime/AllAnalAllTheTime.yml create mode 100755 stash/config/scrapers/community/AllAnalAllTheTime/manifest create mode 100644 stash/config/scrapers/community/AllGirlMassage/AllGirlMassage.yml create mode 100755 stash/config/scrapers/community/AllGirlMassage/manifest create mode 100644 stash/config/scrapers/community/Alterpic/Alterpic.yml create mode 100755 stash/config/scrapers/community/Alterpic/manifest create mode 100644 stash/config/scrapers/community/AmateurAllure/AmateurAllure.yml create mode 100755 stash/config/scrapers/community/AmateurAllure/manifest create mode 100644 stash/config/scrapers/community/AmateurBoxxx/AmateurBoxxx.yml create mode 100755 stash/config/scrapers/community/AmateurBoxxx/manifest create mode 100644 stash/config/scrapers/community/AmateureExtreme/AmateureExtreme.yml create mode 100755 stash/config/scrapers/community/AmateureExtreme/manifest create mode 100644 stash/config/scrapers/community/AmelieLou/AmelieLou.yml create mode 100755 stash/config/scrapers/community/AmelieLou/manifest create mode 100644 stash/config/scrapers/community/AmourAngels/AmourAngels.yml create mode 100755 stash/config/scrapers/community/AmourAngels/manifest create mode 100644 stash/config/scrapers/community/AnalVids/AnalVids.py create mode 100644 stash/config/scrapers/community/AnalVids/AnalVids.yml create mode 100755 stash/config/scrapers/community/AnalVids/manifest create mode 100644 stash/config/scrapers/community/Andomark/Andomark.yml create mode 100755 stash/config/scrapers/community/Andomark/manifest create mode 100644 stash/config/scrapers/community/AngelaWhite/AngelaWhite.yml create mode 100755 stash/config/scrapers/community/AngelaWhite/manifest create mode 100644 stash/config/scrapers/community/AniDB/AniDB.yml create mode 100755 stash/config/scrapers/community/AniDB/manifest create mode 100644 stash/config/scrapers/community/Anime-DB/Anime-DB.yml create mode 100755 stash/config/scrapers/community/Anime-DB/manifest create mode 100644 stash/config/scrapers/community/AnimeCharactersDatabase/AnimeCharactersDatabase.py create mode 100644 stash/config/scrapers/community/AnimeCharactersDatabase/AnimeCharactersDatabase.yml create mode 100755 stash/config/scrapers/community/AnimeCharactersDatabase/manifest create mode 100644 stash/config/scrapers/community/AntonioSuleiman/AntonioSuleiman.yml create mode 100755 stash/config/scrapers/community/AntonioSuleiman/manifest create mode 100644 stash/config/scrapers/community/ArchAngelVideo/ArchAngelVideo.yml create mode 100755 stash/config/scrapers/community/ArchAngelVideo/manifest create mode 100644 stash/config/scrapers/community/Arx/Arx.py create mode 100644 stash/config/scrapers/community/Arx/Arx.yml create mode 100755 stash/config/scrapers/community/Arx/manifest create mode 100644 stash/config/scrapers/community/AsianStreetMeat/AsianStreetMeat.yml create mode 100755 stash/config/scrapers/community/AsianStreetMeat/manifest create mode 100644 stash/config/scrapers/community/AssumeThePositionStudios/AssumeThePositionStudios.py create mode 100644 stash/config/scrapers/community/AssumeThePositionStudios/AssumeThePositionStudios.yml create mode 100755 stash/config/scrapers/community/AssumeThePositionStudios/manifest create mode 100644 stash/config/scrapers/community/Assylum/Assylum.yml create mode 100755 stash/config/scrapers/community/Assylum/manifest create mode 100644 stash/config/scrapers/community/AuntJudys/AuntJudys.py create mode 100644 stash/config/scrapers/community/AuntJudys/AuntJudys.yml create mode 100755 stash/config/scrapers/community/AuntJudys/manifest create mode 100644 stash/config/scrapers/community/AussieAss/AussieAss.yml create mode 100755 stash/config/scrapers/community/AussieAss/manifest create mode 100644 stash/config/scrapers/community/AussieFelatioQueens/AussieFelatioQueens.yml create mode 100755 stash/config/scrapers/community/AussieFelatioQueens/manifest create mode 100644 stash/config/scrapers/community/AyloAPI/domains.py create mode 100755 stash/config/scrapers/community/AyloAPI/manifest create mode 100644 stash/config/scrapers/community/AyloAPI/scrape.py create mode 100644 stash/config/scrapers/community/AyloAPI/slugger.py create mode 100644 stash/config/scrapers/community/Aziani/Aziani.yml create mode 100755 stash/config/scrapers/community/Aziani/manifest create mode 100644 stash/config/scrapers/community/BaDoink/BaDoink.yml create mode 100755 stash/config/scrapers/community/BaDoink/manifest create mode 100644 stash/config/scrapers/community/Babepedia/Babepedia.yml create mode 100755 stash/config/scrapers/community/Babepedia/manifest create mode 100644 stash/config/scrapers/community/Baberotica/Baberotica.yml create mode 100755 stash/config/scrapers/community/Baberotica/manifest create mode 100644 stash/config/scrapers/community/Babes&Stars/Babes&Stars.yml create mode 100755 stash/config/scrapers/community/Babes&Stars/manifest create mode 100644 stash/config/scrapers/community/Babes/Babes.yml create mode 100755 stash/config/scrapers/community/Babes/manifest create mode 100644 stash/config/scrapers/community/BadPuppy/BadPuppy.yml create mode 100755 stash/config/scrapers/community/BadPuppy/manifest create mode 100644 stash/config/scrapers/community/BamVisions/BamVisions.yml create mode 100755 stash/config/scrapers/community/BamVisions/manifest create mode 100644 stash/config/scrapers/community/Bang/Bang.yml create mode 100755 stash/config/scrapers/community/Bang/manifest create mode 100644 stash/config/scrapers/community/BangBros/BangBros.py create mode 100644 stash/config/scrapers/community/BangBros/BangBros.yml create mode 100755 stash/config/scrapers/community/BangBros/manifest create mode 100644 stash/config/scrapers/community/BathroomCreepers/BathroomCreepers.yml create mode 100755 stash/config/scrapers/community/BathroomCreepers/manifest create mode 100644 stash/config/scrapers/community/BelAmi/BelAmi.yml create mode 100755 stash/config/scrapers/community/BelAmi/manifest create mode 100644 stash/config/scrapers/community/Bellesa/Bellesa.yml create mode 100755 stash/config/scrapers/community/Bellesa/manifest create mode 100644 stash/config/scrapers/community/BeltBound/BeltBound.yml create mode 100755 stash/config/scrapers/community/BeltBound/manifest create mode 100644 stash/config/scrapers/community/BigBootyTGirls/BigBootyTGirls.yml create mode 100755 stash/config/scrapers/community/BigBootyTGirls/manifest create mode 100644 stash/config/scrapers/community/Biphoria/Biphoria.yml create mode 100755 stash/config/scrapers/community/Biphoria/manifest create mode 100644 stash/config/scrapers/community/BlackFoxBound/BlackFoxBound.yml create mode 100755 stash/config/scrapers/community/BlackFoxBound/manifest create mode 100644 stash/config/scrapers/community/BlakeMason/BlakeMason.yml create mode 100755 stash/config/scrapers/community/BlakeMason/manifest create mode 100644 stash/config/scrapers/community/BlowBangGirls/BlowBangGirls.yml create mode 100755 stash/config/scrapers/community/BlowBangGirls/manifest create mode 100644 stash/config/scrapers/community/Blowpass/Blowpass.yml create mode 100755 stash/config/scrapers/community/Blowpass/manifest create mode 100644 stash/config/scrapers/community/BluMedia/BluMedia.yml create mode 100755 stash/config/scrapers/community/BluMedia/manifest create mode 100644 stash/config/scrapers/community/BlurredMedia/BlurredMedia.yml create mode 100755 stash/config/scrapers/community/BlurredMedia/manifest create mode 100644 stash/config/scrapers/community/BondageCafe/BondageCafe.yml create mode 100755 stash/config/scrapers/community/BondageCafe/manifest create mode 100644 stash/config/scrapers/community/BondageLiberation/BondageLiberation.yml create mode 100755 stash/config/scrapers/community/BondageLiberation/manifest create mode 100644 stash/config/scrapers/community/Boobpedia/Boobpedia.yml create mode 100755 stash/config/scrapers/community/Boobpedia/manifest create mode 100644 stash/config/scrapers/community/BoundHeat/BoundHeat.yml create mode 100755 stash/config/scrapers/community/BoundHeat/manifest create mode 100644 stash/config/scrapers/community/Boundhoneys/Boundhoneys.yml create mode 100755 stash/config/scrapers/community/Boundhoneys/manifest create mode 100644 stash/config/scrapers/community/Boundlife/Boundlife.yml create mode 100755 stash/config/scrapers/community/Boundlife/manifest create mode 100644 stash/config/scrapers/community/BoxTruckSex/BoxTruckSex.yml create mode 100755 stash/config/scrapers/community/BoxTruckSex/manifest create mode 100644 stash/config/scrapers/community/BoyCrush/BoyCrush.yml create mode 100755 stash/config/scrapers/community/BoyCrush/manifest create mode 100644 stash/config/scrapers/community/BoyFun/BoyFun.yml create mode 100755 stash/config/scrapers/community/BoyFun/manifest create mode 100644 stash/config/scrapers/community/BradMontana/BradMontana.yml create mode 100755 stash/config/scrapers/community/BradMontana/manifest create mode 100644 stash/config/scrapers/community/BrandNewAmateurs/BrandNewAmateurs.yml create mode 100755 stash/config/scrapers/community/BrandNewAmateurs/manifest create mode 100644 stash/config/scrapers/community/Brazzers/Brazzers.py create mode 100644 stash/config/scrapers/community/Brazzers/Brazzers.yml create mode 100755 stash/config/scrapers/community/Brazzers/manifest create mode 100644 stash/config/scrapers/community/BreedItRaw/BreedItRaw.yml create mode 100755 stash/config/scrapers/community/BreedItRaw/manifest create mode 100644 stash/config/scrapers/community/BrokenLatinaWhores/BrokenLatinaWhores.py create mode 100644 stash/config/scrapers/community/BrokenLatinaWhores/BrokenLatinaWhores.yml create mode 100755 stash/config/scrapers/community/BrokenLatinaWhores/manifest create mode 100644 stash/config/scrapers/community/Bromo/Bromo.py create mode 100644 stash/config/scrapers/community/Bromo/Bromo.yml create mode 100755 stash/config/scrapers/community/Bromo/manifest create mode 100644 stash/config/scrapers/community/BurningAngel/BurningAngel.yml create mode 100755 stash/config/scrapers/community/BurningAngel/manifest create mode 100644 stash/config/scrapers/community/CJXXX/CJXXX.yml create mode 100755 stash/config/scrapers/community/CJXXX/manifest create mode 100644 stash/config/scrapers/community/CamWhorestv/CamWhorestv.yml create mode 100755 stash/config/scrapers/community/CamWhorestv/manifest create mode 100644 stash/config/scrapers/community/Carib/Carib.yml create mode 100755 stash/config/scrapers/community/Carib/manifest create mode 100644 stash/config/scrapers/community/CarnalPlus/CarnalPlus.yml create mode 100755 stash/config/scrapers/community/CarnalPlus/manifest create mode 100644 stash/config/scrapers/community/Catalina Cruz/Catalina Cruz.yml create mode 100755 stash/config/scrapers/community/Catalina Cruz/manifest create mode 100644 stash/config/scrapers/community/ChaosMen/ChaosMen.yml create mode 100755 stash/config/scrapers/community/ChaosMen/manifest create mode 100644 stash/config/scrapers/community/CherryPimps/CherryPimps.yml create mode 100755 stash/config/scrapers/community/CherryPimps/manifest create mode 100644 stash/config/scrapers/community/ChickPass/ChickPass.yml create mode 100755 stash/config/scrapers/community/ChickPass/manifest create mode 100644 stash/config/scrapers/community/ClassLesbians/ClassLesbians.yml create mode 100755 stash/config/scrapers/community/ClassLesbians/manifest create mode 100644 stash/config/scrapers/community/ClaudiaMarie/ClaudiaMarie.yml create mode 100755 stash/config/scrapers/community/ClaudiaMarie/manifest create mode 100644 stash/config/scrapers/community/Clips4Sale/Clips4Sale.yml create mode 100755 stash/config/scrapers/community/Clips4Sale/manifest create mode 100644 stash/config/scrapers/community/ClubElegantAngel/ClubElegantAngel.yml create mode 100755 stash/config/scrapers/community/ClubElegantAngel/manifest create mode 100644 stash/config/scrapers/community/ClubInfernoDungeon/ClubInfernoDungeon.yml create mode 100755 stash/config/scrapers/community/ClubInfernoDungeon/manifest create mode 100644 stash/config/scrapers/community/ClubSeventeen/ClubSeventeen.yml create mode 100755 stash/config/scrapers/community/ClubSeventeen/manifest create mode 100644 stash/config/scrapers/community/Cockhero/Cockhero.yml create mode 100755 stash/config/scrapers/community/Cockhero/manifest create mode 100644 stash/config/scrapers/community/CocksureMen/CocksureMen.yml create mode 100755 stash/config/scrapers/community/CocksureMen/manifest create mode 100644 stash/config/scrapers/community/CockyBoys/CockyBoys.yml create mode 100755 stash/config/scrapers/community/CockyBoys/manifest create mode 100644 stash/config/scrapers/community/ColbyKnox/ColbyKnox.yml create mode 100755 stash/config/scrapers/community/ColbyKnox/manifest create mode 100644 stash/config/scrapers/community/Colette/Colette.yml create mode 100755 stash/config/scrapers/community/Colette/manifest create mode 100644 stash/config/scrapers/community/CollegeUniform/CollegeUniform.yml create mode 100755 stash/config/scrapers/community/CollegeUniform/manifest create mode 100644 stash/config/scrapers/community/CombatZone/CombatZone.yml create mode 100755 stash/config/scrapers/community/CombatZone/manifest create mode 100644 stash/config/scrapers/community/ComicInfoXML/ComicInfoXML.py create mode 100644 stash/config/scrapers/community/ComicInfoXML/ComicInfoXML.yml create mode 100755 stash/config/scrapers/community/ComicInfoXML/manifest create mode 100644 stash/config/scrapers/community/CopyFromScene/CopyFromScene.py create mode 100644 stash/config/scrapers/community/CopyFromScene/CopyFromScene.yml create mode 100755 stash/config/scrapers/community/CopyFromScene/manifest create mode 100644 stash/config/scrapers/community/CopyToGallery/CopyToGallery.py create mode 100644 stash/config/scrapers/community/CopyToGallery/CopyToGallery.yml create mode 100755 stash/config/scrapers/community/CopyToGallery/manifest create mode 100644 stash/config/scrapers/community/CopyToImages/CopyToImages.py create mode 100644 stash/config/scrapers/community/CopyToImages/CopyToImages.yml create mode 100755 stash/config/scrapers/community/CopyToImages/manifest create mode 100644 stash/config/scrapers/community/CorbinFisher/CorbinFisher.yml create mode 100755 stash/config/scrapers/community/CorbinFisher/manifest create mode 100644 stash/config/scrapers/community/Cospuri/Cospuri.yml create mode 100755 stash/config/scrapers/community/Cospuri/manifest create mode 100644 stash/config/scrapers/community/CrashpadSeries/CrashpadSeries.yml create mode 100755 stash/config/scrapers/community/CrashpadSeries/manifest create mode 100644 stash/config/scrapers/community/CruelGirlfriend/CruelGirlfriend.yml create mode 100755 stash/config/scrapers/community/CruelGirlfriend/manifest create mode 100644 stash/config/scrapers/community/Cumlouder/Cumlouder.yml create mode 100755 stash/config/scrapers/community/Cumlouder/manifest create mode 100644 stash/config/scrapers/community/CutlersDen/CutlersDen.yml create mode 100755 stash/config/scrapers/community/CutlersDen/manifest create mode 100644 stash/config/scrapers/community/CzechHunter/CzechHunter.py create mode 100644 stash/config/scrapers/community/CzechHunter/CzechHunter.yml create mode 100755 stash/config/scrapers/community/CzechHunter/manifest create mode 100644 stash/config/scrapers/community/CzechVR/CzechVR.yml create mode 100755 stash/config/scrapers/community/CzechVR/manifest create mode 100644 stash/config/scrapers/community/Czechav/Czechav.yml create mode 100755 stash/config/scrapers/community/Czechav/manifest create mode 100644 stash/config/scrapers/community/DDFNetwork/DDFNetwork.yml create mode 100755 stash/config/scrapers/community/DDFNetwork/manifest create mode 100644 stash/config/scrapers/community/DEMedia/DEMedia.yml create mode 100755 stash/config/scrapers/community/DEMedia/manifest create mode 100644 stash/config/scrapers/community/DFB/DFB.yml create mode 100755 stash/config/scrapers/community/DFB/manifest create mode 100644 stash/config/scrapers/community/DLsite/DLsite.yml create mode 100755 stash/config/scrapers/community/DLsite/manifest create mode 100644 stash/config/scrapers/community/DMM/DMM.yml create mode 100755 stash/config/scrapers/community/DMM/manifest create mode 100644 stash/config/scrapers/community/Danni/Danni.yml create mode 100755 stash/config/scrapers/community/Danni/manifest create mode 100644 stash/config/scrapers/community/DarkRoomVR/DarkRoomVR.yml create mode 100755 stash/config/scrapers/community/DarkRoomVR/manifest create mode 100644 stash/config/scrapers/community/DartTechStudios/DartTechStudios.yml create mode 100755 stash/config/scrapers/community/DartTechStudios/manifest create mode 100644 stash/config/scrapers/community/DesperateAmateurs/DesperateAmateurs.yml create mode 100755 stash/config/scrapers/community/DesperateAmateurs/manifest create mode 100644 stash/config/scrapers/community/DesperatePleasuresXXX/DesperatePleasuresXXX.yml create mode 100755 stash/config/scrapers/community/DesperatePleasuresXXX/manifest create mode 100644 stash/config/scrapers/community/Deviante/Deviante.py create mode 100644 stash/config/scrapers/community/Deviante/Deviante.yml create mode 100755 stash/config/scrapers/community/Deviante/manifest create mode 100644 stash/config/scrapers/community/Dickdrainers/Dickdrainers.yml create mode 100755 stash/config/scrapers/community/Dickdrainers/manifest create mode 100644 stash/config/scrapers/community/DigitalDesire/DigitalDesire.yml create mode 100755 stash/config/scrapers/community/DigitalDesire/manifest create mode 100644 stash/config/scrapers/community/DigitalPlayground/DigitalPlayground.py create mode 100644 stash/config/scrapers/community/DigitalPlayground/DigitalPlayground.yml create mode 100755 stash/config/scrapers/community/DigitalPlayground/manifest create mode 100644 stash/config/scrapers/community/DirtyFlix/DirtyFlix.yml create mode 100755 stash/config/scrapers/community/DirtyFlix/manifest create mode 100644 stash/config/scrapers/community/DogfartNetwork/DogfartNetwork.yml create mode 100755 stash/config/scrapers/community/DogfartNetwork/manifest create mode 100644 stash/config/scrapers/community/DollsHub/DollsHub.yml create mode 100755 stash/config/scrapers/community/DollsHub/manifest create mode 100644 stash/config/scrapers/community/DorcelClub/DorcelClub.yml create mode 100755 stash/config/scrapers/community/DorcelClub/manifest create mode 100644 stash/config/scrapers/community/DorcelVision/DorcelVision.yml create mode 100755 stash/config/scrapers/community/DorcelVision/manifest create mode 100644 stash/config/scrapers/community/DreamTranny/DreamTranny.yml create mode 100755 stash/config/scrapers/community/DreamTranny/manifest create mode 100644 stash/config/scrapers/community/DreamsOfSpanking/DreamsOfSpanking.yml create mode 100755 stash/config/scrapers/community/DreamsOfSpanking/manifest create mode 100644 stash/config/scrapers/community/EastBoys/EastBoys.yml create mode 100755 stash/config/scrapers/community/EastBoys/manifest create mode 100644 stash/config/scrapers/community/EliteBabes/EliteBabes.yml create mode 100755 stash/config/scrapers/community/EliteBabes/manifest create mode 100644 stash/config/scrapers/community/EmilyBloom/EmilyBloom.yml create mode 100755 stash/config/scrapers/community/EmilyBloom/manifest create mode 100644 stash/config/scrapers/community/EnglishLads/EnglishLads.yml create mode 100755 stash/config/scrapers/community/EnglishLads/manifest create mode 100644 stash/config/scrapers/community/EnjoyX/EnjoyX.yml create mode 100755 stash/config/scrapers/community/EnjoyX/manifest create mode 100644 stash/config/scrapers/community/Eporner/Eporner.yml create mode 100755 stash/config/scrapers/community/Eporner/manifest create mode 100644 stash/config/scrapers/community/EricJohnsSexAdventures/EricJohnsSexAdventures.yml create mode 100755 stash/config/scrapers/community/EricJohnsSexAdventures/manifest create mode 100644 stash/config/scrapers/community/EricVideos/EricVideos.yml create mode 100755 stash/config/scrapers/community/EricVideos/manifest create mode 100644 stash/config/scrapers/community/Erito/Erito.yml create mode 100755 stash/config/scrapers/community/Erito/manifest create mode 100644 stash/config/scrapers/community/EroProfile/EroProfile.yml create mode 100755 stash/config/scrapers/community/EroProfile/manifest create mode 100644 stash/config/scrapers/community/EvilAngel/EvilAngel.yml create mode 100755 stash/config/scrapers/community/EvilAngel/manifest create mode 100644 stash/config/scrapers/community/EvilAngelStore/EvilAngelStore.yml create mode 100755 stash/config/scrapers/community/EvilAngelStore/manifest create mode 100644 stash/config/scrapers/community/ExpliciteArt/ExpliciteArt.yml create mode 100755 stash/config/scrapers/community/ExpliciteArt/manifest create mode 100644 stash/config/scrapers/community/ExploitedX/ExploitedX.yml create mode 100755 stash/config/scrapers/community/ExploitedX/manifest create mode 100644 stash/config/scrapers/community/ExtraPackage/ExtraPackage.yml create mode 100755 stash/config/scrapers/community/ExtraPackage/manifest create mode 100644 stash/config/scrapers/community/FFCSH/FFCSH.yml create mode 100755 stash/config/scrapers/community/FFCSH/manifest create mode 100644 stash/config/scrapers/community/FFstockings/FFstockings.yml create mode 100755 stash/config/scrapers/community/FFstockings/manifest create mode 100644 stash/config/scrapers/community/FILF/FILF.yml create mode 100755 stash/config/scrapers/community/FILF/manifest create mode 100644 stash/config/scrapers/community/FTV/FTV.yml create mode 100755 stash/config/scrapers/community/FTV/manifest create mode 100644 stash/config/scrapers/community/FakeHub/FakeHub.py create mode 100644 stash/config/scrapers/community/FakeHub/FakeHub.yml create mode 100755 stash/config/scrapers/community/FakeHub/manifest create mode 100644 stash/config/scrapers/community/FalconStudios/FalconStudios.yml create mode 100755 stash/config/scrapers/community/FalconStudios/manifest create mode 100644 stash/config/scrapers/community/FamilySexMassage/FamilySexMassage.yml create mode 100755 stash/config/scrapers/community/FamilySexMassage/manifest create mode 100644 stash/config/scrapers/community/FamilyTherapyXXX/FamilyTherapyXXX.yml create mode 100755 stash/config/scrapers/community/FamilyTherapyXXX/manifest create mode 100644 stash/config/scrapers/community/FantasyMassage/FantasyMassage.yml create mode 100755 stash/config/scrapers/community/FantasyMassage/manifest create mode 100644 stash/config/scrapers/community/FapHouse/FapHouse.yml create mode 100755 stash/config/scrapers/community/FapHouse/manifest create mode 100644 stash/config/scrapers/community/Femanic/Femanic.yml create mode 100755 stash/config/scrapers/community/Femanic/manifest create mode 100644 stash/config/scrapers/community/FemdomEmpire/FemdomEmpire.yml create mode 100755 stash/config/scrapers/community/FemdomEmpire/manifest create mode 100644 stash/config/scrapers/community/Femjoy/Femjoy.yml create mode 100755 stash/config/scrapers/community/Femjoy/manifest create mode 100644 stash/config/scrapers/community/FetishNetwork/FetishNetwork.yml create mode 100755 stash/config/scrapers/community/FetishNetwork/manifest create mode 100644 stash/config/scrapers/community/FetishPro/FetishPro.yml create mode 100755 stash/config/scrapers/community/FetishPro/manifest create mode 100644 stash/config/scrapers/community/FileMetadata/FileMetadata.py create mode 100644 stash/config/scrapers/community/FileMetadata/FileMetadata.yml create mode 100755 stash/config/scrapers/community/FileMetadata/manifest create mode 100644 stash/config/scrapers/community/FileMetadata_Windows/FileMetadata_Windows.ps1 create mode 100644 stash/config/scrapers/community/FileMetadata_Windows/FileMetadata_Windows.yml create mode 100755 stash/config/scrapers/community/FileMetadata_Windows/manifest create mode 100644 stash/config/scrapers/community/Filename/Filename.py create mode 100644 stash/config/scrapers/community/Filename/Filename.yml create mode 100755 stash/config/scrapers/community/Filename/manifest create mode 100644 stash/config/scrapers/community/FilthFlix/FilthFlix.yml create mode 100755 stash/config/scrapers/community/FilthFlix/manifest create mode 100644 stash/config/scrapers/community/FilthyFamily/FilthyFamily.yml create mode 100755 stash/config/scrapers/community/FilthyFamily/manifest create mode 100644 stash/config/scrapers/community/FinishesTheJob/FinishesTheJob.yml create mode 100755 stash/config/scrapers/community/FinishesTheJob/manifest create mode 100644 stash/config/scrapers/community/Firstanalquest/Firstanalquest.yml create mode 100755 stash/config/scrapers/community/Firstanalquest/manifest create mode 100644 stash/config/scrapers/community/Fistertwister/Fistertwister.yml create mode 100755 stash/config/scrapers/community/Fistertwister/manifest create mode 100644 stash/config/scrapers/community/FistingInferno/FistingInferno.yml create mode 100755 stash/config/scrapers/community/FistingInferno/manifest create mode 100644 stash/config/scrapers/community/Fit18/Fit18.py create mode 100644 stash/config/scrapers/community/Fit18/Fit18.yml create mode 100755 stash/config/scrapers/community/Fit18/manifest create mode 100644 stash/config/scrapers/community/FittingRoom/FittingRoom.yml create mode 100755 stash/config/scrapers/community/FittingRoom/manifest create mode 100644 stash/config/scrapers/community/FootFetishDaily/FootFetishDaily.yml create mode 100755 stash/config/scrapers/community/FootFetishDaily/manifest create mode 100644 stash/config/scrapers/community/FragileSlave/FragileSlave.yml create mode 100755 stash/config/scrapers/community/FragileSlave/manifest create mode 100644 stash/config/scrapers/community/FrankfurtSexStories/FrankfurtSexStories.yml create mode 100755 stash/config/scrapers/community/FrankfurtSexStories/manifest create mode 100644 stash/config/scrapers/community/FratX/FratX.py create mode 100644 stash/config/scrapers/community/FratX/FratX.yml create mode 100755 stash/config/scrapers/community/FratX/manifest create mode 100644 stash/config/scrapers/community/FreeonesCommunity/FreeonesCommunity.yml create mode 100755 stash/config/scrapers/community/FreeonesCommunity/manifest create mode 100644 stash/config/scrapers/community/FreeonesStore/FreeonesStore.yml create mode 100755 stash/config/scrapers/community/FreeonesStore/manifest create mode 100644 stash/config/scrapers/community/Frenchtwinks/Frenchtwinks.yml create mode 100755 stash/config/scrapers/community/Frenchtwinks/manifest create mode 100644 stash/config/scrapers/community/Freshmen/Freshmen.yml create mode 100755 stash/config/scrapers/community/Freshmen/manifest create mode 100644 stash/config/scrapers/community/FrolicMe/FrolicMe.yml create mode 100755 stash/config/scrapers/community/FrolicMe/manifest create mode 100644 stash/config/scrapers/community/FuckedHard18/FuckedHard18.yml create mode 100755 stash/config/scrapers/community/FuckedHard18/manifest create mode 100644 stash/config/scrapers/community/Fuckermate/Fuckermate.yml create mode 100755 stash/config/scrapers/community/Fuckermate/manifest create mode 100644 stash/config/scrapers/community/FuckingAwesome/FuckingAwesome.yml create mode 100755 stash/config/scrapers/community/FuckingAwesome/manifest create mode 100644 stash/config/scrapers/community/Futanarica/Futanarica.yml create mode 100755 stash/config/scrapers/community/Futanarica/manifest create mode 100644 stash/config/scrapers/community/GASM/GASM.yml create mode 100755 stash/config/scrapers/community/GASM/manifest create mode 100644 stash/config/scrapers/community/GEVI/GEVI.py create mode 100644 stash/config/scrapers/community/GEVI/GEVI.yml create mode 100755 stash/config/scrapers/community/GEVI/manifest create mode 100644 stash/config/scrapers/community/GIGA/GIGA.yml create mode 100755 stash/config/scrapers/community/GIGA/manifest create mode 100644 stash/config/scrapers/community/GammaEntertainment/GammaEntertainment.yml create mode 100755 stash/config/scrapers/community/GammaEntertainment/manifest create mode 100644 stash/config/scrapers/community/GangBangCreampie/GangBangCreampie.yml create mode 100755 stash/config/scrapers/community/GangBangCreampie/manifest create mode 100755 stash/config/scrapers/community/GayAdultEmpire/GayAdultEmpire.yml create mode 100755 stash/config/scrapers/community/GayAdultEmpire/manifest create mode 100644 stash/config/scrapers/community/GayWire/GayWire.py create mode 100644 stash/config/scrapers/community/GayWire/GayWire.yml create mode 100755 stash/config/scrapers/community/GayWire/manifest create mode 100644 stash/config/scrapers/community/GenderXFilms/GenderXFilms.yml create mode 100755 stash/config/scrapers/community/GenderXFilms/manifest create mode 100644 stash/config/scrapers/community/Girlfriendsfilms/Girlfriendsfilms.yml create mode 100755 stash/config/scrapers/community/Girlfriendsfilms/manifest create mode 100755 stash/config/scrapers/community/GirlsOfPB/GirlsOfPB.yml create mode 100755 stash/config/scrapers/community/GirlsOfPB/manifest create mode 100644 stash/config/scrapers/community/GirlsOutWest/GirlsOutWest.yml create mode 100755 stash/config/scrapers/community/GirlsOutWest/manifest create mode 100644 stash/config/scrapers/community/GirlsRimming/GirlsRimming.yml create mode 100755 stash/config/scrapers/community/GirlsRimming/manifest create mode 100644 stash/config/scrapers/community/GirlsUnderArrest/GirlsUnderArrest.yml create mode 100755 stash/config/scrapers/community/GirlsUnderArrest/manifest create mode 100644 stash/config/scrapers/community/Girlsway/Girlsway.yml create mode 100755 stash/config/scrapers/community/Girlsway/manifest create mode 100644 stash/config/scrapers/community/Glamose/Glamose.yml create mode 100755 stash/config/scrapers/community/Glamose/manifest create mode 100644 stash/config/scrapers/community/GloryHoleSwallow/GloryHoleSwallow.yml create mode 100755 stash/config/scrapers/community/GloryHoleSwallow/manifest create mode 100644 stash/config/scrapers/community/Gloryholesecrets/Gloryholesecrets.yml create mode 100755 stash/config/scrapers/community/Gloryholesecrets/manifest create mode 100644 stash/config/scrapers/community/GlossTightsGlamour/GlossTightsGlamour.yml create mode 100755 stash/config/scrapers/community/GlossTightsGlamour/manifest create mode 100644 stash/config/scrapers/community/GoddessSnow/GoddessSnow.yml create mode 100755 stash/config/scrapers/community/GoddessSnow/manifest create mode 100644 stash/config/scrapers/community/GroobyClub/GroobyClub.yml create mode 100755 stash/config/scrapers/community/GroobyClub/manifest create mode 100644 stash/config/scrapers/community/GroobyNetwork-Brazilian/GroobyNetwork-Brazilian.yml create mode 100755 stash/config/scrapers/community/GroobyNetwork-Brazilian/manifest create mode 100644 stash/config/scrapers/community/GroobyNetwork-Partial/GroobyNetwork-Partial.yml create mode 100755 stash/config/scrapers/community/GroobyNetwork-Partial/manifest create mode 100644 stash/config/scrapers/community/GuysInSweatpants/GuysInSweatpants.yml create mode 100755 stash/config/scrapers/community/GuysInSweatpants/manifest create mode 100644 stash/config/scrapers/community/GymRotic/GymRotic.yml create mode 100755 stash/config/scrapers/community/GymRotic/manifest create mode 100644 stash/config/scrapers/community/HDPorn/HDPorn.yml create mode 100755 stash/config/scrapers/community/HDPorn/manifest create mode 100644 stash/config/scrapers/community/HQPorner/HQPorner.yml create mode 100755 stash/config/scrapers/community/HQPorner/manifest create mode 100644 stash/config/scrapers/community/HandDomination/HandDomination.yml create mode 100755 stash/config/scrapers/community/HandDomination/manifest create mode 100644 stash/config/scrapers/community/HarmonyVision/HarmonyVision.yml create mode 100755 stash/config/scrapers/community/HarmonyVision/manifest create mode 100644 stash/config/scrapers/community/HeavyOnHotties/HeavyOnHotties.yml create mode 100755 stash/config/scrapers/community/HeavyOnHotties/manifest create mode 100644 stash/config/scrapers/community/Hegre/Hegre.yml create mode 100755 stash/config/scrapers/community/Hegre/manifest create mode 100644 stash/config/scrapers/community/HelixStudios/HelixStudios.yml create mode 100755 stash/config/scrapers/community/HelixStudios/manifest create mode 100644 stash/config/scrapers/community/HentaiPros/HentaiPros.yml create mode 100755 stash/config/scrapers/community/HentaiPros/manifest create mode 100644 stash/config/scrapers/community/Hentaied/Hentaied.yml create mode 100755 stash/config/scrapers/community/Hentaied/manifest create mode 100644 stash/config/scrapers/community/Heyzo/Heyzo.yml create mode 100755 stash/config/scrapers/community/Heyzo/manifest create mode 100644 stash/config/scrapers/community/HimerosTV/HimerosTV.yml create mode 100755 stash/config/scrapers/community/HimerosTV/manifest create mode 100644 stash/config/scrapers/community/Hitzefrei/Hitzefrei.yml create mode 100755 stash/config/scrapers/community/Hitzefrei/manifest create mode 100644 stash/config/scrapers/community/HmvMania/HmvMania.yml create mode 100755 stash/config/scrapers/community/HmvMania/manifest create mode 100644 stash/config/scrapers/community/HobbyPorn/HobbyPorn.yml create mode 100755 stash/config/scrapers/community/HobbyPorn/manifest create mode 100644 stash/config/scrapers/community/HollyRandall/HollyRandall.yml create mode 100755 stash/config/scrapers/community/HollyRandall/manifest create mode 100644 stash/config/scrapers/community/Hotmovies/Hotmovies.yml create mode 100755 stash/config/scrapers/community/Hotmovies/manifest create mode 100644 stash/config/scrapers/community/HouseOfGord/HouseOfGord.yml create mode 100755 stash/config/scrapers/community/HouseOfGord/manifest create mode 100644 stash/config/scrapers/community/Hucows/Hucows.yml create mode 100755 stash/config/scrapers/community/Hucows/manifest create mode 100644 stash/config/scrapers/community/Hustler/Hustler.yml create mode 100755 stash/config/scrapers/community/Hustler/manifest create mode 100644 stash/config/scrapers/community/Hypnotube/Hypnotube.yml create mode 100755 stash/config/scrapers/community/Hypnotube/manifest create mode 100644 stash/config/scrapers/community/IAFD/IAFD.py create mode 100644 stash/config/scrapers/community/IAFD/IAFD.yml create mode 100755 stash/config/scrapers/community/IAFD/manifest create mode 100644 stash/config/scrapers/community/IFeelMyself/IFeelMyself.py create mode 100644 stash/config/scrapers/community/IFeelMyself/IFeelMyself.yml create mode 100755 stash/config/scrapers/community/IFeelMyself/manifest create mode 100644 stash/config/scrapers/community/IKissGirls/IKissGirls.yml create mode 100755 stash/config/scrapers/community/IKissGirls/manifest create mode 100644 stash/config/scrapers/community/IMDB/IMDB.yml create mode 100755 stash/config/scrapers/community/IMDB/manifest create mode 100644 stash/config/scrapers/community/IWantClips/IWantClips.yml create mode 100755 stash/config/scrapers/community/IWantClips/manifest create mode 100644 stash/config/scrapers/community/IafdStreaming/IafdStreaming.yml create mode 100755 stash/config/scrapers/community/IafdStreaming/manifest create mode 100644 stash/config/scrapers/community/InTheCrack/InTheCrack.yml create mode 100755 stash/config/scrapers/community/InTheCrack/manifest create mode 100755 stash/config/scrapers/community/IncestFlix/IncestFlix.yml create mode 100755 stash/config/scrapers/community/IncestFlix/manifest create mode 100644 stash/config/scrapers/community/InnOfSin/InnOfSin.yml create mode 100755 stash/config/scrapers/community/InnOfSin/manifest create mode 100644 stash/config/scrapers/community/InterracialPass/InterracialPass.yml create mode 100755 stash/config/scrapers/community/InterracialPass/manifest create mode 100644 stash/config/scrapers/community/Interracialvision/Interracialvision.yml create mode 100755 stash/config/scrapers/community/Interracialvision/manifest create mode 100644 stash/config/scrapers/community/ItsPOV/ItsPOV.yml create mode 100755 stash/config/scrapers/community/ItsPOV/manifest create mode 100644 stash/config/scrapers/community/Iwara/Iwara.yml create mode 100755 stash/config/scrapers/community/Iwara/manifest create mode 100644 stash/config/scrapers/community/JBVideo/JBVideo.yml create mode 100755 stash/config/scrapers/community/JBVideo/manifest create mode 100644 stash/config/scrapers/community/JacquieEtMichelElite/JacquieEtMichelElite.yml create mode 100755 stash/config/scrapers/community/JacquieEtMichelElite/manifest create mode 100644 stash/config/scrapers/community/JacquieEtMichelTV/JacquieEtMichelTV.py create mode 100644 stash/config/scrapers/community/JacquieEtMichelTV/JacquieEtMichelTV.yml create mode 100755 stash/config/scrapers/community/JacquieEtMichelTV/manifest create mode 100644 stash/config/scrapers/community/JapanHDV/JapanHDV.yml create mode 100755 stash/config/scrapers/community/JapanHDV/manifest create mode 100644 stash/config/scrapers/community/JapornXXX/JapornXXX.yml create mode 100755 stash/config/scrapers/community/JapornXXX/manifest create mode 100644 stash/config/scrapers/community/JavBus/JavBus.yml create mode 100755 stash/config/scrapers/community/JavBus/manifest create mode 100644 stash/config/scrapers/community/JavHD/JavHD.yml create mode 100755 stash/config/scrapers/community/JavHD/manifest create mode 100644 stash/config/scrapers/community/JavHub/JavHub.yml create mode 100755 stash/config/scrapers/community/JavHub/manifest create mode 100644 stash/config/scrapers/community/JavLand/JavLand.yml create mode 100755 stash/config/scrapers/community/JavLand/manifest create mode 100644 stash/config/scrapers/community/JavLibrary/JavLibrary.yml create mode 100755 stash/config/scrapers/community/JavLibrary/manifest create mode 100644 stash/config/scrapers/community/JavLibrary_python/JavLibrary_python.py create mode 100644 stash/config/scrapers/community/JavLibrary_python/JavLibrary_python.yml create mode 100755 stash/config/scrapers/community/JavLibrary_python/manifest create mode 100644 stash/config/scrapers/community/JaxSlayher/JaxSlayher.yml create mode 100755 stash/config/scrapers/community/JaxSlayher/manifest create mode 100644 stash/config/scrapers/community/Jeedoo/Jeedoo.yml create mode 100755 stash/config/scrapers/community/Jeedoo/manifest create mode 100644 stash/config/scrapers/community/Jellyfin/Jellyfin.py create mode 100644 stash/config/scrapers/community/Jellyfin/Jellyfin.yml create mode 100755 stash/config/scrapers/community/Jellyfin/manifest create mode 100644 stash/config/scrapers/community/Jhdv/Jhdv.yml create mode 100755 stash/config/scrapers/community/Jhdv/manifest create mode 100644 stash/config/scrapers/community/JimWeathersArchives/JimWeathersArchives.yml create mode 100755 stash/config/scrapers/community/JimWeathersArchives/manifest create mode 100644 stash/config/scrapers/community/Johnnyrapid/Johnnyrapid.yml create mode 100755 stash/config/scrapers/community/Johnnyrapid/manifest create mode 100644 stash/config/scrapers/community/JoyBear/JoyBear.yml create mode 100755 stash/config/scrapers/community/JoyBear/manifest create mode 100644 stash/config/scrapers/community/JulesJordan/JulesJordan.yml create mode 100755 stash/config/scrapers/community/JulesJordan/manifest create mode 100644 stash/config/scrapers/community/KBProductions/KBProductions.py create mode 100644 stash/config/scrapers/community/KBProductions/KBProductions.yml create mode 100755 stash/config/scrapers/community/KBProductions/manifest create mode 100644 stash/config/scrapers/community/Karissa-Diamond/Karissa-Diamond.yml create mode 100755 stash/config/scrapers/community/Karissa-Diamond/manifest create mode 100644 stash/config/scrapers/community/Karups/Karups.yml create mode 100755 stash/config/scrapers/community/Karups/manifest create mode 100644 stash/config/scrapers/community/KellyMadisonMedia/KellyMadisonMedia.yml create mode 100755 stash/config/scrapers/community/KellyMadisonMedia/manifest create mode 100644 stash/config/scrapers/community/Killergram/Killergram.yml create mode 100755 stash/config/scrapers/community/Killergram/manifest create mode 100644 stash/config/scrapers/community/KimHolland/KimHolland.yml create mode 100755 stash/config/scrapers/community/KimHolland/manifest create mode 100644 stash/config/scrapers/community/Kin8tengoku/Kin8tengoku.yml create mode 100755 stash/config/scrapers/community/Kin8tengoku/manifest create mode 100644 stash/config/scrapers/community/Kink/Kink.yml create mode 100755 stash/config/scrapers/community/Kink/manifest create mode 100644 stash/config/scrapers/community/KinkBomb/KinkBomb.yml create mode 100755 stash/config/scrapers/community/KinkBomb/manifest create mode 100644 stash/config/scrapers/community/KinkMen/KinkMen.yml create mode 100755 stash/config/scrapers/community/KinkMen/manifest create mode 100644 stash/config/scrapers/community/KinkyMistresses/KinkyMistresses.yml create mode 100755 stash/config/scrapers/community/KinkyMistresses/manifest create mode 100644 stash/config/scrapers/community/Kpopping/Kpopping.yml create mode 100755 stash/config/scrapers/community/Kpopping/manifest create mode 100755 stash/config/scrapers/community/KristenBjorn/KristenBjorn.yml create mode 100755 stash/config/scrapers/community/KristenBjorn/manifest create mode 100644 stash/config/scrapers/community/LadyboyGold/LadyboyGold.yml create mode 100755 stash/config/scrapers/community/LadyboyGold/manifest create mode 100644 stash/config/scrapers/community/Lasublime/Lasublime.yml create mode 100755 stash/config/scrapers/community/Lasublime/manifest create mode 100644 stash/config/scrapers/community/LetThemWatch/LetThemWatch.yml create mode 100755 stash/config/scrapers/community/LetThemWatch/manifest create mode 100644 stash/config/scrapers/community/LetsDoeIt/LetsDoeIt.yml create mode 100755 stash/config/scrapers/community/LetsDoeIt/manifest create mode 100644 stash/config/scrapers/community/LewRubens/LewRubens.yml create mode 100755 stash/config/scrapers/community/LewRubens/manifest create mode 100644 stash/config/scrapers/community/LexiDona/LexiDona.yml create mode 100755 stash/config/scrapers/community/LexiDona/manifest create mode 100644 stash/config/scrapers/community/LittleCapriceDreams/LittleCapriceDreams.yml create mode 100755 stash/config/scrapers/community/LittleCapriceDreams/manifest create mode 100644 stash/config/scrapers/community/LoneStarAngel/LoneStarAngel.yml create mode 100755 stash/config/scrapers/community/LoneStarAngel/manifest create mode 100644 stash/config/scrapers/community/LordAardvark/LordAardvark.yml create mode 100755 stash/config/scrapers/community/LordAardvark/manifest create mode 100644 stash/config/scrapers/community/LoveHerFilms/LoveHerFilms.yml create mode 100755 stash/config/scrapers/community/LoveHerFilms/manifest create mode 100644 stash/config/scrapers/community/Loyalfans/Loyalfans.py create mode 100644 stash/config/scrapers/community/Loyalfans/Loyalfans.yml create mode 100755 stash/config/scrapers/community/Loyalfans/manifest create mode 100644 stash/config/scrapers/community/Loyalfans/requirements.txt create mode 100755 stash/config/scrapers/community/LucasEntertainment/LucasEntertainment.yml create mode 100755 stash/config/scrapers/community/LucasEntertainment/manifest create mode 100644 stash/config/scrapers/community/LustCinema/LustCinema.yml create mode 100755 stash/config/scrapers/community/LustCinema/manifest create mode 100644 stash/config/scrapers/community/Lustery/Lustery.yml create mode 100755 stash/config/scrapers/community/Lustery/manifest create mode 100644 stash/config/scrapers/community/MFC/MFC.yml create mode 100755 stash/config/scrapers/community/MFC/manifest create mode 100644 stash/config/scrapers/community/MMP_Network/MMP_Network.yml create mode 100755 stash/config/scrapers/community/MMP_Network/manifest create mode 100644 stash/config/scrapers/community/MPLStudios/MPLStudios.yml create mode 100755 stash/config/scrapers/community/MPLStudios/manifest create mode 100644 stash/config/scrapers/community/MVG/MVG.yml create mode 100755 stash/config/scrapers/community/MVG/manifest create mode 100644 stash/config/scrapers/community/MYLF/MYLF.yml create mode 100644 stash/config/scrapers/community/MYLF/MYLFAPI.py create mode 100755 stash/config/scrapers/community/MYLF/manifest create mode 100644 stash/config/scrapers/community/MadeInCanada/MadeInCanada.yml create mode 100755 stash/config/scrapers/community/MadeInCanada/manifest create mode 100644 stash/config/scrapers/community/Madou/Madou.yml create mode 100755 stash/config/scrapers/community/Madou/manifest create mode 100644 stash/config/scrapers/community/Mandyflores/Mandyflores.yml create mode 100755 stash/config/scrapers/community/Mandyflores/manifest create mode 100644 stash/config/scrapers/community/ManyVids/ManyVids.yml create mode 100755 stash/config/scrapers/community/ManyVids/manifest create mode 100644 stash/config/scrapers/community/MariskaX/MariskaX.yml create mode 100755 stash/config/scrapers/community/MariskaX/manifest create mode 100644 stash/config/scrapers/community/MarsMedia/MarsMedia.yml create mode 100755 stash/config/scrapers/community/MarsMedia/manifest create mode 100644 stash/config/scrapers/community/Masqulin/Masqulin.yml create mode 100755 stash/config/scrapers/community/Masqulin/manifest create mode 100644 stash/config/scrapers/community/MatureNL/MatureNL.yml create mode 100755 stash/config/scrapers/community/MatureNL/manifest create mode 100644 stash/config/scrapers/community/MaxHardcore/MaxHardcore.yml create mode 100755 stash/config/scrapers/community/MaxHardcore/manifest create mode 100644 stash/config/scrapers/community/MeanBitches/MeanBitches.yml create mode 100755 stash/config/scrapers/community/MeanBitches/manifest create mode 100644 stash/config/scrapers/community/MeanaWolf/MeanaWolf.yml create mode 100755 stash/config/scrapers/community/MeanaWolf/manifest create mode 100644 stash/config/scrapers/community/MelonJuggler/MelonJuggler.yml create mode 100755 stash/config/scrapers/community/MelonJuggler/manifest create mode 100644 stash/config/scrapers/community/Men/Men.py create mode 100644 stash/config/scrapers/community/Men/Men.yml create mode 100755 stash/config/scrapers/community/Men/manifest create mode 100644 stash/config/scrapers/community/MenAtPlay/MenAtPlay.yml create mode 100755 stash/config/scrapers/community/MenAtPlay/manifest create mode 100644 stash/config/scrapers/community/MenOver30/MenOver30.yml create mode 100755 stash/config/scrapers/community/MenOver30/manifest create mode 100644 stash/config/scrapers/community/MetalBondage/MetalBondage.yml create mode 100755 stash/config/scrapers/community/MetalBondage/manifest create mode 100644 stash/config/scrapers/community/MetroHD/MetroHD.py create mode 100644 stash/config/scrapers/community/MetroHD/MetroHD.yml create mode 100755 stash/config/scrapers/community/MetroHD/manifest create mode 100644 stash/config/scrapers/community/MileHighMedia_BiandTrans/MileHighMedia_BiandTrans.py create mode 100644 stash/config/scrapers/community/MileHighMedia_BiandTrans/MileHighMedia_BiandTrans.yml create mode 100755 stash/config/scrapers/community/MileHighMedia_BiandTrans/manifest create mode 100644 stash/config/scrapers/community/MileHighMedia_Gay/MileHighMedia_Gay.py create mode 100644 stash/config/scrapers/community/MileHighMedia_Gay/MileHighMedia_Gay.yml create mode 100755 stash/config/scrapers/community/MileHighMedia_Gay/manifest create mode 100644 stash/config/scrapers/community/MileHighMedia_Straight/MileHighMedia_Straight.py create mode 100644 stash/config/scrapers/community/MileHighMedia_Straight/MileHighMedia_Straight.yml create mode 100755 stash/config/scrapers/community/MileHighMedia_Straight/manifest create mode 100644 stash/config/scrapers/community/MilfTugs/MilfTugs.yml create mode 100755 stash/config/scrapers/community/MilfTugs/manifest create mode 100644 stash/config/scrapers/community/Milovana/Milovana.yml create mode 100755 stash/config/scrapers/community/Milovana/manifest create mode 100644 stash/config/scrapers/community/Minnano-AV/Minnano-AV.py create mode 100644 stash/config/scrapers/community/Minnano-AV/Minnano-AV.yml create mode 100755 stash/config/scrapers/community/Minnano-AV/manifest create mode 100644 stash/config/scrapers/community/Minnano-AV/requirements.txt create mode 100644 stash/config/scrapers/community/MissAV_en/MissAV_en.yml create mode 100755 stash/config/scrapers/community/MissAV_en/manifest create mode 100644 stash/config/scrapers/community/MissAV_jp/MissAV_jp.yml create mode 100755 stash/config/scrapers/community/MissAV_jp/manifest create mode 100644 stash/config/scrapers/community/MissMedeaMortelle/MissMedeaMortelle.yml create mode 100755 stash/config/scrapers/community/MissMedeaMortelle/manifest create mode 100644 stash/config/scrapers/community/MissaX/MissaX.py create mode 100644 stash/config/scrapers/community/MissaX/MissaX.yml create mode 100755 stash/config/scrapers/community/MissaX/manifest create mode 100644 stash/config/scrapers/community/ModelCentroAPI/ModelCentroAPI.py create mode 100644 stash/config/scrapers/community/ModelCentroAPI/ModelCentroAPI.yml create mode 100755 stash/config/scrapers/community/ModelCentroAPI/manifest create mode 100644 stash/config/scrapers/community/ModelMediaUS/ModelMediaUS.yml create mode 100755 stash/config/scrapers/community/ModelMediaUS/manifest create mode 100644 stash/config/scrapers/community/Modelhub/Modelhub.yml create mode 100755 stash/config/scrapers/community/Modelhub/manifest create mode 100644 stash/config/scrapers/community/Mofos/Mofos.py create mode 100644 stash/config/scrapers/community/Mofos/Mofos.yml create mode 100755 stash/config/scrapers/community/Mofos/manifest create mode 100644 stash/config/scrapers/community/Mormongirlz/Mormongirlz.yml create mode 100755 stash/config/scrapers/community/Mormongirlz/manifest create mode 100644 stash/config/scrapers/community/Motherless/Motherless.yml create mode 100755 stash/config/scrapers/community/Motherless/manifest create mode 100644 stash/config/scrapers/community/Mousouzoku/Mousouzoku.yml create mode 100755 stash/config/scrapers/community/Mousouzoku/manifest create mode 100644 stash/config/scrapers/community/MrBigFatDick/MrBigFatDick.yml create mode 100755 stash/config/scrapers/community/MrBigFatDick/manifest create mode 100644 stash/config/scrapers/community/MugFucked/MugFucked.yml create mode 100755 stash/config/scrapers/community/MugFucked/manifest create mode 100644 stash/config/scrapers/community/MyCherryCrush/MyCherryCrush.yml create mode 100755 stash/config/scrapers/community/MyCherryCrush/manifest create mode 100644 stash/config/scrapers/community/MyDirtyHobby/MyDirtyHobby.yml create mode 100755 stash/config/scrapers/community/MyDirtyHobby/manifest create mode 100644 stash/config/scrapers/community/MySweetApple/MySweetApple.yml create mode 100755 stash/config/scrapers/community/MySweetApple/manifest create mode 100644 stash/config/scrapers/community/Mypervmom/Mypervmom.yml create mode 100755 stash/config/scrapers/community/Mypervmom/manifest create mode 100644 stash/config/scrapers/community/NVGNetwork/NVGNetwork.yml create mode 100755 stash/config/scrapers/community/NVGNetwork/manifest create mode 100644 stash/config/scrapers/community/NakedSword/NakedSword.yml create mode 100755 stash/config/scrapers/community/NakedSword/manifest create mode 100644 stash/config/scrapers/community/NaughtyAlysha/NaughtyAlysha.yml create mode 100755 stash/config/scrapers/community/NaughtyAlysha/manifest create mode 100644 stash/config/scrapers/community/NaughtyAmerica/NaughtyAmerica.yml create mode 100755 stash/config/scrapers/community/NaughtyAmerica/manifest create mode 100644 stash/config/scrapers/community/NaughtyAmericaVR/NaughtyAmericaVR.yml create mode 100755 stash/config/scrapers/community/NaughtyAmericaVR/manifest create mode 100644 stash/config/scrapers/community/NaughtyNatural/NaughtyNatural.yml create mode 100755 stash/config/scrapers/community/NaughtyNatural/manifest create mode 100644 stash/config/scrapers/community/NewSensationsMain/NewSensationsMain.yml create mode 100755 stash/config/scrapers/community/NewSensationsMain/manifest create mode 100644 stash/config/scrapers/community/NewSensationsNetworkSites/NewSensationsNetworkSites.yml create mode 100755 stash/config/scrapers/community/NewSensationsNetworkSites/manifest create mode 100644 stash/config/scrapers/community/Newgrounds/Newgrounds.yml create mode 100755 stash/config/scrapers/community/Newgrounds/manifest create mode 100644 stash/config/scrapers/community/NextDoorStudios/NextDoorStudios.yml create mode 100755 stash/config/scrapers/community/NextDoorStudios/manifest create mode 100644 stash/config/scrapers/community/NikkiAndTera/NikkiAndTera.yml create mode 100755 stash/config/scrapers/community/NikkiAndTera/manifest create mode 100644 stash/config/scrapers/community/NoelAlejandro/NoelAlejandro.yml create mode 100755 stash/config/scrapers/community/NoelAlejandro/manifest create mode 100644 stash/config/scrapers/community/Noodledude/Noodledude.yml create mode 100755 stash/config/scrapers/community/Noodledude/manifest create mode 100644 stash/config/scrapers/community/Nubiles/Nubiles.yml create mode 100755 stash/config/scrapers/community/Nubiles/manifest create mode 100644 stash/config/scrapers/community/OldGoesYoung/OldGoesYoung.yml create mode 100755 stash/config/scrapers/community/OldGoesYoung/manifest create mode 100644 stash/config/scrapers/community/OldNanny/OldNanny.yml create mode 100755 stash/config/scrapers/community/OldNanny/manifest create mode 100644 stash/config/scrapers/community/Oldje/Oldje.yml create mode 100755 stash/config/scrapers/community/Oldje/manifest create mode 100644 stash/config/scrapers/community/Only3xGirls/Only3xGirls.yml create mode 100755 stash/config/scrapers/community/Only3xGirls/manifest create mode 100644 stash/config/scrapers/community/OnlyTarts/OnlyTarts.yml create mode 100755 stash/config/scrapers/community/OnlyTarts/manifest create mode 100755 stash/config/scrapers/community/OopsFamily/OopsFamily.yml create mode 100755 stash/config/scrapers/community/OopsFamily/manifest create mode 100644 stash/config/scrapers/community/Oreno3d/Oreno3d.yml create mode 100755 stash/config/scrapers/community/Oreno3d/manifest create mode 100644 stash/config/scrapers/community/PKFStudios/PKFStudios.yml create mode 100755 stash/config/scrapers/community/PKFStudios/manifest create mode 100644 stash/config/scrapers/community/PMVHaven/PMVHaven.py create mode 100644 stash/config/scrapers/community/PMVHaven/PMVHaven.yml create mode 100755 stash/config/scrapers/community/PMVHaven/manifest create mode 100644 stash/config/scrapers/community/POVR/POVR.yml create mode 100755 stash/config/scrapers/community/POVR/manifest create mode 100644 stash/config/scrapers/community/POVTrain/POVTrain.yml create mode 100755 stash/config/scrapers/community/POVTrain/manifest create mode 100644 stash/config/scrapers/community/Paco/Paco.yml create mode 100755 stash/config/scrapers/community/Paco/manifest create mode 100644 stash/config/scrapers/community/PacoJp/PacoJp.yml create mode 100755 stash/config/scrapers/community/PacoJp/manifest create mode 100755 stash/config/scrapers/community/PaperStreetMedia/PaperStreetMedia.yml create mode 100755 stash/config/scrapers/community/PaperStreetMedia/manifest create mode 100644 stash/config/scrapers/community/Passionxxx/Passionxxx.yml create mode 100755 stash/config/scrapers/community/Passionxxx/manifest create mode 100644 stash/config/scrapers/community/PegasProductions/PegasProductions.yml create mode 100755 stash/config/scrapers/community/PegasProductions/manifest create mode 100644 stash/config/scrapers/community/Penthouse/Penthouse.yml create mode 100755 stash/config/scrapers/community/Penthouse/manifest create mode 100644 stash/config/scrapers/community/PerfectGonzo/PerfectGonzo.py create mode 100644 stash/config/scrapers/community/PerfectGonzo/PerfectGonzo.yml create mode 100755 stash/config/scrapers/community/PerfectGonzo/manifest create mode 100644 stash/config/scrapers/community/PervCity/PervCity.yml create mode 100755 stash/config/scrapers/community/PervCity/manifest create mode 100644 stash/config/scrapers/community/Philavise/Philavise.yml create mode 100755 stash/config/scrapers/community/Philavise/manifest create mode 100755 stash/config/scrapers/community/PinkLabelTV/PinkLabelTV.yml create mode 100755 stash/config/scrapers/community/PinkLabelTV/manifest create mode 100644 stash/config/scrapers/community/PinkVisual/PinkVisual.yml create mode 100755 stash/config/scrapers/community/PinkVisual/manifest create mode 100644 stash/config/scrapers/community/Pinkoclub/Pinkoclub.yml create mode 100755 stash/config/scrapers/community/Pinkoclub/manifest create mode 100644 stash/config/scrapers/community/PinupDollars/PinupDollars.yml create mode 100755 stash/config/scrapers/community/PinupDollars/manifest create mode 100644 stash/config/scrapers/community/PissPlay/PissPlay.yml create mode 100755 stash/config/scrapers/community/PissPlay/manifest create mode 100644 stash/config/scrapers/community/PissyNetwork/PissyNetwork.yml create mode 100755 stash/config/scrapers/community/PissyNetwork/manifest create mode 100644 stash/config/scrapers/community/PlayboyPlus/PlayboyPlus.yml create mode 100755 stash/config/scrapers/community/PlayboyPlus/manifest create mode 100644 stash/config/scrapers/community/PlayboyTV/PlayboyTV.yml create mode 100755 stash/config/scrapers/community/PlayboyTV/manifest create mode 100644 stash/config/scrapers/community/PlumperPass/PlumperPass.yml create mode 100755 stash/config/scrapers/community/PlumperPass/manifest create mode 100644 stash/config/scrapers/community/Plushies/Plushies.yml create mode 100755 stash/config/scrapers/community/Plushies/manifest create mode 100644 stash/config/scrapers/community/PornDudeCasting/PornDudeCasting.yml create mode 100755 stash/config/scrapers/community/PornDudeCasting/manifest create mode 100644 stash/config/scrapers/community/PornHex/PornHex.yml create mode 100755 stash/config/scrapers/community/PornHex/manifest create mode 100644 stash/config/scrapers/community/Pornbox/Pornbox.yml create mode 100755 stash/config/scrapers/community/Pornbox/manifest create mode 100644 stash/config/scrapers/community/Porncz/Porncz.yml create mode 100755 stash/config/scrapers/community/Porncz/manifest create mode 100644 stash/config/scrapers/community/Pornditos/Pornditos.yml create mode 100755 stash/config/scrapers/community/Pornditos/manifest create mode 100644 stash/config/scrapers/community/Pornhub/Pornhub.yml create mode 100755 stash/config/scrapers/community/Pornhub/manifest create mode 100644 stash/config/scrapers/community/PornhubPremium/PornhubPremium.yml create mode 100755 stash/config/scrapers/community/PornhubPremium/manifest create mode 100644 stash/config/scrapers/community/PornsiteManager/PornsiteManager.yml create mode 100755 stash/config/scrapers/community/PornsiteManager/manifest create mode 100644 stash/config/scrapers/community/PornstarPlatinum/PornstarPlatinum.yml create mode 100755 stash/config/scrapers/community/PornstarPlatinum/manifest create mode 100644 stash/config/scrapers/community/PortaGloryhole/PortaGloryhole.yml create mode 100755 stash/config/scrapers/community/PortaGloryhole/manifest create mode 100644 stash/config/scrapers/community/PremiumBukkake/PremiumBukkake.py create mode 100644 stash/config/scrapers/community/PremiumBukkake/PremiumBukkake.yml create mode 100755 stash/config/scrapers/community/PremiumBukkake/manifest create mode 100644 stash/config/scrapers/community/Private/Private.yml create mode 100755 stash/config/scrapers/community/Private/manifest create mode 100644 stash/config/scrapers/community/ProducersFun/ProducersFun.yml create mode 100755 stash/config/scrapers/community/ProducersFun/manifest create mode 100644 stash/config/scrapers/community/PropertySex/PropertySex.py create mode 100644 stash/config/scrapers/community/PropertySex/PropertySex.yml create mode 100755 stash/config/scrapers/community/PropertySex/manifest create mode 100644 stash/config/scrapers/community/PuffyNetworkSite/PuffyNetworkSite.yml create mode 100755 stash/config/scrapers/community/PuffyNetworkSite/manifest create mode 100644 stash/config/scrapers/community/Puffynetwork/Puffynetwork.yml create mode 100755 stash/config/scrapers/community/Puffynetwork/manifest create mode 100644 stash/config/scrapers/community/PureMedia/PureMedia.yml create mode 100755 stash/config/scrapers/community/PureMedia/manifest create mode 100644 stash/config/scrapers/community/Putalocura/Putalocura.yml create mode 100755 stash/config/scrapers/community/Putalocura/manifest create mode 100644 stash/config/scrapers/community/Queensnake/Queensnake.yml create mode 100755 stash/config/scrapers/community/Queensnake/manifest create mode 100644 stash/config/scrapers/community/R18.dev/R18.dev.yml create mode 100755 stash/config/scrapers/community/R18.dev/manifest create mode 100644 stash/config/scrapers/community/RachelSteele/RachelSteele.yml create mode 100755 stash/config/scrapers/community/RachelSteele/manifest create mode 100644 stash/config/scrapers/community/RagingStallion/RagingStallion.yml create mode 100755 stash/config/scrapers/community/RagingStallion/manifest create mode 100755 stash/config/scrapers/community/RandyBlue/RandyBlue.yml create mode 100755 stash/config/scrapers/community/RandyBlue/manifest create mode 100644 stash/config/scrapers/community/RawFuckClub/RawFuckClub.yml create mode 100755 stash/config/scrapers/community/RawFuckClub/manifest create mode 100644 stash/config/scrapers/community/RawRoadNation/RawRoadNation.yml create mode 100755 stash/config/scrapers/community/RawRoadNation/manifest create mode 100644 stash/config/scrapers/community/RealJamVR/RealJamVR.yml create mode 100755 stash/config/scrapers/community/RealJamVR/manifest create mode 100644 stash/config/scrapers/community/RealityDudes/RealityDudes.py create mode 100644 stash/config/scrapers/community/RealityDudes/RealityDudes.yml create mode 100755 stash/config/scrapers/community/RealityDudes/manifest create mode 100644 stash/config/scrapers/community/RealityKings/RealityKings.py create mode 100644 stash/config/scrapers/community/RealityKings/RealityKings.yml create mode 100755 stash/config/scrapers/community/RealityKings/manifest create mode 100644 stash/config/scrapers/community/RealityLovers/RealityLovers.py create mode 100644 stash/config/scrapers/community/RealityLovers/RealityLovers.yml create mode 100755 stash/config/scrapers/community/RealityLovers/manifest create mode 100644 stash/config/scrapers/community/RedHotStraightBoys/RedHotStraightBoys.yml create mode 100755 stash/config/scrapers/community/RedHotStraightBoys/manifest create mode 100644 stash/config/scrapers/community/Reddit/Reddit.yml create mode 100755 stash/config/scrapers/community/Reddit/manifest create mode 100644 stash/config/scrapers/community/Redgifs/Redgifs.py create mode 100644 stash/config/scrapers/community/Redgifs/Redgifs.yml create mode 100755 stash/config/scrapers/community/Redgifs/manifest create mode 100644 stash/config/scrapers/community/ReflectiveDesire/ReflectiveDesire.yml create mode 100755 stash/config/scrapers/community/ReflectiveDesire/manifest create mode 100644 stash/config/scrapers/community/RestrictedSenses/RestrictedSenses.yml create mode 100755 stash/config/scrapers/community/RestrictedSenses/manifest create mode 100644 stash/config/scrapers/community/RiggsFilms/RiggsFilms.yml create mode 100755 stash/config/scrapers/community/RiggsFilms/manifest create mode 100644 stash/config/scrapers/community/RoccoSiffredi/RoccoSiffredi.yml create mode 100755 stash/config/scrapers/community/RoccoSiffredi/manifest create mode 100644 stash/config/scrapers/community/RoyalFetishFilms/RoyalFetishFilms.yml create mode 100755 stash/config/scrapers/community/RoyalFetishFilms/manifest create mode 100644 stash/config/scrapers/community/Rule34Video/Rule34Video.yml create mode 100755 stash/config/scrapers/community/Rule34Video/manifest create mode 100644 stash/config/scrapers/community/SARJ-LLC/SARJ-LLC.py create mode 100644 stash/config/scrapers/community/SARJ-LLC/SARJ-LLC.yml create mode 100755 stash/config/scrapers/community/SARJ-LLC/manifest create mode 100644 stash/config/scrapers/community/SLRoriginals/SLRoriginals.yml create mode 100755 stash/config/scrapers/community/SLRoriginals/manifest create mode 100644 stash/config/scrapers/community/Sayuncle/Sayuncle.yml create mode 100755 stash/config/scrapers/community/Sayuncle/manifest create mode 100644 stash/config/scrapers/community/ScrapeWithURL/ScrapeWithURL.py create mode 100644 stash/config/scrapers/community/ScrapeWithURL/ScrapeWithURL.yml create mode 100755 stash/config/scrapers/community/ScrapeWithURL/manifest create mode 100644 stash/config/scrapers/community/SeanCody/SeanCody.py create mode 100644 stash/config/scrapers/community/SeanCody/SeanCody.yml create mode 100755 stash/config/scrapers/community/SeanCody/manifest create mode 100644 stash/config/scrapers/community/SeeMomSuck/SeeMomSuck.yml create mode 100755 stash/config/scrapers/community/SeeMomSuck/manifest create mode 100644 stash/config/scrapers/community/SelfieSuck/SelfieSuck.yml create mode 100755 stash/config/scrapers/community/SelfieSuck/manifest create mode 100644 stash/config/scrapers/community/SexBabesVR/SexBabesVR.yml create mode 100755 stash/config/scrapers/community/SexBabesVR/manifest create mode 100644 stash/config/scrapers/community/SexLikeReal/SexLikeReal.yml create mode 100755 stash/config/scrapers/community/SexLikeReal/manifest create mode 100644 stash/config/scrapers/community/SexMex/SexMex.yml create mode 100755 stash/config/scrapers/community/SexMex/manifest create mode 100644 stash/config/scrapers/community/SexSelector/SexSelector.yml create mode 100755 stash/config/scrapers/community/SexSelector/manifest create mode 100644 stash/config/scrapers/community/SexVR/SexVR.yml create mode 100755 stash/config/scrapers/community/SexVR/manifest create mode 100644 stash/config/scrapers/community/SexyHub/SexyHub.py create mode 100644 stash/config/scrapers/community/SexyHub/SexyHub.yml create mode 100755 stash/config/scrapers/community/SexyHub/manifest create mode 100644 stash/config/scrapers/community/ShinyBound/ShinyBound.yml create mode 100755 stash/config/scrapers/community/ShinyBound/manifest create mode 100644 stash/config/scrapers/community/ShokoAPI/ShokoAPI.py create mode 100644 stash/config/scrapers/community/ShokoAPI/ShokoAPI.yml create mode 100644 stash/config/scrapers/community/ShokoAPI/config.py create mode 100755 stash/config/scrapers/community/ShokoAPI/manifest create mode 100644 stash/config/scrapers/community/ShowyBeauty/ShowyBeauty.yml create mode 100755 stash/config/scrapers/community/ShowyBeauty/manifest create mode 100644 stash/config/scrapers/community/ShylaJ/ShylaJ.yml create mode 100755 stash/config/scrapers/community/ShylaJ/manifest create mode 100644 stash/config/scrapers/community/Sinematica/Sinematica.yml create mode 100755 stash/config/scrapers/community/Sinematica/manifest create mode 100644 stash/config/scrapers/community/SinsLife/SinsLife.yml create mode 100755 stash/config/scrapers/community/SinsLife/manifest create mode 100644 stash/config/scrapers/community/SlaveMouth/SlaveMouth.yml create mode 100755 stash/config/scrapers/community/SlaveMouth/manifest create mode 100644 stash/config/scrapers/community/Slim4k/Slim4k.yml create mode 100755 stash/config/scrapers/community/Slim4k/manifest create mode 100644 stash/config/scrapers/community/SmokingMina/SmokingMina.yml create mode 100755 stash/config/scrapers/community/SmokingMina/manifest create mode 100644 stash/config/scrapers/community/SmutPuppet/SmutPuppet.yml create mode 100755 stash/config/scrapers/community/SmutPuppet/manifest create mode 100644 stash/config/scrapers/community/SpankBang/SpankBang.yml create mode 100755 stash/config/scrapers/community/SpankBang/manifest create mode 100644 stash/config/scrapers/community/SpermMania/SpermMania.yml create mode 100755 stash/config/scrapers/community/SpermMania/manifest create mode 100644 stash/config/scrapers/community/Spizoo/Spizoo.yml create mode 100755 stash/config/scrapers/community/Spizoo/manifest create mode 100644 stash/config/scrapers/community/Spritzz/Spritzz.yml create mode 100755 stash/config/scrapers/community/Spritzz/manifest create mode 100644 stash/config/scrapers/community/SpunkWorthy/SpunkWorthy.yml create mode 100755 stash/config/scrapers/community/SpunkWorthy/manifest create mode 100644 stash/config/scrapers/community/Squirted/Squirted.yml create mode 100755 stash/config/scrapers/community/Squirted/manifest create mode 100644 stash/config/scrapers/community/StasyQ/StasyQ.yml create mode 100755 stash/config/scrapers/community/StasyQ/manifest create mode 100644 stash/config/scrapers/community/StasyQVR/StasyQVR.yml create mode 100755 stash/config/scrapers/community/StasyQVR/manifest create mode 100644 stash/config/scrapers/community/Staxus/Staxus.yml create mode 100755 stash/config/scrapers/community/Staxus/manifest create mode 100644 stash/config/scrapers/community/StrapOnCum/StrapOnCum.yml create mode 100755 stash/config/scrapers/community/StrapOnCum/manifest create mode 100644 stash/config/scrapers/community/StraponDreamer/StraponDreamer.yml create mode 100755 stash/config/scrapers/community/StraponDreamer/manifest create mode 100644 stash/config/scrapers/community/StripzVR/StripzVR.yml create mode 100755 stash/config/scrapers/community/StripzVR/manifest create mode 100644 stash/config/scrapers/community/Strokies/Strokies.yml create mode 100755 stash/config/scrapers/community/Strokies/manifest create mode 100644 stash/config/scrapers/community/StudioFOW/StudioFOW.yml create mode 100755 stash/config/scrapers/community/StudioFOW/manifest create mode 100644 stash/config/scrapers/community/SubbyHubby/SubbyHubby.yml create mode 100755 stash/config/scrapers/community/SubbyHubby/manifest create mode 100644 stash/config/scrapers/community/SubmissiveX/SubmissiveX.yml create mode 100755 stash/config/scrapers/community/SubmissiveX/manifest create mode 100644 stash/config/scrapers/community/SubspaceLand/SubspaceLand.yml create mode 100755 stash/config/scrapers/community/SubspaceLand/manifest create mode 100644 stash/config/scrapers/community/SwallowBay/SwallowBay.yml create mode 100755 stash/config/scrapers/community/SwallowBay/manifest create mode 100644 stash/config/scrapers/community/SweetFemdom/SweetFemdom.yml create mode 100755 stash/config/scrapers/community/SweetFemdom/manifest create mode 100644 stash/config/scrapers/community/SweetyX/SweetyX.yml create mode 100755 stash/config/scrapers/community/SweetyX/manifest create mode 100644 stash/config/scrapers/community/SwingerBlog/SwingerBlog.yml create mode 100755 stash/config/scrapers/community/SwingerBlog/manifest create mode 100644 stash/config/scrapers/community/TACAmateurs/TACAmateurs.yml create mode 100755 stash/config/scrapers/community/TACAmateurs/manifest create mode 100755 stash/config/scrapers/community/TMDB/TMDB.yml create mode 100755 stash/config/scrapers/community/TMDB/manifest create mode 100644 stash/config/scrapers/community/TSPlayground/TSPlayground.yml create mode 100755 stash/config/scrapers/community/TSPlayground/manifest create mode 100644 stash/config/scrapers/community/TabooHeat/TabooHeat.yml create mode 100755 stash/config/scrapers/community/TabooHeat/manifest create mode 100644 stash/config/scrapers/community/TadpolexStudio/TadpolexStudio.yml create mode 100755 stash/config/scrapers/community/TadpolexStudio/manifest create mode 100644 stash/config/scrapers/community/TakeVan/TakeVan.yml create mode 100755 stash/config/scrapers/community/TakeVan/manifest create mode 100644 stash/config/scrapers/community/TaraTainton/TaraTainton.yml create mode 100755 stash/config/scrapers/community/TaraTainton/manifest create mode 100644 stash/config/scrapers/community/Teamskeet/Teamskeet.yml create mode 100644 stash/config/scrapers/community/Teamskeet/TeamskeetAPI.py create mode 100755 stash/config/scrapers/community/Teamskeet/manifest create mode 100644 stash/config/scrapers/community/TeenDreams/TeenDreams.yml create mode 100755 stash/config/scrapers/community/TeenDreams/manifest create mode 100644 stash/config/scrapers/community/TeenMegaWorld/TeenMegaWorld.yml create mode 100755 stash/config/scrapers/community/TeenMegaWorld/manifest create mode 100644 stash/config/scrapers/community/Teencoreclub/Teencoreclub.yml create mode 100755 stash/config/scrapers/community/Teencoreclub/manifest create mode 100644 stash/config/scrapers/community/TeenyTaboo/TeenyTaboo.yml create mode 100755 stash/config/scrapers/community/TeenyTaboo/manifest create mode 100644 stash/config/scrapers/community/Tenshigao/Tenshigao.yml create mode 100755 stash/config/scrapers/community/Tenshigao/manifest create mode 100644 stash/config/scrapers/community/TesteDeFudelidade/TesteDeFudelidade.yml create mode 100755 stash/config/scrapers/community/TesteDeFudelidade/manifest create mode 100644 stash/config/scrapers/community/TexasBukkake/TexasBukkake.yml create mode 100755 stash/config/scrapers/community/TexasBukkake/manifest create mode 100644 stash/config/scrapers/community/TheBroNetwork/TheBroNetwork.yml create mode 100755 stash/config/scrapers/community/TheBroNetwork/manifest create mode 100644 stash/config/scrapers/community/TheFlourish/TheFlourish.yml create mode 100755 stash/config/scrapers/community/TheFlourish/manifest create mode 100644 stash/config/scrapers/community/TheHabibShow/TheHabibShow.yml create mode 100755 stash/config/scrapers/community/TheHabibShow/manifest create mode 100644 stash/config/scrapers/community/TheNude/TheNude.yml create mode 100755 stash/config/scrapers/community/TheNude/manifest create mode 100644 stash/config/scrapers/community/ThePornDBJAV/ThePornDBJAV.yml create mode 100755 stash/config/scrapers/community/ThePornDBJAV/manifest create mode 100644 stash/config/scrapers/community/ThePornDBMovies/ThePornDBMovies.yml create mode 100755 stash/config/scrapers/community/ThePornDBMovies/manifest create mode 100644 stash/config/scrapers/community/TheScoreGroup/TheScoreGroup.py create mode 100644 stash/config/scrapers/community/TheScoreGroup/TheScoreGroup.yml create mode 100755 stash/config/scrapers/community/TheScoreGroup/manifest create mode 100644 stash/config/scrapers/community/ThirdRockEnt/ThirdRockEnt.yml create mode 100755 stash/config/scrapers/community/ThirdRockEnt/manifest create mode 100644 stash/config/scrapers/community/ThirdSexXXX/ThirdSexXXX.yml create mode 100755 stash/config/scrapers/community/ThirdSexXXX/manifest create mode 100644 stash/config/scrapers/community/ThisVid/ThisVid.yml create mode 100755 stash/config/scrapers/community/ThisVid/manifest create mode 100644 stash/config/scrapers/community/TimTales/TimTales.yml create mode 100755 stash/config/scrapers/community/TimTales/manifest create mode 100644 stash/config/scrapers/community/Timestamp.trade/Timestamp.trade.yml create mode 100755 stash/config/scrapers/community/Timestamp.trade/manifest create mode 100644 stash/config/scrapers/community/TitanMen/TitanMen.yml create mode 100755 stash/config/scrapers/community/TitanMen/manifest create mode 100644 stash/config/scrapers/community/Tokyohot/Tokyohot.py create mode 100644 stash/config/scrapers/community/Tokyohot/Tokyohot.yml create mode 100755 stash/config/scrapers/community/Tokyohot/manifest create mode 100644 stash/config/scrapers/community/Tonightsgirlfriend/Tonightsgirlfriend.yml create mode 100755 stash/config/scrapers/community/Tonightsgirlfriend/manifest create mode 100644 stash/config/scrapers/community/Trans500/Trans500.yml create mode 100755 stash/config/scrapers/community/Trans500/manifest create mode 100644 stash/config/scrapers/community/TransAngels/TransAngels.py create mode 100644 stash/config/scrapers/community/TransAngels/TransAngels.yml create mode 100755 stash/config/scrapers/community/TransAngels/manifest create mode 100644 stash/config/scrapers/community/TransModelDatabase/TransModelDatabase.yml create mode 100755 stash/config/scrapers/community/TransModelDatabase/manifest create mode 100644 stash/config/scrapers/community/Transerotica/Transerotica.yml create mode 100755 stash/config/scrapers/community/Transerotica/manifest create mode 100644 stash/config/scrapers/community/Traxxx/Traxxx.py create mode 100644 stash/config/scrapers/community/Traxxx/Traxxx.yml create mode 100755 stash/config/scrapers/community/Traxxx/manifest create mode 100644 stash/config/scrapers/community/Traxxx/traxxx_interface.py create mode 100644 stash/config/scrapers/community/TreasureIslandMedia/TreasureIslandMedia.yml create mode 100755 stash/config/scrapers/community/TreasureIslandMedia/manifest create mode 100644 stash/config/scrapers/community/TrikePatrol/TrikePatrol.yml create mode 100755 stash/config/scrapers/community/TrikePatrol/manifest create mode 100644 stash/config/scrapers/community/TripForFuck/TripForFuck.yml create mode 100755 stash/config/scrapers/community/TripForFuck/manifest create mode 100644 stash/config/scrapers/community/TrueAmateurs/TrueAmateurs.yml create mode 100755 stash/config/scrapers/community/TrueAmateurs/manifest create mode 100644 stash/config/scrapers/community/Tube8Vip/Tube8Vip.py create mode 100644 stash/config/scrapers/community/Tube8Vip/Tube8Vip.yml create mode 100755 stash/config/scrapers/community/Tube8Vip/manifest create mode 100644 stash/config/scrapers/community/TugPass/TugPass.yml create mode 100755 stash/config/scrapers/community/TugPass/manifest create mode 100644 stash/config/scrapers/community/TukTukPatrol/TukTukPatrol.yml create mode 100755 stash/config/scrapers/community/TukTukPatrol/manifest create mode 100644 stash/config/scrapers/community/Twistys/Twistys.py create mode 100644 stash/config/scrapers/community/Twistys/Twistys.yml create mode 100755 stash/config/scrapers/community/Twistys/manifest create mode 100644 stash/config/scrapers/community/TwoTGirls/TwoTGirls.yml create mode 100755 stash/config/scrapers/community/TwoTGirls/manifest create mode 100644 stash/config/scrapers/community/UltraFilms/UltraFilms.yml create mode 100755 stash/config/scrapers/community/UltraFilms/manifest create mode 100644 stash/config/scrapers/community/UnderHentai/UnderHentai.yml create mode 100755 stash/config/scrapers/community/UnderHentai/manifest create mode 100644 stash/config/scrapers/community/VNAGirls/VNAGirls.yml create mode 100755 stash/config/scrapers/community/VNAGirls/manifest create mode 100644 stash/config/scrapers/community/VRBangers/VRBangers.yml create mode 100755 stash/config/scrapers/community/VRBangers/manifest create mode 100644 stash/config/scrapers/community/VRHush/VRHush.yml create mode 100755 stash/config/scrapers/community/VRHush/manifest create mode 100644 stash/config/scrapers/community/VRLatina/VRLatina.yml create mode 100755 stash/config/scrapers/community/VRLatina/manifest create mode 100644 stash/config/scrapers/community/VRPorn/VRPorn.yml create mode 100755 stash/config/scrapers/community/VRPorn/manifest create mode 100644 stash/config/scrapers/community/VegasDreamsLLC/VegasDreamsLLC.yml create mode 100755 stash/config/scrapers/community/VegasDreamsLLC/manifest create mode 100644 stash/config/scrapers/community/VegasDreamworks/VegasDreamworks.yml create mode 100755 stash/config/scrapers/community/VegasDreamworks/manifest create mode 100644 stash/config/scrapers/community/VelvetVeronica/VelvetVeronica.yml create mode 100755 stash/config/scrapers/community/VelvetVeronica/manifest create mode 100644 stash/config/scrapers/community/Vip4K/Vip4K.yml create mode 100755 stash/config/scrapers/community/Vip4K/manifest create mode 100644 stash/config/scrapers/community/Vipissy/Vipissy.yml create mode 100755 stash/config/scrapers/community/Vipissy/manifest create mode 100644 stash/config/scrapers/community/VirtualPee/VirtualPee.yml create mode 100755 stash/config/scrapers/community/VirtualPee/manifest create mode 100644 stash/config/scrapers/community/VirtualPorn/VirtualPorn.yml create mode 100755 stash/config/scrapers/community/VirtualPorn/manifest create mode 100644 stash/config/scrapers/community/VirtualRealPorn/VirtualRealPorn.yml create mode 100755 stash/config/scrapers/community/VirtualRealPorn/manifest create mode 100644 stash/config/scrapers/community/VirtualTaboo/VirtualTaboo.yml create mode 100755 stash/config/scrapers/community/VirtualTaboo/manifest create mode 100644 stash/config/scrapers/community/Visit-X/Visit-X.yml create mode 100755 stash/config/scrapers/community/Visit-X/manifest create mode 100644 stash/config/scrapers/community/Vivid/Vivid.yml create mode 100755 stash/config/scrapers/community/Vivid/manifest create mode 100644 stash/config/scrapers/community/Voyeurweb/Voyeurweb.yml create mode 100755 stash/config/scrapers/community/Voyeurweb/manifest create mode 100644 stash/config/scrapers/community/Voyr/Voyr.yml create mode 100755 stash/config/scrapers/community/Voyr/manifest create mode 100644 stash/config/scrapers/community/VrxDB/VrxDB.yml create mode 100755 stash/config/scrapers/community/VrxDB/manifest create mode 100644 stash/config/scrapers/community/WAPdB/WAPdB.py create mode 100644 stash/config/scrapers/community/WAPdB/WAPdB.yml create mode 100755 stash/config/scrapers/community/WAPdB/manifest create mode 100644 stash/config/scrapers/community/WOWGirlsBlog/WOWGirlsBlog.yml create mode 100755 stash/config/scrapers/community/WOWGirlsBlog/manifest create mode 100644 stash/config/scrapers/community/WakeUpnFuck/WakeUpnFuck.yml create mode 100755 stash/config/scrapers/community/WakeUpnFuck/manifest create mode 100644 stash/config/scrapers/community/WankItNow/WankItNow.yml create mode 100755 stash/config/scrapers/community/WankItNow/manifest create mode 100644 stash/config/scrapers/community/Watch4Beauty/Watch4Beauty.yml create mode 100755 stash/config/scrapers/community/Watch4Beauty/manifest create mode 100644 stash/config/scrapers/community/Watch4Fetish/Watch4Fetish.yml create mode 100755 stash/config/scrapers/community/Watch4Fetish/manifest create mode 100644 stash/config/scrapers/community/WatchMyGF/WatchMyGF.yml create mode 100755 stash/config/scrapers/community/WatchMyGF/manifest create mode 100644 stash/config/scrapers/community/WatchYouJerk/WatchYouJerk.yml create mode 100755 stash/config/scrapers/community/WatchYouJerk/manifest create mode 100644 stash/config/scrapers/community/Waybig/Waybig.yml create mode 100755 stash/config/scrapers/community/Waybig/manifest create mode 100644 stash/config/scrapers/community/WeAreHairy/WeAreHairy.yml create mode 100755 stash/config/scrapers/community/WeAreHairy/manifest create mode 100644 stash/config/scrapers/community/WeFuckBlackGirls/WeFuckBlackGirls.yml create mode 100755 stash/config/scrapers/community/WeFuckBlackGirls/manifest create mode 100644 stash/config/scrapers/community/WhisparrWDTV/WhisparrWDTV.py create mode 100644 stash/config/scrapers/community/WhisparrWDTV/WhisparrWDTV.yml create mode 100755 stash/config/scrapers/community/WhisparrWDTV/manifest create mode 100644 stash/config/scrapers/community/WhyNotBi/WhyNotBi.py create mode 100644 stash/config/scrapers/community/WhyNotBi/WhyNotBi.yml create mode 100755 stash/config/scrapers/community/WhyNotBi/manifest create mode 100644 stash/config/scrapers/community/Wicked/Wicked.yml create mode 100755 stash/config/scrapers/community/Wicked/manifest create mode 100644 stash/config/scrapers/community/WickedMovies/WickedMovies.yml create mode 100755 stash/config/scrapers/community/WickedMovies/manifest create mode 100644 stash/config/scrapers/community/WikiData/WikiData.yml create mode 100755 stash/config/scrapers/community/WikiData/manifest create mode 100644 stash/config/scrapers/community/Williamhiggins/Williamhiggins.yml create mode 100755 stash/config/scrapers/community/Williamhiggins/manifest create mode 100644 stash/config/scrapers/community/WoodmancastingX/WoodmancastingX.yml create mode 100755 stash/config/scrapers/community/WoodmancastingX/manifest create mode 100644 stash/config/scrapers/community/WowNetworkVenus/WowNetworkVenus.py create mode 100644 stash/config/scrapers/community/WowNetworkVenus/WowNetworkVenus.yml create mode 100755 stash/config/scrapers/community/WowNetworkVenus/manifest create mode 100644 stash/config/scrapers/community/WowNetworkVenus/requirements.txt create mode 100644 stash/config/scrapers/community/WowPorn/WowPorn.yml create mode 100755 stash/config/scrapers/community/WowPorn/manifest create mode 100644 stash/config/scrapers/community/Wtfpass/Wtfpass.yml create mode 100755 stash/config/scrapers/community/Wtfpass/manifest create mode 100644 stash/config/scrapers/community/X-artcom/X-artcom.yml create mode 100755 stash/config/scrapers/community/X-artcom/manifest create mode 100644 stash/config/scrapers/community/XConfessions/XConfessions.yml create mode 100755 stash/config/scrapers/community/XConfessions/manifest create mode 100644 stash/config/scrapers/community/XVirtual/XVirtual.yml create mode 100755 stash/config/scrapers/community/XVirtual/manifest create mode 100644 stash/config/scrapers/community/XXXJobInterviews/XXXJobInterviews.yml create mode 100755 stash/config/scrapers/community/XXXJobInterviews/manifest create mode 100644 stash/config/scrapers/community/XXXPawn/XXXPawn.yml create mode 100755 stash/config/scrapers/community/XXXPawn/manifest create mode 100644 stash/config/scrapers/community/Xartxxx/Xartxxx.yml create mode 100755 stash/config/scrapers/community/Xartxxx/manifest create mode 100644 stash/config/scrapers/community/Xes/Xes.yml create mode 100755 stash/config/scrapers/community/Xes/manifest create mode 100644 stash/config/scrapers/community/Xhamster/Xhamster.yml create mode 100755 stash/config/scrapers/community/Xhamster/manifest create mode 100644 stash/config/scrapers/community/Xnxx/Xnxx.yml create mode 100755 stash/config/scrapers/community/Xnxx/manifest create mode 100644 stash/config/scrapers/community/Xrares/Xrares.yml create mode 100755 stash/config/scrapers/community/Xrares/manifest create mode 100644 stash/config/scrapers/community/Xslist/Xslist.yml create mode 100755 stash/config/scrapers/community/Xslist/manifest create mode 100644 stash/config/scrapers/community/Xtube/Xtube.yml create mode 100755 stash/config/scrapers/community/Xtube/manifest create mode 100644 stash/config/scrapers/community/Xvideos/Xvideos.yml create mode 100755 stash/config/scrapers/community/Xvideos/manifest create mode 100644 stash/config/scrapers/community/YNGR/YNGR.yml create mode 100755 stash/config/scrapers/community/YNGR/manifest create mode 100644 stash/config/scrapers/community/Yanks/Yanks.yml create mode 100755 stash/config/scrapers/community/Yanks/manifest create mode 100644 stash/config/scrapers/community/YouPorn/YouPorn.yml create mode 100755 stash/config/scrapers/community/YouPorn/manifest create mode 100644 stash/config/scrapers/community/ZentaiDolls/ZentaiDolls.yml create mode 100755 stash/config/scrapers/community/ZentaiDolls/manifest create mode 100644 stash/config/scrapers/community/ZexyVR/ZexyVR.yml create mode 100755 stash/config/scrapers/community/ZexyVR/manifest create mode 100644 stash/config/scrapers/community/Zishy/Zishy.yml create mode 100755 stash/config/scrapers/community/Zishy/manifest create mode 100644 stash/config/scrapers/community/angelasommers/angelasommers.yml create mode 100755 stash/config/scrapers/community/angelasommers/manifest create mode 100644 stash/config/scrapers/community/auntykathy/auntykathy.yml create mode 100755 stash/config/scrapers/community/auntykathy/manifest create mode 100644 stash/config/scrapers/community/bellapass/bellapass.yml create mode 100755 stash/config/scrapers/community/bellapass/manifest create mode 100644 stash/config/scrapers/community/brandibelle/brandibelle.yml create mode 100755 stash/config/scrapers/community/brandibelle/manifest create mode 100644 stash/config/scrapers/community/brickyates/brickyates.yml create mode 100755 stash/config/scrapers/community/brickyates/manifest create mode 100644 stash/config/scrapers/community/bruceandmorgan/bruceandmorgan.yml create mode 100755 stash/config/scrapers/community/bruceandmorgan/manifest create mode 100644 stash/config/scrapers/community/chastitybabes/chastitybabes.yml create mode 100755 stash/config/scrapers/community/chastitybabes/manifest create mode 100755 stash/config/scrapers/community/czechcasting/czechcasting.yml create mode 100755 stash/config/scrapers/community/czechcasting/manifest create mode 100644 stash/config/scrapers/community/data18/data18.yml create mode 100755 stash/config/scrapers/community/data18/manifest create mode 100644 stash/config/scrapers/community/disruptivefilms/disruptivefilms.yml create mode 100755 stash/config/scrapers/community/disruptivefilms/manifest create mode 100644 stash/config/scrapers/community/evolvedfightslez/evolvedfightslez.yml create mode 100755 stash/config/scrapers/community/evolvedfightslez/manifest create mode 100644 stash/config/scrapers/community/filthykings/filthykings.yml create mode 100755 stash/config/scrapers/community/filthykings/manifest create mode 100644 stash/config/scrapers/community/hanime/hanime.yml create mode 100755 stash/config/scrapers/community/hanime/manifest create mode 100644 stash/config/scrapers/community/hentai2read/hentai2read.yml create mode 100755 stash/config/scrapers/community/hentai2read/manifest create mode 100644 stash/config/scrapers/community/hushpass/hushpass.yml create mode 100755 stash/config/scrapers/community/hushpass/manifest create mode 100644 stash/config/scrapers/community/hussiemodels/hussiemodels.yml create mode 100755 stash/config/scrapers/community/hussiemodels/manifest create mode 100644 stash/config/scrapers/community/insex/insex.yml create mode 100755 stash/config/scrapers/community/insex/manifest create mode 100644 stash/config/scrapers/community/insexOL/insexOL.yml create mode 100755 stash/config/scrapers/community/insexOL/manifest create mode 100644 stash/config/scrapers/community/javdb/javdb.yml create mode 100755 stash/config/scrapers/community/javdb/manifest create mode 100644 stash/config/scrapers/community/karatmedia/karatmedia.yml create mode 100755 stash/config/scrapers/community/karatmedia/manifest create mode 100644 stash/config/scrapers/community/kinkyfamily/kinkyfamily.yml create mode 100755 stash/config/scrapers/community/kinkyfamily/manifest create mode 100644 stash/config/scrapers/community/lethalpass/lethalpass.yml create mode 100755 stash/config/scrapers/community/lethalpass/manifest create mode 100755 stash/config/scrapers/community/mgstage/manifest create mode 100644 stash/config/scrapers/community/mgstage/mgstage.yml create mode 100755 stash/config/scrapers/community/multiscrape/manifest create mode 100644 stash/config/scrapers/community/multiscrape/multiscrape.py create mode 100644 stash/config/scrapers/community/multiscrape/multiscrape.yml create mode 100755 stash/config/scrapers/community/my-slavegirl/manifest create mode 100644 stash/config/scrapers/community/my-slavegirl/my-slavegirl.yml create mode 100755 stash/config/scrapers/community/mypervyfamily/manifest create mode 100644 stash/config/scrapers/community/mypervyfamily/mypervyfamily.yml create mode 100755 stash/config/scrapers/community/nhentai/manifest create mode 100644 stash/config/scrapers/community/nhentai/nhentai.yml create mode 100755 stash/config/scrapers/community/pantyjobs/manifest create mode 100644 stash/config/scrapers/community/pantyjobs/pantyjobs.yml create mode 100755 stash/config/scrapers/community/peeonher/manifest create mode 100644 stash/config/scrapers/community/peeonher/peeonher.yml create mode 100755 stash/config/scrapers/community/performer-image-by-scene/manifest create mode 100644 stash/config/scrapers/community/performer-image-by-scene/performer-image-by-scene.py create mode 100644 stash/config/scrapers/community/performer-image-by-scene/performer-image-by-scene.yml create mode 100755 stash/config/scrapers/community/performer-image-dir/manifest create mode 100644 stash/config/scrapers/community/performer-image-dir/performer-image-dir.py create mode 100644 stash/config/scrapers/community/performer-image-dir/performer-image-dir.yml create mode 100755 stash/config/scrapers/community/pjgirls/manifest create mode 100644 stash/config/scrapers/community/pjgirls/pjgirls.yml create mode 100755 stash/config/scrapers/community/pornworld/manifest create mode 100644 stash/config/scrapers/community/pornworld/pornworld.yml create mode 100755 stash/config/scrapers/community/privatecastings/manifest create mode 100644 stash/config/scrapers/community/privatecastings/privatecastings.yml create mode 100755 stash/config/scrapers/community/purgatoryx/manifest create mode 100644 stash/config/scrapers/community/purgatoryx/purgatoryx.yml create mode 100644 stash/config/scrapers/community/py_common/config.py create mode 100644 stash/config/scrapers/community/py_common/graphql.py create mode 100644 stash/config/scrapers/community/py_common/log.py create mode 100755 stash/config/scrapers/community/py_common/manifest create mode 100644 stash/config/scrapers/community/py_common/types.py create mode 100644 stash/config/scrapers/community/py_common/util.py create mode 100644 stash/config/scrapers/community/rb_common/README.md create mode 100644 stash/config/scrapers/community/rb_common/configs/README.md create mode 100644 stash/config/scrapers/community/rb_common/configs/config_base.rb create mode 100644 stash/config/scrapers/community/rb_common/configs/stash_config.rb create mode 100644 stash/config/scrapers/community/rb_common/configs/stashdb_config.rb create mode 100644 stash/config/scrapers/community/rb_common/graphql/README.md create mode 100644 stash/config/scrapers/community/rb_common/graphql/graphql_base.rb create mode 100644 stash/config/scrapers/community/rb_common/graphql/stash.rb create mode 100644 stash/config/scrapers/community/rb_common/logger.rb create mode 100755 stash/config/scrapers/community/rb_common/manifest create mode 100644 stash/config/scrapers/community/rb_common/rb_common.rb create mode 100755 stash/config/scrapers/community/sapphix/manifest create mode 100644 stash/config/scrapers/community/sapphix/sapphix.yml create mode 100755 stash/config/scrapers/community/sexuria/manifest create mode 100644 stash/config/scrapers/community/sexuria/sexuria.yml create mode 100755 stash/config/scrapers/community/shagmag/manifest create mode 100644 stash/config/scrapers/community/shagmag/shagmag.yml create mode 100755 stash/config/scrapers/community/stash-sqlite/manifest create mode 100644 stash/config/scrapers/community/stash-sqlite/stash-sqlite.py create mode 100644 stash/config/scrapers/community/stash-sqlite/stash-sqlite.yml create mode 100755 stash/config/scrapers/community/sugarcookie/manifest create mode 100644 stash/config/scrapers/community/sugarcookie/sugarcookie.yml create mode 100755 stash/config/scrapers/community/superbemodels/manifest create mode 100644 stash/config/scrapers/community/superbemodels/superbemodels.yml create mode 100755 stash/config/scrapers/community/taboopov/manifest create mode 100644 stash/config/scrapers/community/taboopov/taboopov.yml create mode 100755 stash/config/scrapers/community/torrent/manifest create mode 100644 stash/config/scrapers/community/torrent/torrent.py create mode 100644 stash/config/scrapers/community/torrent/torrent.yml create mode 100755 stash/config/scrapers/community/touchmywife/manifest create mode 100644 stash/config/scrapers/community/touchmywife/touchmywife.yml create mode 100755 stash/config/scrapers/community/toughlovex/manifest create mode 100644 stash/config/scrapers/community/toughlovex/toughlovex.yml create mode 100755 stash/config/scrapers/community/trafficpimps/manifest create mode 100644 stash/config/scrapers/community/trafficpimps/trafficpimps.yml create mode 100755 stash/config/scrapers/community/vTubie/manifest create mode 100644 stash/config/scrapers/community/vTubie/vTubie.yml create mode 100755 stash/config/scrapers/community/vixenNetwork/manifest create mode 100644 stash/config/scrapers/community/vixenNetwork/vixenNetwork.py create mode 100644 stash/config/scrapers/community/vixenNetwork/vixenNetwork.yml create mode 100755 stash/config/scrapers/community/vogov/manifest create mode 100644 stash/config/scrapers/community/vogov/vogov.yml create mode 100755 stash/config/scrapers/community/wankz/manifest create mode 100644 stash/config/scrapers/community/wankz/wankz.yml create mode 100755 stash/config/scrapers/community/xEmpire/manifest create mode 100644 stash/config/scrapers/community/xEmpire/xEmpire.yml create mode 100755 stash/config/scrapers/community/xSinsVR/manifest create mode 100644 stash/config/scrapers/community/xSinsVR/xSinsVR.yml create mode 100755 stash/config/scrapers/community/xbvrdb/manifest create mode 100644 stash/config/scrapers/community/xbvrdb/xbvrdb.py create mode 100644 stash/config/scrapers/community/xbvrdb/xbvrdb.yml create mode 100755 stash/config/scrapers/community/zerotolerancefilms/manifest create mode 100644 stash/config/scrapers/community/zerotolerancefilms/zerotolerancefilms.yml diff --git a/stash/config/plugins/community/CommunityScriptsUILibrary/CommunityScriptsUILibrary.yml b/stash/config/plugins/community/CommunityScriptsUILibrary/CommunityScriptsUILibrary.yml new file mode 100644 index 0000000..55074e8 --- /dev/null +++ b/stash/config/plugins/community/CommunityScriptsUILibrary/CommunityScriptsUILibrary.yml @@ -0,0 +1,6 @@ +name: CommunityScriptsUILibrary +description: CommunityScripts UI helper library +version: 1.0.0 +ui: + javascript: + - cs-ui-lib.js diff --git a/stash/config/plugins/community/CommunityScriptsUILibrary/README.md b/stash/config/plugins/community/CommunityScriptsUILibrary/README.md new file mode 100644 index 0000000..e641f69 --- /dev/null +++ b/stash/config/plugins/community/CommunityScriptsUILibrary/README.md @@ -0,0 +1,90 @@ +# CommunityScripts UI Plugin library + +This is a set of slimmed down functions from StashUserscriptLibrary, targeting CommunityScripts originally introduced in [#319](https://github.com/stashapp/CommunityScripts/pull/319) + + +## functions +All the following functions are exposed under `window.csLib` and `csLib` + +## callGQL +```js +/** + * This is a wrapped GraphQL (GQL) query caller + * @param {...Object} reqData + * @param {Object} reqData.query - GraphQL query + * @param {Object}= reqData.variables - GraphQL variables + * @returns {Object} - GQL response data with the `data` wrapper removed + * + * @example + * // fetch the count of organized scenes + * const filter = { organized: true }; + * const query = `query findScenes($filter: SceneFilter) { findScenes(filter: $filter) { count } }`; + * const variables = { filter }; + * const response = await callGQL({ query, variables }); + * // response = { findScenes: { count: 3 } } + */ +``` + +## getConfiguration +```js +/** + * Get configuration of a plugin from the server via GraphQL + * @param {string} pluginId - The ID of the plugin as it is registered in the server + * @param {*}= fallback - Fallback value if the configuration is not found. Defaults to an empty object + * @returns {Object} - The configuration object of the plugin as it is stored in the server + * + * @example + * // set default config + * const defaultConfig = { enabled: true, theme: 'light' }; + * // fetch config from the server + * const config = await getConfiguration('CommunityScriptsUIPlugin', defaultConfig); + * // config = { theme: 'dark' } + * // merge fetched with default config + * const pluginConfig = { + * ...defaultConfig + * ...config + * }; + * // pluginConfig = { enabled: true, theme: 'dark' } + * } + */ +``` + +## setConfiguration +```js +/** + * Set configuration of a plugin in the server via GraphQL + * @param {string} pluginId - The ID of the plugin as it is registered in the server + * @param {*} values - The configuration object with the values you want to save in the server + * @returns {Object} - The configuration object of the plugin as it is stored in the server after update + * + * @example + * // fetch config from the server + * const config = await getConfiguration('CommunityScriptsUIPlugin', defaultConfig); + * // config = { theme: 'dark' } + * // update the config based on user input + * // config = { theme: 'light' } + * // save config in the server + * await setConfiguration('CommunityScriptsUIPlugin', config); + * } + */ +``` + +## waitForElement +```js + /** + * Waits for an element to be available in the DOM and runs the callback function once it is + * @param {string} selector - The CSS selector of the element to wait for + * @param {function} callback - The function to be called once the element is available (with the element as an argument) + * @returns + * + * @example + * // wait for the element with the class 'my-element' to be available + * // and change its color to red + * function myCallback(el) { + * el.style.color = 'red'; + * }; + * waitForElement('.my-element', myCallback); + */ +``` + +## pathElementListener \ No newline at end of file diff --git a/stash/config/plugins/community/CommunityScriptsUILibrary/cs-ui-lib.js b/stash/config/plugins/community/CommunityScriptsUILibrary/cs-ui-lib.js new file mode 100644 index 0000000..ba346c9 --- /dev/null +++ b/stash/config/plugins/community/CommunityScriptsUILibrary/cs-ui-lib.js @@ -0,0 +1,141 @@ +// CommunityScripts UI Library +// cs-ui-lib.js +(function () { + // get base URL for graphQL queries + const baseURL = document.querySelector("base")?.getAttribute("href") ?? "/"; + + /** + * This is a wrapped GraphQL (GQL) query caller + * @param {...Object} reqData + * @param {Object} reqData.query - GraphQL query + * @param {Object}= reqData.variables - GraphQL variables + * @returns {Object} - GQL response data with the `data` wrapper removed + * + * @example + * // fetch the count of organized scenes + * const filter = { organized: true }; + * const query = `query findScenes($filter: SceneFilter) { findScenes(filter: $filter) { count } }`; + * const variables = { filter }; + * const response = await callGQL({ query, variables }); + * // response = { findScenes: { count: 3 } } + */ + const callGQL = (reqData) => + fetch(`${baseURL}graphql`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(reqData), + }) + .then((res) => res.json()) + .then((res) => res.data); + + /** + * Get configuration of a plugin from the server via GraphQL + * @param {string} pluginId - The ID of the plugin as it is registered in the server + * @param {*}= fallback - Fallback value if the configuration is not found. Defaults to an empty object + * @returns {Object} - The configuration object of the plugin as it is stored in the server + * + * @example + * // set default config + * const defaultConfig = { enabled: true, theme: 'light' }; + * // fetch config from the server + * const config = await getConfiguration('CommunityScriptsUIPlugin', defaultConfig); + * // config = { theme: 'dark' } + * // merge fetched with default config + * const pluginConfig = { + * ...defaultConfig + * ...config + * }; + * // pluginConfig = { enabled: true, theme: 'dark' } + * } + */ + const getConfiguration = async (pluginId, fallback = {}) => { + const query = `query Configuration { configuration { plugins }}`; + const response = await callGQL({ query }); + return response.configuration.plugins?.[pluginId] ?? fallback; + }; + + /** + * Set configuration of a plugin in the server via GraphQL + * @param {string} pluginId - The ID of the plugin as it is registered in the server + * @param {*} values - The configuration object with the values you want to save in the server + * @returns {Object} - The configuration object of the plugin as it is stored in the server after update + * + * @example + * // fetch config from the server + * const config = await getConfiguration('CommunityScriptsUIPlugin', defaultConfig); + * // config = { theme: 'dark' } + * // update the config based on user input + * // config = { theme: 'light' } + * // save config in the server + * await setConfiguration('CommunityScriptsUIPlugin', config); + * } + */ + const setConfiguration = async (pluginId, values) => { + const query = `mutation ConfigurePlugin($pluginId: ID!, $input: Map!) { configurePlugin(plugin_id: $pluginId, input: $input) }`; + const queryBody = { + query: query, + variables: { + pluginId: pluginId, + input: values, + }, + }; + const response = await csLib.callGQL({ ...queryBody }); + return response.configurePlugin; + }; + + /** + * Waits for an element to be available in the DOM and runs the callback function once it is + * @param {string} selector - The CSS selector of the element to wait for + * @param {function} callback - The function to be called once the element is available (with the element as an argument) + * @returns + * + * @example + * // wait for the element with the class 'my-element' to be available + * // and change its color to red + * function myCallback(el) { + * el.style.color = 'red'; + * }; + * waitForElement('.my-element', myCallback); + */ + function waitForElement(selector, callback) { + var el = document.querySelector(selector); + if (el) return callback(el); + setTimeout(waitForElement, 100, selector, callback); + } + + /** + * Wait for a specific element to be available on a specific path + * This combines the `waitForElement` and `PluginApi.Event.addEventListener` functions to only trigger on certain pages + * + * @param {string} path - The path to listen for + * @param {string} element - The CSS selector of the element to wait for + * @param {function} callback - The function to be called once the element is available (with the element as an argument) + * + * @example + * // wait for the element with the class 'my-element' to be available, but only on the `/scene/#` path + * function myCallback(el) { + * el.style.color = 'red'; + * }; + * PathElementListener('/scene/', '.my-element', myCallback); + * // this will only trigger the callback function when the user is on the `/scene/` path AND the element is available + */ + const PathElementListener = (path, element, callback) => { + // startup location + if (window.location.pathname.startsWith(path)) + waitForElement(element, callback); + PluginApi.Event.addEventListener("stash:location", (e) => { + if (e.detail.data.location.pathname.startsWith(path)) + waitForElement(element, callback); + }); + }; + + // export to window + window.csLib = { + baseURL, + callGQL, + getConfiguration, + setConfiguration, + waitForElement, + PathElementListener, + }; +})(); diff --git a/stash/config/plugins/community/CommunityScriptsUILibrary/manifest b/stash/config/plugins/community/CommunityScriptsUILibrary/manifest new file mode 100755 index 0000000..4e01abf --- /dev/null +++ b/stash/config/plugins/community/CommunityScriptsUILibrary/manifest @@ -0,0 +1,12 @@ +id: CommunityScriptsUILibrary +name: CommunityScriptsUILibrary +metadata: + description: CommunityScripts UI helper library +version: 1.0.0-512fbb8 +date: "2024-11-27 21:50:31" +requires: [] +source_repository: https://stashapp.github.io/CommunityScripts/stable/index.yml +files: +- cs-ui-lib.js +- README.md +- CommunityScriptsUILibrary.yml diff --git a/stash/config/plugins/community/DupFileManager/DupFileManager.log b/stash/config/plugins/community/DupFileManager/DupFileManager.log new file mode 100644 index 0000000..7cef01e --- /dev/null +++ b/stash/config/plugins/community/DupFileManager/DupFileManager.log @@ -0,0 +1,12 @@ +[251006 10:33:16] [LN:95] INF: '******************* Starting *******************' +[251006 10:33:17] [LN:1573] INF: "Sending json value {'LocalDupReportExist' : false, 'Path': '/root/.stash/plugins/DupFileManager/report/DuplicateTagScenes.html'}" +[251006 10:33:17] [LN:1984] INF: '\n*********************************\nEXITING ***********************\n*********************************' +[251006 10:33:17] [LN:95] INF: '******************* Starting *******************' +[251006 10:33:17] [LN:1573] INF: "Sending json value {'LocalDupReportExist' : false, 'Path': '/root/.stash/plugins/DupFileManager/report/DuplicateTagScenes.html'}" +[251006 10:33:17] [LN:1984] INF: '\n*********************************\nEXITING ***********************\n*********************************' +[251006 10:35:25] [LN:95] INF: '******************* Starting *******************' +[251006 10:35:25] [LN:1573] INF: "Sending json value {'LocalDupReportExist' : false, 'Path': '/root/.stash/plugins/DupFileManager/report/DuplicateTagScenes.html'}" +[251006 10:35:25] [LN:1984] INF: '\n*********************************\nEXITING ***********************\n*********************************' +[251006 10:35:26] [LN:95] INF: '******************* Starting *******************' +[251006 10:35:26] [LN:1573] INF: "Sending json value {'LocalDupReportExist' : false, 'Path': '/root/.stash/plugins/DupFileManager/report/DuplicateTagScenes.html'}" +[251006 10:35:26] [LN:1984] INF: '\n*********************************\nEXITING ***********************\n*********************************' diff --git a/stash/config/plugins/community/DupFileManager/__pycache__/DupFileManager_config.cpython-312.pyc b/stash/config/plugins/community/DupFileManager/__pycache__/DupFileManager_config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8cf7c2aebcb4a8f59bcc7292fe9683b5328c0f3 GIT binary patch literal 2621 zcmbtUOHUhD6rRBzLTD%u^Cl3|k_RmYYz%qy#lsL#A$757)2Nj@nS1S-GOx~zofx%? z{)0$a)Qc{nN?CN#A5yiISXOscsjEs|Op>m$>N)3{5Rqh6gFc_{+;hM4ojc?EYgbpN z0-v9qU(EEVqWp#A@T0YYC;vk5y<#a$Vd{OAwXp@QDA4NYK(B4@GRj3;W@%L2;U@}Bs@=e zf$(BgVV8bH&r=Y+MbX<3O;ePHXojL$Hg{irsIm;pvU!&KA@NYXr8E|%7R89pSRt?+ zJ!s@>enF4Sl9%U^ZrNc;bg-IV_8}(}kqWJa^(fdEn?ScO$!z=QfY{y6A#Uy1QJ7cmOHU z&AjW}<*Y4oe5i&uS@;Q=^O+V0=XLvL}58wnmyGFLh%Xm7kUhh8a2nMTgwqgXIOR#L)V7~(6Z0oKL`(Zg0 z1G?{Xmu>5jVZw4AjOwnzMPJQjJO~YV16o7lxT%U>_X61-59WsM@WZ4YfF>r3);<@f zsd7a=vQ<+D!=i_B8&=h9i-kmKrIgt~u~vN@~m-EJWYJ8Pa500M7Z6~Yx(`0@ICb!ey)!L^j8w>w zLhvD6msAA;PzwTpB3ZF9^x=dPRjVSBUx5JZPvbYp(bw^_&rXd5C6Eh>2s;Qj5VjEt z2p=JAA*>)A>$*+6wVr+Zi<+5G*0gDg4@``Z*HPN=FHcNEmlwm*{-4|1`FVcel; z-S^t!lSED_+DLOX?jq8IBp>$@=~J}6dq&((WJuA5n&;zTB4==g#bZP!6m6iX#pj4j zDq8B^ZhW4|B}E&5kc_8@Oe@-%CX3TV<|N4w$;qY*MBY`j-h)&+evjCa3gQPtnRrahX!z KwFd^g9{&NTzbUBz literal 0 HcmV?d00001 diff --git a/stash/config/plugins/community/DupFileManager/__pycache__/DupFileManager_report_config.cpython-312.pyc b/stash/config/plugins/community/DupFileManager/__pycache__/DupFileManager_report_config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61a654b58b808556f858ebe4f3ac1f3a242d44a0 GIT binary patch literal 18815 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 literal 0 HcmV?d00001 diff --git a/stash/config/plugins/community/DupFileManager/__pycache__/StashPluginHelper.cpython-312.pyc b/stash/config/plugins/community/DupFileManager/__pycache__/StashPluginHelper.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b15adee9b780345e57a1cb167fbea0ccc3a8078f GIT binary patch literal 62898 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 JA{3wK{{WNNjEMjM literal 0 HcmV?d00001 diff --git a/stash/config/plugins/community/LocalVisage/LocalVisage.py b/stash/config/plugins/community/LocalVisage/LocalVisage.py new file mode 100644 index 0000000..1432ec9 --- /dev/null +++ b/stash/config/plugins/community/LocalVisage/LocalVisage.py @@ -0,0 +1,371 @@ +import os +import sys +import zipfile +import tempfile +from PythonDepManager import ensure_import +# --- VENV AUTO-CREATION WITH REQUIREMENTS AND AUTO-RESTART --- +venv_dir = os.path.join(os.path.dirname(__file__), "venv") +requirements_path = os.path.join(os.path.dirname(__file__), "requirements.txt") +# --- PYTHON VERSION CHECK --- + +if not os.path.isdir(venv_dir) and not (sys.version_info.major == 3 and sys.version_info.minor == 10): + ensure_import("stashapi:stashapp-tools>=0.2.58") + import stashapi.log as log + log.error("Error: Python version must be >= 3.10.X (recommanded 3.10.11) for the first installation of the plugin. Once installed you can change back your python version in stash as this plugin will run within its own venv") + log.error(f"Current version: {sys.version}") + log.error("Go to https://www.python.org/downloads/release/python-31011/") + sys.exit(1) +# --- END PYTHON VERSION CHECK --- + + +def in_venv(): + # Checks if running inside the venv we expect + return ( + hasattr(sys, 'real_prefix') or + (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix) + ) and os.path.abspath(sys.prefix) == os.path.abspath(venv_dir) +def install_dependencies(): + """ + Install dependencies from requirements.txt if not already installed. + """ + if not os.path.isfile(requirements_path): + print("No requirements.txt found, skipping dependency installation.") + return + + import subprocess + pip_exe = os.path.join(venv_dir, "Scripts", "pip.exe") if os.name == "nt" else os.path.join(venv_dir, "bin", "pip") + py_exe = os.path.join(venv_dir, "Scripts", "python.exe") if os.name == "nt" else os.path.join(venv_dir, "bin", "python") + subprocess.check_call([py_exe,"-m","pip", "install", "--upgrade", "pip"]) + subprocess.check_call([pip_exe, "install", "-r", requirements_path]) + +if not os.path.isdir(venv_dir): + + ensure_import("stashapi:stashapp-tools>=0.2.58") + import stashapi.log as log + import subprocess + log.info("No venv found. Creating virtual environment...") + + subprocess.check_call([sys.executable, "-m", "venv", venv_dir]) + log.progress(0.25) + log.info("Virtual environment created at "+ venv_dir) + if os.path.isfile(requirements_path): + log.info("Installing dependencies... This might take a while") + install_dependencies() + else: + log.info("No requirements.txt found, skipping dependency installation.") + +# If not running in the venv, restart the script using the venv's Python +if not in_venv(): + py_exe = os.path.join(venv_dir, "Scripts", "python.exe") if os.name == "nt" else os.path.join(venv_dir, "bin", "python") + print(f"Restarting script in venv: {py_exe}") + os.execv(py_exe, [py_exe] + sys.argv) +# --- END VENV AUTO-CREATION WITH REQUIREMENTS AND AUTO-RESTART --- + +import json +import subprocess +import platform + +# Set environment variables +os.environ["TF_ENABLE_ONEDNN_OPTS"] = "0" +os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" # Suppress TF logs +# Ensure dependencies + +try: + from deepface import DeepFace + import numpy as np + import psutil + import stashapi.log as log + from stashapi.stashapp import StashInterface +except: + install_dependencies() + +from deepface import DeepFace +import numpy as np +import psutil +import stashapi.log as log +from stashapi.stashapp import StashInterface + +VOY_DB_PATH = os.path.join(os.path.dirname(__file__), "voy_db") +os.makedirs(os.path.join(VOY_DB_PATH, "facenet"), exist_ok=True) +os.makedirs(os.path.join(VOY_DB_PATH, "arc"), exist_ok=True) + + +def main(): + """ + Main entry point for the plugin. + """ + global stash + + json_input = json.loads(sys.stdin.read()) + stash = StashInterface(json_input["server_connection"]) + mode_arg = json_input["args"].get("mode") + config = stash.get_configuration()["plugins"] + settings = {"voyCount": 15, "sceneCount": 0, "imgCount": 0} + if "LocalVisage" in config: + settings.update(config["LocalVisage"]) + + if mode_arg == "spawn_server": + spawn_server(json_input["server_connection"]) + elif mode_arg == "stop_server": + kill_stashface_server() + elif mode_arg == "rebuild_model": + rebuild_model(update_only=False, settings=settings) + elif mode_arg == "update_model": + rebuild_model(update_only=True, settings=settings) + +def can_read_image(image_path): + """ + Check if an image path can be read, handling both regular files and files inside ZIP archives. + + Args: + image_path (str): Path to the image file + + Returns: + tuple: (can_read, actual_path) where can_read is bool and actual_path is the path to use + """ + if os.path.exists(image_path): + return True, image_path + + # Check if it's inside a ZIP file + if ".zip" in image_path.lower(): + try: + parts = image_path.split(".zip") + if len(parts) >= 2: + zip_path = parts[0] + ".zip" + internal_path = parts[1].lstrip(os.sep + "/") # Remove leading separators + + if os.path.exists(zip_path): + with zipfile.ZipFile(zip_path, 'r') as zip_file: + # Check if the internal path exists in the ZIP + if internal_path in zip_file.namelist(): + # Extract to temporary file and return temp path + with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(internal_path)[1]) as tmp_file: + tmp_file.write(zip_file.read(internal_path)) + return True, tmp_file.name + except Exception as e: + log.warning(f"Error reading from ZIP file {image_path}: {e}") + + return False, image_path + +def cleanup_temp_file(file_path): + """ + Clean up temporary files created for ZIP extraction. + + Args: + file_path (str): Path to the temporary file + """ + try: + if file_path.startswith(tempfile.gettempdir()): + os.unlink(file_path) + except Exception as e: + log.warning(f"Error cleaning up temporary file {file_path}: {e}") + + +def find_performers(settings): + """ + Find performers with images for model building. + """ + query={} + # query performers based on sceneCount and imgCount settings + scene_count_min = settings.get("sceneCount", 0) + img_count_min = settings.get("imgCount", 0) + if scene_count_min>0 or img_count_min>0: + query={ + "scene_count": {"modifier": "GREATER_THAN", "value": scene_count_min-1}, + "image_count": {"modifier": "GREATER_THAN", "value": img_count_min-1}, + } + performers_all = stash.find_performers(f=query, fragment="id name image_path custom_fields") + performers_without_image = stash.find_performers(f={"is_missing": "image"}, fragment="id") + performers_without_image_ids = {p["id"] for p in performers_without_image} + performers_to_process = [p for p in performers_all if p["id"] not in performers_without_image_ids] + + + + performers_to_process = [ + p for p in performers_to_process + if (p.get("scene_count", 0) >= scene_count_min and + p.get("image_count", 0) >= img_count_min) + ] + return enrich_performers(performers_to_process, settings) + +def enrich_performers(performers, settings): + """ + Add extra images to each performer for embedding calculation. + """ + for progress, performer in enumerate(performers): + performer["images"] = [] + if performer.get("image_path"): + performer["images"].append(performer["image_path"]) + extra_images = stash.find_images( + filter={ + "direction": "ASC", + "page": 1, + "per_page": settings.get("voyCount", 15) - 1, + "q": "", + "sort": "random_11365347" + }, + f={ + "performer_count": {"modifier": "EQUALS", "value": 1}, + "performers": {"modifier": "INCLUDES_ALL", "value": [performer["id"]]}, + "path": { + "modifier": "NOT_MATCHES_REGEX", + "value": r".*\.(mp4|webm|avi|mov|mkv|flv|wmv|gif)$|.*[^\x00-\x7F].*" + } + } + ) + for image in extra_images: + if image.get("visual_files") and len(image["visual_files"]) > 0: + image_path = image["visual_files"][0]["path"] + can_read, actual_path = can_read_image(image_path) + if can_read: + performer["images"].append(actual_path) + else: + log.warning(f"Image path does not exist and cannot be read: {image_path}") + else: + log.warning(f"No visual files found for image ID: {image['id']}") + log.progress((progress + 1) / len(performers)) + return performers + +def rebuild_model(update_only, settings): + """ + Build or update the face embedding model for all performers. + """ + log.info("Updating model..." if update_only else "Rebuilding model...") + performers = find_performers(settings) + if not performers: + log.info("No performers found for model building.") + return + + log.info("Database scraped, starting to rebuild model...") + for progress, performer in enumerate(performers): + embeddings_facenet = [] + embeddings_arc = [] + custom_fields = performer.get("custom_fields", {}) + images_used = custom_fields.get("number_of_images_used_for_voy", 0) + if update_only and images_used >= settings["voyCount"]: + continue + if update_only and len(performer["images"]) <= images_used: + continue + + for uri in performer["images"]: + try: + result_facenet = DeepFace.represent( + img_path=uri, + model_name="Facenet512", + detector_backend='yolov8', + normalization='Facenet2018', + align=True, + enforce_detection=False + ) + embeddings_facenet.append(result_facenet[0]['embedding']) + result_arc = DeepFace.represent( + img_path=uri, + model_name="ArcFace", + detector_backend='yolov8', + enforce_detection=False, + align=True + ) + embeddings_arc.append(result_arc[0]['embedding']) + except Exception as e: + log.warning(f"[WARN] Skipping {uri}: {e}") + finally: + # Clean up temporary files created for ZIP extraction + cleanup_temp_file(uri) + + if embeddings_facenet and embeddings_arc: + avg_embedding_facenet = np.mean(embeddings_facenet, axis=0).astype(np.float32) + facenet_path = os.path.join(VOY_DB_PATH, "facenet", f"{performer['id']}-{performer['name']}.voy") + np.save(facenet_path, avg_embedding_facenet) + avg_embedding_arc = np.mean(embeddings_arc, axis=0).astype(np.float32) + arc_path = os.path.join(VOY_DB_PATH, "arc", f"{performer['id']}-{performer['name']}.voy") + np.save(arc_path, avg_embedding_arc) + embeddings_count = max(len(embeddings_facenet), len(embeddings_arc)) + stash.update_performer({ + "id": performer["id"], + "custom_fields": { + "partial": { + "number_of_images_used_for_voy": embeddings_count, + } + } + }) + log.info(f"[INFO] Saved VOY for {performer['name']} with {embeddings_count} images.") + else: + log.warning(f"[WARN] No valid embeddings for {performer['name']}.") + log.progress((progress + 1) / len(performers)) + log.info("Rebuilding model finished.") + if server_running(): + kill_stashface_server() + # Optionally, reload server with new connection info if needed + +def server_running(): + """ + Check if the stashface server is running. + """ + try: + for proc in psutil.process_iter(['pid', 'name', 'cmdline']): + name = proc.info.get('name', '').lower() + cmdline_raw = proc.info.get('cmdline') + if not cmdline_raw: + continue + cmdline = [str(arg).lower() for arg in cmdline_raw] + if 'python' in name and any('stashface' in arg and 'app.py' in arg for arg in cmdline): + log.debug("Stashface server is already running.") + return True + except psutil.NoSuchProcess: + return False + return False + +def kill_stashface_server(): + """ + Kill any running stashface server processes. + """ + killed = False + for proc in psutil.process_iter(['pid', 'name', 'cmdline']): + try: + cmdline = proc.info['cmdline'] + if cmdline and any('stashface' in arg and 'app.py' in arg for arg in cmdline): + log.debug(f"Killing process {proc.pid}: {' '.join(cmdline)}") + proc.kill() + killed = True + except (psutil.NoSuchProcess, psutil.AccessDenied): + continue + if killed: + log.info("Stashface server killed.") + +def spawn_server(server_connection=None): + """ + Spawn the stashface server as a subprocess. + """ + if server_running(): + log.info("Stashface server is already running.") + return + plugin_dir = os.path.dirname(__file__) + py_exe = os.path.join(venv_dir, "Scripts", "python.exe") if os.name == "nt" else os.path.join(venv_dir, "bin", "python") + cmd = [ + py_exe, + os.path.abspath(os.path.join(plugin_dir, "stashface", "app.py")), + ] + log.info("Spawning server") + env = os.environ.copy() + if server_connection is not None: + env["SERVER_CONNECTION"] = json.dumps(server_connection) + if platform.system() == "Windows": + subprocess.Popen( + cmd, + creationflags=subprocess.CREATE_NEW_CONSOLE, + close_fds=True, + cwd=plugin_dir, + env=env + ) + else: + subprocess.Popen( + cmd, + start_new_session=True, + close_fds=True, + cwd=plugin_dir, + env=env + ) + log.info("Server spawned successfully, you can now use the plugin.") + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/stash/config/plugins/community/LocalVisage/LocalVisage.yml b/stash/config/plugins/community/LocalVisage/LocalVisage.yml new file mode 100644 index 0000000..fa0224d --- /dev/null +++ b/stash/config/plugins/community/LocalVisage/LocalVisage.yml @@ -0,0 +1,57 @@ +name: Local Visage +description: Local Performer Recognition plugin using DeepFace +# requires: PythonDepManager +# requires: stashUserscriptLibrary7dJx1qP +version: 1.0.1 +exec: + - python + - "{pluginDir}/LocalVisage.py" +interface: raw +ui: + requires: + - stashUserscriptLibrary7dJx1qP + javascript: + - frontend.js + - https://cdn.jsdelivr.net/npm/@gradio/client@1.15.3/dist/index.js + css: + - frontend.css + csp: + connect-src: + - http://localhost:7860 + - http://192.168.1.198:7860 + - http://your-server-ip-address:7860 + script-src: + - https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js + - https://cdn.jsdelivr.net/npm/@gradio/client@1.15.3/dist/index.js + +tasks: + - name: Rebuild Face Recognition Model + description: Rebuild the face recognition model entirely + defaultArgs: + mode: rebuild_model + - name: Update Face Recognition Model + description: Update the face performers model with new images if there model was built on less than "Target image count per voy" images + defaultArgs: + mode: update_model + - name: Start server + description: Start the face recognition server (if not started) to allow the plugin to work + defaultArgs: + mode: spawn_server + - name: Stop server + description: Stop the face recognition server + defaultArgs: + mode: stop_server + +settings: + voyCount: + displayName: Target image count per voy (default is 15) + description: Number of images to to use to create the face recognition model (per performer) + type: NUMBER + imgCount: + displayName: Minimum number of images for performer to be added to model + description: Minimum number of images a performer must have to be included in recognition (EXCLUDING THE PERFORMER THUMBNAIL). Set to 0 for best result. + type: NUMBER + sceneCount: + displayName: Minimum number of scenes for performer to be added to model + description: Minimum number of scenes a performer must have to be included in recognition + type: NUMBER diff --git a/stash/config/plugins/community/LocalVisage/frontend.css b/stash/config/plugins/community/LocalVisage/frontend.css new file mode 100644 index 0000000..a423d17 --- /dev/null +++ b/stash/config/plugins/community/LocalVisage/frontend.css @@ -0,0 +1,136 @@ +button.svelte-localhjf { + background-color: var(--nav-color); + border: 0px; +} +.scanner.svelte-localhjf { + animation: svelte-localhjf-pulse 2s infinite; +} +@keyframes svelte-localhjf-pulse { + 0% { + transform: scale(0.95); + box-shadow: 0 0 0 0 var(--light); + } + 70% { + transform: scale(1.1); + box-shadow: 0 0 0 10px var(--info); + } + 100% { + transform: scale(0.95); + box-shadow: 0 0 0 0 var(--primary); + } +} +svg.svelte-localhjf { + fill: #ffffff; +} +button.svelte-localhjf { + background-color: var(--nav-color); + border: 0px; +} +.scanner.svelte-localhjf { + animation: svelte-localhjf-pulse 2s infinite; +} +@keyframes svelte-localhjf-pulse { + 0% { + transform: scale(0.95); + box-shadow: 0 0 0 0 var(--light); + } + 70% { + transform: scale(1.1); + box-shadow: 0 0 0 10px var(--info); + } + 100% { + transform: scale(0.95); + box-shadow: 0 0 0 0 var(--primary); + } +} +svg.svelte-localhjf { + fill: #ffffff; +} +.carousel.svelte-localhja { + display: flex; + overflow-x: auto; + overflow-y: auto; + white-space: nowrap; + overscroll-behavior-x: contain; + overscroll-behavior-y: contain; + scroll-snap-type: x mandatory; + gap: 1rem; +} +.modal-header.svelte-localhja { + font-size: 2.4rem; + border-bottom: 0px; + padding: 10px 10px 0px 10px; +} +.modal-footer.svelte-localhja { + border-top: 0px; +} +.svelte-localhja::-webkit-scrollbar { + width: 30px; +} +.svelte-localhja::-webkit-scrollbar-thumb { + background: var(--orange); + border-radius: 20px; +} +.card.svelte-localhja { + max-width: 78%; +} +.performer-card.svelte-localhja { + cursor: pointer; +} +.performer-card-image .svelte-localhja { + min-width: none !important; + aspect-ratio: 4/5; +} +.assigned.svelte-localhja { + border: 5px solid var(--green); + animation: border 1s ease-in-out; +} +.face-tab.svelte-localhja { + width: 50px; + height: 50px; + object-fit: cover; +} +.selected.svelte-localhjb { + border: 2px solid #007bff; +} +.face-tabs.svelte-localhjb { + position: absolute; + flex: 0 0 450px; + max-width: 450px; + min-width: 450px; + height: 100%; + overflow: auto; + order: -1; + background-color: var(--body-color); +} +.face-item.svelte-localhjb { + width: 160px; + height: 90px; + border-radius: 5px 5px 0px 0px; + position: relative; + cursor: pointer; +} +.svelte-tabs__tab.svelte-localhjc { + border: none; + border-bottom: 2px solid transparent; + color: #000000; + cursor: pointer; + list-style: none; + display: inline-block; + padding: 0.5em 0.75em; +} +.svelte-tabs__tab.svelte-localhjc:focus { + outline: thin dotted; +} +.svelte-tabs__selected.svelte-localhjc { + border-bottom: 2px solid #4f81e5; + color: #4f81e5; +} +.svelte-tabs__tab-panel.svelte-lcocalhjd { + margin-top: 0.5em; +} +.svelte-tabs__tab-list.svelte-localhje { + border-bottom: 1px solid #cccccc; + margin: 0; + padding: 0; +} diff --git a/stash/config/plugins/community/LocalVisage/frontend.js b/stash/config/plugins/community/LocalVisage/frontend.js new file mode 100644 index 0000000..e275575 --- /dev/null +++ b/stash/config/plugins/community/LocalVisage/frontend.js @@ -0,0 +1,14579 @@ +(function () { + "use strict"; + // Using CDN version of @gradio/client to avoid bundling issues + // import { Client, handle_file } from "@gradio/client"; + + let VISAGE_API_URL = + window.location.protocol + "//" + window.location.hostname + ":7860"; // URL of the Visage API + let THRESHOLD = 0; // remove matches with a distance higher than this + let MAX_RESULTS = 5; // number of results to show, don't change this for now + + function waitForElm(selector) { + return new Promise((resolve) => { + if (document.querySelector(selector)) { + return resolve(document.querySelector(selector)); + } + + const observer = new MutationObserver((mutations) => { + if (document.querySelector(selector)) { + resolve(document.querySelector(selector)); + observer.disconnect(); + } + }); + + observer.observe(document.body, { + childList: true, + subtree: true, + }); + }); + } + + function getScenarioAndID() { + var result = document.URL.match(/(scenes|images)\/(\d+)/); + var scenario = result[1]; + var scenario_id = result[2]; + return [scenario, scenario_id]; + } + + async function startServer() { + const reqData = { + query: `mutation{ + runPluginTask(plugin_id:"LocalVisage",task_name:"Start server") +}`, + }; + await stash7dJx1qP.stash.callGQL(reqData); + } + + async function getPerformersForScene(scene_id) { + const reqData = { + query: `{ + findScene(id: "${scene_id}") { + performers { + id + } + } + }`, + }; + var result = await stash7dJx1qP.stash.callGQL(reqData); + return result.data.findScene.performers.map((p) => p.id); + } + + async function getPerformersForImage(image_id) { + const reqData = { + query: `{ + findImage(id: "${image_id}") { + performers { + id + } + } + }`, + }; + var result = await stash7dJx1qP.stash.callGQL(reqData); + return result.data.findImage.performers.map((p) => p.id); + } + + async function updateScene(scene_id, performer_ids) { + const reqData = { + variables: { input: { id: scene_id, performer_ids: performer_ids } }, + query: `mutation sceneUpdate($input: SceneUpdateInput!){ + sceneUpdate(input: $input) { + id + } + }`, + }; + return stash7dJx1qP.stash.callGQL(reqData); + } + + async function updateImage(image_id, performer_ids) { + const reqData = { + variables: { input: { id: image_id, performer_ids: performer_ids } }, + query: `mutation imageUpdate($input: ImageUpdateInput!){ + imageUpdate(input: $input) { + id + } + }`, + }; + return stash7dJx1qP.stash.callGQL(reqData); + } + + async function getStashboxEndpoint() { + const reqData = { + query: `{ + configuration { + general { + stashBoxes { + endpoint + } + } + } + }`, + }; + var result = await stash7dJx1qP.stash.callGQL(reqData); + return result.data.configuration.general.stashBoxes[0].endpoint; + } + + async function getPerformerDataFromStashID(stash_id) { + const reqData = { + variables: { + source: { + stash_box_index: 0, + }, + input: { + query: stash_id, + }, + }, + query: `query ScrapeSinglePerformer($source: ScraperSourceInput!, $input: ScrapeSinglePerformerInput!) { + scrapeSinglePerformer(source: $source, input: $input) { + name + disambiguation + gender + url + twitter + instagram + birthdate + ethnicity + country + eye_color + height + measurements + fake_tits + career_length + tattoos + piercings + aliases + images + details + death_date + hair_color + weight + remote_site_id + } + }`, + }; + var result = await stash7dJx1qP.stash.callGQL(reqData); + return result.data.scrapeSinglePerformer.filter( + (p) => p.remote_site_id === stash_id + )[0]; + } + + async function createPerformer(performer) { + const reqData = { + variables: { input: performer }, + query: `mutation performerCreate($input: PerformerCreateInput!) { + performerCreate(input: $input){ + id + } + }`, + }; + return stash7dJx1qP.stash.callGQL(reqData); + } + + let gradioClientModule = null; + let gradioClient = null; + + /** + * Loads the Gradio client from CDN + * @returns {Promise} - The Gradio client module + */ + async function loadGradioClient() { + if (!gradioClientModule) { + try { + // Add Node.js polyfills for browser compatibility + if (typeof window !== "undefined") { + if (!window.Buffer) { + // Create a proper Buffer constructor for instanceof checks + function Buffer(data, encoding) { + if (typeof data === "string") { + if (encoding === "base64") { + const binaryString = atob(data); + return new Uint8Array( + binaryString.split("").map((c) => c.charCodeAt(0)) + ); + } + return new TextEncoder().encode(data); + } + return new Uint8Array(data); + } + + Buffer.from = (data, encoding) => { + if (encoding === "base64") { + const binaryString = atob(data); + return new Uint8Array( + binaryString.split("").map((c) => c.charCodeAt(0)) + ); + } + return new TextEncoder().encode(data); + }; + + Buffer.isBuffer = (obj) => { + return obj instanceof Uint8Array || obj instanceof ArrayBuffer; + }; + + window.Buffer = Buffer; + } + + if (!window.global) { + window.global = window; + } + + if (!window.process) { + window.process = { + env: {}, + nextTick: (fn) => setTimeout(fn, 0), + }; + } + } + + console.log("Loading Gradio client from CDN..."); + const module = await import( + "https://cdn.jsdelivr.net/npm/@gradio/client@1.15.3/dist/index.js" + ); + console.log("Gradio client loaded:", module); + gradioClientModule = module; + } catch (error) { + console.error("Failed to load Gradio client:", error); + throw new Error(`Could not load Gradio client: ${error.message}`); + } + } + return gradioClientModule; + } + + /** + * Gets or creates a Gradio client connection. + * If the client is not available, attempts to start the server and retries for up to 1 minute. + * @returns {Promise} - The Gradio client instance + */ + async function getGradioClient() { + const RETRY_INTERVAL = 5000; // 5 seconds + const MAX_RETRIES = 12; // 12 * 5s = 60s + + if (gradioClient) return gradioClient; + + let lastError; + + for (let attempt = 0; attempt < MAX_RETRIES; attempt++) { + try { + const { Client } = await loadGradioClient(); + gradioClient = await Client.connect(VISAGE_API_URL); + return gradioClient; + } catch (error) { + lastError = error; + console.warn( + `Gradio client connection failed (attempt ${ + attempt + 1 + }/${MAX_RETRIES}): ${error.message}` + ); + + // On first failure, try to start the server + if (attempt === 0) { + try { + await startServer(); + console.info("Called startServer() after Gradio client failure."); + } catch (e) { + console.warn("startServer() also failed:", e); + } + } + + // Wait before retrying, unless it's the last attempt + if (attempt < MAX_RETRIES - 1) { + await new Promise((res) => setTimeout(res, RETRY_INTERVAL)); + } + } + } + + throw new Error( + "Server couldn't be reached nor remotely started. Please check stash log. If it's your first time using the plugin, installation can be long." + ); + } + + /** + * Converts a data URL to a Blob + * @param {string} dataUrl - The data URL to convert + * @returns {Blob} - The converted blob + */ + function dataUrlToBlob(dataUrl) { + const arr = dataUrl.split(","); + const mime = arr[0].match(/:(.*?);/)[1]; + const bstr = atob(arr[1]); + let n = bstr.length; + const u8arr = new Uint8Array(n); + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + return new Blob([u8arr], { type: mime }); + } + + /** + * Creates a file handle for Gradio API + * @param {Blob} blob - The blob to convert to file handle + * @returns {Promise} - The file handle + */ + async function createFileHandle(blob) { + try { + // Ensure we have a valid blob-like object + if (!blob || typeof blob !== "object") { + throw new Error("Invalid blob provided to createFileHandle"); + } + + const { handle_file } = await loadGradioClient(); + if (!handle_file || typeof handle_file !== "function") { + throw new Error( + "handle_file function not available from Gradio client" + ); + } + + return handle_file(blob); + } catch (error) { + console.error("Error in createFileHandle:", error); + throw new Error(`File handle creation failed: ${error.message}`); + } + } + + /** + * Calls the Gradio API using the official client. + * If the client is not available, attempts to start the server and retries for up to 1 minute. + * @param {string} endpoint - The API endpoint name (e.g., 'image_search', 'find_faces_in_sprite') + * @param {Array} inputs - The input parameters for the API call + * @returns {Promise} - The API response data + */ + async function callGradioAPI(endpoint, inputs) { + const RETRY_INTERVAL = 5000; // 5 seconds + const MAX_RETRIES = 12; // 12 * 5s = 60s + + let lastError; + + for (let attempt = 0; attempt < MAX_RETRIES; attempt++) { + try { + const client = await getGradioClient(); + const result = await client.predict(`/${endpoint}`, inputs); + console.log(result); + return result; + } catch (error) { + lastError = error; + console.warn( + `Gradio API call failed (attempt ${attempt + 1}/${MAX_RETRIES}): ${ + error.message + }` + ); + + // On first failure, try to start the server + if (attempt === 0) { + try { + await startServer(); + console.info("Called startServer() after Gradio client failure."); + } catch (e) { + console.warn("startServer() also failed:", e); + } + } + + // Wait before retrying, unless it's the last attempt + if (attempt < MAX_RETRIES - 1) { + await new Promise((res) => setTimeout(res, RETRY_INTERVAL)); + } + } + } + + throw new Error( + "Server couldnt be reach nor remotly started. Please check stash log. If its you first time using the plugin, installation can be long." + ); + } + + function smoothload(node) { + function load() { + if (node.naturalWidth) return; // already loaded + + node.style.opacity = "0"; + node.style.transition = "opacity 0.4s"; + + node.addEventListener( + "load", + () => { + node.style.opacity = "1"; + }, + { + once: true, + } + ); + } + + const observer = new MutationObserver((mutations) => { + for (const mutation of mutations) { + if (mutation.attributeName === "src") { + load(); + } + } + }); + + observer.observe(node, { + attributes: true, + }); + + load(); + + return { + destroy() { + observer.disconnect(); + }, + }; + } + + /** + * Retrieves the URL of the sprite for a given scene ID. + * @param {number} scene_id - The ID of the scene to retrieve the sprite URL for. + * @returns {Promise} - A Promise that resolves with the sprite URL if it exists, or null if it does not. + */ + async function getUrlSprite(scene_id) { + const reqData = { + query: `{ + findScene(id: ${scene_id}){ + paths{ + sprite + } + } + }`, + }; + var result = await stash7dJx1qP.stash.callGQL(reqData); + const url = result.data.findScene.paths["sprite"]; + const response = await fetch(url); + if (response.status === 404) { + return null; + } else { + return result.data.findScene.paths["sprite"]; + } + } + + function noop() {} + const identity = (x) => x; + function assign(tar, src) { + // @ts-ignore + for (const k in src) tar[k] = src[k]; + return tar; + } + function run(fn) { + return fn(); + } + function blank_object() { + return Object.create(null); + } + function run_all(fns) { + fns.forEach(run); + } + function is_function(thing) { + return typeof thing === "function"; + } + function safe_not_equal(a, b) { + return a != a + ? b == b + : a !== b || (a && typeof a === "object") || typeof a === "function"; + } + let src_url_equal_anchor; + function src_url_equal(element_src, url) { + if (!src_url_equal_anchor) { + src_url_equal_anchor = document.createElement("a"); + } + src_url_equal_anchor.href = url; + return element_src === src_url_equal_anchor.href; + } + function is_empty(obj) { + return Object.keys(obj).length === 0; + } + function subscribe(store, ...callbacks) { + if (store == null) { + return noop; + } + const unsub = store.subscribe(...callbacks); + return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; + } + function component_subscribe(component, store, callback) { + component.$$.on_destroy.push(subscribe(store, callback)); + } + function create_slot(definition, ctx, $$scope, fn) { + if (definition) { + const slot_ctx = get_slot_context(definition, ctx, $$scope, fn); + return definition[0](slot_ctx); + } + } + function get_slot_context(definition, ctx, $$scope, fn) { + return definition[1] && fn + ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) + : $$scope.ctx; + } + function get_slot_changes(definition, $$scope, dirty, fn) { + if (definition[2] && fn) { + const lets = definition[2](fn(dirty)); + if ($$scope.dirty === undefined) { + return lets; + } + if (typeof lets === "object") { + const merged = []; + const len = Math.max($$scope.dirty.length, lets.length); + for (let i = 0; i < len; i += 1) { + merged[i] = $$scope.dirty[i] | lets[i]; + } + return merged; + } + return $$scope.dirty | lets; + } + return $$scope.dirty; + } + function update_slot_base( + slot, + slot_definition, + ctx, + $$scope, + slot_changes, + get_slot_context_fn + ) { + if (slot_changes) { + const slot_context = get_slot_context( + slot_definition, + ctx, + $$scope, + get_slot_context_fn + ); + slot.p(slot_context, slot_changes); + } + } + function get_all_dirty_from_scope($$scope) { + if ($$scope.ctx.length > 32) { + const dirty = []; + const length = $$scope.ctx.length / 32; + for (let i = 0; i < length; i++) { + dirty[i] = -1; + } + return dirty; + } + return -1; + } + function action_destroyer(action_result) { + return action_result && is_function(action_result.destroy) + ? action_result.destroy + : noop; + } + function split_css_unit(value) { + const split = + typeof value === "string" && value.match(/^\s*(-?[\d.]+)([^\s]*)\s*$/); + return split ? [parseFloat(split[1]), split[2] || "px"] : [value, "px"]; + } + + const is_client = typeof window !== "undefined"; + let now = is_client ? () => window.performance.now() : () => Date.now(); + let raf = is_client ? (cb) => requestAnimationFrame(cb) : noop; + + const tasks = new Set(); + function run_tasks(now) { + tasks.forEach((task) => { + if (!task.c(now)) { + tasks.delete(task); + task.f(); + } + }); + if (tasks.size !== 0) raf(run_tasks); + } + /** + * Creates a new task that runs on each raf frame + * until it returns a falsy value or is aborted + */ + function loop(callback) { + let task; + if (tasks.size === 0) raf(run_tasks); + return { + promise: new Promise((fulfill) => { + tasks.add((task = { c: callback, f: fulfill })); + }), + abort() { + tasks.delete(task); + }, + }; + } + function append(target, node) { + target.appendChild(node); + } + function get_root_for_style(node) { + if (!node) return document; + const root = node.getRootNode ? node.getRootNode() : node.ownerDocument; + if (root && root.host) { + return root; + } + return node.ownerDocument; + } + function append_empty_stylesheet(node) { + const style_element = element("style"); + append_stylesheet(get_root_for_style(node), style_element); + return style_element.sheet; + } + function append_stylesheet(node, style) { + append(node.head || node, style); + return style.sheet; + } + function insert(target, node, anchor) { + target.insertBefore(node, anchor || null); + } + function detach(node) { + if (node.parentNode) { + node.parentNode.removeChild(node); + } + } + function element(name) { + return document.createElement(name); + } + function text(data) { + return document.createTextNode(data); + } + function space() { + return text(" "); + } + function empty() { + return text(""); + } + function listen(node, event, handler, options) { + node.addEventListener(event, handler, options); + return () => node.removeEventListener(event, handler, options); + } + function attr(node, attribute, value) { + if (value == null) node.removeAttribute(attribute); + else if (node.getAttribute(attribute) !== value) + node.setAttribute(attribute, value); + } + function children(element) { + return Array.from(element.childNodes); + } + function set_data(text, data) { + data = "" + data; + if (text.data === data) return; + text.data = data; + } + function set_style(node, key, value, important) { + if (value == null) { + node.style.removeProperty(key); + } else { + node.style.setProperty(key, value, important ? "important" : ""); + } + } + function toggle_class(element, name, toggle) { + element.classList[toggle ? "add" : "remove"](name); + } + function custom_event( + type, + detail, + { bubbles = false, cancelable = false } = {} + ) { + const e = document.createEvent("CustomEvent"); + e.initCustomEvent(type, bubbles, cancelable, detail); + return e; + } + + // we need to store the information for multiple documents because a Svelte application could also contain iframes + // https://github.com/sveltejs/svelte/issues/3624 + const managed_styles = new Map(); + let active = 0; + // https://github.com/darkskyapp/string-hash/blob/master/index.js + function hash(str) { + let hash = 5381; + let i = str.length; + while (i--) hash = ((hash << 5) - hash) ^ str.charCodeAt(i); + return hash >>> 0; + } + function create_style_information(doc, node) { + const info = { stylesheet: append_empty_stylesheet(node), rules: {} }; + managed_styles.set(doc, info); + return info; + } + function create_rule(node, a, b, duration, delay, ease, fn, uid = 0) { + const step = 16.666 / duration; + let keyframes = "{\n"; + for (let p = 0; p <= 1; p += step) { + const t = a + (b - a) * ease(p); + keyframes += p * 100 + `%{${fn(t, 1 - t)}}\n`; + } + const rule = keyframes + `100% {${fn(b, 1 - b)}}\n}`; + const name = `__svelte_${hash(rule)}_${uid}`; + const doc = get_root_for_style(node); + const { stylesheet, rules } = + managed_styles.get(doc) || create_style_information(doc, node); + if (!rules[name]) { + rules[name] = true; + stylesheet.insertRule( + `@keyframes ${name} ${rule}`, + stylesheet.cssRules.length + ); + } + const animation = node.style.animation || ""; + node.style.animation = `${ + animation ? `${animation}, ` : "" + }${name} ${duration}ms linear ${delay}ms 1 both`; + active += 1; + return name; + } + function delete_rule(node, name) { + const previous = (node.style.animation || "").split(", "); + const next = previous.filter( + name + ? (anim) => anim.indexOf(name) < 0 // remove specific animation + : (anim) => anim.indexOf("__svelte") === -1 // remove all Svelte animations + ); + const deleted = previous.length - next.length; + if (deleted) { + node.style.animation = next.join(", "); + active -= deleted; + if (!active) clear_rules(); + } + } + function clear_rules() { + raf(() => { + if (active) return; + managed_styles.forEach((info) => { + const { ownerNode } = info.stylesheet; + // there is no ownerNode if it runs on jsdom. + if (ownerNode) detach(ownerNode); + }); + managed_styles.clear(); + }); + } + + function create_animation(node, from, fn, params) { + if (!from) return noop; + const to = node.getBoundingClientRect(); + if ( + from.left === to.left && + from.right === to.right && + from.top === to.top && + from.bottom === to.bottom + ) + return noop; + const { + delay = 0, + duration = 300, + easing = identity, + // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation? + start: start_time = now() + delay, + // @ts-ignore todo: + end = start_time + duration, + tick = noop, + css, + } = fn(node, { from, to }, params); + let running = true; + let started = false; + let name; + function start() { + if (css) { + name = create_rule(node, 0, 1, duration, delay, easing, css); + } + if (!delay) { + started = true; + } + } + function stop() { + if (css) delete_rule(node, name); + running = false; + } + loop((now) => { + if (!started && now >= start_time) { + started = true; + } + if (started && now >= end) { + tick(1, 0); + stop(); + } + if (!running) { + return false; + } + if (started) { + const p = now - start_time; + const t = 0 + 1 * easing(p / duration); + tick(t, 1 - t); + } + return true; + }); + start(); + tick(0, 1); + return stop; + } + function fix_position(node) { + const style = getComputedStyle(node); + if (style.position !== "absolute" && style.position !== "fixed") { + const { width, height } = style; + const a = node.getBoundingClientRect(); + node.style.position = "absolute"; + node.style.width = width; + node.style.height = height; + add_transform(node, a); + } + } + function add_transform(node, a) { + const b = node.getBoundingClientRect(); + if (a.left !== b.left || a.top !== b.top) { + const style = getComputedStyle(node); + const transform = style.transform === "none" ? "" : style.transform; + node.style.transform = `${transform} translate(${a.left - b.left}px, ${ + a.top - b.top + }px)`; + } + } + + let current_component; + function set_current_component(component) { + current_component = component; + } + function get_current_component() { + if (!current_component) + throw new Error("Function called outside component initialization"); + return current_component; + } + /** + * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM. + * It must be called during the component's initialisation (but doesn't need to live *inside* the component; + * it can be called from an external module). + * + * `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api). + * + * https://svelte.dev/docs#run-time-svelte-onmount + */ + function onMount(fn) { + get_current_component().$$.on_mount.push(fn); + } + /** + * Schedules a callback to run immediately after the component has been updated. + * + * The first time the callback runs will be after the initial `onMount` + */ + function afterUpdate(fn) { + get_current_component().$$.after_update.push(fn); + } + /** + * Schedules a callback to run immediately before the component is unmounted. + * + * Out of `onMount`, `beforeUpdate`, `afterUpdate` and `onDestroy`, this is the + * only one that runs inside a server-side component. + * + * https://svelte.dev/docs#run-time-svelte-ondestroy + */ + function onDestroy(fn) { + get_current_component().$$.on_destroy.push(fn); + } + /** + * Associates an arbitrary `context` object with the current component and the specified `key` + * and returns that object. The context is then available to children of the component + * (including slotted content) with `getContext`. + * + * Like lifecycle functions, this must be called during component initialisation. + * + * https://svelte.dev/docs#run-time-svelte-setcontext + */ + function setContext(key, context) { + get_current_component().$$.context.set(key, context); + return context; + } + /** + * Retrieves the context that belongs to the closest parent component with the specified `key`. + * Must be called during component initialisation. + * + * https://svelte.dev/docs#run-time-svelte-getcontext + */ + function getContext(key) { + return get_current_component().$$.context.get(key); + } + + const dirty_components = []; + const binding_callbacks = []; + let render_callbacks = []; + const flush_callbacks = []; + const resolved_promise = /* @__PURE__ */ Promise.resolve(); + let update_scheduled = false; + function schedule_update() { + if (!update_scheduled) { + update_scheduled = true; + resolved_promise.then(flush); + } + } + function tick() { + schedule_update(); + return resolved_promise; + } + function add_render_callback(fn) { + render_callbacks.push(fn); + } + function add_flush_callback(fn) { + flush_callbacks.push(fn); + } + // flush() calls callbacks in this order: + // 1. All beforeUpdate callbacks, in order: parents before children + // 2. All bind:this callbacks, in reverse order: children before parents. + // 3. All afterUpdate callbacks, in order: parents before children. EXCEPT + // for afterUpdates called during the initial onMount, which are called in + // reverse order: children before parents. + // Since callbacks might update component values, which could trigger another + // call to flush(), the following steps guard against this: + // 1. During beforeUpdate, any updated components will be added to the + // dirty_components array and will cause a reentrant call to flush(). Because + // the flush index is kept outside the function, the reentrant call will pick + // up where the earlier call left off and go through all dirty components. The + // current_component value is saved and restored so that the reentrant call will + // not interfere with the "parent" flush() call. + // 2. bind:this callbacks cannot trigger new flush() calls. + // 3. During afterUpdate, any updated components will NOT have their afterUpdate + // callback called a second time; the seen_callbacks set, outside the flush() + // function, guarantees this behavior. + const seen_callbacks = new Set(); + let flushidx = 0; // Do *not* move this inside the flush() function + function flush() { + // Do not reenter flush while dirty components are updated, as this can + // result in an infinite loop. Instead, let the inner flush handle it. + // Reentrancy is ok afterwards for bindings etc. + if (flushidx !== 0) { + return; + } + const saved_component = current_component; + do { + // first, call beforeUpdate functions + // and update components + try { + while (flushidx < dirty_components.length) { + const component = dirty_components[flushidx]; + flushidx++; + set_current_component(component); + update(component.$$); + } + } catch (e) { + // reset dirty state to not end up in a deadlocked state and then rethrow + dirty_components.length = 0; + flushidx = 0; + throw e; + } + set_current_component(null); + dirty_components.length = 0; + flushidx = 0; + while (binding_callbacks.length) binding_callbacks.pop()(); + // then, once components are updated, call + // afterUpdate functions. This may cause + // subsequent updates... + for (let i = 0; i < render_callbacks.length; i += 1) { + const callback = render_callbacks[i]; + if (!seen_callbacks.has(callback)) { + // ...so guard against infinite loops + seen_callbacks.add(callback); + callback(); + } + } + render_callbacks.length = 0; + } while (dirty_components.length); + while (flush_callbacks.length) { + flush_callbacks.pop()(); + } + update_scheduled = false; + seen_callbacks.clear(); + set_current_component(saved_component); + } + function update($$) { + if ($$.fragment !== null) { + $$.update(); + run_all($$.before_update); + const dirty = $$.dirty; + $$.dirty = [-1]; + $$.fragment && $$.fragment.p($$.ctx, dirty); + $$.after_update.forEach(add_render_callback); + } + } + /** + * Useful for example to execute remaining `afterUpdate` callbacks before executing `destroy`. + */ + function flush_render_callbacks(fns) { + const filtered = []; + const targets = []; + render_callbacks.forEach((c) => + fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c) + ); + targets.forEach((c) => c()); + render_callbacks = filtered; + } + + let promise; + function wait() { + if (!promise) { + promise = Promise.resolve(); + promise.then(() => { + promise = null; + }); + } + return promise; + } + function dispatch(node, direction, kind) { + node.dispatchEvent(custom_event(`${direction ? "intro" : "outro"}${kind}`)); + } + const outroing = new Set(); + let outros; + function group_outros() { + outros = { + r: 0, + c: [], + p: outros, // parent group + }; + } + function check_outros() { + if (!outros.r) { + run_all(outros.c); + } + outros = outros.p; + } + function transition_in(block, local) { + if (block && block.i) { + outroing.delete(block); + block.i(local); + } + } + function transition_out(block, local, detach, callback) { + if (block && block.o) { + if (outroing.has(block)) return; + outroing.add(block); + outros.c.push(() => { + outroing.delete(block); + if (callback) { + if (detach) block.d(1); + callback(); + } + }); + block.o(local); + } else if (callback) { + callback(); + } + } + const null_transition = { duration: 0 }; + function create_in_transition(node, fn, params) { + const options = { direction: "in" }; + let config = fn(node, params, options); + let running = false; + let animation_name; + let task; + let uid = 0; + function cleanup() { + if (animation_name) delete_rule(node, animation_name); + } + function go() { + const { + delay = 0, + duration = 300, + easing = identity, + tick = noop, + css, + } = config || null_transition; + if (css) + animation_name = create_rule( + node, + 0, + 1, + duration, + delay, + easing, + css, + uid++ + ); + tick(0, 1); + const start_time = now() + delay; + const end_time = start_time + duration; + if (task) task.abort(); + running = true; + add_render_callback(() => dispatch(node, true, "start")); + task = loop((now) => { + if (running) { + if (now >= end_time) { + tick(1, 0); + dispatch(node, true, "end"); + cleanup(); + return (running = false); + } + if (now >= start_time) { + const t = easing((now - start_time) / duration); + tick(t, 1 - t); + } + } + return running; + }); + } + let started = false; + return { + start() { + if (started) return; + started = true; + delete_rule(node); + if (is_function(config)) { + config = config(options); + wait().then(go); + } else { + go(); + } + }, + invalidate() { + started = false; + }, + end() { + if (running) { + cleanup(); + running = false; + } + }, + }; + } + function create_out_transition(node, fn, params) { + const options = { direction: "out" }; + let config = fn(node, params, options); + let running = true; + let animation_name; + const group = outros; + group.r += 1; + function go() { + const { + delay = 0, + duration = 300, + easing = identity, + tick = noop, + css, + } = config || null_transition; + if (css) + animation_name = create_rule(node, 1, 0, duration, delay, easing, css); + const start_time = now() + delay; + const end_time = start_time + duration; + add_render_callback(() => dispatch(node, false, "start")); + loop((now) => { + if (running) { + if (now >= end_time) { + tick(0, 1); + dispatch(node, false, "end"); + if (!--group.r) { + // this will result in `end()` being called, + // so we don't need to clean up here + run_all(group.c); + } + return false; + } + if (now >= start_time) { + const t = easing((now - start_time) / duration); + tick(1 - t, t); + } + } + return running; + }); + } + if (is_function(config)) { + wait().then(() => { + // @ts-ignore + config = config(options); + go(); + }); + } else { + go(); + } + return { + end(reset) { + if (reset && config.tick) { + config.tick(1, 0); + } + if (running) { + if (animation_name) delete_rule(node, animation_name); + running = false; + } + }, + }; + } + + function destroy_block(block, lookup) { + block.d(1); + lookup.delete(block.key); + } + function outro_and_destroy_block(block, lookup) { + transition_out(block, 1, 1, () => { + lookup.delete(block.key); + }); + } + function fix_and_outro_and_destroy_block(block, lookup) { + block.f(); + outro_and_destroy_block(block, lookup); + } + function update_keyed_each( + old_blocks, + dirty, + get_key, + dynamic, + ctx, + list, + lookup, + node, + destroy, + create_each_block, + next, + get_context + ) { + let o = old_blocks.length; + let n = list.length; + let i = o; + const old_indexes = {}; + while (i--) old_indexes[old_blocks[i].key] = i; + const new_blocks = []; + const new_lookup = new Map(); + const deltas = new Map(); + const updates = []; + i = n; + while (i--) { + const child_ctx = get_context(ctx, list, i); + const key = get_key(child_ctx); + let block = lookup.get(key); + if (!block) { + block = create_each_block(key, child_ctx); + block.c(); + } else if (dynamic) { + // defer updates until all the DOM shuffling is done + updates.push(() => block.p(child_ctx, dirty)); + } + new_lookup.set(key, (new_blocks[i] = block)); + if (key in old_indexes) deltas.set(key, Math.abs(i - old_indexes[key])); + } + const will_move = new Set(); + const did_move = new Set(); + function insert(block) { + transition_in(block, 1); + block.m(node, next); + lookup.set(block.key, block); + next = block.first; + n--; + } + while (o && n) { + const new_block = new_blocks[n - 1]; + const old_block = old_blocks[o - 1]; + const new_key = new_block.key; + const old_key = old_block.key; + if (new_block === old_block) { + // do nothing + next = new_block.first; + o--; + n--; + } else if (!new_lookup.has(old_key)) { + // remove old block + destroy(old_block, lookup); + o--; + } else if (!lookup.has(new_key) || will_move.has(new_key)) { + insert(new_block); + } else if (did_move.has(old_key)) { + o--; + } else if (deltas.get(new_key) > deltas.get(old_key)) { + did_move.add(new_key); + insert(new_block); + } else { + will_move.add(old_key); + o--; + } + } + while (o--) { + const old_block = old_blocks[o]; + if (!new_lookup.has(old_block.key)) destroy(old_block, lookup); + } + while (n) insert(new_blocks[n - 1]); + run_all(updates); + return new_blocks; + } + + function bind(component, name, callback) { + const index = component.$$.props[name]; + if (index !== undefined) { + component.$$.bound[index] = callback; + callback(component.$$.ctx[index]); + } + } + function create_component(block) { + block && block.c(); + } + function mount_component(component, target, anchor, customElement) { + const { fragment, after_update } = component.$$; + fragment && fragment.m(target, anchor); + if (!customElement) { + // onMount happens before the initial afterUpdate + add_render_callback(() => { + const new_on_destroy = component.$$.on_mount + .map(run) + .filter(is_function); + // if the component was destroyed immediately + // it will update the `$$.on_destroy` reference to `null`. + // the destructured on_destroy may still reference to the old array + if (component.$$.on_destroy) { + component.$$.on_destroy.push(...new_on_destroy); + } else { + // Edge case - component was destroyed immediately, + // most likely as a result of a binding initialising + run_all(new_on_destroy); + } + component.$$.on_mount = []; + }); + } + after_update.forEach(add_render_callback); + } + function destroy_component(component, detaching) { + const $$ = component.$$; + if ($$.fragment !== null) { + flush_render_callbacks($$.after_update); + run_all($$.on_destroy); + $$.fragment && $$.fragment.d(detaching); + // TODO null out other refs, including component.$$ (but need to + // preserve final state?) + $$.on_destroy = $$.fragment = null; + $$.ctx = []; + } + } + function make_dirty(component, i) { + if (component.$$.dirty[0] === -1) { + dirty_components.push(component); + schedule_update(); + component.$$.dirty.fill(0); + } + component.$$.dirty[(i / 31) | 0] |= 1 << i % 31; + } + function init( + component, + options, + instance, + create_fragment, + not_equal, + props, + append_styles, + dirty = [-1] + ) { + const parent_component = current_component; + set_current_component(component); + const $$ = (component.$$ = { + fragment: null, + ctx: [], + // state + props, + update: noop, + not_equal, + bound: blank_object(), + // lifecycle + on_mount: [], + on_destroy: [], + on_disconnect: [], + before_update: [], + after_update: [], + context: new Map( + options.context || (parent_component ? parent_component.$$.context : []) + ), + // everything else + callbacks: blank_object(), + dirty, + skip_bound: false, + root: options.target || parent_component.$$.root, + }); + append_styles && append_styles($$.root); + let ready = false; + $$.ctx = instance + ? instance(component, options.props || {}, (i, ret, ...rest) => { + const value = rest.length ? rest[0] : ret; + if ($$.ctx && not_equal($$.ctx[i], ($$.ctx[i] = value))) { + if (!$$.skip_bound && $$.bound[i]) $$.bound[i](value); + if (ready) make_dirty(component, i); + } + return ret; + }) + : []; + $$.update(); + ready = true; + run_all($$.before_update); + // `false` as a special case of no DOM component + $$.fragment = create_fragment ? create_fragment($$.ctx) : false; + if (options.target) { + if (options.hydrate) { + const nodes = children(options.target); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.l(nodes); + nodes.forEach(detach); + } else { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.c(); + } + if (options.intro) transition_in(component.$$.fragment); + mount_component( + component, + options.target, + options.anchor, + options.customElement + ); + flush(); + } + set_current_component(parent_component); + } + /** + * Base class for Svelte components. Used when dev=false. + */ + class SvelteComponent { + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type, callback) { + if (!is_function(callback)) { + return noop; + } + const callbacks = + this.$$.callbacks[type] || (this.$$.callbacks[type] = []); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) callbacks.splice(index, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } + } + + let id = 1; + + function getId() { + return `svelte-tabs-${id++}`; + } + + const subscriber_queue = []; + /** + * Create a `Writable` store that allows both updating and reading by subscription. + * @param {*=}value initial value + * @param {StartStopNotifier=} start + */ + function writable(value, start = noop) { + let stop; + const subscribers = new Set(); + function set(new_value) { + if (safe_not_equal(value, new_value)) { + value = new_value; + if (stop) { + // store is ready + const run_queue = !subscriber_queue.length; + for (const subscriber of subscribers) { + subscriber[1](); + subscriber_queue.push(subscriber, value); + } + if (run_queue) { + for (let i = 0; i < subscriber_queue.length; i += 2) { + subscriber_queue[i][0](subscriber_queue[i + 1]); + } + subscriber_queue.length = 0; + } + } + } + } + function update(fn) { + set(fn(value)); + } + function subscribe(run, invalidate = noop) { + const subscriber = [run, invalidate]; + subscribers.add(subscriber); + if (subscribers.size === 1) { + stop = start(set) || noop; + } + run(value); + return () => { + subscribers.delete(subscriber); + if (subscribers.size === 0 && stop) { + stop(); + stop = null; + } + }; + } + return { set, update, subscribe }; + } + + /* node_modules/svelte-tabs/src/Tabs.svelte generated by Svelte v3.59.2 */ + + function create_fragment$7(ctx) { + let div; + let current; + let mounted; + let dispose; + const default_slot_template = /*#slots*/ ctx[4].default; + const default_slot = create_slot( + default_slot_template, + ctx, + /*$$scope*/ ctx[3], + null + ); + + return { + c() { + div = element("div"); + if (default_slot) default_slot.c(); + attr(div, "class", "svelte-tabs"); + }, + m(target, anchor) { + insert(target, div, anchor); + + if (default_slot) { + default_slot.m(div, null); + } + + current = true; + + if (!mounted) { + dispose = listen(div, "keydown", /*handleKeyDown*/ ctx[1]); + mounted = true; + } + }, + p(ctx, [dirty]) { + if (default_slot) { + if (default_slot.p && (!current || dirty & /*$$scope*/ 8)) { + update_slot_base( + default_slot, + default_slot_template, + ctx, + /*$$scope*/ ctx[3], + !current + ? get_all_dirty_from_scope(/*$$scope*/ ctx[3]) + : get_slot_changes( + default_slot_template, + /*$$scope*/ ctx[3], + dirty, + null + ), + null + ); + } + } + }, + i(local) { + if (current) return; + transition_in(default_slot, local); + current = true; + }, + o(local) { + transition_out(default_slot, local); + current = false; + }, + d(detaching) { + if (detaching) detach(div); + if (default_slot) default_slot.d(detaching); + mounted = false; + dispose(); + }, + }; + } + + const TABS = {}; + + function removeAndUpdateSelected(arr, item, selectedStore) { + const index = arr.indexOf(item); + arr.splice(index, 1); + + selectedStore.update((selected) => + selected === item ? arr[index] || arr[arr.length - 1] : selected + ); + } + + function instance$7($$self, $$props, $$invalidate) { + let $selectedTab; + let { $$slots: slots = {}, $$scope } = $$props; + let { initialSelectedIndex = 0 } = $$props; + const tabElements = []; + const tabs = []; + const panels = []; + const controls = writable({}); + const labeledBy = writable({}); + const selectedTab = writable(null); + component_subscribe($$self, selectedTab, (value) => + $$invalidate(5, ($selectedTab = value)) + ); + const selectedPanel = writable(null); + + function registerItem(arr, item, selectedStore) { + arr.push(item); + selectedStore.update((selected) => selected || item); + onDestroy(() => removeAndUpdateSelected(arr, item, selectedStore)); + } + + function selectTab(tab) { + const index = tabs.indexOf(tab); + selectedTab.set(tab); + selectedPanel.set(panels[index]); + } + + setContext(TABS, { + registerTab(tab) { + registerItem(tabs, tab, selectedTab); + }, + registerTabElement(tabElement) { + tabElements.push(tabElement); + }, + registerPanel(panel) { + registerItem(panels, panel, selectedPanel); + }, + selectTab, + selectedTab, + selectedPanel, + controls, + labeledBy, + }); + + onMount(() => { + selectTab(tabs[initialSelectedIndex]); + }); + + afterUpdate(() => { + for (let i = 0; i < tabs.length; i++) { + controls.update((controlsData) => ({ + ...controlsData, + [tabs[i].id]: panels[i].id, + })); + + labeledBy.update((labeledByData) => ({ + ...labeledByData, + [panels[i].id]: tabs[i].id, + })); + } + }); + + async function handleKeyDown(event) { + if (event.target.classList.contains("svelte-tabs__tab")) { + let selectedIndex = tabs.indexOf($selectedTab); + + switch (event.key) { + case "ArrowRight": + selectedIndex += 1; + if (selectedIndex > tabs.length - 1) { + selectedIndex = 0; + } + selectTab(tabs[selectedIndex]); + tabElements[selectedIndex].focus(); + break; + case "ArrowLeft": + selectedIndex -= 1; + if (selectedIndex < 0) { + selectedIndex = tabs.length - 1; + } + selectTab(tabs[selectedIndex]); + tabElements[selectedIndex].focus(); + } + } + } + + $$self.$$set = ($$props) => { + if ("initialSelectedIndex" in $$props) + $$invalidate(2, (initialSelectedIndex = $$props.initialSelectedIndex)); + if ("$$scope" in $$props) $$invalidate(3, ($$scope = $$props.$$scope)); + }; + + return [selectedTab, handleKeyDown, initialSelectedIndex, $$scope, slots]; + } + + class Tabs extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance$7, create_fragment$7, safe_not_equal, { + initialSelectedIndex: 2, + }); + } + } + + /* node_modules/svelte-tabs/src/Tab.svelte generated by Svelte v3.59.2 */ + + function create_fragment$6(ctx) { + let li; + let li_aria_controls_value; + let li_tabindex_value; + let current; + let mounted; + let dispose; + const default_slot_template = /*#slots*/ ctx[9].default; + const default_slot = create_slot( + default_slot_template, + ctx, + /*$$scope*/ ctx[8], + null + ); + + return { + c() { + li = element("li"); + if (default_slot) default_slot.c(); + attr(li, "role", "tab"); + attr(li, "id", /*tab*/ ctx[3].id); + attr( + li, + "aria-controls", + (li_aria_controls_value = /*$controls*/ ctx[2][/*tab*/ ctx[3].id]) + ); + attr(li, "aria-selected", /*isSelected*/ ctx[1]); + attr( + li, + "tabindex", + (li_tabindex_value = /*isSelected*/ ctx[1] ? 0 : -1) + ); + attr(li, "class", "svelte-tabs__tab svelte-localhjc"); + toggle_class(li, "svelte-tabs__selected", /*isSelected*/ ctx[1]); + }, + m(target, anchor) { + insert(target, li, anchor); + + if (default_slot) { + default_slot.m(li, null); + } + + /*li_binding*/ ctx[10](li); + current = true; + + if (!mounted) { + dispose = listen(li, "click", /*click_handler*/ ctx[11]); + mounted = true; + } + }, + p(ctx, [dirty]) { + if (default_slot) { + if (default_slot.p && (!current || dirty & /*$$scope*/ 256)) { + update_slot_base( + default_slot, + default_slot_template, + ctx, + /*$$scope*/ ctx[8], + !current + ? get_all_dirty_from_scope(/*$$scope*/ ctx[8]) + : get_slot_changes( + default_slot_template, + /*$$scope*/ ctx[8], + dirty, + null + ), + null + ); + } + } + + if ( + !current || + (dirty & /*$controls*/ 4 && + li_aria_controls_value !== + (li_aria_controls_value = + /*$controls*/ ctx[2][/*tab*/ ctx[3].id])) + ) { + attr(li, "aria-controls", li_aria_controls_value); + } + + if (!current || dirty & /*isSelected*/ 2) { + attr(li, "aria-selected", /*isSelected*/ ctx[1]); + } + + if ( + !current || + (dirty & /*isSelected*/ 2 && + li_tabindex_value !== + (li_tabindex_value = /*isSelected*/ ctx[1] ? 0 : -1)) + ) { + attr(li, "tabindex", li_tabindex_value); + } + + if (!current || dirty & /*isSelected*/ 2) { + toggle_class(li, "svelte-tabs__selected", /*isSelected*/ ctx[1]); + } + }, + i(local) { + if (current) return; + transition_in(default_slot, local); + current = true; + }, + o(local) { + transition_out(default_slot, local); + current = false; + }, + d(detaching) { + if (detaching) detach(li); + if (default_slot) default_slot.d(detaching); + /*li_binding*/ ctx[10](null); + mounted = false; + dispose(); + }, + }; + } + + function instance$6($$self, $$props, $$invalidate) { + let $selectedTab; + let $controls; + let { $$slots: slots = {}, $$scope } = $$props; + let tabEl; + const tab = { id: getId() }; + const { + registerTab, + registerTabElement, + selectTab, + selectedTab, + controls, + } = getContext(TABS); + component_subscribe($$self, selectedTab, (value) => + $$invalidate(7, ($selectedTab = value)) + ); + component_subscribe($$self, controls, (value) => + $$invalidate(2, ($controls = value)) + ); + let isSelected; + registerTab(tab); + + onMount(async () => { + await tick(); + registerTabElement(tabEl); + }); + + function li_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + tabEl = $$value; + $$invalidate(0, tabEl); + }); + } + + const click_handler = () => selectTab(tab); + + $$self.$$set = ($$props) => { + if ("$$scope" in $$props) $$invalidate(8, ($$scope = $$props.$$scope)); + }; + + $$self.$$.update = () => { + if ($$self.$$.dirty & /*$selectedTab*/ 128) { + $$invalidate(1, (isSelected = $selectedTab === tab)); + } + }; + + return [ + tabEl, + isSelected, + $controls, + tab, + selectTab, + selectedTab, + controls, + $selectedTab, + $$scope, + slots, + li_binding, + click_handler, + ]; + } + + class Tab extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance$6, create_fragment$6, safe_not_equal, {}); + } + } + + /* node_modules/svelte-tabs/src/TabList.svelte generated by Svelte v3.59.2 */ + + function create_fragment$5(ctx) { + let ul; + let current; + const default_slot_template = /*#slots*/ ctx[1].default; + const default_slot = create_slot( + default_slot_template, + ctx, + /*$$scope*/ ctx[0], + null + ); + + return { + c() { + ul = element("ul"); + if (default_slot) default_slot.c(); + attr(ul, "role", "tablist"); + attr(ul, "class", "svelte-tabs__tab-list svelte-localhje"); + }, + m(target, anchor) { + insert(target, ul, anchor); + + if (default_slot) { + default_slot.m(ul, null); + } + + current = true; + }, + p(ctx, [dirty]) { + if (default_slot) { + if (default_slot.p && (!current || dirty & /*$$scope*/ 1)) { + update_slot_base( + default_slot, + default_slot_template, + ctx, + /*$$scope*/ ctx[0], + !current + ? get_all_dirty_from_scope(/*$$scope*/ ctx[0]) + : get_slot_changes( + default_slot_template, + /*$$scope*/ ctx[0], + dirty, + null + ), + null + ); + } + } + }, + i(local) { + if (current) return; + transition_in(default_slot, local); + current = true; + }, + o(local) { + transition_out(default_slot, local); + current = false; + }, + d(detaching) { + if (detaching) detach(ul); + if (default_slot) default_slot.d(detaching); + }, + }; + } + + function instance$5($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + + $$self.$$set = ($$props) => { + if ("$$scope" in $$props) $$invalidate(0, ($$scope = $$props.$$scope)); + }; + + return [$$scope, slots]; + } + + class TabList extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance$5, create_fragment$5, safe_not_equal, {}); + } + } + + /* node_modules/svelte-tabs/src/TabPanel.svelte generated by Svelte v3.59.2 */ + + function create_if_block$1(ctx) { + let current; + const default_slot_template = /*#slots*/ ctx[6].default; + const default_slot = create_slot( + default_slot_template, + ctx, + /*$$scope*/ ctx[5], + null + ); + + return { + c() { + if (default_slot) default_slot.c(); + }, + m(target, anchor) { + if (default_slot) { + default_slot.m(target, anchor); + } + + current = true; + }, + p(ctx, dirty) { + if (default_slot) { + if (default_slot.p && (!current || dirty & /*$$scope*/ 32)) { + update_slot_base( + default_slot, + default_slot_template, + ctx, + /*$$scope*/ ctx[5], + !current + ? get_all_dirty_from_scope(/*$$scope*/ ctx[5]) + : get_slot_changes( + default_slot_template, + /*$$scope*/ ctx[5], + dirty, + null + ), + null + ); + } + } + }, + i(local) { + if (current) return; + transition_in(default_slot, local); + current = true; + }, + o(local) { + transition_out(default_slot, local); + current = false; + }, + d(detaching) { + if (default_slot) default_slot.d(detaching); + }, + }; + } + + function create_fragment$4(ctx) { + let div; + let div_aria_labelledby_value; + let current; + let if_block = + /*$selectedPanel*/ ctx[1] === /*panel*/ ctx[2] && create_if_block$1(ctx); + + return { + c() { + div = element("div"); + if (if_block) if_block.c(); + attr(div, "id", /*panel*/ ctx[2].id); + attr( + div, + "aria-labelledby", + (div_aria_labelledby_value = + /*$labeledBy*/ ctx[0][/*panel*/ ctx[2].id]) + ); + attr(div, "class", "svelte-tabs__tab-panel svelte-localhjd"); + attr(div, "role", "tabpanel"); + }, + m(target, anchor) { + insert(target, div, anchor); + if (if_block) if_block.m(div, null); + current = true; + }, + p(ctx, [dirty]) { + if (/*$selectedPanel*/ ctx[1] === /*panel*/ ctx[2]) { + if (if_block) { + if_block.p(ctx, dirty); + + if (dirty & /*$selectedPanel*/ 2) { + transition_in(if_block, 1); + } + } else { + if_block = create_if_block$1(ctx); + if_block.c(); + transition_in(if_block, 1); + if_block.m(div, null); + } + } else if (if_block) { + group_outros(); + + transition_out(if_block, 1, 1, () => { + if_block = null; + }); + + check_outros(); + } + + if ( + !current || + (dirty & /*$labeledBy*/ 1 && + div_aria_labelledby_value !== + (div_aria_labelledby_value = + /*$labeledBy*/ ctx[0][/*panel*/ ctx[2].id])) + ) { + attr(div, "aria-labelledby", div_aria_labelledby_value); + } + }, + i(local) { + if (current) return; + transition_in(if_block); + current = true; + }, + o(local) { + transition_out(if_block); + current = false; + }, + d(detaching) { + if (detaching) detach(div); + if (if_block) if_block.d(); + }, + }; + } + + function instance$4($$self, $$props, $$invalidate) { + let $labeledBy; + let $selectedPanel; + let { $$slots: slots = {}, $$scope } = $$props; + const panel = { id: getId() }; + const { registerPanel, selectedPanel, labeledBy } = getContext(TABS); + component_subscribe($$self, selectedPanel, (value) => + $$invalidate(1, ($selectedPanel = value)) + ); + component_subscribe($$self, labeledBy, (value) => + $$invalidate(0, ($labeledBy = value)) + ); + registerPanel(panel); + + $$self.$$set = ($$props) => { + if ("$$scope" in $$props) $$invalidate(5, ($$scope = $$props.$$scope)); + }; + + return [ + $labeledBy, + $selectedPanel, + panel, + selectedPanel, + labeledBy, + $$scope, + slots, + ]; + } + + class TabPanel extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance$4, create_fragment$4, safe_not_equal, {}); + } + } + + function cubicOut(t) { + const f = t - 1.0; + return f * f * f + 1.0; + } + function quintOut(t) { + return --t * t * t * t * t + 1; + } + + function fade(node, { delay = 0, duration = 400, easing = identity } = {}) { + const o = +getComputedStyle(node).opacity; + return { + delay, + duration, + easing, + css: (t) => `opacity: ${t * o}`, + }; + } + function fly( + node, + { + delay = 0, + duration = 400, + easing = cubicOut, + x = 0, + y = 0, + opacity = 0, + } = {} + ) { + const style = getComputedStyle(node); + const target_opacity = +style.opacity; + const transform = style.transform === "none" ? "" : style.transform; + const od = target_opacity * (1 - opacity); + const [xValue, xUnit] = split_css_unit(x); + const [yValue, yUnit] = split_css_unit(y); + return { + delay, + duration, + easing, + css: (t, u) => ` + transform: ${transform} translate(${(1 - t) * xValue}${xUnit}, ${ + (1 - t) * yValue + }${yUnit}); + opacity: ${target_opacity - od * u}`, + }; + } + + /* src/Match.svelte generated by Svelte v3.59.2 */ + + function get_each_context$1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[10] = list[i]; + child_ctx[13] = i; + const constants_0 = /*face*/ child_ctx[10].performers; + child_ctx[11] = constants_0; + return child_ctx; + } + + function get_each_context_1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[14] = list[i]; + child_ctx[13] = i; + return child_ctx; + } + + function get_each_context_2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[10] = list[i]; + child_ctx[13] = i; + return child_ctx; + } + + // (125:0) {#if visible} + function create_if_block(ctx) { + let div5; + let div4; + let div3; + let div0; + let tabs; + let t0; + let div2; + let div1; + let button0; + let t2; + let button1; + let div5_intro; + let div5_outro; + let current; + let mounted; + let dispose; + + tabs = new Tabs({ + props: { + $$slots: { default: [create_default_slot] }, + $$scope: { ctx }, + }, + }); + + return { + c() { + div5 = element("div"); + div4 = element("div"); + div3 = element("div"); + div0 = element("div"); + create_component(tabs.$$.fragment); + t0 = space(); + div2 = element("div"); + div1 = element("div"); + button0 = element("button"); + button0.textContent = "Close"; + t2 = space(); + button1 = element("button"); + button1.textContent = "Toggle Visibility"; + attr(div0, "class", "modal-body svelte-localhja"); + attr(button0, "id", "face_close"); + attr(button0, "type", "button"); + attr(button0, "class", "ml-2 btn btn-secondary svelte-localhja"); + attr(button1, "id", "face_toggle"); + attr(button1, "type", "button"); + attr(button1, "class", "ml-2 btn btn-secondary svelte-localhja"); + attr(div1, "class", "svelte-localhja"); + attr(div2, "class", "ModalFooter modal-footer svelte-localhja"); + attr(div3, "class", "modal-content svelte-localhja"); + attr(div4, "class", "modal-dialog modal-xl svelte-localhja"); + attr(div5, "role", "dialog"); + attr(div5, "aria-modal", "true"); + attr(div5, "class", "fade ModalComponent modal show svelte-localhja"); + attr(div5, "tabindex", "-1"); + set_style(div5, "display", "block"); + }, + m(target, anchor) { + insert(target, div5, anchor); + append(div5, div4); + append(div4, div3); + append(div3, div0); + mount_component(tabs, div0, null); + append(div3, t0); + append(div3, div2); + append(div2, div1); + append(div1, button0); + append(div1, t2); + append(div1, button1); + /*div5_binding*/ ctx[8](div5); + current = true; + + if (!mounted) { + dispose = [ + listen(button0, "click", /*close*/ ctx[3]), + listen(button1, "click", /*toggle*/ ctx[4]), + ]; + + mounted = true; + } + }, + p(ctx, dirty) { + const tabs_changes = {}; + + if (dirty & /*$$scope, matches*/ 131073) { + tabs_changes.$$scope = { dirty, ctx }; + } + + tabs.$set(tabs_changes); + }, + i(local) { + if (current) return; + transition_in(tabs.$$.fragment, local); + + add_render_callback(() => { + if (!current) return; + if (div5_outro) div5_outro.end(1); + div5_intro = create_in_transition(div5, fly, { + y: 100, + duration: 400, + }); + div5_intro.start(); + }); + + current = true; + }, + o(local) { + transition_out(tabs.$$.fragment, local); + if (div5_intro) div5_intro.invalidate(); + div5_outro = create_out_transition(div5, fly, { + y: -100, + duration: 400, + }); + current = false; + }, + d(detaching) { + if (detaching) detach(div5); + destroy_component(tabs); + /*div5_binding*/ ctx[8](null); + if (detaching && div5_outro) div5_outro.end(); + mounted = false; + run_all(dispose); + }, + }; + } + + // (142:16) + function create_default_slot_3(ctx) { + let img; + let img_src_value; + let t; + + return { + c() { + img = element("img"); + t = space(); + if ( + !src_url_equal( + img.src, + (img_src_value = "data:image/jpg;base64," + /*face*/ ctx[10].image) + ) + ) + attr(img, "src", img_src_value); + attr(img, "alt", ""); + attr(img, "class", "face-tab svelte-localhja"); + }, + m(target, anchor) { + insert(target, img, anchor); + insert(target, t, anchor); + }, + p(ctx, dirty) { + if ( + dirty & /*matches*/ 1 && + !src_url_equal( + img.src, + (img_src_value = "data:image/jpg;base64," + /*face*/ ctx[10].image) + ) + ) { + attr(img, "src", img_src_value); + } + }, + d(detaching) { + if (detaching) detach(img); + if (detaching) detach(t); + }, + }; + } + + // (141:14) {#each matches as face, i (face.image)} + function create_each_block_2(key_1, ctx) { + let first; + let tab; + let current; + + tab = new Tab({ + props: { + $$slots: { default: [create_default_slot_3] }, + $$scope: { ctx }, + }, + }); + + return { + key: key_1, + first: null, + c() { + first = empty(); + create_component(tab.$$.fragment); + this.first = first; + }, + m(target, anchor) { + insert(target, first, anchor); + mount_component(tab, target, anchor); + current = true; + }, + p(new_ctx, dirty) { + ctx = new_ctx; + const tab_changes = {}; + + if (dirty & /*$$scope, matches*/ 131073) { + tab_changes.$$scope = { dirty, ctx }; + } + + tab.$set(tab_changes); + }, + i(local) { + if (current) return; + transition_in(tab.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(tab.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) detach(first); + destroy_component(tab, detaching); + }, + }; + } + + // (140:12) + function create_default_slot_2(ctx) { + let each_blocks = []; + let each_1_lookup = new Map(); + let each_1_anchor; + let current; + let each_value_2 = /*matches*/ ctx[0]; + const get_key = (ctx) => /*face*/ ctx[10].image; + + for (let i = 0; i < each_value_2.length; i += 1) { + let child_ctx = get_each_context_2(ctx, each_value_2, i); + let key = get_key(child_ctx); + each_1_lookup.set( + key, + (each_blocks[i] = create_each_block_2(key, child_ctx)) + ); + } + + return { + c() { + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + each_1_anchor = empty(); + }, + m(target, anchor) { + for (let i = 0; i < each_blocks.length; i += 1) { + if (each_blocks[i]) { + each_blocks[i].m(target, anchor); + } + } + + insert(target, each_1_anchor, anchor); + current = true; + }, + p(ctx, dirty) { + if (dirty & /*matches*/ 1) { + each_value_2 = /*matches*/ ctx[0]; + group_outros(); + each_blocks = update_keyed_each( + each_blocks, + dirty, + get_key, + 1, + ctx, + each_value_2, + each_1_lookup, + each_1_anchor.parentNode, + outro_and_destroy_block, + create_each_block_2, + each_1_anchor, + get_each_context_2 + ); + check_outros(); + } + }, + i(local) { + if (current) return; + + for (let i = 0; i < each_value_2.length; i += 1) { + transition_in(each_blocks[i]); + } + + current = true; + }, + o(local) { + for (let i = 0; i < each_blocks.length; i += 1) { + transition_out(each_blocks[i]); + } + + current = false; + }, + d(detaching) { + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(detaching); + } + + if (detaching) detach(each_1_anchor); + }, + }; + } + + // (157:20) {#each performers as match, i (match.id)} + function create_each_block_1(key_1, ctx) { + let div4; + let div0; + let img; + let img_alt_value; + let img_src_value; + let t0; + let span0; + let span0_class_value; + let t1; + let div3; + let h5; + let div2; + let a; + let t2_value = /*match*/ ctx[14].name + ""; + let t2; + let a_href_value; + let t3; + let span1; + let div1; + let t4_value = /*match*/ ctx[14].confidence + ""; + let t4; + let t5; + let t6; + let div4_id_value; + let mounted; + let dispose; + + function click_handler(...args) { + return /*click_handler*/ ctx[6](/*match*/ ctx[14], ...args); + } + + function keypress_handler(...args) { + return /*keypress_handler*/ ctx[7](/*match*/ ctx[14], ...args); + } + + return { + key: key_1, + first: null, + c() { + div4 = element("div"); + div0 = element("div"); + img = element("img"); + t0 = space(); + span0 = element("span"); + t1 = space(); + div3 = element("div"); + h5 = element("h5"); + div2 = element("div"); + a = element("a"); + t2 = text(t2_value); + t3 = space(); + span1 = element("span"); + div1 = element("div"); + t4 = text(t4_value); + t5 = text("%"); + t6 = space(); + attr(img, "class", "performer-card-image svelte-localhja"); + attr(img, "alt", (img_alt_value = /*match*/ ctx[14].name)); + if (!src_url_equal(img.src, (img_src_value = /*match*/ ctx[14].image))) + attr(img, "src", img_src_value); + attr( + span0, + "class", + (span0_class_value = + "performer-card__country-flag fi fi-" + + /*match*/ ctx[14].country?.toLowerCase() + + " svelte-localhja") + ); + attr(div0, "class", "thumbnail-section svelte-localhja"); + attr( + a, + "href", + (a_href_value = + window.stash7dJx1qP.stash.serverUrl + + "/performers/" + + /*match*/ ctx[14].id) + ); + attr(a, "target", "_blank"); + attr(a, "class", "svelte-localhja"); + attr(div1, "class", "svelte-localhja"); + attr(span1, "class", "tag-item badge badge-pill svelte-localhja"); + set_style(div2, "-webkit-line-clamp", "2"); + attr(div2, "class", "svelte-localhja"); + attr(h5, "class", "card-section-title flex-aligned svelte-localhja"); + attr(div3, "class", "card-section svelte-localhja"); + attr(div4, "draggable", "false"); + attr(div4, "class", "performer-card grid-card card svelte-localhja"); + attr(div4, "id", (div4_id_value = "face-" + /*i*/ ctx[13])); + this.first = div4; + }, + m(target, anchor) { + insert(target, div4, anchor); + append(div4, div0); + append(div0, img); + append(div0, t0); + append(div0, span0); + append(div4, t1); + append(div4, div3); + append(div3, h5); + append(h5, div2); + append(div2, a); + append(a, t2); + append(div2, t3); + append(div2, span1); + append(span1, div1); + append(div1, t4); + append(div1, t5); + append(div4, t6); + + if (!mounted) { + dispose = [ + action_destroyer(smoothload.call(null, img)), + listen(div4, "click", click_handler), + listen(div4, "keypress", keypress_handler), + ]; + + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + + if ( + dirty & /*matches*/ 1 && + img_alt_value !== (img_alt_value = /*match*/ ctx[14].name) + ) { + attr(img, "alt", img_alt_value); + } + + if ( + dirty & /*matches*/ 1 && + !src_url_equal(img.src, (img_src_value = /*match*/ ctx[14].image)) + ) { + attr(img, "src", img_src_value); + } + + if ( + dirty & /*matches*/ 1 && + span0_class_value !== + (span0_class_value = + "performer-card__country-flag fi fi-" + + /*match*/ ctx[14].country?.toLowerCase() + + " svelte-localhja") + ) { + attr(span0, "class", span0_class_value); + } + + if ( + dirty & /*matches*/ 1 && + t2_value !== (t2_value = /*match*/ ctx[14].name + "") + ) + set_data(t2, t2_value); + + if ( + dirty & /*matches*/ 1 && + a_href_value !== + (a_href_value = + window.stash7dJx1qP.stash.serverUrl + + "/performers/" + + /*match*/ ctx[14].id) + ) { + attr(a, "href", a_href_value); + } + + if ( + dirty & /*matches*/ 1 && + t4_value !== (t4_value = /*match*/ ctx[14].confidence + "") + ) + set_data(t4, t4_value); + + if ( + dirty & /*matches*/ 1 && + div4_id_value !== (div4_id_value = "face-" + /*i*/ ctx[13]) + ) { + attr(div4, "id", div4_id_value); + } + }, + d(detaching) { + if (detaching) detach(div4); + mounted = false; + run_all(dispose); + }, + }; + } + + // (154:14) + function create_default_slot_1(ctx) { + let div1; + let div0; + let each_blocks = []; + let each_1_lookup = new Map(); + let t; + let each_value_1 = /*performers*/ ctx[11]; + const get_key = (ctx) => /*match*/ ctx[14].id; + + for (let i = 0; i < each_value_1.length; i += 1) { + let child_ctx = get_each_context_1(ctx, each_value_1, i); + let key = get_key(child_ctx); + each_1_lookup.set( + key, + (each_blocks[i] = create_each_block_1(key, child_ctx)) + ); + } + + return { + c() { + div1 = element("div"); + div0 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + t = space(); + attr(div0, "class", "carousel svelte-localhja"); + attr(div1, "class", "row svelte-localhja"); + }, + m(target, anchor) { + insert(target, div1, anchor); + append(div1, div0); + + for (let i = 0; i < each_blocks.length; i += 1) { + if (each_blocks[i]) { + each_blocks[i].m(div0, null); + } + } + + insert(target, t, anchor); + }, + p(ctx, dirty) { + if (dirty & /*matches, addPerformer*/ 33) { + each_value_1 = /*performers*/ ctx[11]; + each_blocks = update_keyed_each( + each_blocks, + dirty, + get_key, + 1, + ctx, + each_value_1, + each_1_lookup, + div0, + destroy_block, + create_each_block_1, + null, + get_each_context_1 + ); + } + }, + d(detaching) { + if (detaching) detach(div1); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } + + if (detaching) detach(t); + }, + }; + } + + // (152:12) {#each matches as face, i (face.image)} + function create_each_block$1(key_1, ctx) { + let first; + let tabpanel; + let current; + + tabpanel = new TabPanel({ + props: { + $$slots: { default: [create_default_slot_1] }, + $$scope: { ctx }, + }, + }); + + return { + key: key_1, + first: null, + c() { + first = empty(); + create_component(tabpanel.$$.fragment); + this.first = first; + }, + m(target, anchor) { + insert(target, first, anchor); + mount_component(tabpanel, target, anchor); + current = true; + }, + p(new_ctx, dirty) { + ctx = new_ctx; + const tabpanel_changes = {}; + + if (dirty & /*$$scope, matches*/ 131073) { + tabpanel_changes.$$scope = { dirty, ctx }; + } + + tabpanel.$set(tabpanel_changes); + }, + i(local) { + if (current) return; + transition_in(tabpanel.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(tabpanel.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) detach(first); + destroy_component(tabpanel, detaching); + }, + }; + } + + // (139:10) + function create_default_slot(ctx) { + let tablist; + let t; + let each_blocks = []; + let each_1_lookup = new Map(); + let each_1_anchor; + let current; + + tablist = new TabList({ + props: { + $$slots: { default: [create_default_slot_2] }, + $$scope: { ctx }, + }, + }); + + let each_value = /*matches*/ ctx[0]; + const get_key = (ctx) => /*face*/ ctx[10].image; + + for (let i = 0; i < each_value.length; i += 1) { + let child_ctx = get_each_context$1(ctx, each_value, i); + let key = get_key(child_ctx); + each_1_lookup.set( + key, + (each_blocks[i] = create_each_block$1(key, child_ctx)) + ); + } + + return { + c() { + create_component(tablist.$$.fragment); + t = space(); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + each_1_anchor = empty(); + }, + m(target, anchor) { + mount_component(tablist, target, anchor); + insert(target, t, anchor); + + for (let i = 0; i < each_blocks.length; i += 1) { + if (each_blocks[i]) { + each_blocks[i].m(target, anchor); + } + } + + insert(target, each_1_anchor, anchor); + current = true; + }, + p(ctx, dirty) { + const tablist_changes = {}; + + if (dirty & /*$$scope, matches*/ 131073) { + tablist_changes.$$scope = { dirty, ctx }; + } + + tablist.$set(tablist_changes); + + if (dirty & /*matches, addPerformer*/ 33) { + each_value = /*matches*/ ctx[0]; + group_outros(); + each_blocks = update_keyed_each( + each_blocks, + dirty, + get_key, + 1, + ctx, + each_value, + each_1_lookup, + each_1_anchor.parentNode, + outro_and_destroy_block, + create_each_block$1, + each_1_anchor, + get_each_context$1 + ); + check_outros(); + } + }, + i(local) { + if (current) return; + transition_in(tablist.$$.fragment, local); + + for (let i = 0; i < each_value.length; i += 1) { + transition_in(each_blocks[i]); + } + + current = true; + }, + o(local) { + transition_out(tablist.$$.fragment, local); + + for (let i = 0; i < each_blocks.length; i += 1) { + transition_out(each_blocks[i]); + } + + current = false; + }, + d(detaching) { + destroy_component(tablist, detaching); + if (detaching) detach(t); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(detaching); + } + + if (detaching) detach(each_1_anchor); + }, + }; + } + + function create_fragment$3(ctx) { + let if_block_anchor; + let current; + let if_block = /*visible*/ ctx[1] && create_if_block(ctx); + + return { + c() { + if (if_block) if_block.c(); + if_block_anchor = empty(); + }, + m(target, anchor) { + if (if_block) if_block.m(target, anchor); + insert(target, if_block_anchor, anchor); + current = true; + }, + p(ctx, [dirty]) { + if (/*visible*/ ctx[1]) { + if (if_block) { + if_block.p(ctx, dirty); + + if (dirty & /*visible*/ 2) { + transition_in(if_block, 1); + } + } else { + if_block = create_if_block(ctx); + if_block.c(); + transition_in(if_block, 1); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + group_outros(); + + transition_out(if_block, 1, 1, () => { + if_block = null; + }); + + check_outros(); + } + }, + i(local) { + if (current) return; + transition_in(if_block); + current = true; + }, + o(local) { + transition_out(if_block); + current = false; + }, + d(detaching) { + if (if_block) if_block.d(detaching); + if (detaching) detach(if_block_anchor); + }, + }; + } + + function instance$3($$self, $$props, $$invalidate) { + let { matches = [] } = $$props; + let matchesSelected = 0; + let visible = false; + let modal; + + onMount(() => { + $$invalidate(1, (visible = true)); + }); + + async function close() { + $$invalidate(1, (visible = false)); + + setTimeout(() => { + modal.remove(); + }, 400); + } + + function toggle() { + $$invalidate( + 2, + (modal.style.opacity = modal.style.opacity == "0.1" ? "1.0" : "0.1"), + modal + ); + } + + async function addPerformer(current, id_) { + current.classList.add("assigned"); + let [scenario, scenarioId] = getScenarioAndID(); + var performIds; + + if (scenario === "scenes") { + performIds = await getPerformersForScene(scenarioId); + + if (performIds.includes(id_)) { + current.classList.remove("assigned"); + alert("Performer already assigned to scene"); + return; + } + + performIds.push(id_); + await updateScene(scenarioId, performIds); + } else if (scenario === "images") { + performIds = await getPerformersForImage(scenarioId); + + if (performIds.includes(id_)) { + current.classList.remove("assigned"); + alert("Performer already assigned to image"); + return; + } + + performIds.push(id_); + await updateImage(scenarioId, performIds); + } + + matchesSelected += 1; + + if (matchesSelected === matches.length) { + close(); + window.location.reload(); + } + } + + const click_handler = (match, event) => + addPerformer(event.target, match.id); + const keypress_handler = (match, event) => + addPerformer(event.target, match.id); + + function div5_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + modal = $$value; + $$invalidate(2, modal); + }); + } + + $$self.$$set = ($$props) => { + if ("matches" in $$props) $$invalidate(0, (matches = $$props.matches)); + }; + + return [ + matches, + visible, + modal, + close, + toggle, + addPerformer, + click_handler, + keypress_handler, + div5_binding, + ]; + } + + class Match extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance$3, create_fragment$3, safe_not_equal, { + matches: 0, + }); + } + } + + var commonjsGlobal = + typeof globalThis !== "undefined" + ? globalThis + : typeof window !== "undefined" + ? window + : typeof global !== "undefined" + ? global + : typeof self !== "undefined" + ? self + : {}; + + function createCommonjsModule(fn) { + var module = { exports: {} }; + return fn(module, module.exports), module.exports; + } + + /*! + * html2canvas 1.4.1 + * Copyright (c) 2022 Niklas von Hertzen + * Released under MIT License + */ + + var html2canvas = createCommonjsModule(function (module, exports) { + (function (global, factory) { + module.exports = factory(); + })(commonjsGlobal, function () { + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function (d, b) { + extendStatics = + Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && + function (d, b) { + d.__proto__ = b; + }) || + function (d, b) { + for (var p in b) + if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; + }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError( + "Class extends value " + String(b) + " is not a constructor or null" + ); + extendStatics(d, b); + function __() { + this.constructor = d; + } + d.prototype = + b === null + ? Object.create(b) + : ((__.prototype = b.prototype), new __()); + } + + var __assign = function () { + __assign = + Object.assign || + function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P + ? value + : new P(function (resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done + ? resolve(result.value) + : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + } + + function __generator(thisArg, body) { + var _ = { + label: 0, + sent: function () { + if (t[0] & 1) throw t[1]; + return t[1]; + }, + trys: [], + ops: [], + }, + f, + y, + t, + g; + return ( + (g = { next: verb(0), throw: verb(1), return: verb(2) }), + typeof Symbol === "function" && + (g[Symbol.iterator] = function () { + return this; + }), + g + ); + function verb(n) { + return function (v) { + return step([n, v]); + }; + } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) + try { + if ( + ((f = 1), + y && + (t = + op[0] & 2 + ? y["return"] + : op[0] + ? y["throw"] || ((t = y["return"]) && t.call(y), 0) + : y.next) && + !(t = t.call(y, op[1])).done) + ) + return t; + if (((y = 0), t)) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: + case 1: + t = op; + break; + case 4: + _.label++; + return { value: op[1], done: false }; + case 5: + _.label++; + y = op[1]; + op = [0]; + continue; + case 7: + op = _.ops.pop(); + _.trys.pop(); + continue; + default: + if ( + !((t = _.trys), (t = t.length > 0 && t[t.length - 1])) && + (op[0] === 6 || op[0] === 2) + ) { + _ = 0; + continue; + } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { + _.label = op[1]; + break; + } + if (op[0] === 6 && _.label < t[1]) { + _.label = t[1]; + t = op; + break; + } + if (t && _.label < t[2]) { + _.label = t[2]; + _.ops.push(op); + break; + } + if (t[2]) _.ops.pop(); + _.trys.pop(); + continue; + } + op = body.call(thisArg, _); + } catch (e) { + op = [6, e]; + y = 0; + } finally { + f = t = 0; + } + if (op[0] & 5) throw op[1]; + return { value: op[0] ? op[1] : void 0, done: true }; + } + } + + function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) + for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || from); + } + + var Bounds = /** @class */ (function () { + function Bounds(left, top, width, height) { + this.left = left; + this.top = top; + this.width = width; + this.height = height; + } + Bounds.prototype.add = function (x, y, w, h) { + return new Bounds( + this.left + x, + this.top + y, + this.width + w, + this.height + h + ); + }; + Bounds.fromClientRect = function (context, clientRect) { + return new Bounds( + clientRect.left + context.windowBounds.left, + clientRect.top + context.windowBounds.top, + clientRect.width, + clientRect.height + ); + }; + Bounds.fromDOMRectList = function (context, domRectList) { + var domRect = Array.from(domRectList).find(function (rect) { + return rect.width !== 0; + }); + return domRect + ? new Bounds( + domRect.left + context.windowBounds.left, + domRect.top + context.windowBounds.top, + domRect.width, + domRect.height + ) + : Bounds.EMPTY; + }; + Bounds.EMPTY = new Bounds(0, 0, 0, 0); + return Bounds; + })(); + var parseBounds = function (context, node) { + return Bounds.fromClientRect(context, node.getBoundingClientRect()); + }; + var parseDocumentSize = function (document) { + var body = document.body; + var documentElement = document.documentElement; + if (!body || !documentElement) { + throw new Error("Unable to get document size"); + } + var width = Math.max( + Math.max(body.scrollWidth, documentElement.scrollWidth), + Math.max(body.offsetWidth, documentElement.offsetWidth), + Math.max(body.clientWidth, documentElement.clientWidth) + ); + var height = Math.max( + Math.max(body.scrollHeight, documentElement.scrollHeight), + Math.max(body.offsetHeight, documentElement.offsetHeight), + Math.max(body.clientHeight, documentElement.clientHeight) + ); + return new Bounds(0, 0, width, height); + }; + + /* + * css-line-break 2.1.0 + * Copyright (c) 2022 Niklas von Hertzen + * Released under MIT License + */ + var toCodePoints$1 = function (str) { + var codePoints = []; + var i = 0; + var length = str.length; + while (i < length) { + var value = str.charCodeAt(i++); + if (value >= 0xd800 && value <= 0xdbff && i < length) { + var extra = str.charCodeAt(i++); + if ((extra & 0xfc00) === 0xdc00) { + codePoints.push( + ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000 + ); + } else { + codePoints.push(value); + i--; + } + } else { + codePoints.push(value); + } + } + return codePoints; + }; + var fromCodePoint$1 = function () { + var codePoints = []; + for (var _i = 0; _i < arguments.length; _i++) { + codePoints[_i] = arguments[_i]; + } + if (String.fromCodePoint) { + return String.fromCodePoint.apply(String, codePoints); + } + var length = codePoints.length; + if (!length) { + return ""; + } + var codeUnits = []; + var index = -1; + var result = ""; + while (++index < length) { + var codePoint = codePoints[index]; + if (codePoint <= 0xffff) { + codeUnits.push(codePoint); + } else { + codePoint -= 0x10000; + codeUnits.push( + (codePoint >> 10) + 0xd800, + (codePoint % 0x400) + 0xdc00 + ); + } + if (index + 1 === length || codeUnits.length > 0x4000) { + result += String.fromCharCode.apply(String, codeUnits); + codeUnits.length = 0; + } + } + return result; + }; + var chars$2 = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + // Use a lookup table to find the index. + var lookup$2 = + typeof Uint8Array === "undefined" ? [] : new Uint8Array(256); + for (var i$2 = 0; i$2 < chars$2.length; i$2++) { + lookup$2[chars$2.charCodeAt(i$2)] = i$2; + } + + /* + * utrie 1.0.2 + * Copyright (c) 2022 Niklas von Hertzen + * Released under MIT License + */ + var chars$1$1 = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + // Use a lookup table to find the index. + var lookup$1$1 = + typeof Uint8Array === "undefined" ? [] : new Uint8Array(256); + for (var i$1$1 = 0; i$1$1 < chars$1$1.length; i$1$1++) { + lookup$1$1[chars$1$1.charCodeAt(i$1$1)] = i$1$1; + } + var decode$1 = function (base64) { + var bufferLength = base64.length * 0.75, + len = base64.length, + i, + p = 0, + encoded1, + encoded2, + encoded3, + encoded4; + if (base64[base64.length - 1] === "=") { + bufferLength--; + if (base64[base64.length - 2] === "=") { + bufferLength--; + } + } + var buffer = + typeof ArrayBuffer !== "undefined" && + typeof Uint8Array !== "undefined" && + typeof Uint8Array.prototype.slice !== "undefined" + ? new ArrayBuffer(bufferLength) + : new Array(bufferLength); + var bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer); + for (i = 0; i < len; i += 4) { + encoded1 = lookup$1$1[base64.charCodeAt(i)]; + encoded2 = lookup$1$1[base64.charCodeAt(i + 1)]; + encoded3 = lookup$1$1[base64.charCodeAt(i + 2)]; + encoded4 = lookup$1$1[base64.charCodeAt(i + 3)]; + bytes[p++] = (encoded1 << 2) | (encoded2 >> 4); + bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2); + bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63); + } + return buffer; + }; + var polyUint16Array$1 = function (buffer) { + var length = buffer.length; + var bytes = []; + for (var i = 0; i < length; i += 2) { + bytes.push((buffer[i + 1] << 8) | buffer[i]); + } + return bytes; + }; + var polyUint32Array$1 = function (buffer) { + var length = buffer.length; + var bytes = []; + for (var i = 0; i < length; i += 4) { + bytes.push( + (buffer[i + 3] << 24) | + (buffer[i + 2] << 16) | + (buffer[i + 1] << 8) | + buffer[i] + ); + } + return bytes; + }; + + /** Shift size for getting the index-2 table offset. */ + var UTRIE2_SHIFT_2$1 = 5; + /** Shift size for getting the index-1 table offset. */ + var UTRIE2_SHIFT_1$1 = 6 + 5; + /** + * Shift size for shifting left the index array values. + * Increases possible data size with 16-bit index values at the cost + * of compactability. + * This requires data blocks to be aligned by UTRIE2_DATA_GRANULARITY. + */ + var UTRIE2_INDEX_SHIFT$1 = 2; + /** + * Difference between the two shift sizes, + * for getting an index-1 offset from an index-2 offset. 6=11-5 + */ + var UTRIE2_SHIFT_1_2$1 = UTRIE2_SHIFT_1$1 - UTRIE2_SHIFT_2$1; + /** + * The part of the index-2 table for U+D800..U+DBFF stores values for + * lead surrogate code _units_ not code _points_. + * Values for lead surrogate code _points_ are indexed with this portion of the table. + * Length=32=0x20=0x400>>UTRIE2_SHIFT_2. (There are 1024=0x400 lead surrogates.) + */ + var UTRIE2_LSCP_INDEX_2_OFFSET$1 = 0x10000 >> UTRIE2_SHIFT_2$1; + /** Number of entries in a data block. 32=0x20 */ + var UTRIE2_DATA_BLOCK_LENGTH$1 = 1 << UTRIE2_SHIFT_2$1; + /** Mask for getting the lower bits for the in-data-block offset. */ + var UTRIE2_DATA_MASK$1 = UTRIE2_DATA_BLOCK_LENGTH$1 - 1; + var UTRIE2_LSCP_INDEX_2_LENGTH$1 = 0x400 >> UTRIE2_SHIFT_2$1; + /** Count the lengths of both BMP pieces. 2080=0x820 */ + var UTRIE2_INDEX_2_BMP_LENGTH$1 = + UTRIE2_LSCP_INDEX_2_OFFSET$1 + UTRIE2_LSCP_INDEX_2_LENGTH$1; + /** + * The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820. + * Length 32=0x20 for lead bytes C0..DF, regardless of UTRIE2_SHIFT_2. + */ + var UTRIE2_UTF8_2B_INDEX_2_OFFSET$1 = UTRIE2_INDEX_2_BMP_LENGTH$1; + var UTRIE2_UTF8_2B_INDEX_2_LENGTH$1 = + 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */ + /** + * The index-1 table, only used for supplementary code points, at offset 2112=0x840. + * Variable length, for code points up to highStart, where the last single-value range starts. + * Maximum length 512=0x200=0x100000>>UTRIE2_SHIFT_1. + * (For 0x100000 supplementary code points U+10000..U+10ffff.) + * + * The part of the index-2 table for supplementary code points starts + * after this index-1 table. + * + * Both the index-1 table and the following part of the index-2 table + * are omitted completely if there is only BMP data. + */ + var UTRIE2_INDEX_1_OFFSET$1 = + UTRIE2_UTF8_2B_INDEX_2_OFFSET$1 + UTRIE2_UTF8_2B_INDEX_2_LENGTH$1; + /** + * Number of index-1 entries for the BMP. 32=0x20 + * This part of the index-1 table is omitted from the serialized form. + */ + var UTRIE2_OMITTED_BMP_INDEX_1_LENGTH$1 = 0x10000 >> UTRIE2_SHIFT_1$1; + /** Number of entries in an index-2 block. 64=0x40 */ + var UTRIE2_INDEX_2_BLOCK_LENGTH$1 = 1 << UTRIE2_SHIFT_1_2$1; + /** Mask for getting the lower bits for the in-index-2-block offset. */ + var UTRIE2_INDEX_2_MASK$1 = UTRIE2_INDEX_2_BLOCK_LENGTH$1 - 1; + var slice16$1 = function (view, start, end) { + if (view.slice) { + return view.slice(start, end); + } + return new Uint16Array(Array.prototype.slice.call(view, start, end)); + }; + var slice32$1 = function (view, start, end) { + if (view.slice) { + return view.slice(start, end); + } + return new Uint32Array(Array.prototype.slice.call(view, start, end)); + }; + var createTrieFromBase64$1 = function (base64, _byteLength) { + var buffer = decode$1(base64); + var view32 = Array.isArray(buffer) + ? polyUint32Array$1(buffer) + : new Uint32Array(buffer); + var view16 = Array.isArray(buffer) + ? polyUint16Array$1(buffer) + : new Uint16Array(buffer); + var headerLength = 24; + var index = slice16$1(view16, headerLength / 2, view32[4] / 2); + var data = + view32[5] === 2 + ? slice16$1(view16, (headerLength + view32[4]) / 2) + : slice32$1(view32, Math.ceil((headerLength + view32[4]) / 4)); + return new Trie$1( + view32[0], + view32[1], + view32[2], + view32[3], + index, + data + ); + }; + var Trie$1 = /** @class */ (function () { + function Trie( + initialValue, + errorValue, + highStart, + highValueIndex, + index, + data + ) { + this.initialValue = initialValue; + this.errorValue = errorValue; + this.highStart = highStart; + this.highValueIndex = highValueIndex; + this.index = index; + this.data = data; + } + /** + * Get the value for a code point as stored in the Trie. + * + * @param codePoint the code point + * @return the value + */ + Trie.prototype.get = function (codePoint) { + var ix; + if (codePoint >= 0) { + if ( + codePoint < 0x0d800 || + (codePoint > 0x0dbff && codePoint <= 0x0ffff) + ) { + // Ordinary BMP code point, excluding leading surrogates. + // BMP uses a single level lookup. BMP index starts at offset 0 in the Trie2 index. + // 16 bit data is stored in the index array itself. + ix = this.index[codePoint >> UTRIE2_SHIFT_2$1]; + ix = + (ix << UTRIE2_INDEX_SHIFT$1) + (codePoint & UTRIE2_DATA_MASK$1); + return this.data[ix]; + } + if (codePoint <= 0xffff) { + // Lead Surrogate Code Point. A Separate index section is stored for + // lead surrogate code units and code points. + // The main index has the code unit data. + // For this function, we need the code point data. + // Note: this expression could be refactored for slightly improved efficiency, but + // surrogate code points will be so rare in practice that it's not worth it. + ix = + this.index[ + UTRIE2_LSCP_INDEX_2_OFFSET$1 + + ((codePoint - 0xd800) >> UTRIE2_SHIFT_2$1) + ]; + ix = + (ix << UTRIE2_INDEX_SHIFT$1) + (codePoint & UTRIE2_DATA_MASK$1); + return this.data[ix]; + } + if (codePoint < this.highStart) { + // Supplemental code point, use two-level lookup. + ix = + UTRIE2_INDEX_1_OFFSET$1 - + UTRIE2_OMITTED_BMP_INDEX_1_LENGTH$1 + + (codePoint >> UTRIE2_SHIFT_1$1); + ix = this.index[ix]; + ix += (codePoint >> UTRIE2_SHIFT_2$1) & UTRIE2_INDEX_2_MASK$1; + ix = this.index[ix]; + ix = + (ix << UTRIE2_INDEX_SHIFT$1) + (codePoint & UTRIE2_DATA_MASK$1); + return this.data[ix]; + } + if (codePoint <= 0x10ffff) { + return this.data[this.highValueIndex]; + } + } + // Fall through. The code point is outside of the legal range of 0..0x10ffff. + return this.errorValue; + }; + return Trie; + })(); + + /* + * base64-arraybuffer 1.0.2 + * Copyright (c) 2022 Niklas von Hertzen + * Released under MIT License + */ + var chars$3 = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + // Use a lookup table to find the index. + var lookup$3 = + typeof Uint8Array === "undefined" ? [] : new Uint8Array(256); + for (var i$3 = 0; i$3 < chars$3.length; i$3++) { + lookup$3[chars$3.charCodeAt(i$3)] = i$3; + } + + var base64$1 = + "KwAAAAAAAAAACA4AUD0AADAgAAACAAAAAAAIABAAGABAAEgAUABYAGAAaABgAGgAYgBqAF8AZwBgAGgAcQB5AHUAfQCFAI0AlQCdAKIAqgCyALoAYABoAGAAaABgAGgAwgDKAGAAaADGAM4A0wDbAOEA6QDxAPkAAQEJAQ8BFwF1AH0AHAEkASwBNAE6AUIBQQFJAVEBWQFhAWgBcAF4ATAAgAGGAY4BlQGXAZ8BpwGvAbUBvQHFAc0B0wHbAeMB6wHxAfkBAQIJAvEBEQIZAiECKQIxAjgCQAJGAk4CVgJeAmQCbAJ0AnwCgQKJApECmQKgAqgCsAK4ArwCxAIwAMwC0wLbAjAA4wLrAvMC+AIAAwcDDwMwABcDHQMlAy0DNQN1AD0DQQNJA0kDSQNRA1EDVwNZA1kDdQB1AGEDdQBpA20DdQN1AHsDdQCBA4kDkQN1AHUAmQOhA3UAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AKYDrgN1AHUAtgO+A8YDzgPWAxcD3gPjA+sD8wN1AHUA+wMDBAkEdQANBBUEHQQlBCoEFwMyBDgEYABABBcDSARQBFgEYARoBDAAcAQzAXgEgASIBJAEdQCXBHUAnwSnBK4EtgS6BMIEyAR1AHUAdQB1AHUAdQCVANAEYABgAGAAYABgAGAAYABgANgEYADcBOQEYADsBPQE/AQEBQwFFAUcBSQFLAU0BWQEPAVEBUsFUwVbBWAAYgVgAGoFcgV6BYIFigWRBWAAmQWfBaYFYABgAGAAYABgAKoFYACxBbAFuQW6BcEFwQXHBcEFwQXPBdMF2wXjBeoF8gX6BQIGCgYSBhoGIgYqBjIGOgZgAD4GRgZMBmAAUwZaBmAAYABgAGAAYABgAGAAYABgAGAAYABgAGIGYABpBnAGYABgAGAAYABgAGAAYABgAGAAYAB4Bn8GhQZgAGAAYAB1AHcDFQSLBmAAYABgAJMGdQA9A3UAmwajBqsGqwaVALMGuwbDBjAAywbSBtIG1QbSBtIG0gbSBtIG0gbdBuMG6wbzBvsGAwcLBxMHAwcbByMHJwcsBywHMQcsB9IGOAdAB0gHTgfSBkgHVgfSBtIG0gbSBtIG0gbSBtIG0gbSBiwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdgAGAALAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdbB2MHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB2kH0gZwB64EdQB1AHUAdQB1AHUAdQB1AHUHfQdgAIUHjQd1AHUAlQedB2AAYAClB6sHYACzB7YHvgfGB3UAzgfWBzMB3gfmB1EB7gf1B/0HlQENAQUIDQh1ABUIHQglCBcDLQg1CD0IRQhNCEEDUwh1AHUAdQBbCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIcAh3CHoIMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIgggwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAALAcsBywHLAcsBywHLAcsBywHLAcsB4oILAcsB44I0gaWCJ4Ipgh1AHUAqgiyCHUAdQB1AHUAdQB1AHUAdQB1AHUAtwh8AXUAvwh1AMUIyQjRCNkI4AjoCHUAdQB1AO4I9gj+CAYJDgkTCS0HGwkjCYIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiAAIAAAAFAAYABgAGIAXwBgAHEAdQBFAJUAogCyAKAAYABgAEIA4ABGANMA4QDxAMEBDwE1AFwBLAE6AQEBUQF4QkhCmEKoQrhCgAHIQsAB0MLAAcABwAHAAeDC6ABoAHDCwMMAAcABwAHAAdDDGMMAAcAB6MM4wwjDWMNow3jDaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAEjDqABWw6bDqABpg6gAaABoAHcDvwOPA+gAaABfA/8DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DpcPAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAB9cPKwkyCToJMAB1AHUAdQBCCUoJTQl1AFUJXAljCWcJawkwADAAMAAwAHMJdQB2CX4JdQCECYoJjgmWCXUAngkwAGAAYABxAHUApgn3A64JtAl1ALkJdQDACTAAMAAwADAAdQB1AHUAdQB1AHUAdQB1AHUAowYNBMUIMAAwADAAMADICcsJ0wnZCRUE4QkwAOkJ8An4CTAAMAB1AAAKvwh1AAgKDwoXCh8KdQAwACcKLgp1ADYKqAmICT4KRgowADAAdQB1AE4KMAB1AFYKdQBeCnUAZQowADAAMAAwADAAMAAwADAAMAAVBHUAbQowADAAdQC5CXUKMAAwAHwBxAijBogEMgF9CoQKiASMCpQKmgqIBKIKqgquCogEDQG2Cr4KxgrLCjAAMADTCtsKCgHjCusK8Qr5CgELMAAwADAAMAB1AIsECQsRC3UANAEZCzAAMAAwADAAMAB1ACELKQswAHUANAExCzkLdQBBC0kLMABRC1kLMAAwADAAMAAwADAAdQBhCzAAMAAwAGAAYABpC3ELdwt/CzAAMACHC4sLkwubC58Lpwt1AK4Ltgt1APsDMAAwADAAMAAwADAAMAAwAL4LwwvLC9IL1wvdCzAAMADlC+kL8Qv5C/8LSQswADAAMAAwADAAMAAwADAAMAAHDDAAMAAwADAAMAAODBYMHgx1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1ACYMMAAwADAAdQB1AHUALgx1AHUAdQB1AHUAdQA2DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AD4MdQBGDHUAdQB1AHUAdQB1AEkMdQB1AHUAdQB1AFAMMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQBYDHUAdQB1AF8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUA+wMVBGcMMAAwAHwBbwx1AHcMfwyHDI8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAYABgAJcMMAAwADAAdQB1AJ8MlQClDDAAMACtDCwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB7UMLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AA0EMAC9DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAsBywHLAcsBywHLAcsBywHLQcwAMEMyAwsBywHLAcsBywHLAcsBywHLAcsBywHzAwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1ANQM2QzhDDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMABgAGAAYABgAGAAYABgAOkMYADxDGAA+AwADQYNYABhCWAAYAAODTAAMAAwADAAFg1gAGAAHg37AzAAMAAwADAAYABgACYNYAAsDTQNPA1gAEMNPg1LDWAAYABgAGAAYABgAGAAYABgAGAAUg1aDYsGVglhDV0NcQBnDW0NdQ15DWAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAlQCBDZUAiA2PDZcNMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAnw2nDTAAMAAwADAAMAAwAHUArw23DTAAMAAwADAAMAAwADAAMAAwADAAMAB1AL8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQDHDTAAYABgAM8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA1w11ANwNMAAwAD0B5A0wADAAMAAwADAAMADsDfQN/A0EDgwOFA4wABsOMAAwADAAMAAwADAAMAAwANIG0gbSBtIG0gbSBtIG0gYjDigOwQUuDsEFMw7SBjoO0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGQg5KDlIOVg7SBtIGXg5lDm0OdQ7SBtIGfQ6EDooOjQ6UDtIGmg6hDtIG0gaoDqwO0ga0DrwO0gZgAGAAYADEDmAAYAAkBtIGzA5gANIOYADaDokO0gbSBt8O5w7SBu8O0gb1DvwO0gZgAGAAxA7SBtIG0gbSBtIGYABgAGAAYAAED2AAsAUMD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHJA8sBywHLAcsBywHLAccDywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywPLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAc0D9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHPA/SBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gYUD0QPlQCVAJUAMAAwADAAMACVAJUAlQCVAJUAlQCVAEwPMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA//8EAAQABAAEAAQABAAEAAQABAANAAMAAQABAAIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQACgATABcAHgAbABoAHgAXABYAEgAeABsAGAAPABgAHABLAEsASwBLAEsASwBLAEsASwBLABgAGAAeAB4AHgATAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYAGwASAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWAA0AEQAeAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAFAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJABYAGgAbABsAGwAeAB0AHQAeAE8AFwAeAA0AHgAeABoAGwBPAE8ADgBQAB0AHQAdAE8ATwAXAE8ATwBPABYAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAFAATwBAAE8ATwBPAEAATwBQAFAATwBQAB4AHgAeAB4AHgAeAB0AHQAdAB0AHgAdAB4ADgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgBQAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkACQAJAAkACQAJAAkABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAFAAHgAeAB4AKwArAFAAUABQAFAAGABQACsAKwArACsAHgAeAFAAHgBQAFAAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUAAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAYAA0AKwArAB4AHgAbACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAB4ABAAEAB4ABAAEABMABAArACsAKwArACsAKwArACsAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAKwArACsAKwBWAFYAVgBWAB4AHgArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AGgAaABoAGAAYAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQAEwAEACsAEwATAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABLAEsASwBLAEsASwBLAEsASwBLABoAGQAZAB4AUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABMAUAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABABQAFAABAAEAB4ABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUAAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAFAABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQAUABQAB4AHgAYABMAUAArACsABAAbABsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAFAABAAEAAQABAAEAFAABAAEAAQAUAAEAAQABAAEAAQAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArACsAHgArAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAUAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEAA0ADQBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUAArACsAKwBQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABABQACsAKwArACsAKwArACsAKwAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUAAaABoAUABQAFAAUABQAEwAHgAbAFAAHgAEACsAKwAEAAQABAArAFAAUABQAFAAUABQACsAKwArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQACsAUABQACsAKwAEACsABAAEAAQABAAEACsAKwArACsABAAEACsAKwAEAAQABAArACsAKwAEACsAKwArACsAKwArACsAUABQAFAAUAArAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLAAQABABQAFAAUAAEAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAArACsAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AGwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAKwArACsAKwArAAQABAAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAAQAUAArAFAAUABQAFAAUABQACsAKwArAFAAUABQACsAUABQAFAAUAArACsAKwBQAFAAKwBQACsAUABQACsAKwArAFAAUAArACsAKwBQAFAAUAArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAAQABAAEAAQABAArACsAKwAEAAQABAArAAQABAAEAAQAKwArAFAAKwArACsAKwArACsABAArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAHgAeAB4AHgAeAB4AGwAeACsAKwArACsAKwAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAUABQAFAAKwArACsAKwArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwAOAFAAUABQAFAAUABQAFAAHgBQAAQABAAEAA4AUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAKwArAAQAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAKwArACsAKwArACsAUAArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABABQAB4AKwArACsAKwBQAFAAUAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQABoAUABQAFAAUABQAFAAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQACsAUAArACsAUABQAFAAUABQAFAAUAArACsAKwAEACsAKwArACsABAAEAAQABAAEAAQAKwAEACsABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgAqACsAKwArACsAGwBcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAeAEsASwBLAEsASwBLAEsASwBLAEsADQANACsAKwArACsAKwBcAFwAKwBcACsAXABcAFwAXABcACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAXAArAFwAXABcAFwAXABcAFwAXABcAFwAKgBcAFwAKgAqACoAKgAqACoAKgAqACoAXAArACsAXABcAFwAXABcACsAXAArACoAKgAqACoAKgAqACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwBcAFwAXABcAFAADgAOAA4ADgAeAA4ADgAJAA4ADgANAAkAEwATABMAEwATAAkAHgATAB4AHgAeAAQABAAeAB4AHgAeAB4AHgBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQAFAADQAEAB4ABAAeAAQAFgARABYAEQAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAAQABAAEAAQADQAEAAQAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAA0ADQAeAB4AHgAeAB4AHgAEAB4AHgAeAB4AHgAeACsAHgAeAA4ADgANAA4AHgAeAB4AHgAeAAkACQArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgBcAEsASwBLAEsASwBLAEsASwBLAEsADQANAB4AHgAeAB4AXABcAFwAXABcAFwAKgAqACoAKgBcAFwAXABcACoAKgAqAFwAKgAqACoAXABcACoAKgAqACoAKgAqACoAXABcAFwAKgAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqAFwAKgBLAEsASwBLAEsASwBLAEsASwBLACoAKgAqACoAKgAqAFAAUABQAFAAUABQACsAUAArACsAKwArACsAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAKwBQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsABAAEAAQAHgANAB4AHgAeAB4AHgAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUAArACsADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWABEAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQANAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAANAA0AKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUAArAAQABAArACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAA0ADQAVAFwADQAeAA0AGwBcACoAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwAeAB4AEwATAA0ADQAOAB4AEwATAB4ABAAEAAQACQArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAHgArACsAKwATABMASwBLAEsASwBLAEsASwBLAEsASwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAXABcAFwAXABcACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAXAArACsAKwAqACoAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsAHgAeAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKwAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKwArAAQASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACoAKgAqACoAKgAqACoAXAAqACoAKgAqACoAKgArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABABQAFAAUABQAFAAUABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwANAA0AHgANAA0ADQANAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwAeAB4AHgAeAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArAA0ADQANAA0ADQBLAEsASwBLAEsASwBLAEsASwBLACsAKwArAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUAAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAAQAUABQAFAAUABQAFAABABQAFAABAAEAAQAUAArACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQACsAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQACsAKwAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQACsAHgAeAB4AHgAeAB4AHgAOAB4AKwANAA0ADQANAA0ADQANAAkADQANAA0ACAAEAAsABAAEAA0ACQANAA0ADAAdAB0AHgAXABcAFgAXABcAFwAWABcAHQAdAB4AHgAUABQAFAANAAEAAQAEAAQABAAEAAQACQAaABoAGgAaABoAGgAaABoAHgAXABcAHQAVABUAHgAeAB4AHgAeAB4AGAAWABEAFQAVABUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ADQAeAA0ADQANAA0AHgANAA0ADQAHAB4AHgAeAB4AKwAEAAQABAAEAAQABAAEAAQABAAEAFAAUAArACsATwBQAFAAUABQAFAAHgAeAB4AFgARAE8AUABPAE8ATwBPAFAAUABQAFAAUAAeAB4AHgAWABEAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArABsAGwAbABsAGwAbABsAGgAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGgAbABsAGwAbABoAGwAbABoAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHgAeAFAAGgAeAB0AHgBQAB4AGgAeAB4AHgAeAB4AHgAeAB4AHgBPAB4AUAAbAB4AHgBQAFAAUABQAFAAHgAeAB4AHQAdAB4AUAAeAFAAHgBQAB4AUABPAFAAUAAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgBQAFAAUABQAE8ATwBQAFAAUABQAFAATwBQAFAATwBQAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAUABQAFAATwBPAE8ATwBPAE8ATwBPAE8ATwBQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABPAB4AHgArACsAKwArAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHQAdAB4AHgAeAB0AHQAeAB4AHQAeAB4AHgAdAB4AHQAbABsAHgAdAB4AHgAeAB4AHQAeAB4AHQAdAB0AHQAeAB4AHQAeAB0AHgAdAB0AHQAdAB0AHQAeAB0AHgAeAB4AHgAeAB0AHQAdAB0AHgAeAB4AHgAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB0AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAdAB0AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAWABEAHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AHQAdAB0AHgAeAB0AHgAeAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlAB4AHQAdAB4AHgAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AJQAlAB0AHQAlAB4AJQAlACUAIAAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAdAB0AHQAeAB0AJQAdAB0AHgAdAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAdAB0AHQAdACUAHgAlACUAJQAdACUAJQAdAB0AHQAlACUAHQAdACUAHQAdACUAJQAlAB4AHQAeAB4AHgAeAB0AHQAlAB0AHQAdAB0AHQAdACUAJQAlACUAJQAdACUAJQAgACUAHQAdACUAJQAlACUAJQAlACUAJQAeAB4AHgAlACUAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AFwAXABcAFwAXABcAHgATABMAJQAeAB4AHgAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARABYAEQAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAeAB4AKwArACsAKwArABMADQANAA0AUAATAA0AUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUAANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAA0ADQANAA0ADQANAA0ADQAeAA0AFgANAB4AHgAXABcAHgAeABcAFwAWABEAFgARABYAEQAWABEADQANAA0ADQATAFAADQANAB4ADQANAB4AHgAeAB4AHgAMAAwADQANAA0AHgANAA0AFgANAA0ADQANAA0ADQANAA0AHgANAB4ADQANAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArAA0AEQARACUAJQBHAFcAVwAWABEAFgARABYAEQAWABEAFgARACUAJQAWABEAFgARABYAEQAWABEAFQAWABEAEQAlAFcAVwBXAFcAVwBXAFcAVwBXAAQABAAEAAQABAAEACUAVwBXAFcAVwA2ACUAJQBXAFcAVwBHAEcAJQAlACUAKwBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBRAFcAUQBXAFEAVwBXAFcAVwBXAFcAUQBXAFcAVwBXAFcAVwBRAFEAKwArAAQABAAVABUARwBHAFcAFQBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBRAFcAVwBXAFcAVwBXAFEAUQBXAFcAVwBXABUAUQBHAEcAVwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwAlACUAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACsAKwArACsAKwArACsAKwArACsAKwArAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBPAE8ATwBPAE8ATwBPAE8AJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADQATAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQAHgBQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAeAA0ADQANAA0ADQArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAAQAUABQAFAABABQAFAAUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAeAB4AHgAeAAQAKwArACsAUABQAFAAUABQAFAAHgAeABoAHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADgAOABMAEwArACsAKwArACsAKwArACsABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUAAeAB4AHgBQAA4AUABQAAQAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAB4AWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYACsAKwArAAQAHgAeAB4AHgAeAB4ADQANAA0AHgAeAB4AHgArAFAASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArAB4AHgBcAFwAXABcAFwAKgBcAFwAXABcAFwAXABcAFwAXABcAEsASwBLAEsASwBLAEsASwBLAEsAXABcAFwAXABcACsAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAFAAUABQAAQAUABQAFAAUABQAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAHgANAA0ADQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAKgAqACoAXABcACoAKgBcAFwAXABcAFwAKgAqAFwAKgBcACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAA0ADQBQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQADQAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAVABVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBUAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVACsAKwArACsAKwArACsAKwArACsAKwArAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAKwArACsAKwBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAKwArACsAKwAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArACsAKwArAFYABABWAFYAVgBWAFYAVgBWAFYAVgBWAB4AVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgArAFYAVgBWAFYAVgArAFYAKwBWAFYAKwBWAFYAKwBWAFYAVgBWAFYAVgBWAFYAVgBWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAEQAWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAaAB4AKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAARABEAGAAYABMAEwAWABEAFAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACUAJQAlACUAJQAWABEAFgARABYAEQAWABEAFgARABYAEQAlACUAFgARACUAJQAlACUAJQAlACUAEQAlABEAKwAVABUAEwATACUAFgARABYAEQAWABEAJQAlACUAJQAlACUAJQAlACsAJQAbABoAJQArACsAKwArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAcAKwATACUAJQAbABoAJQAlABYAEQAlACUAEQAlABEAJQBXAFcAVwBXAFcAVwBXAFcAVwBXABUAFQAlACUAJQATACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXABYAJQARACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAWACUAEQAlABYAEQARABYAEQARABUAVwBRAFEAUQBRAFEAUQBRAFEAUQBRAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcARwArACsAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXACsAKwBXAFcAVwBXAFcAVwArACsAVwBXAFcAKwArACsAGgAbACUAJQAlABsAGwArAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAAQAB0AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsADQANAA0AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAA0AUABQAFAAUAArACsAKwArAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwBQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAUABQAFAAUABQAAQABAAEACsABAAEACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAKwBQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAA0ADQANAA0ADQANAA0ADQAeACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAArACsAKwArAFAAUABQAFAAUAANAA0ADQANAA0ADQAUACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsADQANAA0ADQANAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArAAQABAANACsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAB4AHgAeAB4AHgArACsAKwArACsAKwAEAAQABAAEAAQABAAEAA0ADQAeAB4AHgAeAB4AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsASwBLAEsASwBLAEsASwBLAEsASwANAA0ADQANAFAABAAEAFAAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAeAA4AUAArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAADQANAB4ADQAEAAQABAAEAB4ABAAEAEsASwBLAEsASwBLAEsASwBLAEsAUAAOAFAADQANAA0AKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAA0AHgANAA0AHgAEACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAA0AKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsABAAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAUAArACsAKwArACsAKwAEACsAKwArACsAKwBQAFAAUABQAFAABAAEACsAKwAEAAQABAAEAAQABAAEACsAKwArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABABQAFAAUABQAA0ADQANAA0AHgBLAEsASwBLAEsASwBLAEsASwBLAA0ADQArAB4ABABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUAAeAFAAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABAAEAAQADgANAA0AEwATAB4AHgAeAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAFAAUABQAFAABAAEACsAKwAEAA0ADQAeAFAAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKwArACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBcAFwADQANAA0AKgBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQAKwAEAAQAKwArAAQABAAEAAQAUAAEAFAABAAEAA0ADQANACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABABQAA4AUAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAOAB4ADQANAA0ADQAOAB4ABAArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA0ADQANAFAADgAOAA4ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAFAADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAOABMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAArACsAKwAEACsABAAEACsABAAEAAQABAAEAAQABABQAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAaABoAGgAaAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABIAEgAQwBDAEMAUABQAFAAUABDAFAAUABQAEgAQwBIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABDAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAJAAkACQAJAAkACQAJABYAEQArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwANAA0AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAANACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQANAB4AHgAeAB4AHgAeAFAAUABQAFAADQAeACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAA0AHgAeACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAARwBHABUARwAJACsAKwArACsAKwArACsAKwArACsAKwAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUQBRAFEAKwArACsAKwArACsAKwArACsAKwArACsAKwBRAFEAUQBRACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAHgAEAAQADQAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQABAAEAAQABAAeAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQAHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAKwArAFAAKwArAFAAUAArACsAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUAArAFAAUABQAFAAUABQAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAHgAeAFAAUABQAFAAUAArAFAAKwArACsAUABQAFAAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeACsAKwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4ABAAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAHgAeAA0ADQANAA0AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArAAQABAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwBQAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArABsAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAB4AHgAeAB4ABAAEAAQABAAEAAQABABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArABYAFgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAGgBQAFAAUAAaAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUAArACsAKwArACsAKwBQACsAKwArACsAUAArAFAAKwBQACsAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUAArAFAAKwBQACsAUAArAFAAUAArAFAAKwArAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAKwBQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AJQAlACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeACUAJQAlAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAlACUAJQAlACUAHgAlACUAJQAlACUAIAAgACAAJQAlACAAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACEAIQAhACEAIQAlACUAIAAgACUAJQAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAIAAlACUAJQAlACAAIAAgACUAIAAgACAAJQAlACUAJQAlACUAJQAgACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAlAB4AJQAeACUAJQAlACUAJQAgACUAJQAlACUAHgAlAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACAAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABcAFwAXABUAFQAVAB4AHgAeAB4AJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAgACUAJQAgACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAIAAgACUAJQAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACAAIAAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACAAIAAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAA=="; + + var LETTER_NUMBER_MODIFIER = 50; + // Non-tailorable Line Breaking Classes + var BK = 1; // Cause a line break (after) + var CR$1 = 2; // Cause a line break (after), except between CR and LF + var LF$1 = 3; // Cause a line break (after) + var CM = 4; // Prohibit a line break between the character and the preceding character + var NL = 5; // Cause a line break (after) + var WJ = 7; // Prohibit line breaks before and after + var ZW = 8; // Provide a break opportunity + var GL = 9; // Prohibit line breaks before and after + var SP = 10; // Enable indirect line breaks + var ZWJ$1 = 11; // Prohibit line breaks within joiner sequences + // Break Opportunities + var B2 = 12; // Provide a line break opportunity before and after the character + var BA = 13; // Generally provide a line break opportunity after the character + var BB = 14; // Generally provide a line break opportunity before the character + var HY = 15; // Provide a line break opportunity after the character, except in numeric context + var CB = 16; // Provide a line break opportunity contingent on additional information + // Characters Prohibiting Certain Breaks + var CL = 17; // Prohibit line breaks before + var CP = 18; // Prohibit line breaks before + var EX = 19; // Prohibit line breaks before + var IN = 20; // Allow only indirect line breaks between pairs + var NS = 21; // Allow only indirect line breaks before + var OP = 22; // Prohibit line breaks after + var QU = 23; // Act like they are both opening and closing + // Numeric Context + var IS = 24; // Prevent breaks after any and before numeric + var NU = 25; // Form numeric expressions for line breaking purposes + var PO = 26; // Do not break following a numeric expression + var PR = 27; // Do not break in front of a numeric expression + var SY = 28; // Prevent a break before; and allow a break after + // Other Characters + var AI = 29; // Act like AL when the resolvedEAW is N; otherwise; act as ID + var AL = 30; // Are alphabetic characters or symbols that are used with alphabetic characters + var CJ = 31; // Treat as NS or ID for strict or normal breaking. + var EB = 32; // Do not break from following Emoji Modifier + var EM = 33; // Do not break from preceding Emoji Base + var H2 = 34; // Form Korean syllable blocks + var H3 = 35; // Form Korean syllable blocks + var HL = 36; // Do not break around a following hyphen; otherwise act as Alphabetic + var ID = 37; // Break before or after; except in some numeric context + var JL = 38; // Form Korean syllable blocks + var JV = 39; // Form Korean syllable blocks + var JT = 40; // Form Korean syllable blocks + var RI$1 = 41; // Keep pairs together. For pairs; break before and after other classes + var SA = 42; // Provide a line break opportunity contingent on additional, language-specific context analysis + var XX = 43; // Have as yet unknown line breaking behavior or unassigned code positions + var ea_OP = [0x2329, 0xff08]; + var BREAK_MANDATORY = "!"; + var BREAK_NOT_ALLOWED$1 = "×"; + var BREAK_ALLOWED$1 = "÷"; + var UnicodeTrie$1 = createTrieFromBase64$1(base64$1); + var ALPHABETICS = [AL, HL]; + var HARD_LINE_BREAKS = [BK, CR$1, LF$1, NL]; + var SPACE$1 = [SP, ZW]; + var PREFIX_POSTFIX = [PR, PO]; + var LINE_BREAKS = HARD_LINE_BREAKS.concat(SPACE$1); + var KOREAN_SYLLABLE_BLOCK = [JL, JV, JT, H2, H3]; + var HYPHEN = [HY, BA]; + var codePointsToCharacterClasses = function (codePoints, lineBreak) { + if (lineBreak === void 0) { + lineBreak = "strict"; + } + var types = []; + var indices = []; + var categories = []; + codePoints.forEach(function (codePoint, index) { + var classType = UnicodeTrie$1.get(codePoint); + if (classType > LETTER_NUMBER_MODIFIER) { + categories.push(true); + classType -= LETTER_NUMBER_MODIFIER; + } else { + categories.push(false); + } + if (["normal", "auto", "loose"].indexOf(lineBreak) !== -1) { + // U+2010, – U+2013, 〜 U+301C, ゠ U+30A0 + if ([0x2010, 0x2013, 0x301c, 0x30a0].indexOf(codePoint) !== -1) { + indices.push(index); + return types.push(CB); + } + } + if (classType === CM || classType === ZWJ$1) { + // LB10 Treat any remaining combining mark or ZWJ as AL. + if (index === 0) { + indices.push(index); + return types.push(AL); + } + // LB9 Do not break a combining character sequence; treat it as if it has the line breaking class of + // the base character in all of the following rules. Treat ZWJ as if it were CM. + var prev = types[index - 1]; + if (LINE_BREAKS.indexOf(prev) === -1) { + indices.push(indices[index - 1]); + return types.push(prev); + } + indices.push(index); + return types.push(AL); + } + indices.push(index); + if (classType === CJ) { + return types.push(lineBreak === "strict" ? NS : ID); + } + if (classType === SA) { + return types.push(AL); + } + if (classType === AI) { + return types.push(AL); + } + // For supplementary characters, a useful default is to treat characters in the range 10000..1FFFD as AL + // and characters in the ranges 20000..2FFFD and 30000..3FFFD as ID, until the implementation can be revised + // to take into account the actual line breaking properties for these characters. + if (classType === XX) { + if ( + (codePoint >= 0x20000 && codePoint <= 0x2fffd) || + (codePoint >= 0x30000 && codePoint <= 0x3fffd) + ) { + return types.push(ID); + } else { + return types.push(AL); + } + } + types.push(classType); + }); + return [indices, types, categories]; + }; + var isAdjacentWithSpaceIgnored = function ( + a, + b, + currentIndex, + classTypes + ) { + var current = classTypes[currentIndex]; + if (Array.isArray(a) ? a.indexOf(current) !== -1 : a === current) { + var i = currentIndex; + while (i <= classTypes.length) { + i++; + var next = classTypes[i]; + if (next === b) { + return true; + } + if (next !== SP) { + break; + } + } + } + if (current === SP) { + var i = currentIndex; + while (i > 0) { + i--; + var prev = classTypes[i]; + if (Array.isArray(a) ? a.indexOf(prev) !== -1 : a === prev) { + var n = currentIndex; + while (n <= classTypes.length) { + n++; + var next = classTypes[n]; + if (next === b) { + return true; + } + if (next !== SP) { + break; + } + } + } + if (prev !== SP) { + break; + } + } + } + return false; + }; + var previousNonSpaceClassType = function (currentIndex, classTypes) { + var i = currentIndex; + while (i >= 0) { + var type = classTypes[i]; + if (type === SP) { + i--; + } else { + return type; + } + } + return 0; + }; + var _lineBreakAtIndex = function ( + codePoints, + classTypes, + indicies, + index, + forbiddenBreaks + ) { + if (indicies[index] === 0) { + return BREAK_NOT_ALLOWED$1; + } + var currentIndex = index - 1; + if ( + Array.isArray(forbiddenBreaks) && + forbiddenBreaks[currentIndex] === true + ) { + return BREAK_NOT_ALLOWED$1; + } + var beforeIndex = currentIndex - 1; + var afterIndex = currentIndex + 1; + var current = classTypes[currentIndex]; + // LB4 Always break after hard line breaks. + // LB5 Treat CR followed by LF, as well as CR, LF, and NL as hard line breaks. + var before = beforeIndex >= 0 ? classTypes[beforeIndex] : 0; + var next = classTypes[afterIndex]; + if (current === CR$1 && next === LF$1) { + return BREAK_NOT_ALLOWED$1; + } + if (HARD_LINE_BREAKS.indexOf(current) !== -1) { + return BREAK_MANDATORY; + } + // LB6 Do not break before hard line breaks. + if (HARD_LINE_BREAKS.indexOf(next) !== -1) { + return BREAK_NOT_ALLOWED$1; + } + // LB7 Do not break before spaces or zero width space. + if (SPACE$1.indexOf(next) !== -1) { + return BREAK_NOT_ALLOWED$1; + } + // LB8 Break before any character following a zero-width space, even if one or more spaces intervene. + if (previousNonSpaceClassType(currentIndex, classTypes) === ZW) { + return BREAK_ALLOWED$1; + } + // LB8a Do not break after a zero width joiner. + if (UnicodeTrie$1.get(codePoints[currentIndex]) === ZWJ$1) { + return BREAK_NOT_ALLOWED$1; + } + // zwj emojis + if ( + (current === EB || current === EM) && + UnicodeTrie$1.get(codePoints[afterIndex]) === ZWJ$1 + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB11 Do not break before or after Word joiner and related characters. + if (current === WJ || next === WJ) { + return BREAK_NOT_ALLOWED$1; + } + // LB12 Do not break after NBSP and related characters. + if (current === GL) { + return BREAK_NOT_ALLOWED$1; + } + // LB12a Do not break before NBSP and related characters, except after spaces and hyphens. + if ([SP, BA, HY].indexOf(current) === -1 && next === GL) { + return BREAK_NOT_ALLOWED$1; + } + // LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces. + if ([CL, CP, EX, IS, SY].indexOf(next) !== -1) { + return BREAK_NOT_ALLOWED$1; + } + // LB14 Do not break after ‘[’, even after spaces. + if (previousNonSpaceClassType(currentIndex, classTypes) === OP) { + return BREAK_NOT_ALLOWED$1; + } + // LB15 Do not break within ‘”[’, even with intervening spaces. + if (isAdjacentWithSpaceIgnored(QU, OP, currentIndex, classTypes)) { + return BREAK_NOT_ALLOWED$1; + } + // LB16 Do not break between closing punctuation and a nonstarter (lb=NS), even with intervening spaces. + if ( + isAdjacentWithSpaceIgnored([CL, CP], NS, currentIndex, classTypes) + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB17 Do not break within ‘——’, even with intervening spaces. + if (isAdjacentWithSpaceIgnored(B2, B2, currentIndex, classTypes)) { + return BREAK_NOT_ALLOWED$1; + } + // LB18 Break after spaces. + if (current === SP) { + return BREAK_ALLOWED$1; + } + // LB19 Do not break before or after quotation marks, such as ‘ ” ’. + if (current === QU || next === QU) { + return BREAK_NOT_ALLOWED$1; + } + // LB20 Break before and after unresolved CB. + if (next === CB || current === CB) { + return BREAK_ALLOWED$1; + } + // LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small kana, and other non-starters, or after acute accents. + if ([BA, HY, NS].indexOf(next) !== -1 || current === BB) { + return BREAK_NOT_ALLOWED$1; + } + // LB21a Don't break after Hebrew + Hyphen. + if (before === HL && HYPHEN.indexOf(current) !== -1) { + return BREAK_NOT_ALLOWED$1; + } + // LB21b Don’t break between Solidus and Hebrew letters. + if (current === SY && next === HL) { + return BREAK_NOT_ALLOWED$1; + } + // LB22 Do not break before ellipsis. + if (next === IN) { + return BREAK_NOT_ALLOWED$1; + } + // LB23 Do not break between digits and letters. + if ( + (ALPHABETICS.indexOf(next) !== -1 && current === NU) || + (ALPHABETICS.indexOf(current) !== -1 && next === NU) + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB23a Do not break between numeric prefixes and ideographs, or between ideographs and numeric postfixes. + if ( + (current === PR && [ID, EB, EM].indexOf(next) !== -1) || + ([ID, EB, EM].indexOf(current) !== -1 && next === PO) + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB24 Do not break between numeric prefix/postfix and letters, or between letters and prefix/postfix. + if ( + (ALPHABETICS.indexOf(current) !== -1 && + PREFIX_POSTFIX.indexOf(next) !== -1) || + (PREFIX_POSTFIX.indexOf(current) !== -1 && + ALPHABETICS.indexOf(next) !== -1) + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB25 Do not break between the following pairs of classes relevant to numbers: + if ( + // (PR | PO) × ( OP | HY )? NU + ([PR, PO].indexOf(current) !== -1 && + (next === NU || + ([OP, HY].indexOf(next) !== -1 && + classTypes[afterIndex + 1] === NU))) || + // ( OP | HY ) × NU + ([OP, HY].indexOf(current) !== -1 && next === NU) || + // NU × (NU | SY | IS) + (current === NU && [NU, SY, IS].indexOf(next) !== -1) + ) { + return BREAK_NOT_ALLOWED$1; + } + // NU (NU | SY | IS)* × (NU | SY | IS | CL | CP) + if ([NU, SY, IS, CL, CP].indexOf(next) !== -1) { + var prevIndex = currentIndex; + while (prevIndex >= 0) { + var type = classTypes[prevIndex]; + if (type === NU) { + return BREAK_NOT_ALLOWED$1; + } else if ([SY, IS].indexOf(type) !== -1) { + prevIndex--; + } else { + break; + } + } + } + // NU (NU | SY | IS)* (CL | CP)? × (PO | PR)) + if ([PR, PO].indexOf(next) !== -1) { + var prevIndex = + [CL, CP].indexOf(current) !== -1 ? beforeIndex : currentIndex; + while (prevIndex >= 0) { + var type = classTypes[prevIndex]; + if (type === NU) { + return BREAK_NOT_ALLOWED$1; + } else if ([SY, IS].indexOf(type) !== -1) { + prevIndex--; + } else { + break; + } + } + } + // LB26 Do not break a Korean syllable. + if ( + (JL === current && [JL, JV, H2, H3].indexOf(next) !== -1) || + ([JV, H2].indexOf(current) !== -1 && [JV, JT].indexOf(next) !== -1) || + ([JT, H3].indexOf(current) !== -1 && next === JT) + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB27 Treat a Korean Syllable Block the same as ID. + if ( + (KOREAN_SYLLABLE_BLOCK.indexOf(current) !== -1 && + [IN, PO].indexOf(next) !== -1) || + (KOREAN_SYLLABLE_BLOCK.indexOf(next) !== -1 && current === PR) + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB28 Do not break between alphabetics (“at”). + if ( + ALPHABETICS.indexOf(current) !== -1 && + ALPHABETICS.indexOf(next) !== -1 + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB29 Do not break between numeric punctuation and alphabetics (“e.g.”). + if (current === IS && ALPHABETICS.indexOf(next) !== -1) { + return BREAK_NOT_ALLOWED$1; + } + // LB30 Do not break between letters, numbers, or ordinary symbols and opening or closing parentheses. + if ( + (ALPHABETICS.concat(NU).indexOf(current) !== -1 && + next === OP && + ea_OP.indexOf(codePoints[afterIndex]) === -1) || + (ALPHABETICS.concat(NU).indexOf(next) !== -1 && current === CP) + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB30a Break between two regional indicator symbols if and only if there are an even number of regional + // indicators preceding the position of the break. + if (current === RI$1 && next === RI$1) { + var i = indicies[currentIndex]; + var count = 1; + while (i > 0) { + i--; + if (classTypes[i] === RI$1) { + count++; + } else { + break; + } + } + if (count % 2 !== 0) { + return BREAK_NOT_ALLOWED$1; + } + } + // LB30b Do not break between an emoji base and an emoji modifier. + if (current === EB && next === EM) { + return BREAK_NOT_ALLOWED$1; + } + return BREAK_ALLOWED$1; + }; + var cssFormattedClasses = function (codePoints, options) { + if (!options) { + options = { lineBreak: "normal", wordBreak: "normal" }; + } + var _a = codePointsToCharacterClasses(codePoints, options.lineBreak), + indicies = _a[0], + classTypes = _a[1], + isLetterNumber = _a[2]; + if ( + options.wordBreak === "break-all" || + options.wordBreak === "break-word" + ) { + classTypes = classTypes.map(function (type) { + return [NU, AL, SA].indexOf(type) !== -1 ? ID : type; + }); + } + var forbiddenBreakpoints = + options.wordBreak === "keep-all" + ? isLetterNumber.map(function (letterNumber, i) { + return ( + letterNumber && + codePoints[i] >= 0x4e00 && + codePoints[i] <= 0x9fff + ); + }) + : undefined; + return [indicies, classTypes, forbiddenBreakpoints]; + }; + var Break = /** @class */ (function () { + function Break(codePoints, lineBreak, start, end) { + this.codePoints = codePoints; + this.required = lineBreak === BREAK_MANDATORY; + this.start = start; + this.end = end; + } + Break.prototype.slice = function () { + return fromCodePoint$1.apply( + void 0, + this.codePoints.slice(this.start, this.end) + ); + }; + return Break; + })(); + var LineBreaker = function (str, options) { + var codePoints = toCodePoints$1(str); + var _a = cssFormattedClasses(codePoints, options), + indicies = _a[0], + classTypes = _a[1], + forbiddenBreakpoints = _a[2]; + var length = codePoints.length; + var lastEnd = 0; + var nextIndex = 0; + return { + next: function () { + if (nextIndex >= length) { + return { done: true, value: null }; + } + var lineBreak = BREAK_NOT_ALLOWED$1; + while ( + nextIndex < length && + (lineBreak = _lineBreakAtIndex( + codePoints, + classTypes, + indicies, + ++nextIndex, + forbiddenBreakpoints + )) === BREAK_NOT_ALLOWED$1 + ) {} + if (lineBreak !== BREAK_NOT_ALLOWED$1 || nextIndex === length) { + var value = new Break(codePoints, lineBreak, lastEnd, nextIndex); + lastEnd = nextIndex; + return { value: value, done: false }; + } + return { done: true, value: null }; + }, + }; + }; + + // https://www.w3.org/TR/css-syntax-3 + var FLAG_UNRESTRICTED = 1 << 0; + var FLAG_ID = 1 << 1; + var FLAG_INTEGER = 1 << 2; + var FLAG_NUMBER = 1 << 3; + var LINE_FEED = 0x000a; + var SOLIDUS = 0x002f; + var REVERSE_SOLIDUS = 0x005c; + var CHARACTER_TABULATION = 0x0009; + var SPACE = 0x0020; + var QUOTATION_MARK = 0x0022; + var EQUALS_SIGN = 0x003d; + var NUMBER_SIGN = 0x0023; + var DOLLAR_SIGN = 0x0024; + var PERCENTAGE_SIGN = 0x0025; + var APOSTROPHE = 0x0027; + var LEFT_PARENTHESIS = 0x0028; + var RIGHT_PARENTHESIS = 0x0029; + var LOW_LINE = 0x005f; + var HYPHEN_MINUS = 0x002d; + var EXCLAMATION_MARK = 0x0021; + var LESS_THAN_SIGN = 0x003c; + var GREATER_THAN_SIGN = 0x003e; + var COMMERCIAL_AT = 0x0040; + var LEFT_SQUARE_BRACKET = 0x005b; + var RIGHT_SQUARE_BRACKET = 0x005d; + var CIRCUMFLEX_ACCENT = 0x003d; + var LEFT_CURLY_BRACKET = 0x007b; + var QUESTION_MARK = 0x003f; + var RIGHT_CURLY_BRACKET = 0x007d; + var VERTICAL_LINE = 0x007c; + var TILDE = 0x007e; + var CONTROL = 0x0080; + var REPLACEMENT_CHARACTER = 0xfffd; + var ASTERISK = 0x002a; + var PLUS_SIGN = 0x002b; + var COMMA = 0x002c; + var COLON = 0x003a; + var SEMICOLON = 0x003b; + var FULL_STOP = 0x002e; + var NULL = 0x0000; + var BACKSPACE = 0x0008; + var LINE_TABULATION = 0x000b; + var SHIFT_OUT = 0x000e; + var INFORMATION_SEPARATOR_ONE = 0x001f; + var DELETE = 0x007f; + var EOF = -1; + var ZERO = 0x0030; + var a = 0x0061; + var e = 0x0065; + var f = 0x0066; + var u = 0x0075; + var z = 0x007a; + var A = 0x0041; + var E = 0x0045; + var F = 0x0046; + var U = 0x0055; + var Z = 0x005a; + var isDigit = function (codePoint) { + return codePoint >= ZERO && codePoint <= 0x0039; + }; + var isSurrogateCodePoint = function (codePoint) { + return codePoint >= 0xd800 && codePoint <= 0xdfff; + }; + var isHex = function (codePoint) { + return ( + isDigit(codePoint) || + (codePoint >= A && codePoint <= F) || + (codePoint >= a && codePoint <= f) + ); + }; + var isLowerCaseLetter = function (codePoint) { + return codePoint >= a && codePoint <= z; + }; + var isUpperCaseLetter = function (codePoint) { + return codePoint >= A && codePoint <= Z; + }; + var isLetter = function (codePoint) { + return isLowerCaseLetter(codePoint) || isUpperCaseLetter(codePoint); + }; + var isNonASCIICodePoint = function (codePoint) { + return codePoint >= CONTROL; + }; + var isWhiteSpace = function (codePoint) { + return ( + codePoint === LINE_FEED || + codePoint === CHARACTER_TABULATION || + codePoint === SPACE + ); + }; + var isNameStartCodePoint = function (codePoint) { + return ( + isLetter(codePoint) || + isNonASCIICodePoint(codePoint) || + codePoint === LOW_LINE + ); + }; + var isNameCodePoint = function (codePoint) { + return ( + isNameStartCodePoint(codePoint) || + isDigit(codePoint) || + codePoint === HYPHEN_MINUS + ); + }; + var isNonPrintableCodePoint = function (codePoint) { + return ( + (codePoint >= NULL && codePoint <= BACKSPACE) || + codePoint === LINE_TABULATION || + (codePoint >= SHIFT_OUT && codePoint <= INFORMATION_SEPARATOR_ONE) || + codePoint === DELETE + ); + }; + var isValidEscape = function (c1, c2) { + if (c1 !== REVERSE_SOLIDUS) { + return false; + } + return c2 !== LINE_FEED; + }; + var isIdentifierStart = function (c1, c2, c3) { + if (c1 === HYPHEN_MINUS) { + return isNameStartCodePoint(c2) || isValidEscape(c2, c3); + } else if (isNameStartCodePoint(c1)) { + return true; + } else if (c1 === REVERSE_SOLIDUS && isValidEscape(c1, c2)) { + return true; + } + return false; + }; + var isNumberStart = function (c1, c2, c3) { + if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) { + if (isDigit(c2)) { + return true; + } + return c2 === FULL_STOP && isDigit(c3); + } + if (c1 === FULL_STOP) { + return isDigit(c2); + } + return isDigit(c1); + }; + var stringToNumber = function (codePoints) { + var c = 0; + var sign = 1; + if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) { + if (codePoints[c] === HYPHEN_MINUS) { + sign = -1; + } + c++; + } + var integers = []; + while (isDigit(codePoints[c])) { + integers.push(codePoints[c++]); + } + var int = integers.length + ? parseInt(fromCodePoint$1.apply(void 0, integers), 10) + : 0; + if (codePoints[c] === FULL_STOP) { + c++; + } + var fraction = []; + while (isDigit(codePoints[c])) { + fraction.push(codePoints[c++]); + } + var fracd = fraction.length; + var frac = fracd + ? parseInt(fromCodePoint$1.apply(void 0, fraction), 10) + : 0; + if (codePoints[c] === E || codePoints[c] === e) { + c++; + } + var expsign = 1; + if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) { + if (codePoints[c] === HYPHEN_MINUS) { + expsign = -1; + } + c++; + } + var exponent = []; + while (isDigit(codePoints[c])) { + exponent.push(codePoints[c++]); + } + var exp = exponent.length + ? parseInt(fromCodePoint$1.apply(void 0, exponent), 10) + : 0; + return ( + sign * + (int + frac * Math.pow(10, -fracd)) * + Math.pow(10, expsign * exp) + ); + }; + var LEFT_PARENTHESIS_TOKEN = { + type: 2 /* LEFT_PARENTHESIS_TOKEN */, + }; + var RIGHT_PARENTHESIS_TOKEN = { + type: 3 /* RIGHT_PARENTHESIS_TOKEN */, + }; + var COMMA_TOKEN = { type: 4 /* COMMA_TOKEN */ }; + var SUFFIX_MATCH_TOKEN = { type: 13 /* SUFFIX_MATCH_TOKEN */ }; + var PREFIX_MATCH_TOKEN = { type: 8 /* PREFIX_MATCH_TOKEN */ }; + var COLUMN_TOKEN = { type: 21 /* COLUMN_TOKEN */ }; + var DASH_MATCH_TOKEN = { type: 9 /* DASH_MATCH_TOKEN */ }; + var INCLUDE_MATCH_TOKEN = { type: 10 /* INCLUDE_MATCH_TOKEN */ }; + var LEFT_CURLY_BRACKET_TOKEN = { + type: 11 /* LEFT_CURLY_BRACKET_TOKEN */, + }; + var RIGHT_CURLY_BRACKET_TOKEN = { + type: 12 /* RIGHT_CURLY_BRACKET_TOKEN */, + }; + var SUBSTRING_MATCH_TOKEN = { type: 14 /* SUBSTRING_MATCH_TOKEN */ }; + var BAD_URL_TOKEN = { type: 23 /* BAD_URL_TOKEN */ }; + var BAD_STRING_TOKEN = { type: 1 /* BAD_STRING_TOKEN */ }; + var CDO_TOKEN = { type: 25 /* CDO_TOKEN */ }; + var CDC_TOKEN = { type: 24 /* CDC_TOKEN */ }; + var COLON_TOKEN = { type: 26 /* COLON_TOKEN */ }; + var SEMICOLON_TOKEN = { type: 27 /* SEMICOLON_TOKEN */ }; + var LEFT_SQUARE_BRACKET_TOKEN = { + type: 28 /* LEFT_SQUARE_BRACKET_TOKEN */, + }; + var RIGHT_SQUARE_BRACKET_TOKEN = { + type: 29 /* RIGHT_SQUARE_BRACKET_TOKEN */, + }; + var WHITESPACE_TOKEN = { type: 31 /* WHITESPACE_TOKEN */ }; + var EOF_TOKEN = { type: 32 /* EOF_TOKEN */ }; + var Tokenizer = /** @class */ (function () { + function Tokenizer() { + this._value = []; + } + Tokenizer.prototype.write = function (chunk) { + this._value = this._value.concat(toCodePoints$1(chunk)); + }; + Tokenizer.prototype.read = function () { + var tokens = []; + var token = this.consumeToken(); + while (token !== EOF_TOKEN) { + tokens.push(token); + token = this.consumeToken(); + } + return tokens; + }; + Tokenizer.prototype.consumeToken = function () { + var codePoint = this.consumeCodePoint(); + switch (codePoint) { + case QUOTATION_MARK: + return this.consumeStringToken(QUOTATION_MARK); + case NUMBER_SIGN: + var c1 = this.peekCodePoint(0); + var c2 = this.peekCodePoint(1); + var c3 = this.peekCodePoint(2); + if (isNameCodePoint(c1) || isValidEscape(c2, c3)) { + var flags = isIdentifierStart(c1, c2, c3) + ? FLAG_ID + : FLAG_UNRESTRICTED; + var value = this.consumeName(); + return { type: 5 /* HASH_TOKEN */, value: value, flags: flags }; + } + break; + case DOLLAR_SIGN: + if (this.peekCodePoint(0) === EQUALS_SIGN) { + this.consumeCodePoint(); + return SUFFIX_MATCH_TOKEN; + } + break; + case APOSTROPHE: + return this.consumeStringToken(APOSTROPHE); + case LEFT_PARENTHESIS: + return LEFT_PARENTHESIS_TOKEN; + case RIGHT_PARENTHESIS: + return RIGHT_PARENTHESIS_TOKEN; + case ASTERISK: + if (this.peekCodePoint(0) === EQUALS_SIGN) { + this.consumeCodePoint(); + return SUBSTRING_MATCH_TOKEN; + } + break; + case PLUS_SIGN: + if ( + isNumberStart( + codePoint, + this.peekCodePoint(0), + this.peekCodePoint(1) + ) + ) { + this.reconsumeCodePoint(codePoint); + return this.consumeNumericToken(); + } + break; + case COMMA: + return COMMA_TOKEN; + case HYPHEN_MINUS: + var e1 = codePoint; + var e2 = this.peekCodePoint(0); + var e3 = this.peekCodePoint(1); + if (isNumberStart(e1, e2, e3)) { + this.reconsumeCodePoint(codePoint); + return this.consumeNumericToken(); + } + if (isIdentifierStart(e1, e2, e3)) { + this.reconsumeCodePoint(codePoint); + return this.consumeIdentLikeToken(); + } + if (e2 === HYPHEN_MINUS && e3 === GREATER_THAN_SIGN) { + this.consumeCodePoint(); + this.consumeCodePoint(); + return CDC_TOKEN; + } + break; + case FULL_STOP: + if ( + isNumberStart( + codePoint, + this.peekCodePoint(0), + this.peekCodePoint(1) + ) + ) { + this.reconsumeCodePoint(codePoint); + return this.consumeNumericToken(); + } + break; + case SOLIDUS: + if (this.peekCodePoint(0) === ASTERISK) { + this.consumeCodePoint(); + while (true) { + var c = this.consumeCodePoint(); + if (c === ASTERISK) { + c = this.consumeCodePoint(); + if (c === SOLIDUS) { + return this.consumeToken(); + } + } + if (c === EOF) { + return this.consumeToken(); + } + } + } + break; + case COLON: + return COLON_TOKEN; + case SEMICOLON: + return SEMICOLON_TOKEN; + case LESS_THAN_SIGN: + if ( + this.peekCodePoint(0) === EXCLAMATION_MARK && + this.peekCodePoint(1) === HYPHEN_MINUS && + this.peekCodePoint(2) === HYPHEN_MINUS + ) { + this.consumeCodePoint(); + this.consumeCodePoint(); + return CDO_TOKEN; + } + break; + case COMMERCIAL_AT: + var a1 = this.peekCodePoint(0); + var a2 = this.peekCodePoint(1); + var a3 = this.peekCodePoint(2); + if (isIdentifierStart(a1, a2, a3)) { + var value = this.consumeName(); + return { type: 7 /* AT_KEYWORD_TOKEN */, value: value }; + } + break; + case LEFT_SQUARE_BRACKET: + return LEFT_SQUARE_BRACKET_TOKEN; + case REVERSE_SOLIDUS: + if (isValidEscape(codePoint, this.peekCodePoint(0))) { + this.reconsumeCodePoint(codePoint); + return this.consumeIdentLikeToken(); + } + break; + case RIGHT_SQUARE_BRACKET: + return RIGHT_SQUARE_BRACKET_TOKEN; + case CIRCUMFLEX_ACCENT: + if (this.peekCodePoint(0) === EQUALS_SIGN) { + this.consumeCodePoint(); + return PREFIX_MATCH_TOKEN; + } + break; + case LEFT_CURLY_BRACKET: + return LEFT_CURLY_BRACKET_TOKEN; + case RIGHT_CURLY_BRACKET: + return RIGHT_CURLY_BRACKET_TOKEN; + case u: + case U: + var u1 = this.peekCodePoint(0); + var u2 = this.peekCodePoint(1); + if (u1 === PLUS_SIGN && (isHex(u2) || u2 === QUESTION_MARK)) { + this.consumeCodePoint(); + this.consumeUnicodeRangeToken(); + } + this.reconsumeCodePoint(codePoint); + return this.consumeIdentLikeToken(); + case VERTICAL_LINE: + if (this.peekCodePoint(0) === EQUALS_SIGN) { + this.consumeCodePoint(); + return DASH_MATCH_TOKEN; + } + if (this.peekCodePoint(0) === VERTICAL_LINE) { + this.consumeCodePoint(); + return COLUMN_TOKEN; + } + break; + case TILDE: + if (this.peekCodePoint(0) === EQUALS_SIGN) { + this.consumeCodePoint(); + return INCLUDE_MATCH_TOKEN; + } + break; + case EOF: + return EOF_TOKEN; + } + if (isWhiteSpace(codePoint)) { + this.consumeWhiteSpace(); + return WHITESPACE_TOKEN; + } + if (isDigit(codePoint)) { + this.reconsumeCodePoint(codePoint); + return this.consumeNumericToken(); + } + if (isNameStartCodePoint(codePoint)) { + this.reconsumeCodePoint(codePoint); + return this.consumeIdentLikeToken(); + } + return { + type: 6 /* DELIM_TOKEN */, + value: fromCodePoint$1(codePoint), + }; + }; + Tokenizer.prototype.consumeCodePoint = function () { + var value = this._value.shift(); + return typeof value === "undefined" ? -1 : value; + }; + Tokenizer.prototype.reconsumeCodePoint = function (codePoint) { + this._value.unshift(codePoint); + }; + Tokenizer.prototype.peekCodePoint = function (delta) { + if (delta >= this._value.length) { + return -1; + } + return this._value[delta]; + }; + Tokenizer.prototype.consumeUnicodeRangeToken = function () { + var digits = []; + var codePoint = this.consumeCodePoint(); + while (isHex(codePoint) && digits.length < 6) { + digits.push(codePoint); + codePoint = this.consumeCodePoint(); + } + var questionMarks = false; + while (codePoint === QUESTION_MARK && digits.length < 6) { + digits.push(codePoint); + codePoint = this.consumeCodePoint(); + questionMarks = true; + } + if (questionMarks) { + var start_1 = parseInt( + fromCodePoint$1.apply( + void 0, + digits.map(function (digit) { + return digit === QUESTION_MARK ? ZERO : digit; + }) + ), + 16 + ); + var end = parseInt( + fromCodePoint$1.apply( + void 0, + digits.map(function (digit) { + return digit === QUESTION_MARK ? F : digit; + }) + ), + 16 + ); + return { + type: 30 /* UNICODE_RANGE_TOKEN */, + start: start_1, + end: end, + }; + } + var start = parseInt(fromCodePoint$1.apply(void 0, digits), 16); + if ( + this.peekCodePoint(0) === HYPHEN_MINUS && + isHex(this.peekCodePoint(1)) + ) { + this.consumeCodePoint(); + codePoint = this.consumeCodePoint(); + var endDigits = []; + while (isHex(codePoint) && endDigits.length < 6) { + endDigits.push(codePoint); + codePoint = this.consumeCodePoint(); + } + var end = parseInt(fromCodePoint$1.apply(void 0, endDigits), 16); + return { + type: 30 /* UNICODE_RANGE_TOKEN */, + start: start, + end: end, + }; + } else { + return { + type: 30 /* UNICODE_RANGE_TOKEN */, + start: start, + end: start, + }; + } + }; + Tokenizer.prototype.consumeIdentLikeToken = function () { + var value = this.consumeName(); + if ( + value.toLowerCase() === "url" && + this.peekCodePoint(0) === LEFT_PARENTHESIS + ) { + this.consumeCodePoint(); + return this.consumeUrlToken(); + } else if (this.peekCodePoint(0) === LEFT_PARENTHESIS) { + this.consumeCodePoint(); + return { type: 19 /* FUNCTION_TOKEN */, value: value }; + } + return { type: 20 /* IDENT_TOKEN */, value: value }; + }; + Tokenizer.prototype.consumeUrlToken = function () { + var value = []; + this.consumeWhiteSpace(); + if (this.peekCodePoint(0) === EOF) { + return { type: 22 /* URL_TOKEN */, value: "" }; + } + var next = this.peekCodePoint(0); + if (next === APOSTROPHE || next === QUOTATION_MARK) { + var stringToken = this.consumeStringToken(this.consumeCodePoint()); + if (stringToken.type === 0 /* STRING_TOKEN */) { + this.consumeWhiteSpace(); + if ( + this.peekCodePoint(0) === EOF || + this.peekCodePoint(0) === RIGHT_PARENTHESIS + ) { + this.consumeCodePoint(); + return { type: 22 /* URL_TOKEN */, value: stringToken.value }; + } + } + this.consumeBadUrlRemnants(); + return BAD_URL_TOKEN; + } + while (true) { + var codePoint = this.consumeCodePoint(); + if (codePoint === EOF || codePoint === RIGHT_PARENTHESIS) { + return { + type: 22 /* URL_TOKEN */, + value: fromCodePoint$1.apply(void 0, value), + }; + } else if (isWhiteSpace(codePoint)) { + this.consumeWhiteSpace(); + if ( + this.peekCodePoint(0) === EOF || + this.peekCodePoint(0) === RIGHT_PARENTHESIS + ) { + this.consumeCodePoint(); + return { + type: 22 /* URL_TOKEN */, + value: fromCodePoint$1.apply(void 0, value), + }; + } + this.consumeBadUrlRemnants(); + return BAD_URL_TOKEN; + } else if ( + codePoint === QUOTATION_MARK || + codePoint === APOSTROPHE || + codePoint === LEFT_PARENTHESIS || + isNonPrintableCodePoint(codePoint) + ) { + this.consumeBadUrlRemnants(); + return BAD_URL_TOKEN; + } else if (codePoint === REVERSE_SOLIDUS) { + if (isValidEscape(codePoint, this.peekCodePoint(0))) { + value.push(this.consumeEscapedCodePoint()); + } else { + this.consumeBadUrlRemnants(); + return BAD_URL_TOKEN; + } + } else { + value.push(codePoint); + } + } + }; + Tokenizer.prototype.consumeWhiteSpace = function () { + while (isWhiteSpace(this.peekCodePoint(0))) { + this.consumeCodePoint(); + } + }; + Tokenizer.prototype.consumeBadUrlRemnants = function () { + while (true) { + var codePoint = this.consumeCodePoint(); + if (codePoint === RIGHT_PARENTHESIS || codePoint === EOF) { + return; + } + if (isValidEscape(codePoint, this.peekCodePoint(0))) { + this.consumeEscapedCodePoint(); + } + } + }; + Tokenizer.prototype.consumeStringSlice = function (count) { + var SLICE_STACK_SIZE = 50000; + var value = ""; + while (count > 0) { + var amount = Math.min(SLICE_STACK_SIZE, count); + value += fromCodePoint$1.apply( + void 0, + this._value.splice(0, amount) + ); + count -= amount; + } + this._value.shift(); + return value; + }; + Tokenizer.prototype.consumeStringToken = function (endingCodePoint) { + var value = ""; + var i = 0; + do { + var codePoint = this._value[i]; + if ( + codePoint === EOF || + codePoint === undefined || + codePoint === endingCodePoint + ) { + value += this.consumeStringSlice(i); + return { type: 0 /* STRING_TOKEN */, value: value }; + } + if (codePoint === LINE_FEED) { + this._value.splice(0, i); + return BAD_STRING_TOKEN; + } + if (codePoint === REVERSE_SOLIDUS) { + var next = this._value[i + 1]; + if (next !== EOF && next !== undefined) { + if (next === LINE_FEED) { + value += this.consumeStringSlice(i); + i = -1; + this._value.shift(); + } else if (isValidEscape(codePoint, next)) { + value += this.consumeStringSlice(i); + value += fromCodePoint$1(this.consumeEscapedCodePoint()); + i = -1; + } + } + } + i++; + } while (true); + }; + Tokenizer.prototype.consumeNumber = function () { + var repr = []; + var type = FLAG_INTEGER; + var c1 = this.peekCodePoint(0); + if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) { + repr.push(this.consumeCodePoint()); + } + while (isDigit(this.peekCodePoint(0))) { + repr.push(this.consumeCodePoint()); + } + c1 = this.peekCodePoint(0); + var c2 = this.peekCodePoint(1); + if (c1 === FULL_STOP && isDigit(c2)) { + repr.push(this.consumeCodePoint(), this.consumeCodePoint()); + type = FLAG_NUMBER; + while (isDigit(this.peekCodePoint(0))) { + repr.push(this.consumeCodePoint()); + } + } + c1 = this.peekCodePoint(0); + c2 = this.peekCodePoint(1); + var c3 = this.peekCodePoint(2); + if ( + (c1 === E || c1 === e) && + (((c2 === PLUS_SIGN || c2 === HYPHEN_MINUS) && isDigit(c3)) || + isDigit(c2)) + ) { + repr.push(this.consumeCodePoint(), this.consumeCodePoint()); + type = FLAG_NUMBER; + while (isDigit(this.peekCodePoint(0))) { + repr.push(this.consumeCodePoint()); + } + } + return [stringToNumber(repr), type]; + }; + Tokenizer.prototype.consumeNumericToken = function () { + var _a = this.consumeNumber(), + number = _a[0], + flags = _a[1]; + var c1 = this.peekCodePoint(0); + var c2 = this.peekCodePoint(1); + var c3 = this.peekCodePoint(2); + if (isIdentifierStart(c1, c2, c3)) { + var unit = this.consumeName(); + return { + type: 15 /* DIMENSION_TOKEN */, + number: number, + flags: flags, + unit: unit, + }; + } + if (c1 === PERCENTAGE_SIGN) { + this.consumeCodePoint(); + return { + type: 16 /* PERCENTAGE_TOKEN */, + number: number, + flags: flags, + }; + } + return { type: 17 /* NUMBER_TOKEN */, number: number, flags: flags }; + }; + Tokenizer.prototype.consumeEscapedCodePoint = function () { + var codePoint = this.consumeCodePoint(); + if (isHex(codePoint)) { + var hex = fromCodePoint$1(codePoint); + while (isHex(this.peekCodePoint(0)) && hex.length < 6) { + hex += fromCodePoint$1(this.consumeCodePoint()); + } + if (isWhiteSpace(this.peekCodePoint(0))) { + this.consumeCodePoint(); + } + var hexCodePoint = parseInt(hex, 16); + if ( + hexCodePoint === 0 || + isSurrogateCodePoint(hexCodePoint) || + hexCodePoint > 0x10ffff + ) { + return REPLACEMENT_CHARACTER; + } + return hexCodePoint; + } + if (codePoint === EOF) { + return REPLACEMENT_CHARACTER; + } + return codePoint; + }; + Tokenizer.prototype.consumeName = function () { + var result = ""; + while (true) { + var codePoint = this.consumeCodePoint(); + if (isNameCodePoint(codePoint)) { + result += fromCodePoint$1(codePoint); + } else if (isValidEscape(codePoint, this.peekCodePoint(0))) { + result += fromCodePoint$1(this.consumeEscapedCodePoint()); + } else { + this.reconsumeCodePoint(codePoint); + return result; + } + } + }; + return Tokenizer; + })(); + + var Parser = /** @class */ (function () { + function Parser(tokens) { + this._tokens = tokens; + } + Parser.create = function (value) { + var tokenizer = new Tokenizer(); + tokenizer.write(value); + return new Parser(tokenizer.read()); + }; + Parser.parseValue = function (value) { + return Parser.create(value).parseComponentValue(); + }; + Parser.parseValues = function (value) { + return Parser.create(value).parseComponentValues(); + }; + Parser.prototype.parseComponentValue = function () { + var token = this.consumeToken(); + while (token.type === 31 /* WHITESPACE_TOKEN */) { + token = this.consumeToken(); + } + if (token.type === 32 /* EOF_TOKEN */) { + throw new SyntaxError( + "Error parsing CSS component value, unexpected EOF" + ); + } + this.reconsumeToken(token); + var value = this.consumeComponentValue(); + do { + token = this.consumeToken(); + } while (token.type === 31 /* WHITESPACE_TOKEN */); + if (token.type === 32 /* EOF_TOKEN */) { + return value; + } + throw new SyntaxError( + "Error parsing CSS component value, multiple values found when expecting only one" + ); + }; + Parser.prototype.parseComponentValues = function () { + var values = []; + while (true) { + var value = this.consumeComponentValue(); + if (value.type === 32 /* EOF_TOKEN */) { + return values; + } + values.push(value); + values.push(); + } + }; + Parser.prototype.consumeComponentValue = function () { + var token = this.consumeToken(); + switch (token.type) { + case 11 /* LEFT_CURLY_BRACKET_TOKEN */: + case 28 /* LEFT_SQUARE_BRACKET_TOKEN */: + case 2 /* LEFT_PARENTHESIS_TOKEN */: + return this.consumeSimpleBlock(token.type); + case 19 /* FUNCTION_TOKEN */: + return this.consumeFunction(token); + } + return token; + }; + Parser.prototype.consumeSimpleBlock = function (type) { + var block = { type: type, values: [] }; + var token = this.consumeToken(); + while (true) { + if ( + token.type === 32 /* EOF_TOKEN */ || + isEndingTokenFor(token, type) + ) { + return block; + } + this.reconsumeToken(token); + block.values.push(this.consumeComponentValue()); + token = this.consumeToken(); + } + }; + Parser.prototype.consumeFunction = function (functionToken) { + var cssFunction = { + name: functionToken.value, + values: [], + type: 18 /* FUNCTION */, + }; + while (true) { + var token = this.consumeToken(); + if ( + token.type === 32 /* EOF_TOKEN */ || + token.type === 3 /* RIGHT_PARENTHESIS_TOKEN */ + ) { + return cssFunction; + } + this.reconsumeToken(token); + cssFunction.values.push(this.consumeComponentValue()); + } + }; + Parser.prototype.consumeToken = function () { + var token = this._tokens.shift(); + return typeof token === "undefined" ? EOF_TOKEN : token; + }; + Parser.prototype.reconsumeToken = function (token) { + this._tokens.unshift(token); + }; + return Parser; + })(); + var isDimensionToken = function (token) { + return token.type === 15 /* DIMENSION_TOKEN */; + }; + var isNumberToken = function (token) { + return token.type === 17 /* NUMBER_TOKEN */; + }; + var isIdentToken = function (token) { + return token.type === 20 /* IDENT_TOKEN */; + }; + var isStringToken = function (token) { + return token.type === 0 /* STRING_TOKEN */; + }; + var isIdentWithValue = function (token, value) { + return isIdentToken(token) && token.value === value; + }; + var nonWhiteSpace = function (token) { + return token.type !== 31 /* WHITESPACE_TOKEN */; + }; + var nonFunctionArgSeparator = function (token) { + return ( + token.type !== 31 /* WHITESPACE_TOKEN */ && + token.type !== 4 /* COMMA_TOKEN */ + ); + }; + var parseFunctionArgs = function (tokens) { + var args = []; + var arg = []; + tokens.forEach(function (token) { + if (token.type === 4 /* COMMA_TOKEN */) { + if (arg.length === 0) { + throw new Error( + "Error parsing function args, zero tokens for arg" + ); + } + args.push(arg); + arg = []; + return; + } + if (token.type !== 31 /* WHITESPACE_TOKEN */) { + arg.push(token); + } + }); + if (arg.length) { + args.push(arg); + } + return args; + }; + var isEndingTokenFor = function (token, type) { + if ( + type === 11 /* LEFT_CURLY_BRACKET_TOKEN */ && + token.type === 12 /* RIGHT_CURLY_BRACKET_TOKEN */ + ) { + return true; + } + if ( + type === 28 /* LEFT_SQUARE_BRACKET_TOKEN */ && + token.type === 29 /* RIGHT_SQUARE_BRACKET_TOKEN */ + ) { + return true; + } + return ( + type === 2 /* LEFT_PARENTHESIS_TOKEN */ && + token.type === 3 /* RIGHT_PARENTHESIS_TOKEN */ + ); + }; + + var isLength = function (token) { + return ( + token.type === 17 /* NUMBER_TOKEN */ || + token.type === 15 /* DIMENSION_TOKEN */ + ); + }; + + var isLengthPercentage = function (token) { + return token.type === 16 /* PERCENTAGE_TOKEN */ || isLength(token); + }; + var parseLengthPercentageTuple = function (tokens) { + return tokens.length > 1 ? [tokens[0], tokens[1]] : [tokens[0]]; + }; + var ZERO_LENGTH = { + type: 17 /* NUMBER_TOKEN */, + number: 0, + flags: FLAG_INTEGER, + }; + var FIFTY_PERCENT = { + type: 16 /* PERCENTAGE_TOKEN */, + number: 50, + flags: FLAG_INTEGER, + }; + var HUNDRED_PERCENT = { + type: 16 /* PERCENTAGE_TOKEN */, + number: 100, + flags: FLAG_INTEGER, + }; + var getAbsoluteValueForTuple = function (tuple, width, height) { + var x = tuple[0], + y = tuple[1]; + return [ + getAbsoluteValue(x, width), + getAbsoluteValue(typeof y !== "undefined" ? y : x, height), + ]; + }; + var getAbsoluteValue = function (token, parent) { + if (token.type === 16 /* PERCENTAGE_TOKEN */) { + return (token.number / 100) * parent; + } + if (isDimensionToken(token)) { + switch (token.unit) { + case "rem": + case "em": + return 16 * token.number; // TODO use correct font-size + case "px": + default: + return token.number; + } + } + return token.number; + }; + + var DEG = "deg"; + var GRAD = "grad"; + var RAD = "rad"; + var TURN = "turn"; + var angle = { + name: "angle", + parse: function (_context, value) { + if (value.type === 15 /* DIMENSION_TOKEN */) { + switch (value.unit) { + case DEG: + return (Math.PI * value.number) / 180; + case GRAD: + return (Math.PI / 200) * value.number; + case RAD: + return value.number; + case TURN: + return Math.PI * 2 * value.number; + } + } + throw new Error("Unsupported angle type"); + }, + }; + var isAngle = function (value) { + if (value.type === 15 /* DIMENSION_TOKEN */) { + if ( + value.unit === DEG || + value.unit === GRAD || + value.unit === RAD || + value.unit === TURN + ) { + return true; + } + } + return false; + }; + var parseNamedSide = function (tokens) { + var sideOrCorner = tokens + .filter(isIdentToken) + .map(function (ident) { + return ident.value; + }) + .join(" "); + switch (sideOrCorner) { + case "to bottom right": + case "to right bottom": + case "left top": + case "top left": + return [ZERO_LENGTH, ZERO_LENGTH]; + case "to top": + case "bottom": + return deg(0); + case "to bottom left": + case "to left bottom": + case "right top": + case "top right": + return [ZERO_LENGTH, HUNDRED_PERCENT]; + case "to right": + case "left": + return deg(90); + case "to top left": + case "to left top": + case "right bottom": + case "bottom right": + return [HUNDRED_PERCENT, HUNDRED_PERCENT]; + case "to bottom": + case "top": + return deg(180); + case "to top right": + case "to right top": + case "left bottom": + case "bottom left": + return [HUNDRED_PERCENT, ZERO_LENGTH]; + case "to left": + case "right": + return deg(270); + } + return 0; + }; + var deg = function (deg) { + return (Math.PI * deg) / 180; + }; + + var color$1 = { + name: "color", + parse: function (context, value) { + if (value.type === 18 /* FUNCTION */) { + var colorFunction = SUPPORTED_COLOR_FUNCTIONS[value.name]; + if (typeof colorFunction === "undefined") { + throw new Error( + 'Attempting to parse an unsupported color function "' + + value.name + + '"' + ); + } + return colorFunction(context, value.values); + } + if (value.type === 5 /* HASH_TOKEN */) { + if (value.value.length === 3) { + var r = value.value.substring(0, 1); + var g = value.value.substring(1, 2); + var b = value.value.substring(2, 3); + return pack( + parseInt(r + r, 16), + parseInt(g + g, 16), + parseInt(b + b, 16), + 1 + ); + } + if (value.value.length === 4) { + var r = value.value.substring(0, 1); + var g = value.value.substring(1, 2); + var b = value.value.substring(2, 3); + var a = value.value.substring(3, 4); + return pack( + parseInt(r + r, 16), + parseInt(g + g, 16), + parseInt(b + b, 16), + parseInt(a + a, 16) / 255 + ); + } + if (value.value.length === 6) { + var r = value.value.substring(0, 2); + var g = value.value.substring(2, 4); + var b = value.value.substring(4, 6); + return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), 1); + } + if (value.value.length === 8) { + var r = value.value.substring(0, 2); + var g = value.value.substring(2, 4); + var b = value.value.substring(4, 6); + var a = value.value.substring(6, 8); + return pack( + parseInt(r, 16), + parseInt(g, 16), + parseInt(b, 16), + parseInt(a, 16) / 255 + ); + } + } + if (value.type === 20 /* IDENT_TOKEN */) { + var namedColor = COLORS[value.value.toUpperCase()]; + if (typeof namedColor !== "undefined") { + return namedColor; + } + } + return COLORS.TRANSPARENT; + }, + }; + var isTransparent = function (color) { + return (0xff & color) === 0; + }; + var asString = function (color) { + var alpha = 0xff & color; + var blue = 0xff & (color >> 8); + var green = 0xff & (color >> 16); + var red = 0xff & (color >> 24); + return alpha < 255 + ? "rgba(" + red + "," + green + "," + blue + "," + alpha / 255 + ")" + : "rgb(" + red + "," + green + "," + blue + ")"; + }; + var pack = function (r, g, b, a) { + return ( + ((r << 24) | (g << 16) | (b << 8) | (Math.round(a * 255) << 0)) >>> 0 + ); + }; + var getTokenColorValue = function (token, i) { + if (token.type === 17 /* NUMBER_TOKEN */) { + return token.number; + } + if (token.type === 16 /* PERCENTAGE_TOKEN */) { + var max = i === 3 ? 1 : 255; + return i === 3 + ? (token.number / 100) * max + : Math.round((token.number / 100) * max); + } + return 0; + }; + var rgb = function (_context, args) { + var tokens = args.filter(nonFunctionArgSeparator); + if (tokens.length === 3) { + var _a = tokens.map(getTokenColorValue), + r = _a[0], + g = _a[1], + b = _a[2]; + return pack(r, g, b, 1); + } + if (tokens.length === 4) { + var _b = tokens.map(getTokenColorValue), + r = _b[0], + g = _b[1], + b = _b[2], + a = _b[3]; + return pack(r, g, b, a); + } + return 0; + }; + function hue2rgb(t1, t2, hue) { + if (hue < 0) { + hue += 1; + } + if (hue >= 1) { + hue -= 1; + } + if (hue < 1 / 6) { + return (t2 - t1) * hue * 6 + t1; + } else if (hue < 1 / 2) { + return t2; + } else if (hue < 2 / 3) { + return (t2 - t1) * 6 * (2 / 3 - hue) + t1; + } else { + return t1; + } + } + var hsl = function (context, args) { + var tokens = args.filter(nonFunctionArgSeparator); + var hue = tokens[0], + saturation = tokens[1], + lightness = tokens[2], + alpha = tokens[3]; + var h = + (hue.type === 17 /* NUMBER_TOKEN */ + ? deg(hue.number) + : angle.parse(context, hue)) / + (Math.PI * 2); + var s = isLengthPercentage(saturation) ? saturation.number / 100 : 0; + var l = isLengthPercentage(lightness) ? lightness.number / 100 : 0; + var a = + typeof alpha !== "undefined" && isLengthPercentage(alpha) + ? getAbsoluteValue(alpha, 1) + : 1; + if (s === 0) { + return pack(l * 255, l * 255, l * 255, 1); + } + var t2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var t1 = l * 2 - t2; + var r = hue2rgb(t1, t2, h + 1 / 3); + var g = hue2rgb(t1, t2, h); + var b = hue2rgb(t1, t2, h - 1 / 3); + return pack(r * 255, g * 255, b * 255, a); + }; + var SUPPORTED_COLOR_FUNCTIONS = { + hsl: hsl, + hsla: hsl, + rgb: rgb, + rgba: rgb, + }; + var parseColor = function (context, value) { + return color$1.parse( + context, + Parser.create(value).parseComponentValue() + ); + }; + var COLORS = { + ALICEBLUE: 0xf0f8ffff, + ANTIQUEWHITE: 0xfaebd7ff, + AQUA: 0x00ffffff, + AQUAMARINE: 0x7fffd4ff, + AZURE: 0xf0ffffff, + BEIGE: 0xf5f5dcff, + BISQUE: 0xffe4c4ff, + BLACK: 0x000000ff, + BLANCHEDALMOND: 0xffebcdff, + BLUE: 0x0000ffff, + BLUEVIOLET: 0x8a2be2ff, + BROWN: 0xa52a2aff, + BURLYWOOD: 0xdeb887ff, + CADETBLUE: 0x5f9ea0ff, + CHARTREUSE: 0x7fff00ff, + CHOCOLATE: 0xd2691eff, + CORAL: 0xff7f50ff, + CORNFLOWERBLUE: 0x6495edff, + CORNSILK: 0xfff8dcff, + CRIMSON: 0xdc143cff, + CYAN: 0x00ffffff, + DARKBLUE: 0x00008bff, + DARKCYAN: 0x008b8bff, + DARKGOLDENROD: 0xb886bbff, + DARKGRAY: 0xa9a9a9ff, + DARKGREEN: 0x006400ff, + DARKGREY: 0xa9a9a9ff, + DARKKHAKI: 0xbdb76bff, + DARKMAGENTA: 0x8b008bff, + DARKOLIVEGREEN: 0x556b2fff, + DARKORANGE: 0xff8c00ff, + DARKORCHID: 0x9932ccff, + DARKRED: 0x8b0000ff, + DARKSALMON: 0xe9967aff, + DARKSEAGREEN: 0x8fbc8fff, + DARKSLATEBLUE: 0x483d8bff, + DARKSLATEGRAY: 0x2f4f4fff, + DARKSLATEGREY: 0x2f4f4fff, + DARKTURQUOISE: 0x00ced1ff, + DARKVIOLET: 0x9400d3ff, + DEEPPINK: 0xff1493ff, + DEEPSKYBLUE: 0x00bfffff, + DIMGRAY: 0x696969ff, + DIMGREY: 0x696969ff, + DODGERBLUE: 0x1e90ffff, + FIREBRICK: 0xb22222ff, + FLORALWHITE: 0xfffaf0ff, + FORESTGREEN: 0x228b22ff, + FUCHSIA: 0xff00ffff, + GAINSBORO: 0xdcdcdcff, + GHOSTWHITE: 0xf8f8ffff, + GOLD: 0xffd700ff, + GOLDENROD: 0xdaa520ff, + GRAY: 0x808080ff, + GREEN: 0x008000ff, + GREENYELLOW: 0xadff2fff, + GREY: 0x808080ff, + HONEYDEW: 0xf0fff0ff, + HOTPINK: 0xff69b4ff, + INDIANRED: 0xcd5c5cff, + INDIGO: 0x4b0082ff, + IVORY: 0xfffff0ff, + KHAKI: 0xf0e68cff, + LAVENDER: 0xe6e6faff, + LAVENDERBLUSH: 0xfff0f5ff, + LAWNGREEN: 0x7cfc00ff, + LEMONCHIFFON: 0xfffacdff, + LIGHTBLUE: 0xadd8e6ff, + LIGHTCORAL: 0xf08080ff, + LIGHTCYAN: 0xe0ffffff, + LIGHTGOLDENRODYELLOW: 0xfafad2ff, + LIGHTGRAY: 0xd3d3d3ff, + LIGHTGREEN: 0x90ee90ff, + LIGHTGREY: 0xd3d3d3ff, + LIGHTPINK: 0xffb6c1ff, + LIGHTSALMON: 0xffa07aff, + LIGHTSEAGREEN: 0x20b2aaff, + LIGHTSKYBLUE: 0x87cefaff, + LIGHTSLATEGRAY: 0x778899ff, + LIGHTSLATEGREY: 0x778899ff, + LIGHTSTEELBLUE: 0xb0c4deff, + LIGHTYELLOW: 0xffffe0ff, + LIME: 0x00ff00ff, + LIMEGREEN: 0x32cd32ff, + LINEN: 0xfaf0e6ff, + MAGENTA: 0xff00ffff, + MAROON: 0x800000ff, + MEDIUMAQUAMARINE: 0x66cdaaff, + MEDIUMBLUE: 0x0000cdff, + MEDIUMORCHID: 0xba55d3ff, + MEDIUMPURPLE: 0x9370dbff, + MEDIUMSEAGREEN: 0x3cb371ff, + MEDIUMSLATEBLUE: 0x7b68eeff, + MEDIUMSPRINGGREEN: 0x00fa9aff, + MEDIUMTURQUOISE: 0x48d1ccff, + MEDIUMVIOLETRED: 0xc71585ff, + MIDNIGHTBLUE: 0x191970ff, + MINTCREAM: 0xf5fffaff, + MISTYROSE: 0xffe4e1ff, + MOCCASIN: 0xffe4b5ff, + NAVAJOWHITE: 0xffdeadff, + NAVY: 0x000080ff, + OLDLACE: 0xfdf5e6ff, + OLIVE: 0x808000ff, + OLIVEDRAB: 0x6b8e23ff, + ORANGE: 0xffa500ff, + ORANGERED: 0xff4500ff, + ORCHID: 0xda70d6ff, + PALEGOLDENROD: 0xeee8aaff, + PALEGREEN: 0x98fb98ff, + PALETURQUOISE: 0xafeeeeff, + PALEVIOLETRED: 0xdb7093ff, + PAPAYAWHIP: 0xffefd5ff, + PEACHPUFF: 0xffdab9ff, + PERU: 0xcd853fff, + PINK: 0xffc0cbff, + PLUM: 0xdda0ddff, + POWDERBLUE: 0xb0e0e6ff, + PURPLE: 0x800080ff, + REBECCAPURPLE: 0x663399ff, + RED: 0xff0000ff, + ROSYBROWN: 0xbc8f8fff, + ROYALBLUE: 0x4169e1ff, + SADDLEBROWN: 0x8b4513ff, + SALMON: 0xfa8072ff, + SANDYBROWN: 0xf4a460ff, + SEAGREEN: 0x2e8b57ff, + SEASHELL: 0xfff5eeff, + SIENNA: 0xa0522dff, + SILVER: 0xc0c0c0ff, + SKYBLUE: 0x87ceebff, + SLATEBLUE: 0x6a5acdff, + SLATEGRAY: 0x708090ff, + SLATEGREY: 0x708090ff, + SNOW: 0xfffafaff, + SPRINGGREEN: 0x00ff7fff, + STEELBLUE: 0x4682b4ff, + TAN: 0xd2b48cff, + TEAL: 0x008080ff, + THISTLE: 0xd8bfd8ff, + TOMATO: 0xff6347ff, + TRANSPARENT: 0x00000000, + TURQUOISE: 0x40e0d0ff, + VIOLET: 0xee82eeff, + WHEAT: 0xf5deb3ff, + WHITE: 0xffffffff, + WHITESMOKE: 0xf5f5f5ff, + YELLOW: 0xffff00ff, + YELLOWGREEN: 0x9acd32ff, + }; + + var backgroundClip = { + name: "background-clip", + initialValue: "border-box", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + return tokens.map(function (token) { + if (isIdentToken(token)) { + switch (token.value) { + case "padding-box": + return 1 /* PADDING_BOX */; + case "content-box": + return 2 /* CONTENT_BOX */; + } + } + return 0 /* BORDER_BOX */; + }); + }, + }; + + var backgroundColor = { + name: "background-color", + initialValue: "transparent", + prefix: false, + type: 3 /* TYPE_VALUE */, + format: "color", + }; + + var parseColorStop = function (context, args) { + var color = color$1.parse(context, args[0]); + var stop = args[1]; + return stop && isLengthPercentage(stop) + ? { color: color, stop: stop } + : { color: color, stop: null }; + }; + var processColorStops = function (stops, lineLength) { + var first = stops[0]; + var last = stops[stops.length - 1]; + if (first.stop === null) { + first.stop = ZERO_LENGTH; + } + if (last.stop === null) { + last.stop = HUNDRED_PERCENT; + } + var processStops = []; + var previous = 0; + for (var i = 0; i < stops.length; i++) { + var stop_1 = stops[i].stop; + if (stop_1 !== null) { + var absoluteValue = getAbsoluteValue(stop_1, lineLength); + if (absoluteValue > previous) { + processStops.push(absoluteValue); + } else { + processStops.push(previous); + } + previous = absoluteValue; + } else { + processStops.push(null); + } + } + var gapBegin = null; + for (var i = 0; i < processStops.length; i++) { + var stop_2 = processStops[i]; + if (stop_2 === null) { + if (gapBegin === null) { + gapBegin = i; + } + } else if (gapBegin !== null) { + var gapLength = i - gapBegin; + var beforeGap = processStops[gapBegin - 1]; + var gapValue = (stop_2 - beforeGap) / (gapLength + 1); + for (var g = 1; g <= gapLength; g++) { + processStops[gapBegin + g - 1] = gapValue * g; + } + gapBegin = null; + } + } + return stops.map(function (_a, i) { + var color = _a.color; + return { + color: color, + stop: Math.max(Math.min(1, processStops[i] / lineLength), 0), + }; + }); + }; + var getAngleFromCorner = function (corner, width, height) { + var centerX = width / 2; + var centerY = height / 2; + var x = getAbsoluteValue(corner[0], width) - centerX; + var y = centerY - getAbsoluteValue(corner[1], height); + return (Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2); + }; + var calculateGradientDirection = function (angle, width, height) { + var radian = + typeof angle === "number" + ? angle + : getAngleFromCorner(angle, width, height); + var lineLength = + Math.abs(width * Math.sin(radian)) + + Math.abs(height * Math.cos(radian)); + var halfWidth = width / 2; + var halfHeight = height / 2; + var halfLineLength = lineLength / 2; + var yDiff = Math.sin(radian - Math.PI / 2) * halfLineLength; + var xDiff = Math.cos(radian - Math.PI / 2) * halfLineLength; + return [ + lineLength, + halfWidth - xDiff, + halfWidth + xDiff, + halfHeight - yDiff, + halfHeight + yDiff, + ]; + }; + var distance = function (a, b) { + return Math.sqrt(a * a + b * b); + }; + var findCorner = function (width, height, x, y, closest) { + var corners = [ + [0, 0], + [0, height], + [width, 0], + [width, height], + ]; + return corners.reduce( + function (stat, corner) { + var cx = corner[0], + cy = corner[1]; + var d = distance(x - cx, y - cy); + if (closest ? d < stat.optimumDistance : d > stat.optimumDistance) { + return { + optimumCorner: corner, + optimumDistance: d, + }; + } + return stat; + }, + { + optimumDistance: closest ? Infinity : -Infinity, + optimumCorner: null, + } + ).optimumCorner; + }; + var calculateRadius = function (gradient, x, y, width, height) { + var rx = 0; + var ry = 0; + switch (gradient.size) { + case 0 /* CLOSEST_SIDE */: + // The ending shape is sized so that that it exactly meets the side of the gradient box closest to the gradient’s center. + // If the shape is an ellipse, it exactly meets the closest side in each dimension. + if (gradient.shape === 0 /* CIRCLE */) { + rx = ry = Math.min( + Math.abs(x), + Math.abs(x - width), + Math.abs(y), + Math.abs(y - height) + ); + } else if (gradient.shape === 1 /* ELLIPSE */) { + rx = Math.min(Math.abs(x), Math.abs(x - width)); + ry = Math.min(Math.abs(y), Math.abs(y - height)); + } + break; + case 2 /* CLOSEST_CORNER */: + // The ending shape is sized so that that it passes through the corner of the gradient box closest to the gradient’s center. + // If the shape is an ellipse, the ending shape is given the same aspect-ratio it would have if closest-side were specified. + if (gradient.shape === 0 /* CIRCLE */) { + rx = ry = Math.min( + distance(x, y), + distance(x, y - height), + distance(x - width, y), + distance(x - width, y - height) + ); + } else if (gradient.shape === 1 /* ELLIPSE */) { + // Compute the ratio ry/rx (which is to be the same as for "closest-side") + var c = + Math.min(Math.abs(y), Math.abs(y - height)) / + Math.min(Math.abs(x), Math.abs(x - width)); + var _a = findCorner(width, height, x, y, true), + cx = _a[0], + cy = _a[1]; + rx = distance(cx - x, (cy - y) / c); + ry = c * rx; + } + break; + case 1 /* FARTHEST_SIDE */: + // Same as closest-side, except the ending shape is sized based on the farthest side(s) + if (gradient.shape === 0 /* CIRCLE */) { + rx = ry = Math.max( + Math.abs(x), + Math.abs(x - width), + Math.abs(y), + Math.abs(y - height) + ); + } else if (gradient.shape === 1 /* ELLIPSE */) { + rx = Math.max(Math.abs(x), Math.abs(x - width)); + ry = Math.max(Math.abs(y), Math.abs(y - height)); + } + break; + case 3 /* FARTHEST_CORNER */: + // Same as closest-corner, except the ending shape is sized based on the farthest corner. + // If the shape is an ellipse, the ending shape is given the same aspect ratio it would have if farthest-side were specified. + if (gradient.shape === 0 /* CIRCLE */) { + rx = ry = Math.max( + distance(x, y), + distance(x, y - height), + distance(x - width, y), + distance(x - width, y - height) + ); + } else if (gradient.shape === 1 /* ELLIPSE */) { + // Compute the ratio ry/rx (which is to be the same as for "farthest-side") + var c = + Math.max(Math.abs(y), Math.abs(y - height)) / + Math.max(Math.abs(x), Math.abs(x - width)); + var _b = findCorner(width, height, x, y, false), + cx = _b[0], + cy = _b[1]; + rx = distance(cx - x, (cy - y) / c); + ry = c * rx; + } + break; + } + if (Array.isArray(gradient.size)) { + rx = getAbsoluteValue(gradient.size[0], width); + ry = + gradient.size.length === 2 + ? getAbsoluteValue(gradient.size[1], height) + : rx; + } + return [rx, ry]; + }; + + var linearGradient = function (context, tokens) { + var angle$1 = deg(180); + var stops = []; + parseFunctionArgs(tokens).forEach(function (arg, i) { + if (i === 0) { + var firstToken = arg[0]; + if ( + firstToken.type === 20 /* IDENT_TOKEN */ && + firstToken.value === "to" + ) { + angle$1 = parseNamedSide(arg); + return; + } else if (isAngle(firstToken)) { + angle$1 = angle.parse(context, firstToken); + return; + } + } + var colorStop = parseColorStop(context, arg); + stops.push(colorStop); + }); + return { angle: angle$1, stops: stops, type: 1 /* LINEAR_GRADIENT */ }; + }; + + var prefixLinearGradient = function (context, tokens) { + var angle$1 = deg(180); + var stops = []; + parseFunctionArgs(tokens).forEach(function (arg, i) { + if (i === 0) { + var firstToken = arg[0]; + if ( + firstToken.type === 20 /* IDENT_TOKEN */ && + ["top", "left", "right", "bottom"].indexOf(firstToken.value) !== + -1 + ) { + angle$1 = parseNamedSide(arg); + return; + } else if (isAngle(firstToken)) { + angle$1 = + (angle.parse(context, firstToken) + deg(270)) % deg(360); + return; + } + } + var colorStop = parseColorStop(context, arg); + stops.push(colorStop); + }); + return { + angle: angle$1, + stops: stops, + type: 1 /* LINEAR_GRADIENT */, + }; + }; + + var webkitGradient = function (context, tokens) { + var angle = deg(180); + var stops = []; + var type = 1; /* LINEAR_GRADIENT */ + var shape = 0; /* CIRCLE */ + var size = 3; /* FARTHEST_CORNER */ + var position = []; + parseFunctionArgs(tokens).forEach(function (arg, i) { + var firstToken = arg[0]; + if (i === 0) { + if (isIdentToken(firstToken) && firstToken.value === "linear") { + type = 1 /* LINEAR_GRADIENT */; + return; + } else if ( + isIdentToken(firstToken) && + firstToken.value === "radial" + ) { + type = 2 /* RADIAL_GRADIENT */; + return; + } + } + if (firstToken.type === 18 /* FUNCTION */) { + if (firstToken.name === "from") { + var color = color$1.parse(context, firstToken.values[0]); + stops.push({ stop: ZERO_LENGTH, color: color }); + } else if (firstToken.name === "to") { + var color = color$1.parse(context, firstToken.values[0]); + stops.push({ stop: HUNDRED_PERCENT, color: color }); + } else if (firstToken.name === "color-stop") { + var values = firstToken.values.filter(nonFunctionArgSeparator); + if (values.length === 2) { + var color = color$1.parse(context, values[1]); + var stop_1 = values[0]; + if (isNumberToken(stop_1)) { + stops.push({ + stop: { + type: 16 /* PERCENTAGE_TOKEN */, + number: stop_1.number * 100, + flags: stop_1.flags, + }, + color: color, + }); + } + } + } + } + }); + return type === 1 /* LINEAR_GRADIENT */ + ? { + angle: (angle + deg(180)) % deg(360), + stops: stops, + type: type, + } + : { + size: size, + shape: shape, + stops: stops, + position: position, + type: type, + }; + }; + + var CLOSEST_SIDE = "closest-side"; + var FARTHEST_SIDE = "farthest-side"; + var CLOSEST_CORNER = "closest-corner"; + var FARTHEST_CORNER = "farthest-corner"; + var CIRCLE = "circle"; + var ELLIPSE = "ellipse"; + var COVER = "cover"; + var CONTAIN = "contain"; + var radialGradient = function (context, tokens) { + var shape = 0; /* CIRCLE */ + var size = 3; /* FARTHEST_CORNER */ + var stops = []; + var position = []; + parseFunctionArgs(tokens).forEach(function (arg, i) { + var isColorStop = true; + if (i === 0) { + var isAtPosition_1 = false; + isColorStop = arg.reduce(function (acc, token) { + if (isAtPosition_1) { + if (isIdentToken(token)) { + switch (token.value) { + case "center": + position.push(FIFTY_PERCENT); + return acc; + case "top": + case "left": + position.push(ZERO_LENGTH); + return acc; + case "right": + case "bottom": + position.push(HUNDRED_PERCENT); + return acc; + } + } else if (isLengthPercentage(token) || isLength(token)) { + position.push(token); + } + } else if (isIdentToken(token)) { + switch (token.value) { + case CIRCLE: + shape = 0 /* CIRCLE */; + return false; + case ELLIPSE: + shape = 1 /* ELLIPSE */; + return false; + case "at": + isAtPosition_1 = true; + return false; + case CLOSEST_SIDE: + size = 0 /* CLOSEST_SIDE */; + return false; + case COVER: + case FARTHEST_SIDE: + size = 1 /* FARTHEST_SIDE */; + return false; + case CONTAIN: + case CLOSEST_CORNER: + size = 2 /* CLOSEST_CORNER */; + return false; + case FARTHEST_CORNER: + size = 3 /* FARTHEST_CORNER */; + return false; + } + } else if (isLength(token) || isLengthPercentage(token)) { + if (!Array.isArray(size)) { + size = []; + } + size.push(token); + return false; + } + return acc; + }, isColorStop); + } + if (isColorStop) { + var colorStop = parseColorStop(context, arg); + stops.push(colorStop); + } + }); + return { + size: size, + shape: shape, + stops: stops, + position: position, + type: 2 /* RADIAL_GRADIENT */, + }; + }; + + var prefixRadialGradient = function (context, tokens) { + var shape = 0; /* CIRCLE */ + var size = 3; /* FARTHEST_CORNER */ + var stops = []; + var position = []; + parseFunctionArgs(tokens).forEach(function (arg, i) { + var isColorStop = true; + if (i === 0) { + isColorStop = arg.reduce(function (acc, token) { + if (isIdentToken(token)) { + switch (token.value) { + case "center": + position.push(FIFTY_PERCENT); + return false; + case "top": + case "left": + position.push(ZERO_LENGTH); + return false; + case "right": + case "bottom": + position.push(HUNDRED_PERCENT); + return false; + } + } else if (isLengthPercentage(token) || isLength(token)) { + position.push(token); + return false; + } + return acc; + }, isColorStop); + } else if (i === 1) { + isColorStop = arg.reduce(function (acc, token) { + if (isIdentToken(token)) { + switch (token.value) { + case CIRCLE: + shape = 0 /* CIRCLE */; + return false; + case ELLIPSE: + shape = 1 /* ELLIPSE */; + return false; + case CONTAIN: + case CLOSEST_SIDE: + size = 0 /* CLOSEST_SIDE */; + return false; + case FARTHEST_SIDE: + size = 1 /* FARTHEST_SIDE */; + return false; + case CLOSEST_CORNER: + size = 2 /* CLOSEST_CORNER */; + return false; + case COVER: + case FARTHEST_CORNER: + size = 3 /* FARTHEST_CORNER */; + return false; + } + } else if (isLength(token) || isLengthPercentage(token)) { + if (!Array.isArray(size)) { + size = []; + } + size.push(token); + return false; + } + return acc; + }, isColorStop); + } + if (isColorStop) { + var colorStop = parseColorStop(context, arg); + stops.push(colorStop); + } + }); + return { + size: size, + shape: shape, + stops: stops, + position: position, + type: 2 /* RADIAL_GRADIENT */, + }; + }; + + var isLinearGradient = function (background) { + return background.type === 1 /* LINEAR_GRADIENT */; + }; + var isRadialGradient = function (background) { + return background.type === 2 /* RADIAL_GRADIENT */; + }; + var image = { + name: "image", + parse: function (context, value) { + if (value.type === 22 /* URL_TOKEN */) { + var image_1 = { url: value.value, type: 0 /* URL */ }; + context.cache.addImage(value.value); + return image_1; + } + if (value.type === 18 /* FUNCTION */) { + var imageFunction = SUPPORTED_IMAGE_FUNCTIONS[value.name]; + if (typeof imageFunction === "undefined") { + throw new Error( + 'Attempting to parse an unsupported image function "' + + value.name + + '"' + ); + } + return imageFunction(context, value.values); + } + throw new Error("Unsupported image type " + value.type); + }, + }; + function isSupportedImage(value) { + return ( + !(value.type === 20 /* IDENT_TOKEN */ && value.value === "none") && + (value.type !== 18 /* FUNCTION */ || + !!SUPPORTED_IMAGE_FUNCTIONS[value.name]) + ); + } + var SUPPORTED_IMAGE_FUNCTIONS = { + "linear-gradient": linearGradient, + "-moz-linear-gradient": prefixLinearGradient, + "-ms-linear-gradient": prefixLinearGradient, + "-o-linear-gradient": prefixLinearGradient, + "-webkit-linear-gradient": prefixLinearGradient, + "radial-gradient": radialGradient, + "-moz-radial-gradient": prefixRadialGradient, + "-ms-radial-gradient": prefixRadialGradient, + "-o-radial-gradient": prefixRadialGradient, + "-webkit-radial-gradient": prefixRadialGradient, + "-webkit-gradient": webkitGradient, + }; + + var backgroundImage = { + name: "background-image", + initialValue: "none", + type: 1 /* LIST */, + prefix: false, + parse: function (context, tokens) { + if (tokens.length === 0) { + return []; + } + var first = tokens[0]; + if (first.type === 20 /* IDENT_TOKEN */ && first.value === "none") { + return []; + } + return tokens + .filter(function (value) { + return nonFunctionArgSeparator(value) && isSupportedImage(value); + }) + .map(function (value) { + return image.parse(context, value); + }); + }, + }; + + var backgroundOrigin = { + name: "background-origin", + initialValue: "border-box", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + return tokens.map(function (token) { + if (isIdentToken(token)) { + switch (token.value) { + case "padding-box": + return 1 /* PADDING_BOX */; + case "content-box": + return 2 /* CONTENT_BOX */; + } + } + return 0 /* BORDER_BOX */; + }); + }, + }; + + var backgroundPosition = { + name: "background-position", + initialValue: "0% 0%", + type: 1 /* LIST */, + prefix: false, + parse: function (_context, tokens) { + return parseFunctionArgs(tokens) + .map(function (values) { + return values.filter(isLengthPercentage); + }) + .map(parseLengthPercentageTuple); + }, + }; + + var backgroundRepeat = { + name: "background-repeat", + initialValue: "repeat", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + return parseFunctionArgs(tokens) + .map(function (values) { + return values + .filter(isIdentToken) + .map(function (token) { + return token.value; + }) + .join(" "); + }) + .map(parseBackgroundRepeat); + }, + }; + var parseBackgroundRepeat = function (value) { + switch (value) { + case "no-repeat": + return 1 /* NO_REPEAT */; + case "repeat-x": + case "repeat no-repeat": + return 2 /* REPEAT_X */; + case "repeat-y": + case "no-repeat repeat": + return 3 /* REPEAT_Y */; + case "repeat": + default: + return 0 /* REPEAT */; + } + }; + + var BACKGROUND_SIZE; + (function (BACKGROUND_SIZE) { + BACKGROUND_SIZE["AUTO"] = "auto"; + BACKGROUND_SIZE["CONTAIN"] = "contain"; + BACKGROUND_SIZE["COVER"] = "cover"; + })(BACKGROUND_SIZE || (BACKGROUND_SIZE = {})); + var backgroundSize = { + name: "background-size", + initialValue: "0", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + return parseFunctionArgs(tokens).map(function (values) { + return values.filter(isBackgroundSizeInfoToken); + }); + }, + }; + var isBackgroundSizeInfoToken = function (value) { + return isIdentToken(value) || isLengthPercentage(value); + }; + + var borderColorForSide = function (side) { + return { + name: "border-" + side + "-color", + initialValue: "transparent", + prefix: false, + type: 3 /* TYPE_VALUE */, + format: "color", + }; + }; + var borderTopColor = borderColorForSide("top"); + var borderRightColor = borderColorForSide("right"); + var borderBottomColor = borderColorForSide("bottom"); + var borderLeftColor = borderColorForSide("left"); + + var borderRadiusForSide = function (side) { + return { + name: "border-radius-" + side, + initialValue: "0 0", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + return parseLengthPercentageTuple( + tokens.filter(isLengthPercentage) + ); + }, + }; + }; + var borderTopLeftRadius = borderRadiusForSide("top-left"); + var borderTopRightRadius = borderRadiusForSide("top-right"); + var borderBottomRightRadius = borderRadiusForSide("bottom-right"); + var borderBottomLeftRadius = borderRadiusForSide("bottom-left"); + + var borderStyleForSide = function (side) { + return { + name: "border-" + side + "-style", + initialValue: "solid", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, style) { + switch (style) { + case "none": + return 0 /* NONE */; + case "dashed": + return 2 /* DASHED */; + case "dotted": + return 3 /* DOTTED */; + case "double": + return 4 /* DOUBLE */; + } + return 1 /* SOLID */; + }, + }; + }; + var borderTopStyle = borderStyleForSide("top"); + var borderRightStyle = borderStyleForSide("right"); + var borderBottomStyle = borderStyleForSide("bottom"); + var borderLeftStyle = borderStyleForSide("left"); + + var borderWidthForSide = function (side) { + return { + name: "border-" + side + "-width", + initialValue: "0", + type: 0 /* VALUE */, + prefix: false, + parse: function (_context, token) { + if (isDimensionToken(token)) { + return token.number; + } + return 0; + }, + }; + }; + var borderTopWidth = borderWidthForSide("top"); + var borderRightWidth = borderWidthForSide("right"); + var borderBottomWidth = borderWidthForSide("bottom"); + var borderLeftWidth = borderWidthForSide("left"); + + var color = { + name: "color", + initialValue: "transparent", + prefix: false, + type: 3 /* TYPE_VALUE */, + format: "color", + }; + + var direction = { + name: "direction", + initialValue: "ltr", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, direction) { + switch (direction) { + case "rtl": + return 1 /* RTL */; + case "ltr": + default: + return 0 /* LTR */; + } + }, + }; + + var display = { + name: "display", + initialValue: "inline-block", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + return tokens.filter(isIdentToken).reduce(function (bit, token) { + return bit | parseDisplayValue(token.value); + }, 0 /* NONE */); + }, + }; + var parseDisplayValue = function (display) { + switch (display) { + case "block": + case "-webkit-box": + return 2 /* BLOCK */; + case "inline": + return 4 /* INLINE */; + case "run-in": + return 8 /* RUN_IN */; + case "flow": + return 16 /* FLOW */; + case "flow-root": + return 32 /* FLOW_ROOT */; + case "table": + return 64 /* TABLE */; + case "flex": + case "-webkit-flex": + return 128 /* FLEX */; + case "grid": + case "-ms-grid": + return 256 /* GRID */; + case "ruby": + return 512 /* RUBY */; + case "subgrid": + return 1024 /* SUBGRID */; + case "list-item": + return 2048 /* LIST_ITEM */; + case "table-row-group": + return 4096 /* TABLE_ROW_GROUP */; + case "table-header-group": + return 8192 /* TABLE_HEADER_GROUP */; + case "table-footer-group": + return 16384 /* TABLE_FOOTER_GROUP */; + case "table-row": + return 32768 /* TABLE_ROW */; + case "table-cell": + return 65536 /* TABLE_CELL */; + case "table-column-group": + return 131072 /* TABLE_COLUMN_GROUP */; + case "table-column": + return 262144 /* TABLE_COLUMN */; + case "table-caption": + return 524288 /* TABLE_CAPTION */; + case "ruby-base": + return 1048576 /* RUBY_BASE */; + case "ruby-text": + return 2097152 /* RUBY_TEXT */; + case "ruby-base-container": + return 4194304 /* RUBY_BASE_CONTAINER */; + case "ruby-text-container": + return 8388608 /* RUBY_TEXT_CONTAINER */; + case "contents": + return 16777216 /* CONTENTS */; + case "inline-block": + return 33554432 /* INLINE_BLOCK */; + case "inline-list-item": + return 67108864 /* INLINE_LIST_ITEM */; + case "inline-table": + return 134217728 /* INLINE_TABLE */; + case "inline-flex": + return 268435456 /* INLINE_FLEX */; + case "inline-grid": + return 536870912 /* INLINE_GRID */; + } + return 0 /* NONE */; + }; + + var float = { + name: "float", + initialValue: "none", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, float) { + switch (float) { + case "left": + return 1 /* LEFT */; + case "right": + return 2 /* RIGHT */; + case "inline-start": + return 3 /* INLINE_START */; + case "inline-end": + return 4 /* INLINE_END */; + } + return 0 /* NONE */; + }, + }; + + var letterSpacing = { + name: "letter-spacing", + initialValue: "0", + prefix: false, + type: 0 /* VALUE */, + parse: function (_context, token) { + if (token.type === 20 /* IDENT_TOKEN */ && token.value === "normal") { + return 0; + } + if (token.type === 17 /* NUMBER_TOKEN */) { + return token.number; + } + if (token.type === 15 /* DIMENSION_TOKEN */) { + return token.number; + } + return 0; + }, + }; + + var LINE_BREAK; + (function (LINE_BREAK) { + LINE_BREAK["NORMAL"] = "normal"; + LINE_BREAK["STRICT"] = "strict"; + })(LINE_BREAK || (LINE_BREAK = {})); + var lineBreak = { + name: "line-break", + initialValue: "normal", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, lineBreak) { + switch (lineBreak) { + case "strict": + return LINE_BREAK.STRICT; + case "normal": + default: + return LINE_BREAK.NORMAL; + } + }, + }; + + var lineHeight = { + name: "line-height", + initialValue: "normal", + prefix: false, + type: 4 /* TOKEN_VALUE */, + }; + var computeLineHeight = function (token, fontSize) { + if (isIdentToken(token) && token.value === "normal") { + return 1.2 * fontSize; + } else if (token.type === 17 /* NUMBER_TOKEN */) { + return fontSize * token.number; + } else if (isLengthPercentage(token)) { + return getAbsoluteValue(token, fontSize); + } + return fontSize; + }; + + var listStyleImage = { + name: "list-style-image", + initialValue: "none", + type: 0 /* VALUE */, + prefix: false, + parse: function (context, token) { + if (token.type === 20 /* IDENT_TOKEN */ && token.value === "none") { + return null; + } + return image.parse(context, token); + }, + }; + + var listStylePosition = { + name: "list-style-position", + initialValue: "outside", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, position) { + switch (position) { + case "inside": + return 0 /* INSIDE */; + case "outside": + default: + return 1 /* OUTSIDE */; + } + }, + }; + + var listStyleType = { + name: "list-style-type", + initialValue: "none", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, type) { + switch (type) { + case "disc": + return 0 /* DISC */; + case "circle": + return 1 /* CIRCLE */; + case "square": + return 2 /* SQUARE */; + case "decimal": + return 3 /* DECIMAL */; + case "cjk-decimal": + return 4 /* CJK_DECIMAL */; + case "decimal-leading-zero": + return 5 /* DECIMAL_LEADING_ZERO */; + case "lower-roman": + return 6 /* LOWER_ROMAN */; + case "upper-roman": + return 7 /* UPPER_ROMAN */; + case "lower-greek": + return 8 /* LOWER_GREEK */; + case "lower-alpha": + return 9 /* LOWER_ALPHA */; + case "upper-alpha": + return 10 /* UPPER_ALPHA */; + case "arabic-indic": + return 11 /* ARABIC_INDIC */; + case "armenian": + return 12 /* ARMENIAN */; + case "bengali": + return 13 /* BENGALI */; + case "cambodian": + return 14 /* CAMBODIAN */; + case "cjk-earthly-branch": + return 15 /* CJK_EARTHLY_BRANCH */; + case "cjk-heavenly-stem": + return 16 /* CJK_HEAVENLY_STEM */; + case "cjk-ideographic": + return 17 /* CJK_IDEOGRAPHIC */; + case "devanagari": + return 18 /* DEVANAGARI */; + case "ethiopic-numeric": + return 19 /* ETHIOPIC_NUMERIC */; + case "georgian": + return 20 /* GEORGIAN */; + case "gujarati": + return 21 /* GUJARATI */; + case "gurmukhi": + return 22 /* GURMUKHI */; + case "hebrew": + return 22 /* HEBREW */; + case "hiragana": + return 23 /* HIRAGANA */; + case "hiragana-iroha": + return 24 /* HIRAGANA_IROHA */; + case "japanese-formal": + return 25 /* JAPANESE_FORMAL */; + case "japanese-informal": + return 26 /* JAPANESE_INFORMAL */; + case "kannada": + return 27 /* KANNADA */; + case "katakana": + return 28 /* KATAKANA */; + case "katakana-iroha": + return 29 /* KATAKANA_IROHA */; + case "khmer": + return 30 /* KHMER */; + case "korean-hangul-formal": + return 31 /* KOREAN_HANGUL_FORMAL */; + case "korean-hanja-formal": + return 32 /* KOREAN_HANJA_FORMAL */; + case "korean-hanja-informal": + return 33 /* KOREAN_HANJA_INFORMAL */; + case "lao": + return 34 /* LAO */; + case "lower-armenian": + return 35 /* LOWER_ARMENIAN */; + case "malayalam": + return 36 /* MALAYALAM */; + case "mongolian": + return 37 /* MONGOLIAN */; + case "myanmar": + return 38 /* MYANMAR */; + case "oriya": + return 39 /* ORIYA */; + case "persian": + return 40 /* PERSIAN */; + case "simp-chinese-formal": + return 41 /* SIMP_CHINESE_FORMAL */; + case "simp-chinese-informal": + return 42 /* SIMP_CHINESE_INFORMAL */; + case "tamil": + return 43 /* TAMIL */; + case "telugu": + return 44 /* TELUGU */; + case "thai": + return 45 /* THAI */; + case "tibetan": + return 46 /* TIBETAN */; + case "trad-chinese-formal": + return 47 /* TRAD_CHINESE_FORMAL */; + case "trad-chinese-informal": + return 48 /* TRAD_CHINESE_INFORMAL */; + case "upper-armenian": + return 49 /* UPPER_ARMENIAN */; + case "disclosure-open": + return 50 /* DISCLOSURE_OPEN */; + case "disclosure-closed": + return 51 /* DISCLOSURE_CLOSED */; + case "none": + default: + return -1 /* NONE */; + } + }, + }; + + var marginForSide = function (side) { + return { + name: "margin-" + side, + initialValue: "0", + prefix: false, + type: 4 /* TOKEN_VALUE */, + }; + }; + var marginTop = marginForSide("top"); + var marginRight = marginForSide("right"); + var marginBottom = marginForSide("bottom"); + var marginLeft = marginForSide("left"); + + var overflow = { + name: "overflow", + initialValue: "visible", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + return tokens.filter(isIdentToken).map(function (overflow) { + switch (overflow.value) { + case "hidden": + return 1 /* HIDDEN */; + case "scroll": + return 2 /* SCROLL */; + case "clip": + return 3 /* CLIP */; + case "auto": + return 4 /* AUTO */; + case "visible": + default: + return 0 /* VISIBLE */; + } + }); + }, + }; + + var overflowWrap = { + name: "overflow-wrap", + initialValue: "normal", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, overflow) { + switch (overflow) { + case "break-word": + return "break-word" /* BREAK_WORD */; + case "normal": + default: + return "normal" /* NORMAL */; + } + }, + }; + + var paddingForSide = function (side) { + return { + name: "padding-" + side, + initialValue: "0", + prefix: false, + type: 3 /* TYPE_VALUE */, + format: "length-percentage", + }; + }; + var paddingTop = paddingForSide("top"); + var paddingRight = paddingForSide("right"); + var paddingBottom = paddingForSide("bottom"); + var paddingLeft = paddingForSide("left"); + + var textAlign = { + name: "text-align", + initialValue: "left", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, textAlign) { + switch (textAlign) { + case "right": + return 2 /* RIGHT */; + case "center": + case "justify": + return 1 /* CENTER */; + case "left": + default: + return 0 /* LEFT */; + } + }, + }; + + var position = { + name: "position", + initialValue: "static", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, position) { + switch (position) { + case "relative": + return 1 /* RELATIVE */; + case "absolute": + return 2 /* ABSOLUTE */; + case "fixed": + return 3 /* FIXED */; + case "sticky": + return 4 /* STICKY */; + } + return 0 /* STATIC */; + }, + }; + + var textShadow = { + name: "text-shadow", + initialValue: "none", + type: 1 /* LIST */, + prefix: false, + parse: function (context, tokens) { + if (tokens.length === 1 && isIdentWithValue(tokens[0], "none")) { + return []; + } + return parseFunctionArgs(tokens).map(function (values) { + var shadow = { + color: COLORS.TRANSPARENT, + offsetX: ZERO_LENGTH, + offsetY: ZERO_LENGTH, + blur: ZERO_LENGTH, + }; + var c = 0; + for (var i = 0; i < values.length; i++) { + var token = values[i]; + if (isLength(token)) { + if (c === 0) { + shadow.offsetX = token; + } else if (c === 1) { + shadow.offsetY = token; + } else { + shadow.blur = token; + } + c++; + } else { + shadow.color = color$1.parse(context, token); + } + } + return shadow; + }); + }, + }; + + var textTransform = { + name: "text-transform", + initialValue: "none", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, textTransform) { + switch (textTransform) { + case "uppercase": + return 2 /* UPPERCASE */; + case "lowercase": + return 1 /* LOWERCASE */; + case "capitalize": + return 3 /* CAPITALIZE */; + } + return 0 /* NONE */; + }, + }; + + var transform$1 = { + name: "transform", + initialValue: "none", + prefix: true, + type: 0 /* VALUE */, + parse: function (_context, token) { + if (token.type === 20 /* IDENT_TOKEN */ && token.value === "none") { + return null; + } + if (token.type === 18 /* FUNCTION */) { + var transformFunction = SUPPORTED_TRANSFORM_FUNCTIONS[token.name]; + if (typeof transformFunction === "undefined") { + throw new Error( + 'Attempting to parse an unsupported transform function "' + + token.name + + '"' + ); + } + return transformFunction(token.values); + } + return null; + }, + }; + var matrix = function (args) { + var values = args + .filter(function (arg) { + return arg.type === 17 /* NUMBER_TOKEN */; + }) + .map(function (arg) { + return arg.number; + }); + return values.length === 6 ? values : null; + }; + // doesn't support 3D transforms at the moment + var matrix3d = function (args) { + var values = args + .filter(function (arg) { + return arg.type === 17 /* NUMBER_TOKEN */; + }) + .map(function (arg) { + return arg.number; + }); + var a1 = values[0], + b1 = values[1]; + values[2]; + values[3]; + var a2 = values[4], + b2 = values[5]; + values[6]; + values[7]; + values[8]; + values[9]; + values[10]; + values[11]; + var a4 = values[12], + b4 = values[13]; + values[14]; + values[15]; + return values.length === 16 ? [a1, b1, a2, b2, a4, b4] : null; + }; + var SUPPORTED_TRANSFORM_FUNCTIONS = { + matrix: matrix, + matrix3d: matrix3d, + }; + + var DEFAULT_VALUE = { + type: 16 /* PERCENTAGE_TOKEN */, + number: 50, + flags: FLAG_INTEGER, + }; + var DEFAULT = [DEFAULT_VALUE, DEFAULT_VALUE]; + var transformOrigin = { + name: "transform-origin", + initialValue: "50% 50%", + prefix: true, + type: 1 /* LIST */, + parse: function (_context, tokens) { + var origins = tokens.filter(isLengthPercentage); + if (origins.length !== 2) { + return DEFAULT; + } + return [origins[0], origins[1]]; + }, + }; + + var visibility = { + name: "visible", + initialValue: "none", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, visibility) { + switch (visibility) { + case "hidden": + return 1 /* HIDDEN */; + case "collapse": + return 2 /* COLLAPSE */; + case "visible": + default: + return 0 /* VISIBLE */; + } + }, + }; + + var WORD_BREAK; + (function (WORD_BREAK) { + WORD_BREAK["NORMAL"] = "normal"; + WORD_BREAK["BREAK_ALL"] = "break-all"; + WORD_BREAK["KEEP_ALL"] = "keep-all"; + })(WORD_BREAK || (WORD_BREAK = {})); + var wordBreak = { + name: "word-break", + initialValue: "normal", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, wordBreak) { + switch (wordBreak) { + case "break-all": + return WORD_BREAK.BREAK_ALL; + case "keep-all": + return WORD_BREAK.KEEP_ALL; + case "normal": + default: + return WORD_BREAK.NORMAL; + } + }, + }; + + var zIndex = { + name: "z-index", + initialValue: "auto", + prefix: false, + type: 0 /* VALUE */, + parse: function (_context, token) { + if (token.type === 20 /* IDENT_TOKEN */) { + return { auto: true, order: 0 }; + } + if (isNumberToken(token)) { + return { auto: false, order: token.number }; + } + throw new Error("Invalid z-index number parsed"); + }, + }; + + var time = { + name: "time", + parse: function (_context, value) { + if (value.type === 15 /* DIMENSION_TOKEN */) { + switch (value.unit.toLowerCase()) { + case "s": + return 1000 * value.number; + case "ms": + return value.number; + } + } + throw new Error("Unsupported time type"); + }, + }; + + var opacity = { + name: "opacity", + initialValue: "1", + type: 0 /* VALUE */, + prefix: false, + parse: function (_context, token) { + if (isNumberToken(token)) { + return token.number; + } + return 1; + }, + }; + + var textDecorationColor = { + name: "text-decoration-color", + initialValue: "transparent", + prefix: false, + type: 3 /* TYPE_VALUE */, + format: "color", + }; + + var textDecorationLine = { + name: "text-decoration-line", + initialValue: "none", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + return tokens + .filter(isIdentToken) + .map(function (token) { + switch (token.value) { + case "underline": + return 1 /* UNDERLINE */; + case "overline": + return 2 /* OVERLINE */; + case "line-through": + return 3 /* LINE_THROUGH */; + case "none": + return 4 /* BLINK */; + } + return 0 /* NONE */; + }) + .filter(function (line) { + return line !== 0 /* NONE */; + }); + }, + }; + + var fontFamily = { + name: "font-family", + initialValue: "", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + var accumulator = []; + var results = []; + tokens.forEach(function (token) { + switch (token.type) { + case 20 /* IDENT_TOKEN */: + case 0 /* STRING_TOKEN */: + accumulator.push(token.value); + break; + case 17 /* NUMBER_TOKEN */: + accumulator.push(token.number.toString()); + break; + case 4 /* COMMA_TOKEN */: + results.push(accumulator.join(" ")); + accumulator.length = 0; + break; + } + }); + if (accumulator.length) { + results.push(accumulator.join(" ")); + } + return results.map(function (result) { + return result.indexOf(" ") === -1 ? result : "'" + result + "'"; + }); + }, + }; + + var fontSize = { + name: "font-size", + initialValue: "0", + prefix: false, + type: 3 /* TYPE_VALUE */, + format: "length", + }; + + var fontWeight = { + name: "font-weight", + initialValue: "normal", + type: 0 /* VALUE */, + prefix: false, + parse: function (_context, token) { + if (isNumberToken(token)) { + return token.number; + } + if (isIdentToken(token)) { + switch (token.value) { + case "bold": + return 700; + case "normal": + default: + return 400; + } + } + return 400; + }, + }; + + var fontVariant = { + name: "font-variant", + initialValue: "none", + type: 1 /* LIST */, + prefix: false, + parse: function (_context, tokens) { + return tokens.filter(isIdentToken).map(function (token) { + return token.value; + }); + }, + }; + + var fontStyle = { + name: "font-style", + initialValue: "normal", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, overflow) { + switch (overflow) { + case "oblique": + return "oblique" /* OBLIQUE */; + case "italic": + return "italic" /* ITALIC */; + case "normal": + default: + return "normal" /* NORMAL */; + } + }, + }; + + var contains = function (bit, value) { + return (bit & value) !== 0; + }; + + var content = { + name: "content", + initialValue: "none", + type: 1 /* LIST */, + prefix: false, + parse: function (_context, tokens) { + if (tokens.length === 0) { + return []; + } + var first = tokens[0]; + if (first.type === 20 /* IDENT_TOKEN */ && first.value === "none") { + return []; + } + return tokens; + }, + }; + + var counterIncrement = { + name: "counter-increment", + initialValue: "none", + prefix: true, + type: 1 /* LIST */, + parse: function (_context, tokens) { + if (tokens.length === 0) { + return null; + } + var first = tokens[0]; + if (first.type === 20 /* IDENT_TOKEN */ && first.value === "none") { + return null; + } + var increments = []; + var filtered = tokens.filter(nonWhiteSpace); + for (var i = 0; i < filtered.length; i++) { + var counter = filtered[i]; + var next = filtered[i + 1]; + if (counter.type === 20 /* IDENT_TOKEN */) { + var increment = next && isNumberToken(next) ? next.number : 1; + increments.push({ counter: counter.value, increment: increment }); + } + } + return increments; + }, + }; + + var counterReset = { + name: "counter-reset", + initialValue: "none", + prefix: true, + type: 1 /* LIST */, + parse: function (_context, tokens) { + if (tokens.length === 0) { + return []; + } + var resets = []; + var filtered = tokens.filter(nonWhiteSpace); + for (var i = 0; i < filtered.length; i++) { + var counter = filtered[i]; + var next = filtered[i + 1]; + if (isIdentToken(counter) && counter.value !== "none") { + var reset = next && isNumberToken(next) ? next.number : 0; + resets.push({ counter: counter.value, reset: reset }); + } + } + return resets; + }, + }; + + var duration = { + name: "duration", + initialValue: "0s", + prefix: false, + type: 1 /* LIST */, + parse: function (context, tokens) { + return tokens.filter(isDimensionToken).map(function (token) { + return time.parse(context, token); + }); + }, + }; + + var quotes = { + name: "quotes", + initialValue: "none", + prefix: true, + type: 1 /* LIST */, + parse: function (_context, tokens) { + if (tokens.length === 0) { + return null; + } + var first = tokens[0]; + if (first.type === 20 /* IDENT_TOKEN */ && first.value === "none") { + return null; + } + var quotes = []; + var filtered = tokens.filter(isStringToken); + if (filtered.length % 2 !== 0) { + return null; + } + for (var i = 0; i < filtered.length; i += 2) { + var open_1 = filtered[i].value; + var close_1 = filtered[i + 1].value; + quotes.push({ open: open_1, close: close_1 }); + } + return quotes; + }, + }; + var getQuote = function (quotes, depth, open) { + if (!quotes) { + return ""; + } + var quote = quotes[Math.min(depth, quotes.length - 1)]; + if (!quote) { + return ""; + } + return open ? quote.open : quote.close; + }; + + var boxShadow = { + name: "box-shadow", + initialValue: "none", + type: 1 /* LIST */, + prefix: false, + parse: function (context, tokens) { + if (tokens.length === 1 && isIdentWithValue(tokens[0], "none")) { + return []; + } + return parseFunctionArgs(tokens).map(function (values) { + var shadow = { + color: 0x000000ff, + offsetX: ZERO_LENGTH, + offsetY: ZERO_LENGTH, + blur: ZERO_LENGTH, + spread: ZERO_LENGTH, + inset: false, + }; + var c = 0; + for (var i = 0; i < values.length; i++) { + var token = values[i]; + if (isIdentWithValue(token, "inset")) { + shadow.inset = true; + } else if (isLength(token)) { + if (c === 0) { + shadow.offsetX = token; + } else if (c === 1) { + shadow.offsetY = token; + } else if (c === 2) { + shadow.blur = token; + } else { + shadow.spread = token; + } + c++; + } else { + shadow.color = color$1.parse(context, token); + } + } + return shadow; + }); + }, + }; + + var paintOrder = { + name: "paint-order", + initialValue: "normal", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + var DEFAULT_VALUE = [0 /* FILL */, 1 /* STROKE */, 2 /* MARKERS */]; + var layers = []; + tokens.filter(isIdentToken).forEach(function (token) { + switch (token.value) { + case "stroke": + layers.push(1 /* STROKE */); + break; + case "fill": + layers.push(0 /* FILL */); + break; + case "markers": + layers.push(2 /* MARKERS */); + break; + } + }); + DEFAULT_VALUE.forEach(function (value) { + if (layers.indexOf(value) === -1) { + layers.push(value); + } + }); + return layers; + }, + }; + + var webkitTextStrokeColor = { + name: "-webkit-text-stroke-color", + initialValue: "currentcolor", + prefix: false, + type: 3 /* TYPE_VALUE */, + format: "color", + }; + + var webkitTextStrokeWidth = { + name: "-webkit-text-stroke-width", + initialValue: "0", + type: 0 /* VALUE */, + prefix: false, + parse: function (_context, token) { + if (isDimensionToken(token)) { + return token.number; + } + return 0; + }, + }; + + var CSSParsedDeclaration = /** @class */ (function () { + function CSSParsedDeclaration(context, declaration) { + var _a, _b; + this.animationDuration = parse( + context, + duration, + declaration.animationDuration + ); + this.backgroundClip = parse( + context, + backgroundClip, + declaration.backgroundClip + ); + this.backgroundColor = parse( + context, + backgroundColor, + declaration.backgroundColor + ); + this.backgroundImage = parse( + context, + backgroundImage, + declaration.backgroundImage + ); + this.backgroundOrigin = parse( + context, + backgroundOrigin, + declaration.backgroundOrigin + ); + this.backgroundPosition = parse( + context, + backgroundPosition, + declaration.backgroundPosition + ); + this.backgroundRepeat = parse( + context, + backgroundRepeat, + declaration.backgroundRepeat + ); + this.backgroundSize = parse( + context, + backgroundSize, + declaration.backgroundSize + ); + this.borderTopColor = parse( + context, + borderTopColor, + declaration.borderTopColor + ); + this.borderRightColor = parse( + context, + borderRightColor, + declaration.borderRightColor + ); + this.borderBottomColor = parse( + context, + borderBottomColor, + declaration.borderBottomColor + ); + this.borderLeftColor = parse( + context, + borderLeftColor, + declaration.borderLeftColor + ); + this.borderTopLeftRadius = parse( + context, + borderTopLeftRadius, + declaration.borderTopLeftRadius + ); + this.borderTopRightRadius = parse( + context, + borderTopRightRadius, + declaration.borderTopRightRadius + ); + this.borderBottomRightRadius = parse( + context, + borderBottomRightRadius, + declaration.borderBottomRightRadius + ); + this.borderBottomLeftRadius = parse( + context, + borderBottomLeftRadius, + declaration.borderBottomLeftRadius + ); + this.borderTopStyle = parse( + context, + borderTopStyle, + declaration.borderTopStyle + ); + this.borderRightStyle = parse( + context, + borderRightStyle, + declaration.borderRightStyle + ); + this.borderBottomStyle = parse( + context, + borderBottomStyle, + declaration.borderBottomStyle + ); + this.borderLeftStyle = parse( + context, + borderLeftStyle, + declaration.borderLeftStyle + ); + this.borderTopWidth = parse( + context, + borderTopWidth, + declaration.borderTopWidth + ); + this.borderRightWidth = parse( + context, + borderRightWidth, + declaration.borderRightWidth + ); + this.borderBottomWidth = parse( + context, + borderBottomWidth, + declaration.borderBottomWidth + ); + this.borderLeftWidth = parse( + context, + borderLeftWidth, + declaration.borderLeftWidth + ); + this.boxShadow = parse(context, boxShadow, declaration.boxShadow); + this.color = parse(context, color, declaration.color); + this.direction = parse(context, direction, declaration.direction); + this.display = parse(context, display, declaration.display); + this.float = parse(context, float, declaration.cssFloat); + this.fontFamily = parse(context, fontFamily, declaration.fontFamily); + this.fontSize = parse(context, fontSize, declaration.fontSize); + this.fontStyle = parse(context, fontStyle, declaration.fontStyle); + this.fontVariant = parse( + context, + fontVariant, + declaration.fontVariant + ); + this.fontWeight = parse(context, fontWeight, declaration.fontWeight); + this.letterSpacing = parse( + context, + letterSpacing, + declaration.letterSpacing + ); + this.lineBreak = parse(context, lineBreak, declaration.lineBreak); + this.lineHeight = parse(context, lineHeight, declaration.lineHeight); + this.listStyleImage = parse( + context, + listStyleImage, + declaration.listStyleImage + ); + this.listStylePosition = parse( + context, + listStylePosition, + declaration.listStylePosition + ); + this.listStyleType = parse( + context, + listStyleType, + declaration.listStyleType + ); + this.marginTop = parse(context, marginTop, declaration.marginTop); + this.marginRight = parse( + context, + marginRight, + declaration.marginRight + ); + this.marginBottom = parse( + context, + marginBottom, + declaration.marginBottom + ); + this.marginLeft = parse(context, marginLeft, declaration.marginLeft); + this.opacity = parse(context, opacity, declaration.opacity); + var overflowTuple = parse(context, overflow, declaration.overflow); + this.overflowX = overflowTuple[0]; + this.overflowY = overflowTuple[overflowTuple.length > 1 ? 1 : 0]; + this.overflowWrap = parse( + context, + overflowWrap, + declaration.overflowWrap + ); + this.paddingTop = parse(context, paddingTop, declaration.paddingTop); + this.paddingRight = parse( + context, + paddingRight, + declaration.paddingRight + ); + this.paddingBottom = parse( + context, + paddingBottom, + declaration.paddingBottom + ); + this.paddingLeft = parse( + context, + paddingLeft, + declaration.paddingLeft + ); + this.paintOrder = parse(context, paintOrder, declaration.paintOrder); + this.position = parse(context, position, declaration.position); + this.textAlign = parse(context, textAlign, declaration.textAlign); + this.textDecorationColor = parse( + context, + textDecorationColor, + (_a = declaration.textDecorationColor) !== null && _a !== void 0 + ? _a + : declaration.color + ); + this.textDecorationLine = parse( + context, + textDecorationLine, + (_b = declaration.textDecorationLine) !== null && _b !== void 0 + ? _b + : declaration.textDecoration + ); + this.textShadow = parse(context, textShadow, declaration.textShadow); + this.textTransform = parse( + context, + textTransform, + declaration.textTransform + ); + this.transform = parse(context, transform$1, declaration.transform); + this.transformOrigin = parse( + context, + transformOrigin, + declaration.transformOrigin + ); + this.visibility = parse(context, visibility, declaration.visibility); + this.webkitTextStrokeColor = parse( + context, + webkitTextStrokeColor, + declaration.webkitTextStrokeColor + ); + this.webkitTextStrokeWidth = parse( + context, + webkitTextStrokeWidth, + declaration.webkitTextStrokeWidth + ); + this.wordBreak = parse(context, wordBreak, declaration.wordBreak); + this.zIndex = parse(context, zIndex, declaration.zIndex); + } + CSSParsedDeclaration.prototype.isVisible = function () { + return ( + this.display > 0 && + this.opacity > 0 && + this.visibility === 0 /* VISIBLE */ + ); + }; + CSSParsedDeclaration.prototype.isTransparent = function () { + return isTransparent(this.backgroundColor); + }; + CSSParsedDeclaration.prototype.isTransformed = function () { + return this.transform !== null; + }; + CSSParsedDeclaration.prototype.isPositioned = function () { + return this.position !== 0 /* STATIC */; + }; + CSSParsedDeclaration.prototype.isPositionedWithZIndex = function () { + return this.isPositioned() && !this.zIndex.auto; + }; + CSSParsedDeclaration.prototype.isFloating = function () { + return this.float !== 0 /* NONE */; + }; + CSSParsedDeclaration.prototype.isInlineLevel = function () { + return ( + contains(this.display, 4 /* INLINE */) || + contains(this.display, 33554432 /* INLINE_BLOCK */) || + contains(this.display, 268435456 /* INLINE_FLEX */) || + contains(this.display, 536870912 /* INLINE_GRID */) || + contains(this.display, 67108864 /* INLINE_LIST_ITEM */) || + contains(this.display, 134217728 /* INLINE_TABLE */) + ); + }; + return CSSParsedDeclaration; + })(); + var CSSParsedPseudoDeclaration = /** @class */ (function () { + function CSSParsedPseudoDeclaration(context, declaration) { + this.content = parse(context, content, declaration.content); + this.quotes = parse(context, quotes, declaration.quotes); + } + return CSSParsedPseudoDeclaration; + })(); + var CSSParsedCounterDeclaration = /** @class */ (function () { + function CSSParsedCounterDeclaration(context, declaration) { + this.counterIncrement = parse( + context, + counterIncrement, + declaration.counterIncrement + ); + this.counterReset = parse( + context, + counterReset, + declaration.counterReset + ); + } + return CSSParsedCounterDeclaration; + })(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var parse = function (context, descriptor, style) { + var tokenizer = new Tokenizer(); + var value = + style !== null && typeof style !== "undefined" + ? style.toString() + : descriptor.initialValue; + tokenizer.write(value); + var parser = new Parser(tokenizer.read()); + switch (descriptor.type) { + case 2 /* IDENT_VALUE */: + var token = parser.parseComponentValue(); + return descriptor.parse( + context, + isIdentToken(token) ? token.value : descriptor.initialValue + ); + case 0 /* VALUE */: + return descriptor.parse(context, parser.parseComponentValue()); + case 1 /* LIST */: + return descriptor.parse(context, parser.parseComponentValues()); + case 4 /* TOKEN_VALUE */: + return parser.parseComponentValue(); + case 3 /* TYPE_VALUE */: + switch (descriptor.format) { + case "angle": + return angle.parse(context, parser.parseComponentValue()); + case "color": + return color$1.parse(context, parser.parseComponentValue()); + case "image": + return image.parse(context, parser.parseComponentValue()); + case "length": + var length_1 = parser.parseComponentValue(); + return isLength(length_1) ? length_1 : ZERO_LENGTH; + case "length-percentage": + var value_1 = parser.parseComponentValue(); + return isLengthPercentage(value_1) ? value_1 : ZERO_LENGTH; + case "time": + return time.parse(context, parser.parseComponentValue()); + } + break; + } + }; + + var elementDebuggerAttribute = "data-html2canvas-debug"; + var getElementDebugType = function (element) { + var attribute = element.getAttribute(elementDebuggerAttribute); + switch (attribute) { + case "all": + return 1 /* ALL */; + case "clone": + return 2 /* CLONE */; + case "parse": + return 3 /* PARSE */; + case "render": + return 4 /* RENDER */; + default: + return 0 /* NONE */; + } + }; + var isDebugging = function (element, type) { + var elementType = getElementDebugType(element); + return elementType === 1 /* ALL */ || type === elementType; + }; + + var ElementContainer = /** @class */ (function () { + function ElementContainer(context, element) { + this.context = context; + this.textNodes = []; + this.elements = []; + this.flags = 0; + if (isDebugging(element, 3 /* PARSE */)) { + debugger; + } + this.styles = new CSSParsedDeclaration( + context, + window.getComputedStyle(element, null) + ); + if (isHTMLElementNode(element)) { + if ( + this.styles.animationDuration.some(function (duration) { + return duration > 0; + }) + ) { + element.style.animationDuration = "0s"; + } + if (this.styles.transform !== null) { + // getBoundingClientRect takes transforms into account + element.style.transform = "none"; + } + } + this.bounds = parseBounds(this.context, element); + if (isDebugging(element, 4 /* RENDER */)) { + this.flags |= 16 /* DEBUG_RENDER */; + } + } + return ElementContainer; + })(); + + /* + * text-segmentation 1.0.3 + * Copyright (c) 2022 Niklas von Hertzen + * Released under MIT License + */ + var base64 = + "AAAAAAAAAAAAEA4AGBkAAFAaAAACAAAAAAAIABAAGAAwADgACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAAQABIAEQATAAIABAACAAQAAgAEAAIABAAVABcAAgAEAAIABAACAAQAGAAaABwAHgAgACIAI4AlgAIABAAmwCjAKgAsAC2AL4AvQDFAMoA0gBPAVYBWgEIAAgACACMANoAYgFkAWwBdAF8AX0BhQGNAZUBlgGeAaMBlQGWAasBswF8AbsBwwF0AcsBYwHTAQgA2wG/AOMBdAF8AekB8QF0AfkB+wHiAHQBfAEIAAMC5gQIAAsCEgIIAAgAFgIeAggAIgIpAggAMQI5AkACygEIAAgASAJQAlgCYAIIAAgACAAKBQoFCgUTBRMFGQUrBSsFCAAIAAgACAAIAAgACAAIAAgACABdAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABoAmgCrwGvAQgAbgJ2AggAHgEIAAgACADnAXsCCAAIAAgAgwIIAAgACAAIAAgACACKAggAkQKZAggAPADJAAgAoQKkAqwCsgK6AsICCADJAggA0AIIAAgACAAIANYC3gIIAAgACAAIAAgACABAAOYCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAkASoB+QIEAAgACAA8AEMCCABCBQgACABJBVAFCAAIAAgACAAIAAgACAAIAAgACABTBVoFCAAIAFoFCABfBWUFCAAIAAgACAAIAAgAbQUIAAgACAAIAAgACABzBXsFfQWFBYoFigWKBZEFigWKBYoFmAWfBaYFrgWxBbkFCAAIAAgACAAIAAgACAAIAAgACAAIAMEFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAMgFCADQBQgACAAIAAgACAAIAAgACAAIAAgACAAIAO4CCAAIAAgAiQAIAAgACABAAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAD0AggACAD8AggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIANYFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAMDvwAIAAgAJAIIAAgACAAIAAgACAAIAAgACwMTAwgACAB9BOsEGwMjAwgAKwMyAwsFYgE3A/MEPwMIAEUDTQNRAwgAWQOsAGEDCAAIAAgACAAIAAgACABpAzQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFIQUoBSwFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABtAwgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABMAEwACAAIAAgACAAIABgACAAIAAgACAC/AAgACAAyAQgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACACAAIAAwAAgACAAIAAgACAAIAAgACAAIAAAARABIAAgACAAIABQASAAIAAgAIABwAEAAjgCIABsAqAC2AL0AigDQAtwC+IJIQqVAZUBWQqVAZUBlQGVAZUBlQGrC5UBlQGVAZUBlQGVAZUBlQGVAXsKlQGVAbAK6wsrDGUMpQzlDJUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAfAKAAuZA64AtwCJALoC6ADwAAgAuACgA/oEpgO6AqsD+AAIAAgAswMIAAgACAAIAIkAuwP5AfsBwwPLAwgACAAIAAgACADRA9kDCAAIAOED6QMIAAgACAAIAAgACADuA/YDCAAIAP4DyQAIAAgABgQIAAgAXQAOBAgACAAIAAgACAAIABMECAAIAAgACAAIAAgACAD8AAQBCAAIAAgAGgQiBCoECAExBAgAEAEIAAgACAAIAAgACAAIAAgACAAIAAgACAA4BAgACABABEYECAAIAAgATAQYAQgAVAQIAAgACAAIAAgACAAIAAgACAAIAFoECAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAOQEIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAB+BAcACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEABhgSMBAgACAAIAAgAlAQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAwAEAAQABAADAAMAAwADAAQABAAEAAQABAAEAAQABHATAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAdQMIAAgACAAIAAgACAAIAMkACAAIAAgAfQMIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACACFA4kDCAAIAAgACAAIAOcBCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAIcDCAAIAAgACAAIAAgACAAIAAgACAAIAJEDCAAIAAgACADFAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABgBAgAZgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAbAQCBXIECAAIAHkECAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAJwEQACjBKoEsgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAC6BMIECAAIAAgACAAIAAgACABmBAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAxwQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAGYECAAIAAgAzgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAigWKBYoFigWKBYoFigWKBd0FXwUIAOIF6gXxBYoF3gT5BQAGCAaKBYoFigWKBYoFigWKBYoFigWKBYoFigXWBIoFigWKBYoFigWKBYoFigWKBYsFEAaKBYoFigWKBYoFigWKBRQGCACKBYoFigWKBQgACAAIANEECAAIABgGigUgBggAJgYIAC4GMwaKBYoF0wQ3Bj4GigWKBYoFigWKBYoFigWKBYoFigWKBYoFigUIAAgACAAIAAgACAAIAAgAigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWLBf///////wQABAAEAAQABAAEAAQABAAEAAQAAwAEAAQAAgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAQADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAUAAAAFAAUAAAAFAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUAAQAAAAUABQAFAAUABQAFAAAAAAAFAAUAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAFAAUAAQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUABQAFAAAABwAHAAcAAAAHAAcABwAFAAEAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAcABwAFAAUAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQABAAAAAAAAAAAAAAAFAAUABQAFAAAABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABwAHAAcAAAAHAAcAAAAAAAUABQAHAAUAAQAHAAEABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABwABAAUABQAFAAUAAAAAAAAAAAAAAAEAAQABAAEAAQABAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABQANAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAABQAHAAUABQAFAAAAAAAAAAcABQAFAAUABQAFAAQABAAEAAQABAAEAAQABAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUAAAAFAAUABQAFAAUAAAAFAAUABQAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAAAAAAAAAAAAUABQAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAUAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABwAHAAcABwAFAAcABwAAAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUABwAHAAUABQAFAAUAAAAAAAcABwAAAAAABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAABQAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABwAHAAcABQAFAAAAAAAAAAAABQAFAAAAAAAFAAUABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAFAAUABQAFAAUAAAAFAAUABwAAAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAUABwAFAAUABQAFAAAAAAAHAAcAAAAAAAcABwAFAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABwAAAAAAAAAHAAcABwAAAAcABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAABQAHAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAcABwAAAAUABQAFAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABQAHAAcABQAHAAcAAAAFAAcABwAAAAcABwAFAAUAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAFAAcABwAFAAUABQAAAAUAAAAHAAcABwAHAAcABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAHAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABwAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAFAAAAAAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUABQAFAAUAAAAFAAUAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABwAFAAUABQAFAAUABQAAAAUABQAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABQAFAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABQAFAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAHAAUABQAFAAUABQAFAAUABwAHAAcABwAHAAcABwAHAAUABwAHAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABwAHAAcABwAFAAUABwAHAAcAAAAAAAAAAAAHAAcABQAHAAcABwAHAAcABwAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAHAAUABQAFAAUABQAFAAUAAAAFAAAABQAAAAAABQAFAAUABQAFAAUABQAFAAcABwAHAAcABwAHAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAUABQAFAAUABQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABwAFAAcABwAHAAcABwAFAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAUABQAFAAUABwAHAAUABQAHAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABQAFAAcABwAHAAUABwAFAAUABQAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAUABQAFAAUABQAFAAUABQAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAcABQAFAAUABQAFAAUABQAAAAAAAAAAAAUAAAAAAAAAAAAAAAAABQAAAAAABwAFAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUAAAAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAUABQAHAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABwAFAAUABQAFAAcABwAFAAUABwAHAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAcABwAFAAUABwAHAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAUABQAAAAAABQAFAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAFAAcABwAAAAAAAAAAAAAABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAFAAcABwAFAAcABwAAAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAFAAUABQAAAAUABQAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABwAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABQAFAAUABQAFAAUABQAFAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAHAAcABQAHAAUABQAAAAAAAAAAAAAAAAAFAAAABwAHAAcABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAcABwAAAAAABwAHAAAAAAAHAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABwAHAAUABQAFAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABQAFAAUABQAFAAUABwAFAAcABwAFAAcABQAFAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABQAFAAUABQAAAAAABwAHAAcABwAFAAUABwAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAHAAUABQAFAAUABQAFAAUABQAHAAcABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAFAAcABwAFAAUABQAFAAUABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAcABwAFAAUABQAFAAcABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABQAHAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAAAAAAFAAUABwAHAAcABwAFAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABwAHAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAHAAUABQAFAAUABQAFAAUABwAFAAUABwAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAAAAAAAABQAAAAUABQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAHAAcAAAAFAAUAAAAHAAcABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAAAAAAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAUABQAFAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAABQAFAAUABQAFAAUABQAAAAUABQAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAFAAUABQAFAAUADgAOAA4ADgAOAA4ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAAAAAAAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAMAAwADAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAAAAAAAAAAAAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAAAAAAAAAAAAsADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwACwAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAADgAOAA4AAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAAAA4ADgAOAA4ADgAOAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAA4AAAAOAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAADgAAAAAAAAAAAA4AAAAOAAAAAAAAAAAADgAOAA4AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAA4ADgAOAA4ADgAOAA4ADgAOAAAADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4AAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAOAA4ADgAOAA4ADgAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAAAAAAA="; + + /* + * utrie 1.0.2 + * Copyright (c) 2022 Niklas von Hertzen + * Released under MIT License + */ + var chars$1 = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + // Use a lookup table to find the index. + var lookup$1 = + typeof Uint8Array === "undefined" ? [] : new Uint8Array(256); + for (var i$1 = 0; i$1 < chars$1.length; i$1++) { + lookup$1[chars$1.charCodeAt(i$1)] = i$1; + } + var decode = function (base64) { + var bufferLength = base64.length * 0.75, + len = base64.length, + i, + p = 0, + encoded1, + encoded2, + encoded3, + encoded4; + if (base64[base64.length - 1] === "=") { + bufferLength--; + if (base64[base64.length - 2] === "=") { + bufferLength--; + } + } + var buffer = + typeof ArrayBuffer !== "undefined" && + typeof Uint8Array !== "undefined" && + typeof Uint8Array.prototype.slice !== "undefined" + ? new ArrayBuffer(bufferLength) + : new Array(bufferLength); + var bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer); + for (i = 0; i < len; i += 4) { + encoded1 = lookup$1[base64.charCodeAt(i)]; + encoded2 = lookup$1[base64.charCodeAt(i + 1)]; + encoded3 = lookup$1[base64.charCodeAt(i + 2)]; + encoded4 = lookup$1[base64.charCodeAt(i + 3)]; + bytes[p++] = (encoded1 << 2) | (encoded2 >> 4); + bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2); + bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63); + } + return buffer; + }; + var polyUint16Array = function (buffer) { + var length = buffer.length; + var bytes = []; + for (var i = 0; i < length; i += 2) { + bytes.push((buffer[i + 1] << 8) | buffer[i]); + } + return bytes; + }; + var polyUint32Array = function (buffer) { + var length = buffer.length; + var bytes = []; + for (var i = 0; i < length; i += 4) { + bytes.push( + (buffer[i + 3] << 24) | + (buffer[i + 2] << 16) | + (buffer[i + 1] << 8) | + buffer[i] + ); + } + return bytes; + }; + + /** Shift size for getting the index-2 table offset. */ + var UTRIE2_SHIFT_2 = 5; + /** Shift size for getting the index-1 table offset. */ + var UTRIE2_SHIFT_1 = 6 + 5; + /** + * Shift size for shifting left the index array values. + * Increases possible data size with 16-bit index values at the cost + * of compactability. + * This requires data blocks to be aligned by UTRIE2_DATA_GRANULARITY. + */ + var UTRIE2_INDEX_SHIFT = 2; + /** + * Difference between the two shift sizes, + * for getting an index-1 offset from an index-2 offset. 6=11-5 + */ + var UTRIE2_SHIFT_1_2 = UTRIE2_SHIFT_1 - UTRIE2_SHIFT_2; + /** + * The part of the index-2 table for U+D800..U+DBFF stores values for + * lead surrogate code _units_ not code _points_. + * Values for lead surrogate code _points_ are indexed with this portion of the table. + * Length=32=0x20=0x400>>UTRIE2_SHIFT_2. (There are 1024=0x400 lead surrogates.) + */ + var UTRIE2_LSCP_INDEX_2_OFFSET = 0x10000 >> UTRIE2_SHIFT_2; + /** Number of entries in a data block. 32=0x20 */ + var UTRIE2_DATA_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_2; + /** Mask for getting the lower bits for the in-data-block offset. */ + var UTRIE2_DATA_MASK = UTRIE2_DATA_BLOCK_LENGTH - 1; + var UTRIE2_LSCP_INDEX_2_LENGTH = 0x400 >> UTRIE2_SHIFT_2; + /** Count the lengths of both BMP pieces. 2080=0x820 */ + var UTRIE2_INDEX_2_BMP_LENGTH = + UTRIE2_LSCP_INDEX_2_OFFSET + UTRIE2_LSCP_INDEX_2_LENGTH; + /** + * The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820. + * Length 32=0x20 for lead bytes C0..DF, regardless of UTRIE2_SHIFT_2. + */ + var UTRIE2_UTF8_2B_INDEX_2_OFFSET = UTRIE2_INDEX_2_BMP_LENGTH; + var UTRIE2_UTF8_2B_INDEX_2_LENGTH = + 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */ + /** + * The index-1 table, only used for supplementary code points, at offset 2112=0x840. + * Variable length, for code points up to highStart, where the last single-value range starts. + * Maximum length 512=0x200=0x100000>>UTRIE2_SHIFT_1. + * (For 0x100000 supplementary code points U+10000..U+10ffff.) + * + * The part of the index-2 table for supplementary code points starts + * after this index-1 table. + * + * Both the index-1 table and the following part of the index-2 table + * are omitted completely if there is only BMP data. + */ + var UTRIE2_INDEX_1_OFFSET = + UTRIE2_UTF8_2B_INDEX_2_OFFSET + UTRIE2_UTF8_2B_INDEX_2_LENGTH; + /** + * Number of index-1 entries for the BMP. 32=0x20 + * This part of the index-1 table is omitted from the serialized form. + */ + var UTRIE2_OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> UTRIE2_SHIFT_1; + /** Number of entries in an index-2 block. 64=0x40 */ + var UTRIE2_INDEX_2_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_1_2; + /** Mask for getting the lower bits for the in-index-2-block offset. */ + var UTRIE2_INDEX_2_MASK = UTRIE2_INDEX_2_BLOCK_LENGTH - 1; + var slice16 = function (view, start, end) { + if (view.slice) { + return view.slice(start, end); + } + return new Uint16Array(Array.prototype.slice.call(view, start, end)); + }; + var slice32 = function (view, start, end) { + if (view.slice) { + return view.slice(start, end); + } + return new Uint32Array(Array.prototype.slice.call(view, start, end)); + }; + var createTrieFromBase64 = function (base64, _byteLength) { + var buffer = decode(base64); + var view32 = Array.isArray(buffer) + ? polyUint32Array(buffer) + : new Uint32Array(buffer); + var view16 = Array.isArray(buffer) + ? polyUint16Array(buffer) + : new Uint16Array(buffer); + var headerLength = 24; + var index = slice16(view16, headerLength / 2, view32[4] / 2); + var data = + view32[5] === 2 + ? slice16(view16, (headerLength + view32[4]) / 2) + : slice32(view32, Math.ceil((headerLength + view32[4]) / 4)); + return new Trie( + view32[0], + view32[1], + view32[2], + view32[3], + index, + data + ); + }; + var Trie = /** @class */ (function () { + function Trie( + initialValue, + errorValue, + highStart, + highValueIndex, + index, + data + ) { + this.initialValue = initialValue; + this.errorValue = errorValue; + this.highStart = highStart; + this.highValueIndex = highValueIndex; + this.index = index; + this.data = data; + } + /** + * Get the value for a code point as stored in the Trie. + * + * @param codePoint the code point + * @return the value + */ + Trie.prototype.get = function (codePoint) { + var ix; + if (codePoint >= 0) { + if ( + codePoint < 0x0d800 || + (codePoint > 0x0dbff && codePoint <= 0x0ffff) + ) { + // Ordinary BMP code point, excluding leading surrogates. + // BMP uses a single level lookup. BMP index starts at offset 0 in the Trie2 index. + // 16 bit data is stored in the index array itself. + ix = this.index[codePoint >> UTRIE2_SHIFT_2]; + ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK); + return this.data[ix]; + } + if (codePoint <= 0xffff) { + // Lead Surrogate Code Point. A Separate index section is stored for + // lead surrogate code units and code points. + // The main index has the code unit data. + // For this function, we need the code point data. + // Note: this expression could be refactored for slightly improved efficiency, but + // surrogate code points will be so rare in practice that it's not worth it. + ix = + this.index[ + UTRIE2_LSCP_INDEX_2_OFFSET + + ((codePoint - 0xd800) >> UTRIE2_SHIFT_2) + ]; + ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK); + return this.data[ix]; + } + if (codePoint < this.highStart) { + // Supplemental code point, use two-level lookup. + ix = + UTRIE2_INDEX_1_OFFSET - + UTRIE2_OMITTED_BMP_INDEX_1_LENGTH + + (codePoint >> UTRIE2_SHIFT_1); + ix = this.index[ix]; + ix += (codePoint >> UTRIE2_SHIFT_2) & UTRIE2_INDEX_2_MASK; + ix = this.index[ix]; + ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK); + return this.data[ix]; + } + if (codePoint <= 0x10ffff) { + return this.data[this.highValueIndex]; + } + } + // Fall through. The code point is outside of the legal range of 0..0x10ffff. + return this.errorValue; + }; + return Trie; + })(); + + /* + * base64-arraybuffer 1.0.2 + * Copyright (c) 2022 Niklas von Hertzen + * Released under MIT License + */ + var chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + // Use a lookup table to find the index. + var lookup = typeof Uint8Array === "undefined" ? [] : new Uint8Array(256); + for (var i = 0; i < chars.length; i++) { + lookup[chars.charCodeAt(i)] = i; + } + + var Prepend = 1; + var CR = 2; + var LF = 3; + var Control = 4; + var Extend = 5; + var SpacingMark = 7; + var L = 8; + var V = 9; + var T = 10; + var LV = 11; + var LVT = 12; + var ZWJ = 13; + var Extended_Pictographic = 14; + var RI = 15; + var toCodePoints = function (str) { + var codePoints = []; + var i = 0; + var length = str.length; + while (i < length) { + var value = str.charCodeAt(i++); + if (value >= 0xd800 && value <= 0xdbff && i < length) { + var extra = str.charCodeAt(i++); + if ((extra & 0xfc00) === 0xdc00) { + codePoints.push( + ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000 + ); + } else { + codePoints.push(value); + i--; + } + } else { + codePoints.push(value); + } + } + return codePoints; + }; + var fromCodePoint = function () { + var codePoints = []; + for (var _i = 0; _i < arguments.length; _i++) { + codePoints[_i] = arguments[_i]; + } + if (String.fromCodePoint) { + return String.fromCodePoint.apply(String, codePoints); + } + var length = codePoints.length; + if (!length) { + return ""; + } + var codeUnits = []; + var index = -1; + var result = ""; + while (++index < length) { + var codePoint = codePoints[index]; + if (codePoint <= 0xffff) { + codeUnits.push(codePoint); + } else { + codePoint -= 0x10000; + codeUnits.push( + (codePoint >> 10) + 0xd800, + (codePoint % 0x400) + 0xdc00 + ); + } + if (index + 1 === length || codeUnits.length > 0x4000) { + result += String.fromCharCode.apply(String, codeUnits); + codeUnits.length = 0; + } + } + return result; + }; + var UnicodeTrie = createTrieFromBase64(base64); + var BREAK_NOT_ALLOWED = "×"; + var BREAK_ALLOWED = "÷"; + var codePointToClass = function (codePoint) { + return UnicodeTrie.get(codePoint); + }; + var _graphemeBreakAtIndex = function (_codePoints, classTypes, index) { + var prevIndex = index - 2; + var prev = classTypes[prevIndex]; + var current = classTypes[index - 1]; + var next = classTypes[index]; + // GB3 Do not break between a CR and LF + if (current === CR && next === LF) { + return BREAK_NOT_ALLOWED; + } + // GB4 Otherwise, break before and after controls. + if (current === CR || current === LF || current === Control) { + return BREAK_ALLOWED; + } + // GB5 + if (next === CR || next === LF || next === Control) { + return BREAK_ALLOWED; + } + // Do not break Hangul syllable sequences. + // GB6 + if (current === L && [L, V, LV, LVT].indexOf(next) !== -1) { + return BREAK_NOT_ALLOWED; + } + // GB7 + if ((current === LV || current === V) && (next === V || next === T)) { + return BREAK_NOT_ALLOWED; + } + // GB8 + if ((current === LVT || current === T) && next === T) { + return BREAK_NOT_ALLOWED; + } + // GB9 Do not break before extending characters or ZWJ. + if (next === ZWJ || next === Extend) { + return BREAK_NOT_ALLOWED; + } + // Do not break before SpacingMarks, or after Prepend characters. + // GB9a + if (next === SpacingMark) { + return BREAK_NOT_ALLOWED; + } + // GB9a + if (current === Prepend) { + return BREAK_NOT_ALLOWED; + } + // GB11 Do not break within emoji modifier sequences or emoji zwj sequences. + if (current === ZWJ && next === Extended_Pictographic) { + while (prev === Extend) { + prev = classTypes[--prevIndex]; + } + if (prev === Extended_Pictographic) { + return BREAK_NOT_ALLOWED; + } + } + // GB12 Do not break within emoji flag sequences. + // That is, do not break between regional indicator (RI) symbols + // if there is an odd number of RI characters before the break point. + if (current === RI && next === RI) { + var countRI = 0; + while (prev === RI) { + countRI++; + prev = classTypes[--prevIndex]; + } + if (countRI % 2 === 0) { + return BREAK_NOT_ALLOWED; + } + } + return BREAK_ALLOWED; + }; + var GraphemeBreaker = function (str) { + var codePoints = toCodePoints(str); + var length = codePoints.length; + var index = 0; + var lastEnd = 0; + var classTypes = codePoints.map(codePointToClass); + return { + next: function () { + if (index >= length) { + return { done: true, value: null }; + } + var graphemeBreak = BREAK_NOT_ALLOWED; + while ( + index < length && + (graphemeBreak = _graphemeBreakAtIndex( + codePoints, + classTypes, + ++index + )) === BREAK_NOT_ALLOWED + ) {} + if (graphemeBreak !== BREAK_NOT_ALLOWED || index === length) { + var value = fromCodePoint.apply( + null, + codePoints.slice(lastEnd, index) + ); + lastEnd = index; + return { value: value, done: false }; + } + return { done: true, value: null }; + }, + }; + }; + var splitGraphemes = function (str) { + var breaker = GraphemeBreaker(str); + var graphemes = []; + var bk; + while (!(bk = breaker.next()).done) { + if (bk.value) { + graphemes.push(bk.value.slice()); + } + } + return graphemes; + }; + + var testRangeBounds = function (document) { + var TEST_HEIGHT = 123; + if (document.createRange) { + var range = document.createRange(); + if (range.getBoundingClientRect) { + var testElement = document.createElement("boundtest"); + testElement.style.height = TEST_HEIGHT + "px"; + testElement.style.display = "block"; + document.body.appendChild(testElement); + range.selectNode(testElement); + var rangeBounds = range.getBoundingClientRect(); + var rangeHeight = Math.round(rangeBounds.height); + document.body.removeChild(testElement); + if (rangeHeight === TEST_HEIGHT) { + return true; + } + } + } + return false; + }; + var testIOSLineBreak = function (document) { + var testElement = document.createElement("boundtest"); + testElement.style.width = "50px"; + testElement.style.display = "block"; + testElement.style.fontSize = "12px"; + testElement.style.letterSpacing = "0px"; + testElement.style.wordSpacing = "0px"; + document.body.appendChild(testElement); + var range = document.createRange(); + testElement.innerHTML = + typeof "".repeat === "function" ? "👨".repeat(10) : ""; + var node = testElement.firstChild; + var textList = toCodePoints$1(node.data).map(function (i) { + return fromCodePoint$1(i); + }); + var offset = 0; + var prev = {}; + // ios 13 does not handle range getBoundingClientRect line changes correctly #2177 + var supports = textList.every(function (text, i) { + range.setStart(node, offset); + range.setEnd(node, offset + text.length); + var rect = range.getBoundingClientRect(); + offset += text.length; + var boundAhead = rect.x > prev.x || rect.y > prev.y; + prev = rect; + if (i === 0) { + return true; + } + return boundAhead; + }); + document.body.removeChild(testElement); + return supports; + }; + var testCORS = function () { + return typeof new Image().crossOrigin !== "undefined"; + }; + var testResponseType = function () { + return typeof new XMLHttpRequest().responseType === "string"; + }; + var testSVG = function (document) { + var img = new Image(); + var canvas = document.createElement("canvas"); + var ctx = canvas.getContext("2d"); + if (!ctx) { + return false; + } + img.src = + "data:image/svg+xml,"; + try { + ctx.drawImage(img, 0, 0); + canvas.toDataURL(); + } catch (e) { + return false; + } + return true; + }; + var isGreenPixel = function (data) { + return ( + data[0] === 0 && data[1] === 255 && data[2] === 0 && data[3] === 255 + ); + }; + var testForeignObject = function (document) { + var canvas = document.createElement("canvas"); + var size = 100; + canvas.width = size; + canvas.height = size; + var ctx = canvas.getContext("2d"); + if (!ctx) { + return Promise.reject(false); + } + ctx.fillStyle = "rgb(0, 255, 0)"; + ctx.fillRect(0, 0, size, size); + var img = new Image(); + var greenImageSrc = canvas.toDataURL(); + img.src = greenImageSrc; + var svg = createForeignObjectSVG(size, size, 0, 0, img); + ctx.fillStyle = "red"; + ctx.fillRect(0, 0, size, size); + return loadSerializedSVG$1(svg) + .then(function (img) { + ctx.drawImage(img, 0, 0); + var data = ctx.getImageData(0, 0, size, size).data; + ctx.fillStyle = "red"; + ctx.fillRect(0, 0, size, size); + var node = document.createElement("div"); + node.style.backgroundImage = "url(" + greenImageSrc + ")"; + node.style.height = size + "px"; + // Firefox 55 does not render inline tags + return isGreenPixel(data) + ? loadSerializedSVG$1( + createForeignObjectSVG(size, size, 0, 0, node) + ) + : Promise.reject(false); + }) + .then(function (img) { + ctx.drawImage(img, 0, 0); + // Edge does not render background-images + return isGreenPixel(ctx.getImageData(0, 0, size, size).data); + }) + .catch(function () { + return false; + }); + }; + var createForeignObjectSVG = function (width, height, x, y, node) { + var xmlns = "http://www.w3.org/2000/svg"; + var svg = document.createElementNS(xmlns, "svg"); + var foreignObject = document.createElementNS(xmlns, "foreignObject"); + svg.setAttributeNS(null, "width", width.toString()); + svg.setAttributeNS(null, "height", height.toString()); + foreignObject.setAttributeNS(null, "width", "100%"); + foreignObject.setAttributeNS(null, "height", "100%"); + foreignObject.setAttributeNS(null, "x", x.toString()); + foreignObject.setAttributeNS(null, "y", y.toString()); + foreignObject.setAttributeNS(null, "externalResourcesRequired", "true"); + svg.appendChild(foreignObject); + foreignObject.appendChild(node); + return svg; + }; + var loadSerializedSVG$1 = function (svg) { + return new Promise(function (resolve, reject) { + var img = new Image(); + img.onload = function () { + return resolve(img); + }; + img.onerror = reject; + img.src = + "data:image/svg+xml;charset=utf-8," + + encodeURIComponent(new XMLSerializer().serializeToString(svg)); + }); + }; + var FEATURES = { + get SUPPORT_RANGE_BOUNDS() { + var value = testRangeBounds(document); + Object.defineProperty(FEATURES, "SUPPORT_RANGE_BOUNDS", { + value: value, + }); + return value; + }, + get SUPPORT_WORD_BREAKING() { + var value = + FEATURES.SUPPORT_RANGE_BOUNDS && testIOSLineBreak(document); + Object.defineProperty(FEATURES, "SUPPORT_WORD_BREAKING", { + value: value, + }); + return value; + }, + get SUPPORT_SVG_DRAWING() { + var value = testSVG(document); + Object.defineProperty(FEATURES, "SUPPORT_SVG_DRAWING", { + value: value, + }); + return value; + }, + get SUPPORT_FOREIGNOBJECT_DRAWING() { + var value = + typeof Array.from === "function" && + typeof window.fetch === "function" + ? testForeignObject(document) + : Promise.resolve(false); + Object.defineProperty(FEATURES, "SUPPORT_FOREIGNOBJECT_DRAWING", { + value: value, + }); + return value; + }, + get SUPPORT_CORS_IMAGES() { + var value = testCORS(); + Object.defineProperty(FEATURES, "SUPPORT_CORS_IMAGES", { + value: value, + }); + return value; + }, + get SUPPORT_RESPONSE_TYPE() { + var value = testResponseType(); + Object.defineProperty(FEATURES, "SUPPORT_RESPONSE_TYPE", { + value: value, + }); + return value; + }, + get SUPPORT_CORS_XHR() { + var value = "withCredentials" in new XMLHttpRequest(); + Object.defineProperty(FEATURES, "SUPPORT_CORS_XHR", { value: value }); + return value; + }, + get SUPPORT_NATIVE_TEXT_SEGMENTATION() { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var value = !!(typeof Intl !== "undefined" && Intl.Segmenter); + Object.defineProperty(FEATURES, "SUPPORT_NATIVE_TEXT_SEGMENTATION", { + value: value, + }); + return value; + }, + }; + + var TextBounds = /** @class */ (function () { + function TextBounds(text, bounds) { + this.text = text; + this.bounds = bounds; + } + return TextBounds; + })(); + var parseTextBounds = function (context, value, styles, node) { + var textList = breakText(value, styles); + var textBounds = []; + var offset = 0; + textList.forEach(function (text) { + if (styles.textDecorationLine.length || text.trim().length > 0) { + if (FEATURES.SUPPORT_RANGE_BOUNDS) { + var clientRects = createRange( + node, + offset, + text.length + ).getClientRects(); + if (clientRects.length > 1) { + var subSegments = segmentGraphemes(text); + var subOffset_1 = 0; + subSegments.forEach(function (subSegment) { + textBounds.push( + new TextBounds( + subSegment, + Bounds.fromDOMRectList( + context, + createRange( + node, + subOffset_1 + offset, + subSegment.length + ).getClientRects() + ) + ) + ); + subOffset_1 += subSegment.length; + }); + } else { + textBounds.push( + new TextBounds( + text, + Bounds.fromDOMRectList(context, clientRects) + ) + ); + } + } else { + var replacementNode = node.splitText(text.length); + textBounds.push( + new TextBounds(text, getWrapperBounds(context, node)) + ); + node = replacementNode; + } + } else if (!FEATURES.SUPPORT_RANGE_BOUNDS) { + node = node.splitText(text.length); + } + offset += text.length; + }); + return textBounds; + }; + var getWrapperBounds = function (context, node) { + var ownerDocument = node.ownerDocument; + if (ownerDocument) { + var wrapper = ownerDocument.createElement("html2canvaswrapper"); + wrapper.appendChild(node.cloneNode(true)); + var parentNode = node.parentNode; + if (parentNode) { + parentNode.replaceChild(wrapper, node); + var bounds = parseBounds(context, wrapper); + if (wrapper.firstChild) { + parentNode.replaceChild(wrapper.firstChild, wrapper); + } + return bounds; + } + } + return Bounds.EMPTY; + }; + var createRange = function (node, offset, length) { + var ownerDocument = node.ownerDocument; + if (!ownerDocument) { + throw new Error("Node has no owner document"); + } + var range = ownerDocument.createRange(); + range.setStart(node, offset); + range.setEnd(node, offset + length); + return range; + }; + var segmentGraphemes = function (value) { + if (FEATURES.SUPPORT_NATIVE_TEXT_SEGMENTATION) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var segmenter = new Intl.Segmenter(void 0, { + granularity: "grapheme", + }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return Array.from(segmenter.segment(value)).map(function (segment) { + return segment.segment; + }); + } + return splitGraphemes(value); + }; + var segmentWords = function (value, styles) { + if (FEATURES.SUPPORT_NATIVE_TEXT_SEGMENTATION) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var segmenter = new Intl.Segmenter(void 0, { + granularity: "word", + }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return Array.from(segmenter.segment(value)).map(function (segment) { + return segment.segment; + }); + } + return breakWords(value, styles); + }; + var breakText = function (value, styles) { + return styles.letterSpacing !== 0 + ? segmentGraphemes(value) + : segmentWords(value, styles); + }; + // https://drafts.csswg.org/css-text/#word-separator + var wordSeparators = [ + 0x0020, 0x00a0, 0x1361, 0x10100, 0x10101, 0x1039, 0x1091, + ]; + var breakWords = function (str, styles) { + var breaker = LineBreaker(str, { + lineBreak: styles.lineBreak, + wordBreak: + styles.overflowWrap === "break-word" /* BREAK_WORD */ + ? "break-word" + : styles.wordBreak, + }); + var words = []; + var bk; + var _loop_1 = function () { + if (bk.value) { + var value = bk.value.slice(); + var codePoints = toCodePoints$1(value); + var word_1 = ""; + codePoints.forEach(function (codePoint) { + if (wordSeparators.indexOf(codePoint) === -1) { + word_1 += fromCodePoint$1(codePoint); + } else { + if (word_1.length) { + words.push(word_1); + } + words.push(fromCodePoint$1(codePoint)); + word_1 = ""; + } + }); + if (word_1.length) { + words.push(word_1); + } + } + }; + while (!(bk = breaker.next()).done) { + _loop_1(); + } + return words; + }; + + var TextContainer = /** @class */ (function () { + function TextContainer(context, node, styles) { + this.text = transform(node.data, styles.textTransform); + this.textBounds = parseTextBounds(context, this.text, styles, node); + } + return TextContainer; + })(); + var transform = function (text, transform) { + switch (transform) { + case 1 /* LOWERCASE */: + return text.toLowerCase(); + case 3 /* CAPITALIZE */: + return text.replace(CAPITALIZE, capitalize); + case 2 /* UPPERCASE */: + return text.toUpperCase(); + default: + return text; + } + }; + var CAPITALIZE = /(^|\s|:|-|\(|\))([a-z])/g; + var capitalize = function (m, p1, p2) { + if (m.length > 0) { + return p1 + p2.toUpperCase(); + } + return m; + }; + + var ImageElementContainer = /** @class */ (function (_super) { + __extends(ImageElementContainer, _super); + function ImageElementContainer(context, img) { + var _this = _super.call(this, context, img) || this; + _this.src = img.currentSrc || img.src; + _this.intrinsicWidth = img.naturalWidth; + _this.intrinsicHeight = img.naturalHeight; + _this.context.cache.addImage(_this.src); + return _this; + } + return ImageElementContainer; + })(ElementContainer); + + var CanvasElementContainer = /** @class */ (function (_super) { + __extends(CanvasElementContainer, _super); + function CanvasElementContainer(context, canvas) { + var _this = _super.call(this, context, canvas) || this; + _this.canvas = canvas; + _this.intrinsicWidth = canvas.width; + _this.intrinsicHeight = canvas.height; + return _this; + } + return CanvasElementContainer; + })(ElementContainer); + + var SVGElementContainer = /** @class */ (function (_super) { + __extends(SVGElementContainer, _super); + function SVGElementContainer(context, img) { + var _this = _super.call(this, context, img) || this; + var s = new XMLSerializer(); + var bounds = parseBounds(context, img); + img.setAttribute("width", bounds.width + "px"); + img.setAttribute("height", bounds.height + "px"); + _this.svg = + "data:image/svg+xml," + + encodeURIComponent(s.serializeToString(img)); + _this.intrinsicWidth = img.width.baseVal.value; + _this.intrinsicHeight = img.height.baseVal.value; + _this.context.cache.addImage(_this.svg); + return _this; + } + return SVGElementContainer; + })(ElementContainer); + + var LIElementContainer = /** @class */ (function (_super) { + __extends(LIElementContainer, _super); + function LIElementContainer(context, element) { + var _this = _super.call(this, context, element) || this; + _this.value = element.value; + return _this; + } + return LIElementContainer; + })(ElementContainer); + + var OLElementContainer = /** @class */ (function (_super) { + __extends(OLElementContainer, _super); + function OLElementContainer(context, element) { + var _this = _super.call(this, context, element) || this; + _this.start = element.start; + _this.reversed = + typeof element.reversed === "boolean" && element.reversed === true; + return _this; + } + return OLElementContainer; + })(ElementContainer); + + var CHECKBOX_BORDER_RADIUS = [ + { + type: 15 /* DIMENSION_TOKEN */, + flags: 0, + unit: "px", + number: 3, + }, + ]; + var RADIO_BORDER_RADIUS = [ + { + type: 16 /* PERCENTAGE_TOKEN */, + flags: 0, + number: 50, + }, + ]; + var reformatInputBounds = function (bounds) { + if (bounds.width > bounds.height) { + return new Bounds( + bounds.left + (bounds.width - bounds.height) / 2, + bounds.top, + bounds.height, + bounds.height + ); + } else if (bounds.width < bounds.height) { + return new Bounds( + bounds.left, + bounds.top + (bounds.height - bounds.width) / 2, + bounds.width, + bounds.width + ); + } + return bounds; + }; + var getInputValue = function (node) { + var value = + node.type === PASSWORD + ? new Array(node.value.length + 1).join("\u2022") + : node.value; + return value.length === 0 ? node.placeholder || "" : value; + }; + var CHECKBOX = "checkbox"; + var RADIO = "radio"; + var PASSWORD = "password"; + var INPUT_COLOR = 0x2a2a2aff; + var InputElementContainer = /** @class */ (function (_super) { + __extends(InputElementContainer, _super); + function InputElementContainer(context, input) { + var _this = _super.call(this, context, input) || this; + _this.type = input.type.toLowerCase(); + _this.checked = input.checked; + _this.value = getInputValue(input); + if (_this.type === CHECKBOX || _this.type === RADIO) { + _this.styles.backgroundColor = 0xdededeff; + _this.styles.borderTopColor = + _this.styles.borderRightColor = + _this.styles.borderBottomColor = + _this.styles.borderLeftColor = + 0xa5a5a5ff; + _this.styles.borderTopWidth = + _this.styles.borderRightWidth = + _this.styles.borderBottomWidth = + _this.styles.borderLeftWidth = + 1; + _this.styles.borderTopStyle = + _this.styles.borderRightStyle = + _this.styles.borderBottomStyle = + _this.styles.borderLeftStyle = + 1 /* SOLID */; + _this.styles.backgroundClip = [0 /* BORDER_BOX */]; + _this.styles.backgroundOrigin = [0 /* BORDER_BOX */]; + _this.bounds = reformatInputBounds(_this.bounds); + } + switch (_this.type) { + case CHECKBOX: + _this.styles.borderTopRightRadius = + _this.styles.borderTopLeftRadius = + _this.styles.borderBottomRightRadius = + _this.styles.borderBottomLeftRadius = + CHECKBOX_BORDER_RADIUS; + break; + case RADIO: + _this.styles.borderTopRightRadius = + _this.styles.borderTopLeftRadius = + _this.styles.borderBottomRightRadius = + _this.styles.borderBottomLeftRadius = + RADIO_BORDER_RADIUS; + break; + } + return _this; + } + return InputElementContainer; + })(ElementContainer); + + var SelectElementContainer = /** @class */ (function (_super) { + __extends(SelectElementContainer, _super); + function SelectElementContainer(context, element) { + var _this = _super.call(this, context, element) || this; + var option = element.options[element.selectedIndex || 0]; + _this.value = option ? option.text || "" : ""; + return _this; + } + return SelectElementContainer; + })(ElementContainer); + + var TextareaElementContainer = /** @class */ (function (_super) { + __extends(TextareaElementContainer, _super); + function TextareaElementContainer(context, element) { + var _this = _super.call(this, context, element) || this; + _this.value = element.value; + return _this; + } + return TextareaElementContainer; + })(ElementContainer); + + var IFrameElementContainer = /** @class */ (function (_super) { + __extends(IFrameElementContainer, _super); + function IFrameElementContainer(context, iframe) { + var _this = _super.call(this, context, iframe) || this; + _this.src = iframe.src; + _this.width = parseInt(iframe.width, 10) || 0; + _this.height = parseInt(iframe.height, 10) || 0; + _this.backgroundColor = _this.styles.backgroundColor; + try { + if ( + iframe.contentWindow && + iframe.contentWindow.document && + iframe.contentWindow.document.documentElement + ) { + _this.tree = parseTree( + context, + iframe.contentWindow.document.documentElement + ); + // http://www.w3.org/TR/css3-background/#special-backgrounds + var documentBackgroundColor = iframe.contentWindow.document + .documentElement + ? parseColor( + context, + getComputedStyle( + iframe.contentWindow.document.documentElement + ).backgroundColor + ) + : COLORS.TRANSPARENT; + var bodyBackgroundColor = iframe.contentWindow.document.body + ? parseColor( + context, + getComputedStyle(iframe.contentWindow.document.body) + .backgroundColor + ) + : COLORS.TRANSPARENT; + _this.backgroundColor = isTransparent(documentBackgroundColor) + ? isTransparent(bodyBackgroundColor) + ? _this.styles.backgroundColor + : bodyBackgroundColor + : documentBackgroundColor; + } + } catch (e) {} + return _this; + } + return IFrameElementContainer; + })(ElementContainer); + + var LIST_OWNERS = ["OL", "UL", "MENU"]; + var parseNodeTree = function (context, node, parent, root) { + for ( + var childNode = node.firstChild, nextNode = void 0; + childNode; + childNode = nextNode + ) { + nextNode = childNode.nextSibling; + if (isTextNode(childNode) && childNode.data.trim().length > 0) { + parent.textNodes.push( + new TextContainer(context, childNode, parent.styles) + ); + } else if (isElementNode(childNode)) { + if (isSlotElement(childNode) && childNode.assignedNodes) { + childNode.assignedNodes().forEach(function (childNode) { + return parseNodeTree(context, childNode, parent, root); + }); + } else { + var container = createContainer(context, childNode); + if (container.styles.isVisible()) { + if (createsRealStackingContext(childNode, container, root)) { + container.flags |= 4 /* CREATES_REAL_STACKING_CONTEXT */; + } else if (createsStackingContext(container.styles)) { + container.flags |= 2 /* CREATES_STACKING_CONTEXT */; + } + if (LIST_OWNERS.indexOf(childNode.tagName) !== -1) { + container.flags |= 8 /* IS_LIST_OWNER */; + } + parent.elements.push(container); + childNode.slot; + if (childNode.shadowRoot) { + parseNodeTree(context, childNode.shadowRoot, container, root); + } else if ( + !isTextareaElement(childNode) && + !isSVGElement(childNode) && + !isSelectElement(childNode) + ) { + parseNodeTree(context, childNode, container, root); + } + } + } + } + } + }; + var createContainer = function (context, element) { + if (isImageElement(element)) { + return new ImageElementContainer(context, element); + } + if (isCanvasElement(element)) { + return new CanvasElementContainer(context, element); + } + if (isSVGElement(element)) { + return new SVGElementContainer(context, element); + } + if (isLIElement(element)) { + return new LIElementContainer(context, element); + } + if (isOLElement(element)) { + return new OLElementContainer(context, element); + } + if (isInputElement(element)) { + return new InputElementContainer(context, element); + } + if (isSelectElement(element)) { + return new SelectElementContainer(context, element); + } + if (isTextareaElement(element)) { + return new TextareaElementContainer(context, element); + } + if (isIFrameElement(element)) { + return new IFrameElementContainer(context, element); + } + return new ElementContainer(context, element); + }; + var parseTree = function (context, element) { + var container = createContainer(context, element); + container.flags |= 4 /* CREATES_REAL_STACKING_CONTEXT */; + parseNodeTree(context, element, container, container); + return container; + }; + var createsRealStackingContext = function (node, container, root) { + return ( + container.styles.isPositionedWithZIndex() || + container.styles.opacity < 1 || + container.styles.isTransformed() || + (isBodyElement(node) && root.styles.isTransparent()) + ); + }; + var createsStackingContext = function (styles) { + return styles.isPositioned() || styles.isFloating(); + }; + var isTextNode = function (node) { + return node.nodeType === Node.TEXT_NODE; + }; + var isElementNode = function (node) { + return node.nodeType === Node.ELEMENT_NODE; + }; + var isHTMLElementNode = function (node) { + return ( + isElementNode(node) && + typeof node.style !== "undefined" && + !isSVGElementNode(node) + ); + }; + var isSVGElementNode = function (element) { + return typeof element.className === "object"; + }; + var isLIElement = function (node) { + return node.tagName === "LI"; + }; + var isOLElement = function (node) { + return node.tagName === "OL"; + }; + var isInputElement = function (node) { + return node.tagName === "INPUT"; + }; + var isHTMLElement = function (node) { + return node.tagName === "HTML"; + }; + var isSVGElement = function (node) { + return node.tagName === "svg"; + }; + var isBodyElement = function (node) { + return node.tagName === "BODY"; + }; + var isCanvasElement = function (node) { + return node.tagName === "CANVAS"; + }; + var isVideoElement = function (node) { + return node.tagName === "VIDEO"; + }; + var isImageElement = function (node) { + return node.tagName === "IMG"; + }; + var isIFrameElement = function (node) { + return node.tagName === "IFRAME"; + }; + var isStyleElement = function (node) { + return node.tagName === "STYLE"; + }; + var isScriptElement = function (node) { + return node.tagName === "SCRIPT"; + }; + var isTextareaElement = function (node) { + return node.tagName === "TEXTAREA"; + }; + var isSelectElement = function (node) { + return node.tagName === "SELECT"; + }; + var isSlotElement = function (node) { + return node.tagName === "SLOT"; + }; + // https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name + var isCustomElement = function (node) { + return node.tagName.indexOf("-") > 0; + }; + + var CounterState = /** @class */ (function () { + function CounterState() { + this.counters = {}; + } + CounterState.prototype.getCounterValue = function (name) { + var counter = this.counters[name]; + if (counter && counter.length) { + return counter[counter.length - 1]; + } + return 1; + }; + CounterState.prototype.getCounterValues = function (name) { + var counter = this.counters[name]; + return counter ? counter : []; + }; + CounterState.prototype.pop = function (counters) { + var _this = this; + counters.forEach(function (counter) { + return _this.counters[counter].pop(); + }); + }; + CounterState.prototype.parse = function (style) { + var _this = this; + var counterIncrement = style.counterIncrement; + var counterReset = style.counterReset; + var canReset = true; + if (counterIncrement !== null) { + counterIncrement.forEach(function (entry) { + var counter = _this.counters[entry.counter]; + if (counter && entry.increment !== 0) { + canReset = false; + if (!counter.length) { + counter.push(1); + } + counter[Math.max(0, counter.length - 1)] += entry.increment; + } + }); + } + var counterNames = []; + if (canReset) { + counterReset.forEach(function (entry) { + var counter = _this.counters[entry.counter]; + counterNames.push(entry.counter); + if (!counter) { + counter = _this.counters[entry.counter] = []; + } + counter.push(entry.reset); + }); + } + return counterNames; + }; + return CounterState; + })(); + var ROMAN_UPPER = { + integers: [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1], + values: [ + "M", + "CM", + "D", + "CD", + "C", + "XC", + "L", + "XL", + "X", + "IX", + "V", + "IV", + "I", + ], + }; + var ARMENIAN = { + integers: [ + 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 900, 800, 700, + 600, 500, 400, 300, 200, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 9, + 8, 7, 6, 5, 4, 3, 2, 1, + ], + values: [ + "Ք", + "Փ", + "Ւ", + "Ց", + "Ր", + "Տ", + "Վ", + "Ս", + "Ռ", + "Ջ", + "Պ", + "Չ", + "Ո", + "Շ", + "Ն", + "Յ", + "Մ", + "Ճ", + "Ղ", + "Ձ", + "Հ", + "Կ", + "Ծ", + "Խ", + "Լ", + "Ի", + "Ժ", + "Թ", + "Ը", + "Է", + "Զ", + "Ե", + "Դ", + "Գ", + "Բ", + "Ա", + ], + }; + var HEBREW = { + integers: [ + 10000, 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 400, 300, + 200, 100, 90, 80, 70, 60, 50, 40, 30, 20, 19, 18, 17, 16, 15, 10, 9, + 8, 7, 6, 5, 4, 3, 2, 1, + ], + values: [ + "י׳", + "ט׳", + "ח׳", + "ז׳", + "ו׳", + "ה׳", + "ד׳", + "ג׳", + "ב׳", + "א׳", + "ת", + "ש", + "ר", + "ק", + "צ", + "פ", + "ע", + "ס", + "נ", + "מ", + "ל", + "כ", + "יט", + "יח", + "יז", + "טז", + "טו", + "י", + "ט", + "ח", + "ז", + "ו", + "ה", + "ד", + "ג", + "ב", + "א", + ], + }; + var GEORGIAN = { + integers: [ + 10000, 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 900, 800, + 700, 600, 500, 400, 300, 200, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, + 9, 8, 7, 6, 5, 4, 3, 2, 1, + ], + values: [ + "ჵ", + "ჰ", + "ჯ", + "ჴ", + "ხ", + "ჭ", + "წ", + "ძ", + "ც", + "ჩ", + "შ", + "ყ", + "ღ", + "ქ", + "ფ", + "ჳ", + "ტ", + "ს", + "რ", + "ჟ", + "პ", + "ო", + "ჲ", + "ნ", + "მ", + "ლ", + "კ", + "ი", + "თ", + "ჱ", + "ზ", + "ვ", + "ე", + "დ", + "გ", + "ბ", + "ა", + ], + }; + var createAdditiveCounter = function ( + value, + min, + max, + symbols, + fallback, + suffix + ) { + if (value < min || value > max) { + return createCounterText(value, fallback, suffix.length > 0); + } + return ( + symbols.integers.reduce(function (string, integer, index) { + while (value >= integer) { + value -= integer; + string += symbols.values[index]; + } + return string; + }, "") + suffix + ); + }; + var createCounterStyleWithSymbolResolver = function ( + value, + codePointRangeLength, + isNumeric, + resolver + ) { + var string = ""; + do { + if (!isNumeric) { + value--; + } + string = resolver(value) + string; + value /= codePointRangeLength; + } while (value * codePointRangeLength >= codePointRangeLength); + return string; + }; + var createCounterStyleFromRange = function ( + value, + codePointRangeStart, + codePointRangeEnd, + isNumeric, + suffix + ) { + var codePointRangeLength = codePointRangeEnd - codePointRangeStart + 1; + return ( + (value < 0 ? "-" : "") + + (createCounterStyleWithSymbolResolver( + Math.abs(value), + codePointRangeLength, + isNumeric, + function (codePoint) { + return fromCodePoint$1( + Math.floor(codePoint % codePointRangeLength) + + codePointRangeStart + ); + } + ) + + suffix) + ); + }; + var createCounterStyleFromSymbols = function (value, symbols, suffix) { + if (suffix === void 0) { + suffix = ". "; + } + var codePointRangeLength = symbols.length; + return ( + createCounterStyleWithSymbolResolver( + Math.abs(value), + codePointRangeLength, + false, + function (codePoint) { + return symbols[Math.floor(codePoint % codePointRangeLength)]; + } + ) + suffix + ); + }; + var CJK_ZEROS = 1 << 0; + var CJK_TEN_COEFFICIENTS = 1 << 1; + var CJK_TEN_HIGH_COEFFICIENTS = 1 << 2; + var CJK_HUNDRED_COEFFICIENTS = 1 << 3; + var createCJKCounter = function ( + value, + numbers, + multipliers, + negativeSign, + suffix, + flags + ) { + if (value < -9999 || value > 9999) { + return createCounterText( + value, + 4 /* CJK_DECIMAL */, + suffix.length > 0 + ); + } + var tmp = Math.abs(value); + var string = suffix; + if (tmp === 0) { + return numbers[0] + string; + } + for (var digit = 0; tmp > 0 && digit <= 4; digit++) { + var coefficient = tmp % 10; + if ( + coefficient === 0 && + contains(flags, CJK_ZEROS) && + string !== "" + ) { + string = numbers[coefficient] + string; + } else if ( + coefficient > 1 || + (coefficient === 1 && digit === 0) || + (coefficient === 1 && + digit === 1 && + contains(flags, CJK_TEN_COEFFICIENTS)) || + (coefficient === 1 && + digit === 1 && + contains(flags, CJK_TEN_HIGH_COEFFICIENTS) && + value > 100) || + (coefficient === 1 && + digit > 1 && + contains(flags, CJK_HUNDRED_COEFFICIENTS)) + ) { + string = + numbers[coefficient] + + (digit > 0 ? multipliers[digit - 1] : "") + + string; + } else if (coefficient === 1 && digit > 0) { + string = multipliers[digit - 1] + string; + } + tmp = Math.floor(tmp / 10); + } + return (value < 0 ? negativeSign : "") + string; + }; + var CHINESE_INFORMAL_MULTIPLIERS = "十百千萬"; + var CHINESE_FORMAL_MULTIPLIERS = "拾佰仟萬"; + var JAPANESE_NEGATIVE = "マイナス"; + var KOREAN_NEGATIVE = "마이너스"; + var createCounterText = function (value, type, appendSuffix) { + var defaultSuffix = appendSuffix ? ". " : ""; + var cjkSuffix = appendSuffix ? "、" : ""; + var koreanSuffix = appendSuffix ? ", " : ""; + var spaceSuffix = appendSuffix ? " " : ""; + switch (type) { + case 0 /* DISC */: + return "•" + spaceSuffix; + case 1 /* CIRCLE */: + return "◦" + spaceSuffix; + case 2 /* SQUARE */: + return "◾" + spaceSuffix; + case 5 /* DECIMAL_LEADING_ZERO */: + var string = createCounterStyleFromRange( + value, + 48, + 57, + true, + defaultSuffix + ); + return string.length < 4 ? "0" + string : string; + case 4 /* CJK_DECIMAL */: + return createCounterStyleFromSymbols( + value, + "〇一二三四五六七八九", + cjkSuffix + ); + case 6 /* LOWER_ROMAN */: + return createAdditiveCounter( + value, + 1, + 3999, + ROMAN_UPPER, + 3 /* DECIMAL */, + defaultSuffix + ).toLowerCase(); + case 7 /* UPPER_ROMAN */: + return createAdditiveCounter( + value, + 1, + 3999, + ROMAN_UPPER, + 3 /* DECIMAL */, + defaultSuffix + ); + case 8 /* LOWER_GREEK */: + return createCounterStyleFromRange( + value, + 945, + 969, + false, + defaultSuffix + ); + case 9 /* LOWER_ALPHA */: + return createCounterStyleFromRange( + value, + 97, + 122, + false, + defaultSuffix + ); + case 10 /* UPPER_ALPHA */: + return createCounterStyleFromRange( + value, + 65, + 90, + false, + defaultSuffix + ); + case 11 /* ARABIC_INDIC */: + return createCounterStyleFromRange( + value, + 1632, + 1641, + true, + defaultSuffix + ); + case 12 /* ARMENIAN */: + case 49 /* UPPER_ARMENIAN */: + return createAdditiveCounter( + value, + 1, + 9999, + ARMENIAN, + 3 /* DECIMAL */, + defaultSuffix + ); + case 35 /* LOWER_ARMENIAN */: + return createAdditiveCounter( + value, + 1, + 9999, + ARMENIAN, + 3 /* DECIMAL */, + defaultSuffix + ).toLowerCase(); + case 13 /* BENGALI */: + return createCounterStyleFromRange( + value, + 2534, + 2543, + true, + defaultSuffix + ); + case 14 /* CAMBODIAN */: + case 30 /* KHMER */: + return createCounterStyleFromRange( + value, + 6112, + 6121, + true, + defaultSuffix + ); + case 15 /* CJK_EARTHLY_BRANCH */: + return createCounterStyleFromSymbols( + value, + "子丑寅卯辰巳午未申酉戌亥", + cjkSuffix + ); + case 16 /* CJK_HEAVENLY_STEM */: + return createCounterStyleFromSymbols( + value, + "甲乙丙丁戊己庚辛壬癸", + cjkSuffix + ); + case 17 /* CJK_IDEOGRAPHIC */: + case 48 /* TRAD_CHINESE_INFORMAL */: + return createCJKCounter( + value, + "零一二三四五六七八九", + CHINESE_INFORMAL_MULTIPLIERS, + "負", + cjkSuffix, + CJK_TEN_COEFFICIENTS | + CJK_TEN_HIGH_COEFFICIENTS | + CJK_HUNDRED_COEFFICIENTS + ); + case 47 /* TRAD_CHINESE_FORMAL */: + return createCJKCounter( + value, + "零壹貳參肆伍陸柒捌玖", + CHINESE_FORMAL_MULTIPLIERS, + "負", + cjkSuffix, + CJK_ZEROS | + CJK_TEN_COEFFICIENTS | + CJK_TEN_HIGH_COEFFICIENTS | + CJK_HUNDRED_COEFFICIENTS + ); + case 42 /* SIMP_CHINESE_INFORMAL */: + return createCJKCounter( + value, + "零一二三四五六七八九", + CHINESE_INFORMAL_MULTIPLIERS, + "负", + cjkSuffix, + CJK_TEN_COEFFICIENTS | + CJK_TEN_HIGH_COEFFICIENTS | + CJK_HUNDRED_COEFFICIENTS + ); + case 41 /* SIMP_CHINESE_FORMAL */: + return createCJKCounter( + value, + "零壹贰叁肆伍陆柒捌玖", + CHINESE_FORMAL_MULTIPLIERS, + "负", + cjkSuffix, + CJK_ZEROS | + CJK_TEN_COEFFICIENTS | + CJK_TEN_HIGH_COEFFICIENTS | + CJK_HUNDRED_COEFFICIENTS + ); + case 26 /* JAPANESE_INFORMAL */: + return createCJKCounter( + value, + "〇一二三四五六七八九", + "十百千万", + JAPANESE_NEGATIVE, + cjkSuffix, + 0 + ); + case 25 /* JAPANESE_FORMAL */: + return createCJKCounter( + value, + "零壱弐参四伍六七八九", + "拾百千万", + JAPANESE_NEGATIVE, + cjkSuffix, + CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS + ); + case 31 /* KOREAN_HANGUL_FORMAL */: + return createCJKCounter( + value, + "영일이삼사오육칠팔구", + "십백천만", + KOREAN_NEGATIVE, + koreanSuffix, + CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS + ); + case 33 /* KOREAN_HANJA_INFORMAL */: + return createCJKCounter( + value, + "零一二三四五六七八九", + "十百千萬", + KOREAN_NEGATIVE, + koreanSuffix, + 0 + ); + case 32 /* KOREAN_HANJA_FORMAL */: + return createCJKCounter( + value, + "零壹貳參四五六七八九", + "拾百千", + KOREAN_NEGATIVE, + koreanSuffix, + CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS + ); + case 18 /* DEVANAGARI */: + return createCounterStyleFromRange( + value, + 0x966, + 0x96f, + true, + defaultSuffix + ); + case 20 /* GEORGIAN */: + return createAdditiveCounter( + value, + 1, + 19999, + GEORGIAN, + 3 /* DECIMAL */, + defaultSuffix + ); + case 21 /* GUJARATI */: + return createCounterStyleFromRange( + value, + 0xae6, + 0xaef, + true, + defaultSuffix + ); + case 22 /* GURMUKHI */: + return createCounterStyleFromRange( + value, + 0xa66, + 0xa6f, + true, + defaultSuffix + ); + case 22 /* HEBREW */: + return createAdditiveCounter( + value, + 1, + 10999, + HEBREW, + 3 /* DECIMAL */, + defaultSuffix + ); + case 23 /* HIRAGANA */: + return createCounterStyleFromSymbols( + value, + "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん" + ); + case 24 /* HIRAGANA_IROHA */: + return createCounterStyleFromSymbols( + value, + "いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす" + ); + case 27 /* KANNADA */: + return createCounterStyleFromRange( + value, + 0xce6, + 0xcef, + true, + defaultSuffix + ); + case 28 /* KATAKANA */: + return createCounterStyleFromSymbols( + value, + "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン", + cjkSuffix + ); + case 29 /* KATAKANA_IROHA */: + return createCounterStyleFromSymbols( + value, + "イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス", + cjkSuffix + ); + case 34 /* LAO */: + return createCounterStyleFromRange( + value, + 0xed0, + 0xed9, + true, + defaultSuffix + ); + case 37 /* MONGOLIAN */: + return createCounterStyleFromRange( + value, + 0x1810, + 0x1819, + true, + defaultSuffix + ); + case 38 /* MYANMAR */: + return createCounterStyleFromRange( + value, + 0x1040, + 0x1049, + true, + defaultSuffix + ); + case 39 /* ORIYA */: + return createCounterStyleFromRange( + value, + 0xb66, + 0xb6f, + true, + defaultSuffix + ); + case 40 /* PERSIAN */: + return createCounterStyleFromRange( + value, + 0x6f0, + 0x6f9, + true, + defaultSuffix + ); + case 43 /* TAMIL */: + return createCounterStyleFromRange( + value, + 0xbe6, + 0xbef, + true, + defaultSuffix + ); + case 44 /* TELUGU */: + return createCounterStyleFromRange( + value, + 0xc66, + 0xc6f, + true, + defaultSuffix + ); + case 45 /* THAI */: + return createCounterStyleFromRange( + value, + 0xe50, + 0xe59, + true, + defaultSuffix + ); + case 46 /* TIBETAN */: + return createCounterStyleFromRange( + value, + 0xf20, + 0xf29, + true, + defaultSuffix + ); + case 3 /* DECIMAL */: + default: + return createCounterStyleFromRange( + value, + 48, + 57, + true, + defaultSuffix + ); + } + }; + + var IGNORE_ATTRIBUTE = "data-html2canvas-ignore"; + var DocumentCloner = /** @class */ (function () { + function DocumentCloner(context, element, options) { + this.context = context; + this.options = options; + this.scrolledElements = []; + this.referenceElement = element; + this.counters = new CounterState(); + this.quoteDepth = 0; + if (!element.ownerDocument) { + throw new Error("Cloned element does not have an owner document"); + } + this.documentElement = this.cloneNode( + element.ownerDocument.documentElement, + false + ); + } + DocumentCloner.prototype.toIFrame = function ( + ownerDocument, + windowSize + ) { + var _this = this; + var iframe = createIFrameContainer(ownerDocument, windowSize); + if (!iframe.contentWindow) { + return Promise.reject("Unable to find iframe window"); + } + var scrollX = ownerDocument.defaultView.pageXOffset; + var scrollY = ownerDocument.defaultView.pageYOffset; + var cloneWindow = iframe.contentWindow; + var documentClone = cloneWindow.document; + /* Chrome doesn't detect relative background-images assigned in inline