From 40859ee2805e7b06d858666177bdddb0cc6ed6e7 Mon Sep 17 00:00:00 2001 From: MrVauxs Date: Thu, 23 Jun 2022 18:34:21 +0200 Subject: [PATCH] v0.5.13 --- archetypes.html | 4 +- data/archetypes.json | 77 +- data/changelog.json | 5 + data/feats/feats-apg.json | 8 +- js/archetypes.js | 5 +- js/classes.js | 5 +- js/filter-archetypes.js | 5 + js/filter-classes.js | 7 + js/utils.js | 2 +- package.json | 2 +- sw.js | 2511 +------------------------------------ 11 files changed, 110 insertions(+), 2521 deletions(-) diff --git a/archetypes.html b/archetypes.html index 7a1bbb9488..bb4e69a95d 100644 --- a/archetypes.html +++ b/archetypes.html @@ -89,10 +89,12 @@

Archetypes

- +
diff --git a/data/archetypes.json b/data/archetypes.json index b1e3db536d..5c9c19c25e 100644 --- a/data/archetypes.json +++ b/data/archetypes.json @@ -46,6 +46,7 @@ { "name": "Aldori Duelist", "source": "LOWG", + "rarity": "uncommon", "page": 35, "entries": [ "You have sworn the Aldori swordpact and study the art of Aldori dueling, a famed school of bladecraft which has been passed down for over a millennium from the teachings of Baron Sirian Aldori. One day, you hope to demonstrate your skill at swordplay in order to become acknowledged as a true swordlord." @@ -56,6 +57,7 @@ { "name": "Animal Trainer", "source": "EC2", + "rarity": "uncommon", "page": 76, "entries": [ "You have befriended an animal to serve as an able assistant and loyal guardian." @@ -181,13 +183,14 @@ "extraFeats": [ "6|Shielded Stride|CRB", "8|Reflexive Shield|CRB", - "10|Quick Shield Block|CRB", + "10|Quick Shield Block (Fighter)|CRB", "12|Mirror Shield|CRB" ], "dedicationLevel": 2 }, { "name": "Beast Gunner", + "rarity": "uncommon", "source": "G&G", "page": 130, "entries": [ @@ -245,6 +248,7 @@ { "name": "Bellflower Tiller", "source": "AoA3", + "rarity": "uncommon", "page": 75, "entries": [ "Bellflower tillers handle most of the ground-level efforts of freeing slaves and escorting them to safety. They use farming-related code words to hide their work: a tiller's freed slaves are her \"crop,\" which she moves along secretive paths termed \"rows,\" taking shelter in secret hideouts referred to as \"barns.\"" @@ -296,6 +300,7 @@ }, { "name": "Bullet Dancer", + "rarity": "uncommon", "source": "G&G", "page": 132, "entries": [ @@ -315,6 +320,7 @@ { "name": "Butterfly Blade", "source": "FRP1", + "rarity": "uncommon", "page": 78, "entries": [ "You've trained in one of Goka's oldest traditions of espionage, intimidation, and combat mastery. You use your skills to learn about your enemies and cut them down with your mastery of the butterfly sword." @@ -344,6 +350,7 @@ }, { "name": "Cathartic Mage", + "rarity": "uncommon", "source": "SoM", "page": 194, "entries": [ @@ -653,6 +660,7 @@ { "name": "Crystal Keeper", "source": "AoA4", + "rarity": "rare", "page": 74, "entries": [ "In the era before Earthfall, the elven people of Golarion exhibited a wide range of mastery over magic. A sect of elves who venerated the goddess Yuelral first developed the techniques of the crystal keeper, but this tradition has since been long forgotten by most of the world. There are those who still remember, though\u2014PCs can gain access to the crystal keeper archetype from the tragic figure that haunts Jewelgate waystation in \"Fires of the Haunted City.\"" @@ -673,6 +681,7 @@ { "name": "Demolitionist", "source": "G&G", + "rarity": "uncommon", "page": 133, "entries": [ "As rippling explosions bring a castle's walls tumbling down, you grin and wipe the stone dust of your handiwork from your face. Brute force might work for others, but applying science to place the right explosives in just the right spot is essential to your craft." @@ -687,6 +696,7 @@ }, { "name": "Dragon Disciple", + "rarity": "uncommon", "source": "APG", "page": 168, "entries": [ @@ -707,6 +717,7 @@ }, { "name": "Drow Shootist", + "rarity": "uncommon", "source": "FRP1", "page": 77, "entries": [ @@ -775,6 +786,7 @@ "name": "Edgewatch Detective", "source": "AOE1", "page": 79, + "rarity": "uncommon", "entries": [ "You're a specially trained detective for the Edgewatch guard precinct in Absalom." ], @@ -811,6 +823,7 @@ { "name": "Eldritch Researcher", "source": "AV2", + "rarity": "uncommon", "page": 76, "entries": [ "An eager student of occult lore, you enjoy reading rare or forgotten tomes with ancient rituals and hidden secrets. You connect disparate facts to unlock deeper mysteries and uncover the truths of the universe, and you zealously hoard the knowledge your painstaking research produces. Aberrations fascinate you for many reasons, not the least of which is because their anatomy is wholly alien and yet, to the insightful, eminently sensible.", @@ -897,6 +910,7 @@ { "name": "Firebrand Braggart", "source": "LOCG", + "rarity": "uncommon", "page": 74, "entries": [ "Many Firebrands travel the Inner Sea region drawing attention to themselves, making great shows of their exploits, and proclaiming their great deeds." @@ -908,6 +922,7 @@ "name": "Firework Technician", "source": "G&G", "page": 134, + "rarity": "uncommon", "entries": [ "The brilliant display of cascading lights and flickering aerial flowers, the thunderous boom, the sizzling crackle, and piercing screech\u2014these are the stock and trade of your craft. You know how to perfectly pair light and sound to create fireworks displays that can amaze children and adults, comfort friends, and even confound your foes.", "As a fireworks technician, you might be an itinerant wanderer, roaming from town to town and developing your craft on your own. In that case, you make a living on the road, selling fireworks to the townsfolk, setting up public displays upon request and receipt of payment, and even tailoring individualized performances to those wealthy or interesting enough to be worthy of receiving their own private show.", @@ -1337,6 +1352,7 @@ { "name": "Folklorist", "source": "SOT2", + "rarity": "uncommon", "page": 78, "entries": [ "Folklorists are welcome across the Mwangi Expanse for the entertaining stories they tell and the counsel they impart. However, those who take the art of storytelling to the next level can produce magical effects based on their understanding of stories and their firm belief that life conforms to the contours of these tales. While many such folklorists are benevolent, terms like hero and villain are notoriously relative, changing to fit the perspective of the storyteller." @@ -1358,6 +1374,7 @@ { "name": "Ghost Eater", "source": "FRP1", + "rarity": "uncommon", "page": 79, "entries": [ "The warriors of Minata frequently contend with lost spirits of the Taumatan people that haunt their shattered lands to this day. These Minatan warriors, known as ghost eaters around Bonmu, travel the countless islands of Minata and offer their skills to exorcists and priests. When working in such a partnership, ghost eater's main task is to destroy a spirit in order to give their holy comrade time to learn about the individual soul and finally put it to rest." @@ -1368,6 +1385,7 @@ { "name": "Ghost Hunter", "source": "AV1", + "rarity": "uncommon", "page": 81, "entries": [ "Ghosts have a wide range of capabilities and features\u2014 no two ghosts are exactly alike, as the nature of their abilities depends as much upon who they were in life as on how they died. Haunts, the spectral phenomena remaining in a site of death or powerful emotions, are related to but distinct from ghosts.", @@ -1390,6 +1408,7 @@ { "name": "Golden League Xun", "source": "FRP2", + "rarity": "uncommon", "page": 76, "entries": [ "You've become a xun, a powerful gang enforcer." @@ -1401,6 +1420,7 @@ "name": "Golem Grafter", "source": "EC3", "page": 74, + "rarity": "uncommon", "entries": [ "You have replaced a portion of your body with artifice of the kind used to create golems, fortifying your flesh with the unyielding might of magical constructs." ], @@ -1409,6 +1429,7 @@ { "name": "Gray Gardener", "source": "NGD", + "rarity": "uncommon", "page": 64, "entries": [ "The Gray Gardeners are the remorseless executioners of Galt. Prior to the events of the adventure, the Gray Gardeners are at best sinister (when not actively pursuing evil) as a malevolent monster controls their organization. After the events of Night of the Gray Death, the organization is broken\u2014leadership is in disarray while the rank-and-file members labor to enforce laws and recapture escaped criminals. The Gray Gardeners still command the respect of Galt's people, however, as their brutal reputation is indelibly etched in the public consciousness over the last fifty years.", @@ -1441,6 +1462,7 @@ { "name": "Halcyon Speaker", "source": "LOCG", + "rarity": "uncommon", "page": 104, "entries": [ "One of Old-Mage Jatembe's central lessons was that magic was magic, no matter what the source. Though the Magaambya seeks to hold true to Jatembe's teachings by aiming to understand magic of all kinds, the mages of the Magaambya have found the most success with magic rooted in the material world. Halcyon speakers are powerful conversants who epitomize the Magaambyan practice of blending arcane and primal magic, seeing both traditions as flowing from the same wellspring." @@ -1451,6 +1473,7 @@ { "name": "Hellknight", "source": "LOCG", + "rarity": "uncommon", "page": 84, "entries": [ "Hellknights are among the fiercest warriors in the Inner Sea region, as they have emerged from hell-forged trials ready to serve as faceless bastions of law wherever chaos might threaten to rear." @@ -1461,6 +1484,7 @@ { "name": "Hellknight Armiger", "source": "LOWG", + "rarity": "uncommon", "page": 107, "entries": [ "You have presented yourself to a Hellknight citadel as a candidate to become a fearsome Hellknight. You believe that all who live must be forced to obey law, and you adventure as a test of your loyalty, discipline, and courage. Someday you will take the Hellknight test and battle a devil in single combat to prove your strength and join the Hellknight ranks." @@ -1471,6 +1495,7 @@ { "name": "Hellknight Signifer", "source": "LOCG", + "rarity": "uncommon", "page": 85, "entries": [ "Signifers are the powerful and enigmatic Hellknight spellcasters who support and sometimes lead other Hellknights on their missions to enforce unwavering law. Formidable in their own right, signifers are trained to be unstoppable forces of order and authority when they stand alongside their martial counterparts." @@ -1549,6 +1574,7 @@ "name": "Jalmeri Heavenseeker", "source": "AoE2", "page": 78, + "rarity": "uncommon", "entries": [ "Certain martial artists dedicate themselves to fighting in Jalmeray's Challenge of Sky and Heaven; these individuals devote themselves to the esoteric mysteries of the sky and incorporate these lofty abilities into their martial arts maneuvers. You may have learned these skills from the Houses of Perfection in Jalmeray, or from a practitioner of this style who left Jalmeray bearing its secrets (such as Shristi Melipdra). The Houses of Perfection focus on honing elemental powers, but the Jalmeri heavenseeker isn't limited by the powers of air alone. This style's attacks emulate darting flashes of lightning and the crash of thunder from roiling storm clouds. A true practitioner masters control even over dense matter, causing the air to support its weight or bring it crashing down." ], @@ -1557,6 +1583,7 @@ }, { "name": "Juggler", + "rarity": "uncommon", "source": "EC1", "page": 74, "entries": [ @@ -1569,6 +1596,7 @@ "name": "Knight Reclaimant", "source": "LOCG", "page": 74, + "rarity": "uncommon", "entries": [ "Knights reclaimant spend much of their time amid the horrors of the Gravelands, rescuing civilians that remain and striking back against the Whispering Tyrant's agents. Accomplishing these goals requires the adoption of subtle tactics, with a focus on stealth and survival." ], @@ -1578,6 +1606,7 @@ { "name": "Knight Vigilant", "source": "LOCG", + "rarity": "uncommon", "page": 94, "entries": [ "Taking their lead from heroic stories of the Shining Crusade, the knights vigilant stand as a courageous example of morality and honor." @@ -1589,6 +1618,7 @@ "name": "Lastwall Sentry", "source": "LOWG", "page": 47, + "rarity": "uncommon", "entries": [ "While the nation of Lastwall is gone, leaving only the horror of the Gravelands behind, you refuse to give up and renounce your oaths. You've renewed your vows, swearing to combat the influence of the Whispering Tyrant wherever it might strike across Golarion." ], @@ -1605,9 +1635,21 @@ "extraFeats": [], "dedicationLevel": 2 }, + { + "name": "Lion Blade", + "source": "LOWG", + "rarity": "uncommon", + "page": 131, + "entries": [ + "You’ve trained as a spy in service of Taldor, learning secrets of disguise, manipulating crowds, and deceiving various sorts of magic users with ease. You likely dropped out of the Kitharodian Academy, Taldor’s premier bardic college, in order to train at one of the Lion Blade’s elite Shadow Schools." + ], + "extraFeats": [], + "dedicationLevel": 2 + }, { "name": "Living Monolith", "source": "LOWG", + "rarity": "uncommon", "page": 59, "entries": [ "You have delved into ancient sphinx magic to imbue your body and soul with the patience and strength of stone, as you work to create a special magical ka stone to finalize your oaths." @@ -1634,6 +1676,7 @@ "name": "Magaambyan Attendant", "source": "LOCG", "page": 101, + "rarity": "uncommon", "entries": [ "Magaambyans attendants have become full members of the Magaambya and begun to learn the secrets of the university. Not all Magaambyan attendants necessarily have this archetype, and this archetype doesn't represent the abilities of all attendants; rather, the archetype represents many of those who have affiliated with a branch and are pursuing conversant rank." ], @@ -1643,6 +1686,7 @@ { "name": "Magic Warrior", "source": "LOWG", + "rarity": "uncommon", "page": 95, "entries": [ "You mix magic and martial prowess, following in the tradition of the Ten Magic Warriors of Old-Mage Jatembe." @@ -1764,6 +1808,7 @@ { "name": "Nantambu Chime-Ringer", "source": "SOT2", + "rarity": "uncommon", "page": 79, "entries": [ "The Chime-Ringers serve as Nantambu's elite town guard, keeping the peace while carrying on ancient traditions of crafting chimes in metal, bamboo, or glass." @@ -1775,6 +1820,7 @@ "name": "Oozemorph", "source": "Sli", "page": 59, + "rarity": "uncommon", "entries": [ "You have suffered from the deadly touch of an ooze or other amorphous creature, like a gibbering mouther or a shoggoth, and have come away changed. Alternatively, you might have been exposed to some alchemical accident involving experiments with oozes, such as those performed in the city of Oenopion in Nex. Parts of your body occasionally liquefy and threaten to slough off, and only through force of will can you keep your natural form intact. Your affliction is plainly supernatural in origin and distressingly permanent." ], @@ -1800,6 +1846,7 @@ { "name": "Overwatch", "source": "G&G", + "rarity": "uncommon", "page": 50, "entries": [ "With a stalwart mind and sharp eyes, you observe the battlefield as though you and your allies are pieces on a chessboard. By predicting dangers and hazards and offering your insights to your comrades, you win battles through keen observation and teamwork. Whenever there's a threat or opening, you're the first to point it out, and you're ready to help your allies directly when necessary.", @@ -1812,6 +1859,7 @@ { "name": "Pathfinder Agent", "source": "LOWG", + "rarity": "uncommon", "page": 23, "entries": [ "You're a field agent of the globe-trotting Pathfinder Society, sworn to report, explore, and cooperate. You explore the world, gathering artifacts and antiquities, and record your adventures for posterity." @@ -1832,6 +1880,7 @@ }, { "name": "Pistol Phenom", + "rarity": "uncommon", "source": "G&G", "page": 136, "entries": [ @@ -1885,6 +1934,7 @@ }, { "name": "Provocator", + "rarity": "uncommon", "source": "AOE3", "page": 79, "entries": [ @@ -1925,6 +1975,7 @@ }, { "name": "Red Mantis Assassin", + "rarity": "uncommon", "source": "AOE3", "page": 71, "entries": [ @@ -1937,6 +1988,7 @@ "name": "Ritualist", "source": "APG", "page": 187, + "rarity": "uncommon", "entries": [ "While some learn the art of ritual casting through rigorous study, other gifted individuals may find that a combination of natural talent and luck gives them surprising skill at performing rituals, whether they want that power or not." ], @@ -1977,6 +2029,7 @@ }, { "name": "Runelord", + "rarity": "rare", "source": "SoM", "page": 240, "entries": [ @@ -2077,6 +2130,7 @@ { "name": "Runescarred", "source": "LOWG", + "rarity": "uncommon", "page": 119, "entries": [ "The rune magic of Thassilon and its descendant nations has left its mark on your very flesh. As a runescarred, you have an unusually close connection to this ancient magic, which has become a newly emerging field of study for small pockets of interested scholars in both Varisia and New Thassilon." @@ -2111,6 +2165,7 @@ { "name": "Scrollmaster", "source": "LOCG", + "rarity": "uncommon", "page": 113, "entries": [ "Members who align themselves with the Scrolls branch of the Pathfinder Society are fervent seekers of lore, experts in esoterica, and masters of the wealth of knowledge at the Society's disposal. In addition to maintaining and researching the Society's massive collection of tomes and artifacts, these scholars are also eager to adventure in order to add to the Pathfinder's archives. They take tremendous pride in their ability to thoroughly observe, research, and catalog creatures and events. Members of the Scrolls value knowledge and preparation above strength and cunning, and they work to hone their intellectual skills. As a Scrollmaster, you are an elite member of this arm of the Society." @@ -2121,6 +2176,7 @@ { "name": "Scrounger", "source": "APG", + "rarity": "uncommon", "page": 190, "entries": [ "You have spent countless hours disassembling and rebuilding complex items to learn how they work, giving you the skill to create just about anything from the most unlikely materials. While your improvised items don't last long, they tend to be just what you need in a pinch, and your enemies find that while they might be able to disarm you, the real challenge is keeping you that way. Locked rooms, diabolical traps, and desperate situations are each their own sort of puzzle to you, and the mundane objects around you are the pieces you use to improvise your own solution." @@ -2144,6 +2200,7 @@ { "name": "Shadowcaster", "source": "SoM", + "rarity": "uncommon", "page": 226, "entries": [ "The world is full of shadows, but each living creature possesses a form of inner light to ward against that ever-present darkness... all except shadowcasters. By trading away that piece of their spirit, shadowcasters have removed a limiter, allowing them to gain magical power rooted in the darkness; however, this trade also exposes them to otherworldly whispers from the realms of shadow." @@ -2187,6 +2244,7 @@ { "name": "Sixth Pillar", "source": "FRP2", + "rarity": "uncommon", "page": 77, "entries": [ "The Sixth Pillar follows a tradition that blends martial arts with magic. Traditionally, this is a way to better focus and harness innate or bloodline magic, but it can be used by anyone who can cast spells." @@ -2257,6 +2315,7 @@ { "name": "Soulforger", "source": "SoM", + "rarity": "uncommon", "page": 236, "entries": [ "Your devotion to a cause unifies your soul with an armament tethered to the very essence of your spirit.", @@ -2310,6 +2369,7 @@ "name": "Spellmaster", "source": "LOCG", "page": 114, + "rarity": "uncommon", "entries": [ "Those who train under the Master of Spells concern themselves with all matters related to magic. Though not all members of the School of Spells are spellcasters, those who would become Spellmasters of the highest rank and influence have at least some spellcasting capabilities." ], @@ -2319,6 +2379,7 @@ { "name": "Spellshot", "source": "G&G", + "rarity": "uncommon", "page": 140, "entries": [ "{@b Rarity:} {@trait Uncommon}", @@ -2550,6 +2611,7 @@ "name": "Staff Acrobat", "source": "EC1", "page": 114, + "rarity": "uncommon", "entries": [ "You can perform amazing acts in and out of combat when you have a spear, staff, or polearm." ], @@ -2560,6 +2622,7 @@ "name": "Sterling Dynamo", "source": "G&G", "page": 52, + "rarity": "uncommon", "entries": [ "While many people across Golarion use prosthetic devices, you've acquired and outfitted yourself with a particularly advanced combat model of clockwork prosthesis: a piece of cutting edge technology called a sterling dynamo. You know how to maintain your dynamo and how to customize it to suit your needs and style, incorporating any promising new technologies you encounter into its design.", "There's a significant distinction, however, between someone who merely has a sterling dynamo prosthesis and someone like you who is a true sterling dynamo. With their recent invention, people in Absalom and Dongun Hold with access to the technology have begun to adopt sterling dynamos as their prostheses of choice, among the wide variety of amazing options already available in both markets. However, not everyone who chooses to use sterling dynamo technology is a member of the sterling dynamo archetype.", @@ -2573,6 +2636,7 @@ "name": "Student of Perfection", "source": "LOWG", "page": 83, + "rarity": "uncommon", "entries": [ "You studied martial arts at Jalmeray's Houses of Perfection." ], @@ -2643,6 +2707,7 @@ "name": "Swordmaster", "source": "LOCG", "page": 115, + "rarity": "uncommon", "entries": [ "Though the ultimate goal of the Pathfinder society is to learn, knowledge cannot be spread if those who discover it fail to come back alive. The Master of Swords teaches recruits to survive, to defend other Pathfinders, and to defeat the Society's enemies. The swordmaster embodies these skills, focusing on practicality and ignoring ideals or methods that interfere with their ability to overcome any challenge." ], @@ -2662,6 +2727,7 @@ { "name": "Trapsmith", "source": "G&G", + "rarity": "uncommon", "page": 52, "entries": [ "Wielding a wrench or blowtorch, you manufacture snares that whir and tick with delicate precision. Your best work requires the right materials\u2014a glorious set of brass fittings and cogwheels\u2014with which you create snares that are as elegantly lethal as they are subtle. As a trapsmith, you're always improving your snares: adjusting timing, tweaking triggers, and finding new ways to hide them from foes.", @@ -2672,6 +2738,7 @@ }, { "name": "Trick Driver", + "rarity": "uncommon", "source": "G&G", "page": 55, "entries": [ @@ -2683,6 +2750,7 @@ { "name": "Turpin Rowe Lumberjack", "source": "EC3", + "rarity": "uncommon", "page": 75, "entries": [ "You are a feller of trees and a skilled axe wielder, trained in the art of forestry by the hard-working loggers of Turpin Rowe." @@ -2693,6 +2761,7 @@ "name": "Unexpected Sharpshooter", "source": "G&G", "page": 138, + "rarity": "uncommon", "entries": [ { "type": "quote", @@ -2723,6 +2792,7 @@ { "name": "Vehicle Mechanic", "source": "G&G", + "rarity": "uncommon", "page": 56, "entries": [ "You have always felt that vehicles are as much works of art as they are means of transportation. It doesn't matter if it's as common as a chariot or as complex as an airship, there's always some aspect of the vehicle you can improve upon. Pilots, drivers, and sailors alike value your expertise, and many seek you out to work on their vehicles. While you can make a great profit working on custom vehicles for wealthy clients, you still keep a vehicle of your own to tinker with as your personal passion project.", @@ -2734,6 +2804,7 @@ { "name": "Vigilante", "source": "APG", + "rarity": "uncommon", "page": 196, "entries": [ "As a vigilante, you have two faces: a public persona, and a secret identity that lets you hide your extralegal actions from polite society. Your secret identity lets you adventure and carry out clandestine missions while keeping the civilians you care about safe. Whatever your purpose\u2014fighting crime, inciting rebellion, sowing chaos\u2014your vigilante identity makes you both hard to pin down and a mysterious, intriguing subject of gossip." @@ -2753,7 +2824,7 @@ "extraFeats": [ "4|Reactive Shield|CRB", "6|Shielded Stride|CRB", - "10|Quick Shield Block|CRB" + "10|Quick Shield Block (Fighter)|CRB" ], "dedicationLevel": 2 }, @@ -2784,6 +2855,7 @@ "name": "Wellspring Mage", "source": "SoM", "page": 248, + "rarity": "rare", "entries": [ "The source of your magic buckles against your control, always pressing to be released.", { @@ -2998,6 +3070,7 @@ "name": "Zephyr Guard", "source": "AOA5", "page": 81, + "rarity": "uncommon", "entries": [ "You are one of the Zephyr Guard, professional soldiers who protect Katapesh from military threats, economic sabotage, and elite thieves." ], diff --git a/data/changelog.json b/data/changelog.json index db6e2bafa3..e402d40aac 100644 --- a/data/changelog.json +++ b/data/changelog.json @@ -154,6 +154,11 @@ "ver": "0.5.12", "date": "2022-06-22", "txt": "- Added 3rd CRB errata\n- (Typos/Tags)" + }, + { + "ver": "0.5.13", + "date": "2022-06-23", + "txt": "- Added rarity filters to Archetypes and Classes pages\n- (Typos/Tags)" } ] } diff --git a/data/feats/feats-apg.json b/data/feats/feats-apg.json index 063e14377a..47d5ff369a 100644 --- a/data/feats/feats-apg.json +++ b/data/feats/feats-apg.json @@ -458,7 +458,7 @@ "traits": [ "investigator" ], - "prerequisites": "alchemical sciences methodology", + "prerequisites": "{@class Investigator|APG|alchemical sciences|alchemical sciences} methodology", "entries": [ "You've devoted extra time in the lab to improve your knowledge of alchemy. You learn the formulas for two alchemical items each time you level up instead of one; these must still be elixirs or tools. The number of versatile vials you can create each day increases by 1 if you're an expert in {@skill Crafting}, 2 if you're a master, or 3 if you're legendary." ] @@ -12430,14 +12430,14 @@ ] }, { - "name": "Sample Investigator Lie Detector", + "name": "Lie Detector", "source": "APG", "page": 62, "level": 4, "traits": [ "investigator" ], - "prerequisites": "empiricism or interrogation methodology", + "prerequisites": "{@class Investigator|APG|empiricism|empiricism} or {@class Investigator|APG|interrogation|interrogation} methodology", "entries": [ "You're adept at noticing the tells of a liar\u2014sweat, flushing, a quavering voice, a quickening pulse. You gain a +1 circumstance bonus to {@skill Perception} checks to {@action Sense Motive} and to {@skill Perception} DCs against attempts to {@action Lie} to you. When you determine someone is lying to you, you can use their deceit to your advantage to gain a +1 circumstance bonus to the next {@skill Deception}, {@skill Diplomacy}, {@skill Intimidation}, or {@skill Performance} check you attempt against that creature within the next minute." ] @@ -12468,7 +12468,7 @@ "traits": [ "investigator" ], - "prerequisites": "forensic medicine methodology", + "prerequisites": "{@class Investigator|APG|forensic medicine|forensic medicine} methodology", "entries": [ "Your stratagems benefit from your precise knowledge of anatomy. When you critically hit with an attack on which you substituted your attack roll due to {@action Devise a Stratagem|APG|Devising a Stratagem}, if your attack dealt piercing or slashing damage, you also deal {@damage 1d6} {@condition persistent damage ||persistent bleed damage} to your target." ] diff --git a/js/archetypes.js b/js/archetypes.js index 94a19f3841..3b1bf2d69e 100644 --- a/js/archetypes.js +++ b/js/archetypes.js @@ -515,10 +515,12 @@ class ArchetypesPage extends BaseComponent { getListItem (arc, ancI, isExcluded) { const hash = UrlUtil.autoEncodeHash(arc); const source = Parser.sourceJsonToAbv(arc.source); + const rarity = arc._fRarity ? arc._fRarity : "\u2014"; const $lnk = $(` - ${arc.name} + ${arc.name} ${arc.dedicationLevel} + ${rarity} ${source} `); @@ -531,6 +533,7 @@ class ArchetypesPage extends BaseComponent { { hash, source, + rarity, level: arc.dedicationLevel, }, { diff --git a/js/classes.js b/js/classes.js index 3334275da2..93f57787ff 100644 --- a/js/classes.js +++ b/js/classes.js @@ -708,7 +708,7 @@ class ClassesPage extends BaseComponent { "_state", "__state", this.activeClass.subclasses - .filter(sc => !this.filterBox.toDisplay(f, sc.source, Array(5), sc._fMisc, null)) + .filter(sc => !this.filterBox.toDisplay(f, sc.source, sc._fRarity, Array(5), sc._fMisc, null)) .map(sc => UrlUtil.getStateKeySubclass(sc)) .filter(stateKey => this._state[stateKey]) .mergeMap(stateKey => ({[stateKey]: false})), @@ -1154,7 +1154,7 @@ class ClassesPage extends BaseComponent { metaTblRow.metasFeatureLinks.forEach(metaFeatureLink => { if (metaFeatureLink.source) { // FIXME: length of _filters hardcoded... - const isHidden = !this.filterBox.toDisplay(filterValues, metaFeatureLink.source, Array(5), null); + const isHidden = !this.filterBox.toDisplay(filterValues, metaFeatureLink.source, null, Array(5), null); metaFeatureLink.isHidden = isHidden; metaFeatureLink.$wrpLink.toggleClass("hidden", isHidden); } @@ -1388,6 +1388,7 @@ class ClassesPage extends BaseComponent { return this.filterBox.toDisplay( f, li.data.entity.source, + cls._fRarity, Array(5), cls._fMisc, ); diff --git a/js/filter-archetypes.js b/js/filter-archetypes.js index 0ff4b22543..a61e30a6a4 100644 --- a/js/filter-archetypes.js +++ b/js/filter-archetypes.js @@ -2,6 +2,7 @@ class PageFilterArchetypes extends PageFilter { constructor () { super(); + this._rarityFilter = new Filter({header: "Rarity"}); this._benefitsFilter = new Filter({header: "Benefits"}); this._levelFilter = new Filter({ header: "Dedication Level", @@ -12,10 +13,12 @@ class PageFilterArchetypes extends PageFilter { mutateForFilters (archetype, opts) { archetype._fSources = SourceFilter.getCompleteFilterSources(archetype); + if (archetype.rarity) archetype._fRarity = archetype.rarity.toTitleCase(); } addToFilters (archetype, isExcluded, opts) { if (isExcluded) return; + this._rarityFilter.addItem(archetype._fRarity); this._sourceFilter.addItem(archetype._fSources); this._levelFilter.addItem(archetype.dedicationLevel); this._benefitsFilter.addItem(archetype.benefits); @@ -25,6 +28,7 @@ class PageFilterArchetypes extends PageFilter { async _pPopulateBoxOptions (opts) { opts.filters = [ this._sourceFilter, + this._rarityFilter, this._levelFilter, this._benefitsFilter, this._miscFilter, @@ -35,6 +39,7 @@ class PageFilterArchetypes extends PageFilter { return this._filterBox.toDisplay( values, a._fSources, + a._fRarity, a.dedicationLevel, a.benefits, a.miscTags, diff --git a/js/filter-classes.js b/js/filter-classes.js index 486e255f54..e24d1a6aea 100644 --- a/js/filter-classes.js +++ b/js/filter-classes.js @@ -3,6 +3,7 @@ class PageFilterClasses extends PageFilter { constructor () { super(); + this._rarityFilter = new Filter({header: "Rarity"}); this._perceptionFilter = new Filter({header: "Perception"}); this._fortFilter = new Filter({header: "Fortitude"}); this._refFilter = new Filter({header: "Reflex"}); @@ -50,6 +51,7 @@ class PageFilterClasses extends PageFilter { get optionsFilter () { return this._optionsFilter; } mutateForFilters (cls, opts) { + if (cls.rarity) cls._fRarity = cls.rarity.toTitleCase(); cls.subclasses = cls.subclasses || [] cls._fSources = SourceFilter.getCompleteFilterSources(cls); cls._fSourceSubclass = [...new Set([cls.source, ...cls.subclasses.map(it => it.source)])]; @@ -101,6 +103,7 @@ class PageFilterClasses extends PageFilter { sc.subclassFeatures.forEach(lvlFeatures => lvlFeatures.forEach(feature => this._addEntrySourcesToFilter(feature))) } }); + this._rarityFilter.addItem(cls._fRarity); this._perceptionFilter.addItem(cls._fPerception); this._fortFilter.addItem(cls._fFort); this._refFilter.addItem(cls._fRef); @@ -113,6 +116,7 @@ class PageFilterClasses extends PageFilter { async _pPopulateBoxOptions (opts) { opts.filters = [ this._sourceFilter, + this._rarityFilter, this._proficienciesFilter, this._miscFilter, this._optionsFilter, @@ -123,6 +127,7 @@ class PageFilterClasses extends PageFilter { return this._filterBox.toDisplay( values, cls.source, + cls._fRarity, Array(this._proficienciesFilter._filters.length), cls._fMisc, ); @@ -133,6 +138,7 @@ class PageFilterClasses extends PageFilter { return this._filterBox.toDisplay( values, sc.source, + cls._fRarity, Array(this._proficienciesFilter._filters.length), sc._fMisc, ); @@ -149,6 +155,7 @@ class PageFilterClasses extends PageFilter { return this._filterBox.toDisplay( values, this.isAnySubclassDisplayed(values, c) ? c._fSourceSubclass : c._fSources, + c._fRarity, [ c._fPerception, c._fFort, diff --git a/js/utils.js b/js/utils.js index b5324bf92d..a627e6ac47 100644 --- a/js/utils.js +++ b/js/utils.js @@ -5,7 +5,7 @@ if (typeof module !== "undefined") require("./parser.js"); // in deployment, `IS_DEPLOYED = "";` should be set below. IS_DEPLOYED = undefined; -VERSION_NUMBER = /* PF2ETOOLS_VERSION__OPEN */"0.5.12"/* PF2ETOOLS_VERSION__CLOSE */; +VERSION_NUMBER = /* PF2ETOOLS_VERSION__OPEN */"0.5.13"/* PF2ETOOLS_VERSION__CLOSE */; DEPLOYED_STATIC_ROOT = ""; // ""; // FIXME re-enable this when we have a CDN again IS_VTT = false; diff --git a/package.json b/package.json index f020c8cc2a..0af344ef02 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pf2etools", "author": "Pf2eTools", - "version": "0.5.12", + "version": "0.5.13", "license": "MIT", "description": "A site dedicated to making playing games with your friends as easy as possible.", "scripts": { diff --git a/sw.js b/sw.js index b7d250b424..1411379542 100644 --- a/sw.js +++ b/sw.js @@ -1,2509 +1,2 @@ -(() => { - // node_modules/workbox-core/_version.js - try { - self["workbox:core:6.5.2"] && _(); - } catch (e) { - } - - // node_modules/workbox-core/models/messages/messages.js - var messages = { - "invalid-value": ({ paramName, validValueDescription, value }) => { - if (!paramName || !validValueDescription) { - throw new Error(`Unexpected input to 'invalid-value' error.`); - } - return `The '${paramName}' parameter was given a value with an unexpected value. ${validValueDescription} Received a value of ${JSON.stringify(value)}.`; - }, - "not-an-array": ({ moduleName, className, funcName, paramName }) => { - if (!moduleName || !className || !funcName || !paramName) { - throw new Error(`Unexpected input to 'not-an-array' error.`); - } - return `The parameter '${paramName}' passed into '${moduleName}.${className}.${funcName}()' must be an array.`; - }, - "incorrect-type": ({ expectedType, paramName, moduleName, className, funcName }) => { - if (!expectedType || !paramName || !moduleName || !funcName) { - throw new Error(`Unexpected input to 'incorrect-type' error.`); - } - const classNameStr = className ? `${className}.` : ""; - return `The parameter '${paramName}' passed into '${moduleName}.${classNameStr}${funcName}()' must be of type ${expectedType}.`; - }, - "incorrect-class": ({ expectedClassName, paramName, moduleName, className, funcName, isReturnValueProblem }) => { - if (!expectedClassName || !moduleName || !funcName) { - throw new Error(`Unexpected input to 'incorrect-class' error.`); - } - const classNameStr = className ? `${className}.` : ""; - if (isReturnValueProblem) { - return `The return value from '${moduleName}.${classNameStr}${funcName}()' must be an instance of class ${expectedClassName}.`; - } - return `The parameter '${paramName}' passed into '${moduleName}.${classNameStr}${funcName}()' must be an instance of class ${expectedClassName}.`; - }, - "missing-a-method": ({ expectedMethod, paramName, moduleName, className, funcName }) => { - if (!expectedMethod || !paramName || !moduleName || !className || !funcName) { - throw new Error(`Unexpected input to 'missing-a-method' error.`); - } - return `${moduleName}.${className}.${funcName}() expected the '${paramName}' parameter to expose a '${expectedMethod}' method.`; - }, - "add-to-cache-list-unexpected-type": ({ entry }) => { - return `An unexpected entry was passed to 'workbox-precaching.PrecacheController.addToCacheList()' The entry '${JSON.stringify(entry)}' isn't supported. You must supply an array of strings with one or more characters, objects with a url property or Request objects.`; - }, - "add-to-cache-list-conflicting-entries": ({ firstEntry, secondEntry }) => { - if (!firstEntry || !secondEntry) { - throw new Error(`Unexpected input to 'add-to-cache-list-duplicate-entries' error.`); - } - return `Two of the entries passed to 'workbox-precaching.PrecacheController.addToCacheList()' had the URL ${firstEntry} but different revision details. Workbox is unable to cache and version the asset correctly. Please remove one of the entries.`; - }, - "plugin-error-request-will-fetch": ({ thrownErrorMessage }) => { - if (!thrownErrorMessage) { - throw new Error(`Unexpected input to 'plugin-error-request-will-fetch', error.`); - } - return `An error was thrown by a plugins 'requestWillFetch()' method. The thrown error message was: '${thrownErrorMessage}'.`; - }, - "invalid-cache-name": ({ cacheNameId, value }) => { - if (!cacheNameId) { - throw new Error(`Expected a 'cacheNameId' for error 'invalid-cache-name'`); - } - return `You must provide a name containing at least one character for setCacheDetails({${cacheNameId}: '...'}). Received a value of '${JSON.stringify(value)}'`; - }, - "unregister-route-but-not-found-with-method": ({ method }) => { - if (!method) { - throw new Error(`Unexpected input to 'unregister-route-but-not-found-with-method' error.`); - } - return `The route you're trying to unregister was not previously registered for the method type '${method}'.`; - }, - "unregister-route-route-not-registered": () => { - return `The route you're trying to unregister was not previously registered.`; - }, - "queue-replay-failed": ({ name }) => { - return `Replaying the background sync queue '${name}' failed.`; - }, - "duplicate-queue-name": ({ name }) => { - return `The Queue name '${name}' is already being used. All instances of backgroundSync.Queue must be given unique names.`; - }, - "expired-test-without-max-age": ({ methodName, paramName }) => { - return `The '${methodName}()' method can only be used when the '${paramName}' is used in the constructor.`; - }, - "unsupported-route-type": ({ moduleName, className, funcName, paramName }) => { - return `The supplied '${paramName}' parameter was an unsupported type. Please check the docs for ${moduleName}.${className}.${funcName} for valid input types.`; - }, - "not-array-of-class": ({ value, expectedClass, moduleName, className, funcName, paramName }) => { - return `The supplied '${paramName}' parameter must be an array of '${expectedClass}' objects. Received '${JSON.stringify(value)},'. Please check the call to ${moduleName}.${className}.${funcName}() to fix the issue.`; - }, - "max-entries-or-age-required": ({ moduleName, className, funcName }) => { - return `You must define either config.maxEntries or config.maxAgeSecondsin ${moduleName}.${className}.${funcName}`; - }, - "statuses-or-headers-required": ({ moduleName, className, funcName }) => { - return `You must define either config.statuses or config.headersin ${moduleName}.${className}.${funcName}`; - }, - "invalid-string": ({ moduleName, funcName, paramName }) => { - if (!paramName || !moduleName || !funcName) { - throw new Error(`Unexpected input to 'invalid-string' error.`); - } - return `When using strings, the '${paramName}' parameter must start with 'http' (for cross-origin matches) or '/' (for same-origin matches). Please see the docs for ${moduleName}.${funcName}() for more info.`; - }, - "channel-name-required": () => { - return `You must provide a channelName to construct a BroadcastCacheUpdate instance.`; - }, - "invalid-responses-are-same-args": () => { - return `The arguments passed into responsesAreSame() appear to be invalid. Please ensure valid Responses are used.`; - }, - "expire-custom-caches-only": () => { - return `You must provide a 'cacheName' property when using the expiration plugin with a runtime caching strategy.`; - }, - "unit-must-be-bytes": ({ normalizedRangeHeader }) => { - if (!normalizedRangeHeader) { - throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`); - } - return `The 'unit' portion of the Range header must be set to 'bytes'. The Range header provided was "${normalizedRangeHeader}"`; - }, - "single-range-only": ({ normalizedRangeHeader }) => { - if (!normalizedRangeHeader) { - throw new Error(`Unexpected input to 'single-range-only' error.`); - } - return `Multiple ranges are not supported. Please use a single start value, and optional end value. The Range header provided was "${normalizedRangeHeader}"`; - }, - "invalid-range-values": ({ normalizedRangeHeader }) => { - if (!normalizedRangeHeader) { - throw new Error(`Unexpected input to 'invalid-range-values' error.`); - } - return `The Range header is missing both start and end values. At least one of those values is needed. The Range header provided was "${normalizedRangeHeader}"`; - }, - "no-range-header": () => { - return `No Range header was found in the Request provided.`; - }, - "range-not-satisfiable": ({ size, start, end }) => { - return `The start (${start}) and end (${end}) values in the Range are not satisfiable by the cached response, which is ${size} bytes.`; - }, - "attempt-to-cache-non-get-request": ({ url, method }) => { - return `Unable to cache '${url}' because it is a '${method}' request and only 'GET' requests can be cached.`; - }, - "cache-put-with-no-response": ({ url }) => { - return `There was an attempt to cache '${url}' but the response was not defined.`; - }, - "no-response": ({ url, error }) => { - let message = `The strategy could not generate a response for '${url}'.`; - if (error) { - message += ` The underlying error is ${error}.`; - } - return message; - }, - "bad-precaching-response": ({ url, status }) => { - return `The precaching request for '${url}' failed` + (status ? ` with an HTTP status of ${status}.` : `.`); - }, - "non-precached-url": ({ url }) => { - return `createHandlerBoundToURL('${url}') was called, but that URL is not precached. Please pass in a URL that is precached instead.`; - }, - "add-to-cache-list-conflicting-integrities": ({ url }) => { - return `Two of the entries passed to 'workbox-precaching.PrecacheController.addToCacheList()' had the URL ${url} with different integrity values. Please remove one of them.`; - }, - "missing-precache-entry": ({ cacheName, url }) => { - return `Unable to find a precached response in ${cacheName} for ${url}.`; - }, - "cross-origin-copy-response": ({ origin }) => { - return `workbox-core.copyResponse() can only be used with same-origin responses. It was passed a response with origin ${origin}.`; - }, - "opaque-streams-source": ({ type }) => { - const message = `One of the workbox-streams sources resulted in an '${type}' response.`; - if (type === "opaqueredirect") { - return `${message} Please do not use a navigation request that results in a redirect as a source.`; - } - return `${message} Please ensure your sources are CORS-enabled.`; - } - }; - - // node_modules/workbox-core/models/messages/messageGenerator.js - var generatorFunction = (code, details = {}) => { - const message = messages[code]; - if (!message) { - throw new Error(`Unable to find message for code '${code}'.`); - } - return message(details); - }; - var messageGenerator = false ? fallback : generatorFunction; - - // node_modules/workbox-core/_private/WorkboxError.js - var WorkboxError = class extends Error { - constructor(errorCode, details) { - const message = messageGenerator(errorCode, details); - super(message); - this.name = errorCode; - this.details = details; - } - }; - - // node_modules/workbox-core/_private/assert.js - var isArray = (value, details) => { - if (!Array.isArray(value)) { - throw new WorkboxError("not-an-array", details); - } - }; - var hasMethod = (object, expectedMethod, details) => { - const type = typeof object[expectedMethod]; - if (type !== "function") { - details["expectedMethod"] = expectedMethod; - throw new WorkboxError("missing-a-method", details); - } - }; - var isType = (object, expectedType, details) => { - if (typeof object !== expectedType) { - details["expectedType"] = expectedType; - throw new WorkboxError("incorrect-type", details); - } - }; - var isInstance = (object, expectedClass, details) => { - if (!(object instanceof expectedClass)) { - details["expectedClassName"] = expectedClass.name; - throw new WorkboxError("incorrect-class", details); - } - }; - var isOneOf = (value, validValues, details) => { - if (!validValues.includes(value)) { - details["validValueDescription"] = `Valid values are ${JSON.stringify(validValues)}.`; - throw new WorkboxError("invalid-value", details); - } - }; - var isArrayOfClass = (value, expectedClass, details) => { - const error = new WorkboxError("not-array-of-class", details); - if (!Array.isArray(value)) { - throw error; - } - for (const item of value) { - if (!(item instanceof expectedClass)) { - throw error; - } - } - }; - var finalAssertExports = false ? null : { - hasMethod, - isArray, - isInstance, - isOneOf, - isType, - isArrayOfClass - }; - - // node_modules/workbox-core/_private/cacheNames.js - var _cacheNameDetails = { - googleAnalytics: "googleAnalytics", - precache: "precache-v2", - prefix: "workbox", - runtime: "runtime", - suffix: typeof registration !== "undefined" ? registration.scope : "" - }; - var _createCacheName = (cacheName) => { - return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix].filter((value) => value && value.length > 0).join("-"); - }; - var eachCacheNameDetail = (fn) => { - for (const key of Object.keys(_cacheNameDetails)) { - fn(key); - } - }; - var cacheNames = { - updateDetails: (details) => { - eachCacheNameDetail((key) => { - if (typeof details[key] === "string") { - _cacheNameDetails[key] = details[key]; - } - }); - }, - getGoogleAnalyticsName: (userCacheName) => { - return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics); - }, - getPrecacheName: (userCacheName) => { - return userCacheName || _createCacheName(_cacheNameDetails.precache); - }, - getPrefix: () => { - return _cacheNameDetails.prefix; - }, - getRuntimeName: (userCacheName) => { - return userCacheName || _createCacheName(_cacheNameDetails.runtime); - }, - getSuffix: () => { - return _cacheNameDetails.suffix; - } - }; - - // node_modules/workbox-core/_private/logger.js - var logger = false ? null : (() => { - if (!("__WB_DISABLE_DEV_LOGS" in self)) { - self.__WB_DISABLE_DEV_LOGS = false; - } - let inGroup = false; - const methodToColorMap = { - debug: `#7f8c8d`, - log: `#2ecc71`, - warn: `#f39c12`, - error: `#c0392b`, - groupCollapsed: `#3498db`, - groupEnd: null - }; - const print = function(method, args) { - if (self.__WB_DISABLE_DEV_LOGS) { - return; - } - if (method === "groupCollapsed") { - if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { - console[method](...args); - return; - } - } - const styles = [ - `background: ${methodToColorMap[method]}`, - `border-radius: 0.5em`, - `color: white`, - `font-weight: bold`, - `padding: 2px 0.5em` - ]; - const logPrefix = inGroup ? [] : ["%cworkbox", styles.join(";")]; - console[method](...logPrefix, ...args); - if (method === "groupCollapsed") { - inGroup = true; - } - if (method === "groupEnd") { - inGroup = false; - } - }; - const api = {}; - const loggerMethods = Object.keys(methodToColorMap); - for (const key of loggerMethods) { - const method = key; - api[method] = (...args) => { - print(method, args); - }; - } - return api; - })(); - - // node_modules/workbox-core/_private/waitUntil.js - function waitUntil(event, asyncFn) { - const returnPromise = asyncFn(); - event.waitUntil(returnPromise); - return returnPromise; - } - - // node_modules/workbox-precaching/_version.js - try { - self["workbox:precaching:6.5.2"] && _(); - } catch (e) { - } - - // node_modules/workbox-precaching/utils/createCacheKey.js - var REVISION_SEARCH_PARAM = "__WB_REVISION__"; - function createCacheKey(entry) { - if (!entry) { - throw new WorkboxError("add-to-cache-list-unexpected-type", { entry }); - } - if (typeof entry === "string") { - const urlObject = new URL(entry, location.href); - return { - cacheKey: urlObject.href, - url: urlObject.href - }; - } - const { revision, url } = entry; - if (!url) { - throw new WorkboxError("add-to-cache-list-unexpected-type", { entry }); - } - if (!revision) { - const urlObject = new URL(url, location.href); - return { - cacheKey: urlObject.href, - url: urlObject.href - }; - } - const cacheKeyURL = new URL(url, location.href); - const originalURL = new URL(url, location.href); - cacheKeyURL.searchParams.set(REVISION_SEARCH_PARAM, revision); - return { - cacheKey: cacheKeyURL.href, - url: originalURL.href - }; - } - - // node_modules/workbox-precaching/utils/PrecacheInstallReportPlugin.js - var PrecacheInstallReportPlugin = class { - constructor() { - this.updatedURLs = []; - this.notUpdatedURLs = []; - this.handlerWillStart = async ({ request, state }) => { - if (state) { - state.originalRequest = request; - } - }; - this.cachedResponseWillBeUsed = async ({ event, state, cachedResponse }) => { - if (event.type === "install") { - if (state && state.originalRequest && state.originalRequest instanceof Request) { - const url = state.originalRequest.url; - if (cachedResponse) { - this.notUpdatedURLs.push(url); - } else { - this.updatedURLs.push(url); - } - } - } - return cachedResponse; - }; - } - }; - - // node_modules/workbox-precaching/utils/PrecacheCacheKeyPlugin.js - var PrecacheCacheKeyPlugin = class { - constructor({ precacheController: precacheController2 }) { - this.cacheKeyWillBeUsed = async ({ request, params }) => { - const cacheKey = (params === null || params === void 0 ? void 0 : params.cacheKey) || this._precacheController.getCacheKeyForURL(request.url); - return cacheKey ? new Request(cacheKey, { headers: request.headers }) : request; - }; - this._precacheController = precacheController2; - } - }; - - // node_modules/workbox-precaching/utils/printCleanupDetails.js - var logGroup = (groupTitle, deletedURLs) => { - logger.groupCollapsed(groupTitle); - for (const url of deletedURLs) { - logger.log(url); - } - logger.groupEnd(); - }; - function printCleanupDetails(deletedURLs) { - const deletionCount = deletedURLs.length; - if (deletionCount > 0) { - logger.groupCollapsed(`During precaching cleanup, ${deletionCount} cached request${deletionCount === 1 ? " was" : "s were"} deleted.`); - logGroup("Deleted Cache Requests", deletedURLs); - logger.groupEnd(); - } - } - - // node_modules/workbox-precaching/utils/printInstallDetails.js - function _nestedGroup(groupTitle, urls) { - if (urls.length === 0) { - return; - } - logger.groupCollapsed(groupTitle); - for (const url of urls) { - logger.log(url); - } - logger.groupEnd(); - } - function printInstallDetails(urlsToPrecache, urlsAlreadyPrecached) { - const precachedCount = urlsToPrecache.length; - const alreadyPrecachedCount = urlsAlreadyPrecached.length; - if (precachedCount || alreadyPrecachedCount) { - let message = `Precaching ${precachedCount} file${precachedCount === 1 ? "" : "s"}.`; - if (alreadyPrecachedCount > 0) { - message += ` ${alreadyPrecachedCount} file${alreadyPrecachedCount === 1 ? " is" : "s are"} already cached.`; - } - logger.groupCollapsed(message); - _nestedGroup(`View newly precached URLs.`, urlsToPrecache); - _nestedGroup(`View previously precached URLs.`, urlsAlreadyPrecached); - logger.groupEnd(); - } - } - - // node_modules/workbox-core/_private/canConstructResponseFromBodyStream.js - var supportStatus; - function canConstructResponseFromBodyStream() { - if (supportStatus === void 0) { - const testResponse = new Response(""); - if ("body" in testResponse) { - try { - new Response(testResponse.body); - supportStatus = true; - } catch (error) { - supportStatus = false; - } - } - supportStatus = false; - } - return supportStatus; - } - - // node_modules/workbox-core/copyResponse.js - async function copyResponse(response, modifier) { - let origin = null; - if (response.url) { - const responseURL = new URL(response.url); - origin = responseURL.origin; - } - if (origin !== self.location.origin) { - throw new WorkboxError("cross-origin-copy-response", { origin }); - } - const clonedResponse = response.clone(); - const responseInit = { - headers: new Headers(clonedResponse.headers), - status: clonedResponse.status, - statusText: clonedResponse.statusText - }; - const modifiedResponseInit = modifier ? modifier(responseInit) : responseInit; - const body = canConstructResponseFromBodyStream() ? clonedResponse.body : await clonedResponse.blob(); - return new Response(body, modifiedResponseInit); - } - - // node_modules/workbox-core/_private/getFriendlyURL.js - var getFriendlyURL = (url) => { - const urlObj = new URL(String(url), location.href); - return urlObj.href.replace(new RegExp(`^${location.origin}`), ""); - }; - - // node_modules/workbox-core/_private/cacheMatchIgnoreParams.js - function stripParams(fullURL, ignoreParams) { - const strippedURL = new URL(fullURL); - for (const param of ignoreParams) { - strippedURL.searchParams.delete(param); - } - return strippedURL.href; - } - async function cacheMatchIgnoreParams(cache, request, ignoreParams, matchOptions) { - const strippedRequestURL = stripParams(request.url, ignoreParams); - if (request.url === strippedRequestURL) { - return cache.match(request, matchOptions); - } - const keysOptions = Object.assign(Object.assign({}, matchOptions), { ignoreSearch: true }); - const cacheKeys = await cache.keys(request, keysOptions); - for (const cacheKey of cacheKeys) { - const strippedCacheKeyURL = stripParams(cacheKey.url, ignoreParams); - if (strippedRequestURL === strippedCacheKeyURL) { - return cache.match(cacheKey, matchOptions); - } - } - return; - } - - // node_modules/workbox-core/_private/Deferred.js - var Deferred = class { - constructor() { - this.promise = new Promise((resolve, reject) => { - this.resolve = resolve; - this.reject = reject; - }); - } - }; - - // node_modules/workbox-core/models/quotaErrorCallbacks.js - var quotaErrorCallbacks = /* @__PURE__ */ new Set(); - - // node_modules/workbox-core/_private/executeQuotaErrorCallbacks.js - async function executeQuotaErrorCallbacks() { - if (true) { - logger.log(`About to run ${quotaErrorCallbacks.size} callbacks to clean up caches.`); - } - for (const callback of quotaErrorCallbacks) { - await callback(); - if (true) { - logger.log(callback, "is complete."); - } - } - if (true) { - logger.log("Finished running callbacks."); - } - } - - // node_modules/workbox-core/_private/timeout.js - function timeout(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); - } - - // node_modules/workbox-strategies/_version.js - try { - self["workbox:strategies:6.5.2"] && _(); - } catch (e) { - } - - // node_modules/workbox-strategies/StrategyHandler.js - function toRequest(input) { - return typeof input === "string" ? new Request(input) : input; - } - var StrategyHandler = class { - constructor(strategy, options) { - this._cacheKeys = {}; - if (true) { - finalAssertExports.isInstance(options.event, ExtendableEvent, { - moduleName: "workbox-strategies", - className: "StrategyHandler", - funcName: "constructor", - paramName: "options.event" - }); - } - Object.assign(this, options); - this.event = options.event; - this._strategy = strategy; - this._handlerDeferred = new Deferred(); - this._extendLifetimePromises = []; - this._plugins = [...strategy.plugins]; - this._pluginStateMap = /* @__PURE__ */ new Map(); - for (const plugin of this._plugins) { - this._pluginStateMap.set(plugin, {}); - } - this.event.waitUntil(this._handlerDeferred.promise); - } - async fetch(input) { - const { event } = this; - let request = toRequest(input); - if (request.mode === "navigate" && event instanceof FetchEvent && event.preloadResponse) { - const possiblePreloadResponse = await event.preloadResponse; - if (possiblePreloadResponse) { - if (true) { - logger.log(`Using a preloaded navigation response for '${getFriendlyURL(request.url)}'`); - } - return possiblePreloadResponse; - } - } - const originalRequest = this.hasCallback("fetchDidFail") ? request.clone() : null; - try { - for (const cb of this.iterateCallbacks("requestWillFetch")) { - request = await cb({ request: request.clone(), event }); - } - } catch (err) { - if (err instanceof Error) { - throw new WorkboxError("plugin-error-request-will-fetch", { - thrownErrorMessage: err.message - }); - } - } - const pluginFilteredRequest = request.clone(); - try { - let fetchResponse; - fetchResponse = await fetch(request, request.mode === "navigate" ? void 0 : this._strategy.fetchOptions); - if (true) { - logger.debug(`Network request for '${getFriendlyURL(request.url)}' returned a response with status '${fetchResponse.status}'.`); - } - for (const callback of this.iterateCallbacks("fetchDidSucceed")) { - fetchResponse = await callback({ - event, - request: pluginFilteredRequest, - response: fetchResponse - }); - } - return fetchResponse; - } catch (error) { - if (true) { - logger.log(`Network request for '${getFriendlyURL(request.url)}' threw an error.`, error); - } - if (originalRequest) { - await this.runCallbacks("fetchDidFail", { - error, - event, - originalRequest: originalRequest.clone(), - request: pluginFilteredRequest.clone() - }); - } - throw error; - } - } - async fetchAndCachePut(input) { - const response = await this.fetch(input); - const responseClone = response.clone(); - void this.waitUntil(this.cachePut(input, responseClone)); - return response; - } - async cacheMatch(key) { - const request = toRequest(key); - let cachedResponse; - const { cacheName, matchOptions } = this._strategy; - const effectiveRequest = await this.getCacheKey(request, "read"); - const multiMatchOptions = Object.assign(Object.assign({}, matchOptions), { cacheName }); - cachedResponse = await caches.match(effectiveRequest, multiMatchOptions); - if (true) { - if (cachedResponse) { - logger.debug(`Found a cached response in '${cacheName}'.`); - } else { - logger.debug(`No cached response found in '${cacheName}'.`); - } - } - for (const callback of this.iterateCallbacks("cachedResponseWillBeUsed")) { - cachedResponse = await callback({ - cacheName, - matchOptions, - cachedResponse, - request: effectiveRequest, - event: this.event - }) || void 0; - } - return cachedResponse; - } - async cachePut(key, response) { - const request = toRequest(key); - await timeout(0); - const effectiveRequest = await this.getCacheKey(request, "write"); - if (true) { - if (effectiveRequest.method && effectiveRequest.method !== "GET") { - throw new WorkboxError("attempt-to-cache-non-get-request", { - url: getFriendlyURL(effectiveRequest.url), - method: effectiveRequest.method - }); - } - const vary = response.headers.get("Vary"); - if (vary) { - logger.debug(`The response for ${getFriendlyURL(effectiveRequest.url)} has a 'Vary: ${vary}' header. Consider setting the {ignoreVary: true} option on your strategy to ensure cache matching and deletion works as expected.`); - } - } - if (!response) { - if (true) { - logger.error(`Cannot cache non-existent response for '${getFriendlyURL(effectiveRequest.url)}'.`); - } - throw new WorkboxError("cache-put-with-no-response", { - url: getFriendlyURL(effectiveRequest.url) - }); - } - const responseToCache = await this._ensureResponseSafeToCache(response); - if (!responseToCache) { - if (true) { - logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' will not be cached.`, responseToCache); - } - return false; - } - const { cacheName, matchOptions } = this._strategy; - const cache = await self.caches.open(cacheName); - const hasCacheUpdateCallback = this.hasCallback("cacheDidUpdate"); - const oldResponse = hasCacheUpdateCallback ? await cacheMatchIgnoreParams(cache, effectiveRequest.clone(), ["__WB_REVISION__"], matchOptions) : null; - if (true) { - logger.debug(`Updating the '${cacheName}' cache with a new Response for ${getFriendlyURL(effectiveRequest.url)}.`); - } - try { - await cache.put(effectiveRequest, hasCacheUpdateCallback ? responseToCache.clone() : responseToCache); - } catch (error) { - if (error instanceof Error) { - if (error.name === "QuotaExceededError") { - await executeQuotaErrorCallbacks(); - } - throw error; - } - } - for (const callback of this.iterateCallbacks("cacheDidUpdate")) { - await callback({ - cacheName, - oldResponse, - newResponse: responseToCache.clone(), - request: effectiveRequest, - event: this.event - }); - } - return true; - } - async getCacheKey(request, mode) { - const key = `${request.url} | ${mode}`; - if (!this._cacheKeys[key]) { - let effectiveRequest = request; - for (const callback of this.iterateCallbacks("cacheKeyWillBeUsed")) { - effectiveRequest = toRequest(await callback({ - mode, - request: effectiveRequest, - event: this.event, - params: this.params - })); - } - this._cacheKeys[key] = effectiveRequest; - } - return this._cacheKeys[key]; - } - hasCallback(name) { - for (const plugin of this._strategy.plugins) { - if (name in plugin) { - return true; - } - } - return false; - } - async runCallbacks(name, param) { - for (const callback of this.iterateCallbacks(name)) { - await callback(param); - } - } - *iterateCallbacks(name) { - for (const plugin of this._strategy.plugins) { - if (typeof plugin[name] === "function") { - const state = this._pluginStateMap.get(plugin); - const statefulCallback = (param) => { - const statefulParam = Object.assign(Object.assign({}, param), { state }); - return plugin[name](statefulParam); - }; - yield statefulCallback; - } - } - } - waitUntil(promise) { - this._extendLifetimePromises.push(promise); - return promise; - } - async doneWaiting() { - let promise; - while (promise = this._extendLifetimePromises.shift()) { - await promise; - } - } - destroy() { - this._handlerDeferred.resolve(null); - } - async _ensureResponseSafeToCache(response) { - let responseToCache = response; - let pluginsUsed = false; - for (const callback of this.iterateCallbacks("cacheWillUpdate")) { - responseToCache = await callback({ - request: this.request, - response: responseToCache, - event: this.event - }) || void 0; - pluginsUsed = true; - if (!responseToCache) { - break; - } - } - if (!pluginsUsed) { - if (responseToCache && responseToCache.status !== 200) { - responseToCache = void 0; - } - if (true) { - if (responseToCache) { - if (responseToCache.status !== 200) { - if (responseToCache.status === 0) { - logger.warn(`The response for '${this.request.url}' is an opaque response. The caching strategy that you're using will not cache opaque responses by default.`); - } else { - logger.debug(`The response for '${this.request.url}' returned a status code of '${response.status}' and won't be cached as a result.`); - } - } - } - } - } - return responseToCache; - } - }; - - // node_modules/workbox-strategies/Strategy.js - var Strategy = class { - constructor(options = {}) { - this.cacheName = cacheNames.getRuntimeName(options.cacheName); - this.plugins = options.plugins || []; - this.fetchOptions = options.fetchOptions; - this.matchOptions = options.matchOptions; - } - handle(options) { - const [responseDone] = this.handleAll(options); - return responseDone; - } - handleAll(options) { - if (options instanceof FetchEvent) { - options = { - event: options, - request: options.request - }; - } - const event = options.event; - const request = typeof options.request === "string" ? new Request(options.request) : options.request; - const params = "params" in options ? options.params : void 0; - const handler = new StrategyHandler(this, { event, request, params }); - const responseDone = this._getResponse(handler, request, event); - const handlerDone = this._awaitComplete(responseDone, handler, request, event); - return [responseDone, handlerDone]; - } - async _getResponse(handler, request, event) { - await handler.runCallbacks("handlerWillStart", { event, request }); - let response = void 0; - try { - response = await this._handle(request, handler); - if (!response || response.type === "error") { - throw new WorkboxError("no-response", { url: request.url }); - } - } catch (error) { - if (error instanceof Error) { - for (const callback of handler.iterateCallbacks("handlerDidError")) { - response = await callback({ error, event, request }); - if (response) { - break; - } - } - } - if (!response) { - throw error; - } else if (true) { - logger.log(`While responding to '${getFriendlyURL(request.url)}', an ${error instanceof Error ? error.toString() : ""} error occurred. Using a fallback response provided by a handlerDidError plugin.`); - } - } - for (const callback of handler.iterateCallbacks("handlerWillRespond")) { - response = await callback({ event, request, response }); - } - return response; - } - async _awaitComplete(responseDone, handler, request, event) { - let response; - let error; - try { - response = await responseDone; - } catch (error2) { - } - try { - await handler.runCallbacks("handlerDidRespond", { - event, - request, - response - }); - await handler.doneWaiting(); - } catch (waitUntilError) { - if (waitUntilError instanceof Error) { - error = waitUntilError; - } - } - await handler.runCallbacks("handlerDidComplete", { - event, - request, - response, - error - }); - handler.destroy(); - if (error) { - throw error; - } - } - }; - - // node_modules/workbox-precaching/PrecacheStrategy.js - var PrecacheStrategy = class extends Strategy { - constructor(options = {}) { - options.cacheName = cacheNames.getPrecacheName(options.cacheName); - super(options); - this._fallbackToNetwork = options.fallbackToNetwork === false ? false : true; - this.plugins.push(PrecacheStrategy.copyRedirectedCacheableResponsesPlugin); - } - async _handle(request, handler) { - const response = await handler.cacheMatch(request); - if (response) { - return response; - } - if (handler.event && handler.event.type === "install") { - return await this._handleInstall(request, handler); - } - return await this._handleFetch(request, handler); - } - async _handleFetch(request, handler) { - let response; - const params = handler.params || {}; - if (this._fallbackToNetwork) { - if (true) { - logger.warn(`The precached response for ${getFriendlyURL(request.url)} in ${this.cacheName} was not found. Falling back to the network.`); - } - const integrityInManifest = params.integrity; - const integrityInRequest = request.integrity; - const noIntegrityConflict = !integrityInRequest || integrityInRequest === integrityInManifest; - response = await handler.fetch(new Request(request, { - integrity: integrityInRequest || integrityInManifest - })); - if (integrityInManifest && noIntegrityConflict) { - this._useDefaultCacheabilityPluginIfNeeded(); - const wasCached = await handler.cachePut(request, response.clone()); - if (true) { - if (wasCached) { - logger.log(`A response for ${getFriendlyURL(request.url)} was used to "repair" the precache.`); - } - } - } - } else { - throw new WorkboxError("missing-precache-entry", { - cacheName: this.cacheName, - url: request.url - }); - } - if (true) { - const cacheKey = params.cacheKey || await handler.getCacheKey(request, "read"); - logger.groupCollapsed(`Precaching is responding to: ` + getFriendlyURL(request.url)); - logger.log(`Serving the precached url: ${getFriendlyURL(cacheKey instanceof Request ? cacheKey.url : cacheKey)}`); - logger.groupCollapsed(`View request details here.`); - logger.log(request); - logger.groupEnd(); - logger.groupCollapsed(`View response details here.`); - logger.log(response); - logger.groupEnd(); - logger.groupEnd(); - } - return response; - } - async _handleInstall(request, handler) { - this._useDefaultCacheabilityPluginIfNeeded(); - const response = await handler.fetch(request); - const wasCached = await handler.cachePut(request, response.clone()); - if (!wasCached) { - throw new WorkboxError("bad-precaching-response", { - url: request.url, - status: response.status - }); - } - return response; - } - _useDefaultCacheabilityPluginIfNeeded() { - let defaultPluginIndex = null; - let cacheWillUpdatePluginCount = 0; - for (const [index, plugin] of this.plugins.entries()) { - if (plugin === PrecacheStrategy.copyRedirectedCacheableResponsesPlugin) { - continue; - } - if (plugin === PrecacheStrategy.defaultPrecacheCacheabilityPlugin) { - defaultPluginIndex = index; - } - if (plugin.cacheWillUpdate) { - cacheWillUpdatePluginCount++; - } - } - if (cacheWillUpdatePluginCount === 0) { - this.plugins.push(PrecacheStrategy.defaultPrecacheCacheabilityPlugin); - } else if (cacheWillUpdatePluginCount > 1 && defaultPluginIndex !== null) { - this.plugins.splice(defaultPluginIndex, 1); - } - } - }; - PrecacheStrategy.defaultPrecacheCacheabilityPlugin = { - async cacheWillUpdate({ response }) { - if (!response || response.status >= 400) { - return null; - } - return response; - } - }; - PrecacheStrategy.copyRedirectedCacheableResponsesPlugin = { - async cacheWillUpdate({ response }) { - return response.redirected ? await copyResponse(response) : response; - } - }; - - // node_modules/workbox-precaching/PrecacheController.js - var PrecacheController = class { - constructor({ cacheName, plugins = [], fallbackToNetwork = true } = {}) { - this._urlsToCacheKeys = /* @__PURE__ */ new Map(); - this._urlsToCacheModes = /* @__PURE__ */ new Map(); - this._cacheKeysToIntegrities = /* @__PURE__ */ new Map(); - this._strategy = new PrecacheStrategy({ - cacheName: cacheNames.getPrecacheName(cacheName), - plugins: [ - ...plugins, - new PrecacheCacheKeyPlugin({ precacheController: this }) - ], - fallbackToNetwork - }); - this.install = this.install.bind(this); - this.activate = this.activate.bind(this); - } - get strategy() { - return this._strategy; - } - precache(entries) { - this.addToCacheList(entries); - if (!this._installAndActiveListenersAdded) { - self.addEventListener("install", this.install); - self.addEventListener("activate", this.activate); - this._installAndActiveListenersAdded = true; - } - } - addToCacheList(entries) { - if (true) { - finalAssertExports.isArray(entries, { - moduleName: "workbox-precaching", - className: "PrecacheController", - funcName: "addToCacheList", - paramName: "entries" - }); - } - const urlsToWarnAbout = []; - for (const entry of entries) { - if (typeof entry === "string") { - urlsToWarnAbout.push(entry); - } else if (entry && entry.revision === void 0) { - urlsToWarnAbout.push(entry.url); - } - const { cacheKey, url } = createCacheKey(entry); - const cacheMode = typeof entry !== "string" && entry.revision ? "reload" : "default"; - if (this._urlsToCacheKeys.has(url) && this._urlsToCacheKeys.get(url) !== cacheKey) { - throw new WorkboxError("add-to-cache-list-conflicting-entries", { - firstEntry: this._urlsToCacheKeys.get(url), - secondEntry: cacheKey - }); - } - if (typeof entry !== "string" && entry.integrity) { - if (this._cacheKeysToIntegrities.has(cacheKey) && this._cacheKeysToIntegrities.get(cacheKey) !== entry.integrity) { - throw new WorkboxError("add-to-cache-list-conflicting-integrities", { - url - }); - } - this._cacheKeysToIntegrities.set(cacheKey, entry.integrity); - } - this._urlsToCacheKeys.set(url, cacheKey); - this._urlsToCacheModes.set(url, cacheMode); - if (urlsToWarnAbout.length > 0) { - const warningMessage = `Workbox is precaching URLs without revision info: ${urlsToWarnAbout.join(", ")} -This is generally NOT safe. Learn more at https://bit.ly/wb-precache`; - if (false) { - console.warn(warningMessage); - } else { - logger.warn(warningMessage); - } - } - } - } - install(event) { - return waitUntil(event, async () => { - const installReportPlugin = new PrecacheInstallReportPlugin(); - this.strategy.plugins.push(installReportPlugin); - for (const [url, cacheKey] of this._urlsToCacheKeys) { - const integrity = this._cacheKeysToIntegrities.get(cacheKey); - const cacheMode = this._urlsToCacheModes.get(url); - const request = new Request(url, { - integrity, - cache: cacheMode, - credentials: "same-origin" - }); - await Promise.all(this.strategy.handleAll({ - params: { cacheKey }, - request, - event - })); - } - const { updatedURLs, notUpdatedURLs } = installReportPlugin; - if (true) { - printInstallDetails(updatedURLs, notUpdatedURLs); - } - return { updatedURLs, notUpdatedURLs }; - }); - } - activate(event) { - return waitUntil(event, async () => { - const cache = await self.caches.open(this.strategy.cacheName); - const currentlyCachedRequests = await cache.keys(); - const expectedCacheKeys = new Set(this._urlsToCacheKeys.values()); - const deletedURLs = []; - for (const request of currentlyCachedRequests) { - if (!expectedCacheKeys.has(request.url)) { - await cache.delete(request); - deletedURLs.push(request.url); - } - } - if (true) { - printCleanupDetails(deletedURLs); - } - return { deletedURLs }; - }); - } - getURLsToCacheKeys() { - return this._urlsToCacheKeys; - } - getCachedURLs() { - return [...this._urlsToCacheKeys.keys()]; - } - getCacheKeyForURL(url) { - const urlObject = new URL(url, location.href); - return this._urlsToCacheKeys.get(urlObject.href); - } - getIntegrityForCacheKey(cacheKey) { - return this._cacheKeysToIntegrities.get(cacheKey); - } - async matchPrecache(request) { - const url = request instanceof Request ? request.url : request; - const cacheKey = this.getCacheKeyForURL(url); - if (cacheKey) { - const cache = await self.caches.open(this.strategy.cacheName); - return cache.match(cacheKey); - } - return void 0; - } - createHandlerBoundToURL(url) { - const cacheKey = this.getCacheKeyForURL(url); - if (!cacheKey) { - throw new WorkboxError("non-precached-url", { url }); - } - return (options) => { - options.request = new Request(url); - options.params = Object.assign({ cacheKey }, options.params); - return this.strategy.handle(options); - }; - } - }; - - // node_modules/workbox-precaching/utils/getOrCreatePrecacheController.js - var precacheController; - var getOrCreatePrecacheController = () => { - if (!precacheController) { - precacheController = new PrecacheController(); - } - return precacheController; - }; - - // node_modules/workbox-routing/_version.js - try { - self["workbox:routing:6.5.2"] && _(); - } catch (e) { - } - - // node_modules/workbox-routing/utils/constants.js - var defaultMethod = "GET"; - var validMethods = [ - "DELETE", - "GET", - "HEAD", - "PATCH", - "POST", - "PUT" - ]; - - // node_modules/workbox-routing/utils/normalizeHandler.js - var normalizeHandler = (handler) => { - if (handler && typeof handler === "object") { - if (true) { - finalAssertExports.hasMethod(handler, "handle", { - moduleName: "workbox-routing", - className: "Route", - funcName: "constructor", - paramName: "handler" - }); - } - return handler; - } else { - if (true) { - finalAssertExports.isType(handler, "function", { - moduleName: "workbox-routing", - className: "Route", - funcName: "constructor", - paramName: "handler" - }); - } - return { handle: handler }; - } - }; - - // node_modules/workbox-routing/Route.js - var Route = class { - constructor(match, handler, method = defaultMethod) { - if (true) { - finalAssertExports.isType(match, "function", { - moduleName: "workbox-routing", - className: "Route", - funcName: "constructor", - paramName: "match" - }); - if (method) { - finalAssertExports.isOneOf(method, validMethods, { paramName: "method" }); - } - } - this.handler = normalizeHandler(handler); - this.match = match; - this.method = method; - } - setCatchHandler(handler) { - this.catchHandler = normalizeHandler(handler); - } - }; - - // node_modules/workbox-routing/RegExpRoute.js - var RegExpRoute = class extends Route { - constructor(regExp, handler, method) { - if (true) { - finalAssertExports.isInstance(regExp, RegExp, { - moduleName: "workbox-routing", - className: "RegExpRoute", - funcName: "constructor", - paramName: "pattern" - }); - } - const match = ({ url }) => { - const result = regExp.exec(url.href); - if (!result) { - return; - } - if (url.origin !== location.origin && result.index !== 0) { - if (true) { - logger.debug(`The regular expression '${regExp.toString()}' only partially matched against the cross-origin URL '${url.toString()}'. RegExpRoute's will only handle cross-origin requests if they match the entire URL.`); - } - return; - } - return result.slice(1); - }; - super(match, handler, method); - } - }; - - // node_modules/workbox-routing/Router.js - var Router = class { - constructor() { - this._routes = /* @__PURE__ */ new Map(); - this._defaultHandlerMap = /* @__PURE__ */ new Map(); - } - get routes() { - return this._routes; - } - addFetchListener() { - self.addEventListener("fetch", (event) => { - const { request } = event; - const responsePromise = this.handleRequest({ request, event }); - if (responsePromise) { - event.respondWith(responsePromise); - } - }); - } - addCacheListener() { - self.addEventListener("message", (event) => { - if (event.data && event.data.type === "CACHE_URLS") { - const { payload } = event.data; - if (true) { - logger.debug(`Caching URLs from the window`, payload.urlsToCache); - } - const requestPromises = Promise.all(payload.urlsToCache.map((entry) => { - if (typeof entry === "string") { - entry = [entry]; - } - const request = new Request(...entry); - return this.handleRequest({ request, event }); - })); - event.waitUntil(requestPromises); - if (event.ports && event.ports[0]) { - void requestPromises.then(() => event.ports[0].postMessage(true)); - } - } - }); - } - handleRequest({ request, event }) { - if (true) { - finalAssertExports.isInstance(request, Request, { - moduleName: "workbox-routing", - className: "Router", - funcName: "handleRequest", - paramName: "options.request" - }); - } - const url = new URL(request.url, location.href); - if (!url.protocol.startsWith("http")) { - if (true) { - logger.debug(`Workbox Router only supports URLs that start with 'http'.`); - } - return; - } - const sameOrigin = url.origin === location.origin; - const { params, route } = this.findMatchingRoute({ - event, - request, - sameOrigin, - url - }); - let handler = route && route.handler; - const debugMessages = []; - if (true) { - if (handler) { - debugMessages.push([`Found a route to handle this request:`, route]); - if (params) { - debugMessages.push([ - `Passing the following params to the route's handler:`, - params - ]); - } - } - } - const method = request.method; - if (!handler && this._defaultHandlerMap.has(method)) { - if (true) { - debugMessages.push(`Failed to find a matching route. Falling back to the default handler for ${method}.`); - } - handler = this._defaultHandlerMap.get(method); - } - if (!handler) { - if (true) { - logger.debug(`No route found for: ${getFriendlyURL(url)}`); - } - return; - } - if (true) { - logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`); - debugMessages.forEach((msg) => { - if (Array.isArray(msg)) { - logger.log(...msg); - } else { - logger.log(msg); - } - }); - logger.groupEnd(); - } - let responsePromise; - try { - responsePromise = handler.handle({ url, request, event, params }); - } catch (err) { - responsePromise = Promise.reject(err); - } - const catchHandler = route && route.catchHandler; - if (responsePromise instanceof Promise && (this._catchHandler || catchHandler)) { - responsePromise = responsePromise.catch(async (err) => { - if (catchHandler) { - if (true) { - logger.groupCollapsed(`Error thrown when responding to: ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`); - logger.error(`Error thrown by:`, route); - logger.error(err); - logger.groupEnd(); - } - try { - return await catchHandler.handle({ url, request, event, params }); - } catch (catchErr) { - if (catchErr instanceof Error) { - err = catchErr; - } - } - } - if (this._catchHandler) { - if (true) { - logger.groupCollapsed(`Error thrown when responding to: ${getFriendlyURL(url)}. Falling back to global Catch Handler.`); - logger.error(`Error thrown by:`, route); - logger.error(err); - logger.groupEnd(); - } - return this._catchHandler.handle({ url, request, event }); - } - throw err; - }); - } - return responsePromise; - } - findMatchingRoute({ url, sameOrigin, request, event }) { - const routes = this._routes.get(request.method) || []; - for (const route of routes) { - let params; - const matchResult = route.match({ url, sameOrigin, request, event }); - if (matchResult) { - if (true) { - if (matchResult instanceof Promise) { - logger.warn(`While routing ${getFriendlyURL(url)}, an async matchCallback function was used. Please convert the following route to use a synchronous matchCallback function:`, route); - } - } - params = matchResult; - if (Array.isArray(params) && params.length === 0) { - params = void 0; - } else if (matchResult.constructor === Object && Object.keys(matchResult).length === 0) { - params = void 0; - } else if (typeof matchResult === "boolean") { - params = void 0; - } - return { route, params }; - } - } - return {}; - } - setDefaultHandler(handler, method = defaultMethod) { - this._defaultHandlerMap.set(method, normalizeHandler(handler)); - } - setCatchHandler(handler) { - this._catchHandler = normalizeHandler(handler); - } - registerRoute(route) { - if (true) { - finalAssertExports.isType(route, "object", { - moduleName: "workbox-routing", - className: "Router", - funcName: "registerRoute", - paramName: "route" - }); - finalAssertExports.hasMethod(route, "match", { - moduleName: "workbox-routing", - className: "Router", - funcName: "registerRoute", - paramName: "route" - }); - finalAssertExports.isType(route.handler, "object", { - moduleName: "workbox-routing", - className: "Router", - funcName: "registerRoute", - paramName: "route" - }); - finalAssertExports.hasMethod(route.handler, "handle", { - moduleName: "workbox-routing", - className: "Router", - funcName: "registerRoute", - paramName: "route.handler" - }); - finalAssertExports.isType(route.method, "string", { - moduleName: "workbox-routing", - className: "Router", - funcName: "registerRoute", - paramName: "route.method" - }); - } - if (!this._routes.has(route.method)) { - this._routes.set(route.method, []); - } - this._routes.get(route.method).push(route); - } - unregisterRoute(route) { - if (!this._routes.has(route.method)) { - throw new WorkboxError("unregister-route-but-not-found-with-method", { - method: route.method - }); - } - const routeIndex = this._routes.get(route.method).indexOf(route); - if (routeIndex > -1) { - this._routes.get(route.method).splice(routeIndex, 1); - } else { - throw new WorkboxError("unregister-route-route-not-registered"); - } - } - }; - - // node_modules/workbox-routing/utils/getOrCreateDefaultRouter.js - var defaultRouter; - var getOrCreateDefaultRouter = () => { - if (!defaultRouter) { - defaultRouter = new Router(); - defaultRouter.addFetchListener(); - defaultRouter.addCacheListener(); - } - return defaultRouter; - }; - - // node_modules/workbox-routing/registerRoute.js - function registerRoute(capture, handler, method) { - let route; - if (typeof capture === "string") { - const captureUrl = new URL(capture, location.href); - if (true) { - if (!(capture.startsWith("/") || capture.startsWith("http"))) { - throw new WorkboxError("invalid-string", { - moduleName: "workbox-routing", - funcName: "registerRoute", - paramName: "capture" - }); - } - const valueToCheck = capture.startsWith("http") ? captureUrl.pathname : capture; - const wildcards = "[*:?+]"; - if (new RegExp(`${wildcards}`).exec(valueToCheck)) { - logger.debug(`The '$capture' parameter contains an Express-style wildcard character (${wildcards}). Strings are now always interpreted as exact matches; use a RegExp for partial or wildcard matches.`); - } - } - const matchCallback = ({ url }) => { - if (true) { - if (url.pathname === captureUrl.pathname && url.origin !== captureUrl.origin) { - logger.debug(`${capture} only partially matches the cross-origin URL ${url.toString()}. This route will only handle cross-origin requests if they match the entire URL.`); - } - } - return url.href === captureUrl.href; - }; - route = new Route(matchCallback, handler, method); - } else if (capture instanceof RegExp) { - route = new RegExpRoute(capture, handler, method); - } else if (typeof capture === "function") { - route = new Route(capture, handler, method); - } else if (capture instanceof Route) { - route = capture; - } else { - throw new WorkboxError("unsupported-route-type", { - moduleName: "workbox-routing", - funcName: "registerRoute", - paramName: "capture" - }); - } - const defaultRouter2 = getOrCreateDefaultRouter(); - defaultRouter2.registerRoute(route); - return route; - } - - // node_modules/workbox-precaching/utils/removeIgnoredSearchParams.js - function removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching = []) { - for (const paramName of [...urlObject.searchParams.keys()]) { - if (ignoreURLParametersMatching.some((regExp) => regExp.test(paramName))) { - urlObject.searchParams.delete(paramName); - } - } - return urlObject; - } - - // node_modules/workbox-precaching/utils/generateURLVariations.js - function* generateURLVariations(url, { ignoreURLParametersMatching = [/^utm_/, /^fbclid$/], directoryIndex = "index.html", cleanURLs = true, urlManipulation } = {}) { - const urlObject = new URL(url, location.href); - urlObject.hash = ""; - yield urlObject.href; - const urlWithoutIgnoredParams = removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching); - yield urlWithoutIgnoredParams.href; - if (directoryIndex && urlWithoutIgnoredParams.pathname.endsWith("/")) { - const directoryURL = new URL(urlWithoutIgnoredParams.href); - directoryURL.pathname += directoryIndex; - yield directoryURL.href; - } - if (cleanURLs) { - const cleanURL = new URL(urlWithoutIgnoredParams.href); - cleanURL.pathname += ".html"; - yield cleanURL.href; - } - if (urlManipulation) { - const additionalURLs = urlManipulation({ url: urlObject }); - for (const urlToAttempt of additionalURLs) { - yield urlToAttempt.href; - } - } - } - - // node_modules/workbox-precaching/PrecacheRoute.js - var PrecacheRoute = class extends Route { - constructor(precacheController2, options) { - const match = ({ request }) => { - const urlsToCacheKeys = precacheController2.getURLsToCacheKeys(); - for (const possibleURL of generateURLVariations(request.url, options)) { - const cacheKey = urlsToCacheKeys.get(possibleURL); - if (cacheKey) { - const integrity = precacheController2.getIntegrityForCacheKey(cacheKey); - return { cacheKey, integrity }; - } - } - if (true) { - logger.debug(`Precaching did not find a match for ` + getFriendlyURL(request.url)); - } - return; - }; - super(match, precacheController2.strategy); - } - }; - - // node_modules/workbox-precaching/addRoute.js - function addRoute(options) { - const precacheController2 = getOrCreatePrecacheController(); - const precacheRoute = new PrecacheRoute(precacheController2, options); - registerRoute(precacheRoute); - } - - // node_modules/workbox-precaching/precache.js - function precache(entries) { - const precacheController2 = getOrCreatePrecacheController(); - precacheController2.precache(entries); - } - - // node_modules/workbox-precaching/precacheAndRoute.js - function precacheAndRoute(entries, options) { - precache(entries); - addRoute(options); - } - - // node_modules/workbox-strategies/utils/messages.js - var messages2 = { - strategyStart: (strategyName, request) => `Using ${strategyName} to respond to '${getFriendlyURL(request.url)}'`, - printFinalResponse: (response) => { - if (response) { - logger.groupCollapsed(`View the final response here.`); - logger.log(response || "[No response returned]"); - logger.groupEnd(); - } - } - }; - - // node_modules/workbox-strategies/CacheFirst.js - var CacheFirst = class extends Strategy { - async _handle(request, handler) { - const logs = []; - if (true) { - finalAssertExports.isInstance(request, Request, { - moduleName: "workbox-strategies", - className: this.constructor.name, - funcName: "makeRequest", - paramName: "request" - }); - } - let response = await handler.cacheMatch(request); - let error = void 0; - if (!response) { - if (true) { - logs.push(`No response found in the '${this.cacheName}' cache. Will respond with a network request.`); - } - try { - response = await handler.fetchAndCachePut(request); - } catch (err) { - if (err instanceof Error) { - error = err; - } - } - if (true) { - if (response) { - logs.push(`Got response from network.`); - } else { - logs.push(`Unable to get a response from the network.`); - } - } - } else { - if (true) { - logs.push(`Found a cached response in the '${this.cacheName}' cache.`); - } - } - if (true) { - logger.groupCollapsed(messages2.strategyStart(this.constructor.name, request)); - for (const log of logs) { - logger.log(log); - } - messages2.printFinalResponse(response); - logger.groupEnd(); - } - if (!response) { - throw new WorkboxError("no-response", { url: request.url, error }); - } - return response; - } - }; - - // node_modules/workbox-strategies/plugins/cacheOkAndOpaquePlugin.js - var cacheOkAndOpaquePlugin = { - cacheWillUpdate: async ({ response }) => { - if (response.status === 200 || response.status === 0) { - return response; - } - return null; - } - }; - - // node_modules/workbox-strategies/NetworkFirst.js - var NetworkFirst = class extends Strategy { - constructor(options = {}) { - super(options); - if (!this.plugins.some((p) => "cacheWillUpdate" in p)) { - this.plugins.unshift(cacheOkAndOpaquePlugin); - } - this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0; - if (true) { - if (this._networkTimeoutSeconds) { - finalAssertExports.isType(this._networkTimeoutSeconds, "number", { - moduleName: "workbox-strategies", - className: this.constructor.name, - funcName: "constructor", - paramName: "networkTimeoutSeconds" - }); - } - } - } - async _handle(request, handler) { - const logs = []; - if (true) { - finalAssertExports.isInstance(request, Request, { - moduleName: "workbox-strategies", - className: this.constructor.name, - funcName: "handle", - paramName: "makeRequest" - }); - } - const promises = []; - let timeoutId; - if (this._networkTimeoutSeconds) { - const { id, promise } = this._getTimeoutPromise({ request, logs, handler }); - timeoutId = id; - promises.push(promise); - } - const networkPromise = this._getNetworkPromise({ - timeoutId, - request, - logs, - handler - }); - promises.push(networkPromise); - const response = await handler.waitUntil((async () => { - return await handler.waitUntil(Promise.race(promises)) || await networkPromise; - })()); - if (true) { - logger.groupCollapsed(messages2.strategyStart(this.constructor.name, request)); - for (const log of logs) { - logger.log(log); - } - messages2.printFinalResponse(response); - logger.groupEnd(); - } - if (!response) { - throw new WorkboxError("no-response", { url: request.url }); - } - return response; - } - _getTimeoutPromise({ request, logs, handler }) { - let timeoutId; - const timeoutPromise = new Promise((resolve) => { - const onNetworkTimeout = async () => { - if (true) { - logs.push(`Timing out the network response at ${this._networkTimeoutSeconds} seconds.`); - } - resolve(await handler.cacheMatch(request)); - }; - timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1e3); - }); - return { - promise: timeoutPromise, - id: timeoutId - }; - } - async _getNetworkPromise({ timeoutId, request, logs, handler }) { - let error; - let response; - try { - response = await handler.fetchAndCachePut(request); - } catch (fetchError) { - if (fetchError instanceof Error) { - error = fetchError; - } - } - if (timeoutId) { - clearTimeout(timeoutId); - } - if (true) { - if (response) { - logs.push(`Got response from network.`); - } else { - logs.push(`Unable to get a response from the network. Will respond with a cached response.`); - } - } - if (error || !response) { - response = await handler.cacheMatch(request); - if (true) { - if (response) { - logs.push(`Found a cached response in the '${this.cacheName}' cache.`); - } else { - logs.push(`No response found in the '${this.cacheName}' cache.`); - } - } - } - return response; - } - }; - - // node_modules/workbox-core/_private/dontWaitFor.js - function dontWaitFor(promise) { - void promise.then(() => { - }); - } - - // node_modules/idb/build/esm/wrap-idb-value.js - var instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c); - var idbProxyableTypes; - var cursorAdvanceMethods; - function getIdbProxyableTypes() { - return idbProxyableTypes || (idbProxyableTypes = [ - IDBDatabase, - IDBObjectStore, - IDBIndex, - IDBCursor, - IDBTransaction - ]); - } - function getCursorAdvanceMethods() { - return cursorAdvanceMethods || (cursorAdvanceMethods = [ - IDBCursor.prototype.advance, - IDBCursor.prototype.continue, - IDBCursor.prototype.continuePrimaryKey - ]); - } - var cursorRequestMap = /* @__PURE__ */ new WeakMap(); - var transactionDoneMap = /* @__PURE__ */ new WeakMap(); - var transactionStoreNamesMap = /* @__PURE__ */ new WeakMap(); - var transformCache = /* @__PURE__ */ new WeakMap(); - var reverseTransformCache = /* @__PURE__ */ new WeakMap(); - function promisifyRequest(request) { - const promise = new Promise((resolve, reject) => { - const unlisten = () => { - request.removeEventListener("success", success); - request.removeEventListener("error", error); - }; - const success = () => { - resolve(wrap(request.result)); - unlisten(); - }; - const error = () => { - reject(request.error); - unlisten(); - }; - request.addEventListener("success", success); - request.addEventListener("error", error); - }); - promise.then((value) => { - if (value instanceof IDBCursor) { - cursorRequestMap.set(value, request); - } - }).catch(() => { - }); - reverseTransformCache.set(promise, request); - return promise; - } - function cacheDonePromiseForTransaction(tx) { - if (transactionDoneMap.has(tx)) - return; - const done = new Promise((resolve, reject) => { - const unlisten = () => { - tx.removeEventListener("complete", complete); - tx.removeEventListener("error", error); - tx.removeEventListener("abort", error); - }; - const complete = () => { - resolve(); - unlisten(); - }; - const error = () => { - reject(tx.error || new DOMException("AbortError", "AbortError")); - unlisten(); - }; - tx.addEventListener("complete", complete); - tx.addEventListener("error", error); - tx.addEventListener("abort", error); - }); - transactionDoneMap.set(tx, done); - } - var idbProxyTraps = { - get(target, prop, receiver) { - if (target instanceof IDBTransaction) { - if (prop === "done") - return transactionDoneMap.get(target); - if (prop === "objectStoreNames") { - return target.objectStoreNames || transactionStoreNamesMap.get(target); - } - if (prop === "store") { - return receiver.objectStoreNames[1] ? void 0 : receiver.objectStore(receiver.objectStoreNames[0]); - } - } - return wrap(target[prop]); - }, - set(target, prop, value) { - target[prop] = value; - return true; - }, - has(target, prop) { - if (target instanceof IDBTransaction && (prop === "done" || prop === "store")) { - return true; - } - return prop in target; - } - }; - function replaceTraps(callback) { - idbProxyTraps = callback(idbProxyTraps); - } - function wrapFunction(func) { - if (func === IDBDatabase.prototype.transaction && !("objectStoreNames" in IDBTransaction.prototype)) { - return function(storeNames, ...args) { - const tx = func.call(unwrap(this), storeNames, ...args); - transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]); - return wrap(tx); - }; - } - if (getCursorAdvanceMethods().includes(func)) { - return function(...args) { - func.apply(unwrap(this), args); - return wrap(cursorRequestMap.get(this)); - }; - } - return function(...args) { - return wrap(func.apply(unwrap(this), args)); - }; - } - function transformCachableValue(value) { - if (typeof value === "function") - return wrapFunction(value); - if (value instanceof IDBTransaction) - cacheDonePromiseForTransaction(value); - if (instanceOfAny(value, getIdbProxyableTypes())) - return new Proxy(value, idbProxyTraps); - return value; - } - function wrap(value) { - if (value instanceof IDBRequest) - return promisifyRequest(value); - if (transformCache.has(value)) - return transformCache.get(value); - const newValue = transformCachableValue(value); - if (newValue !== value) { - transformCache.set(value, newValue); - reverseTransformCache.set(newValue, value); - } - return newValue; - } - var unwrap = (value) => reverseTransformCache.get(value); - - // node_modules/idb/build/esm/index.js - function openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) { - const request = indexedDB.open(name, version); - const openPromise = wrap(request); - if (upgrade) { - request.addEventListener("upgradeneeded", (event) => { - upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction)); - }); - } - if (blocked) - request.addEventListener("blocked", () => blocked()); - openPromise.then((db) => { - if (terminated) - db.addEventListener("close", () => terminated()); - if (blocking) - db.addEventListener("versionchange", () => blocking()); - }).catch(() => { - }); - return openPromise; - } - function deleteDB(name, { blocked } = {}) { - const request = indexedDB.deleteDatabase(name); - if (blocked) - request.addEventListener("blocked", () => blocked()); - return wrap(request).then(() => void 0); - } - var readMethods = ["get", "getKey", "getAll", "getAllKeys", "count"]; - var writeMethods = ["put", "add", "delete", "clear"]; - var cachedMethods = /* @__PURE__ */ new Map(); - function getMethod(target, prop) { - if (!(target instanceof IDBDatabase && !(prop in target) && typeof prop === "string")) { - return; - } - if (cachedMethods.get(prop)) - return cachedMethods.get(prop); - const targetFuncName = prop.replace(/FromIndex$/, ""); - const useIndex = prop !== targetFuncName; - const isWrite = writeMethods.includes(targetFuncName); - if (!(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) || !(isWrite || readMethods.includes(targetFuncName))) { - return; - } - const method = async function(storeName, ...args) { - const tx = this.transaction(storeName, isWrite ? "readwrite" : "readonly"); - let target2 = tx.store; - if (useIndex) - target2 = target2.index(args.shift()); - return (await Promise.all([ - target2[targetFuncName](...args), - isWrite && tx.done - ]))[0]; - }; - cachedMethods.set(prop, method); - return method; - } - replaceTraps((oldTraps) => ({ - ...oldTraps, - get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver), - has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop) - })); - - // node_modules/workbox-expiration/_version.js - try { - self["workbox:expiration:6.5.2"] && _(); - } catch (e) { - } - - // node_modules/workbox-expiration/models/CacheTimestampsModel.js - var DB_NAME = "workbox-expiration"; - var CACHE_OBJECT_STORE = "cache-entries"; - var normalizeURL = (unNormalizedUrl) => { - const url = new URL(unNormalizedUrl, location.href); - url.hash = ""; - return url.href; - }; - var CacheTimestampsModel = class { - constructor(cacheName) { - this._db = null; - this._cacheName = cacheName; - } - _upgradeDb(db) { - const objStore = db.createObjectStore(CACHE_OBJECT_STORE, { keyPath: "id" }); - objStore.createIndex("cacheName", "cacheName", { unique: false }); - objStore.createIndex("timestamp", "timestamp", { unique: false }); - } - _upgradeDbAndDeleteOldDbs(db) { - this._upgradeDb(db); - if (this._cacheName) { - void deleteDB(this._cacheName); - } - } - async setTimestamp(url, timestamp) { - url = normalizeURL(url); - const entry = { - url, - timestamp, - cacheName: this._cacheName, - id: this._getId(url) - }; - const db = await this.getDb(); - const tx = db.transaction(CACHE_OBJECT_STORE, "readwrite", { - durability: "relaxed" - }); - await tx.store.put(entry); - await tx.done; - } - async getTimestamp(url) { - const db = await this.getDb(); - const entry = await db.get(CACHE_OBJECT_STORE, this._getId(url)); - return entry === null || entry === void 0 ? void 0 : entry.timestamp; - } - async expireEntries(minTimestamp, maxCount) { - const db = await this.getDb(); - let cursor = await db.transaction(CACHE_OBJECT_STORE).store.index("timestamp").openCursor(null, "prev"); - const entriesToDelete = []; - let entriesNotDeletedCount = 0; - while (cursor) { - const result = cursor.value; - if (result.cacheName === this._cacheName) { - if (minTimestamp && result.timestamp < minTimestamp || maxCount && entriesNotDeletedCount >= maxCount) { - entriesToDelete.push(cursor.value); - } else { - entriesNotDeletedCount++; - } - } - cursor = await cursor.continue(); - } - const urlsDeleted = []; - for (const entry of entriesToDelete) { - await db.delete(CACHE_OBJECT_STORE, entry.id); - urlsDeleted.push(entry.url); - } - return urlsDeleted; - } - _getId(url) { - return this._cacheName + "|" + normalizeURL(url); - } - async getDb() { - if (!this._db) { - this._db = await openDB(DB_NAME, 1, { - upgrade: this._upgradeDbAndDeleteOldDbs.bind(this) - }); - } - return this._db; - } - }; - - // node_modules/workbox-expiration/CacheExpiration.js - var CacheExpiration = class { - constructor(cacheName, config = {}) { - this._isRunning = false; - this._rerunRequested = false; - if (true) { - finalAssertExports.isType(cacheName, "string", { - moduleName: "workbox-expiration", - className: "CacheExpiration", - funcName: "constructor", - paramName: "cacheName" - }); - if (!(config.maxEntries || config.maxAgeSeconds)) { - throw new WorkboxError("max-entries-or-age-required", { - moduleName: "workbox-expiration", - className: "CacheExpiration", - funcName: "constructor" - }); - } - if (config.maxEntries) { - finalAssertExports.isType(config.maxEntries, "number", { - moduleName: "workbox-expiration", - className: "CacheExpiration", - funcName: "constructor", - paramName: "config.maxEntries" - }); - } - if (config.maxAgeSeconds) { - finalAssertExports.isType(config.maxAgeSeconds, "number", { - moduleName: "workbox-expiration", - className: "CacheExpiration", - funcName: "constructor", - paramName: "config.maxAgeSeconds" - }); - } - } - this._maxEntries = config.maxEntries; - this._maxAgeSeconds = config.maxAgeSeconds; - this._matchOptions = config.matchOptions; - this._cacheName = cacheName; - this._timestampModel = new CacheTimestampsModel(cacheName); - } - async expireEntries() { - if (this._isRunning) { - this._rerunRequested = true; - return; - } - this._isRunning = true; - const minTimestamp = this._maxAgeSeconds ? Date.now() - this._maxAgeSeconds * 1e3 : 0; - const urlsExpired = await this._timestampModel.expireEntries(minTimestamp, this._maxEntries); - const cache = await self.caches.open(this._cacheName); - for (const url of urlsExpired) { - await cache.delete(url, this._matchOptions); - } - if (true) { - if (urlsExpired.length > 0) { - logger.groupCollapsed(`Expired ${urlsExpired.length} ${urlsExpired.length === 1 ? "entry" : "entries"} and removed ${urlsExpired.length === 1 ? "it" : "them"} from the '${this._cacheName}' cache.`); - logger.log(`Expired the following ${urlsExpired.length === 1 ? "URL" : "URLs"}:`); - urlsExpired.forEach((url) => logger.log(` ${url}`)); - logger.groupEnd(); - } else { - logger.debug(`Cache expiration ran and found no entries to remove.`); - } - } - this._isRunning = false; - if (this._rerunRequested) { - this._rerunRequested = false; - dontWaitFor(this.expireEntries()); - } - } - async updateTimestamp(url) { - if (true) { - finalAssertExports.isType(url, "string", { - moduleName: "workbox-expiration", - className: "CacheExpiration", - funcName: "updateTimestamp", - paramName: "url" - }); - } - await this._timestampModel.setTimestamp(url, Date.now()); - } - async isURLExpired(url) { - if (!this._maxAgeSeconds) { - if (true) { - throw new WorkboxError(`expired-test-without-max-age`, { - methodName: "isURLExpired", - paramName: "maxAgeSeconds" - }); - } - return false; - } else { - const timestamp = await this._timestampModel.getTimestamp(url); - const expireOlderThan = Date.now() - this._maxAgeSeconds * 1e3; - return timestamp !== void 0 ? timestamp < expireOlderThan : true; - } - } - async delete() { - this._rerunRequested = false; - await this._timestampModel.expireEntries(Infinity); - } - }; - - // node_modules/workbox-core/registerQuotaErrorCallback.js - function registerQuotaErrorCallback(callback) { - if (true) { - finalAssertExports.isType(callback, "function", { - moduleName: "workbox-core", - funcName: "register", - paramName: "callback" - }); - } - quotaErrorCallbacks.add(callback); - if (true) { - logger.log("Registered a callback to respond to quota errors.", callback); - } - } - - // node_modules/workbox-expiration/ExpirationPlugin.js - var ExpirationPlugin = class { - constructor(config = {}) { - this.cachedResponseWillBeUsed = async ({ event, request, cacheName, cachedResponse }) => { - if (!cachedResponse) { - return null; - } - const isFresh = this._isResponseDateFresh(cachedResponse); - const cacheExpiration = this._getCacheExpiration(cacheName); - dontWaitFor(cacheExpiration.expireEntries()); - const updateTimestampDone = cacheExpiration.updateTimestamp(request.url); - if (event) { - try { - event.waitUntil(updateTimestampDone); - } catch (error) { - if (true) { - if ("request" in event) { - logger.warn(`Unable to ensure service worker stays alive when updating cache entry for '${getFriendlyURL(event.request.url)}'.`); - } - } - } - } - return isFresh ? cachedResponse : null; - }; - this.cacheDidUpdate = async ({ cacheName, request }) => { - if (true) { - finalAssertExports.isType(cacheName, "string", { - moduleName: "workbox-expiration", - className: "Plugin", - funcName: "cacheDidUpdate", - paramName: "cacheName" - }); - finalAssertExports.isInstance(request, Request, { - moduleName: "workbox-expiration", - className: "Plugin", - funcName: "cacheDidUpdate", - paramName: "request" - }); - } - const cacheExpiration = this._getCacheExpiration(cacheName); - await cacheExpiration.updateTimestamp(request.url); - await cacheExpiration.expireEntries(); - }; - if (true) { - if (!(config.maxEntries || config.maxAgeSeconds)) { - throw new WorkboxError("max-entries-or-age-required", { - moduleName: "workbox-expiration", - className: "Plugin", - funcName: "constructor" - }); - } - if (config.maxEntries) { - finalAssertExports.isType(config.maxEntries, "number", { - moduleName: "workbox-expiration", - className: "Plugin", - funcName: "constructor", - paramName: "config.maxEntries" - }); - } - if (config.maxAgeSeconds) { - finalAssertExports.isType(config.maxAgeSeconds, "number", { - moduleName: "workbox-expiration", - className: "Plugin", - funcName: "constructor", - paramName: "config.maxAgeSeconds" - }); - } - } - this._config = config; - this._maxAgeSeconds = config.maxAgeSeconds; - this._cacheExpirations = /* @__PURE__ */ new Map(); - if (config.purgeOnQuotaError) { - registerQuotaErrorCallback(() => this.deleteCacheAndMetadata()); - } - } - _getCacheExpiration(cacheName) { - if (cacheName === cacheNames.getRuntimeName()) { - throw new WorkboxError("expire-custom-caches-only"); - } - let cacheExpiration = this._cacheExpirations.get(cacheName); - if (!cacheExpiration) { - cacheExpiration = new CacheExpiration(cacheName, this._config); - this._cacheExpirations.set(cacheName, cacheExpiration); - } - return cacheExpiration; - } - _isResponseDateFresh(cachedResponse) { - if (!this._maxAgeSeconds) { - return true; - } - const dateHeaderTimestamp = this._getDateHeaderTimestamp(cachedResponse); - if (dateHeaderTimestamp === null) { - return true; - } - const now = Date.now(); - return dateHeaderTimestamp >= now - this._maxAgeSeconds * 1e3; - } - _getDateHeaderTimestamp(cachedResponse) { - if (!cachedResponse.headers.has("date")) { - return null; - } - const dateHeader = cachedResponse.headers.get("date"); - const parsedDate = new Date(dateHeader); - const headerTime = parsedDate.getTime(); - if (isNaN(headerTime)) { - return null; - } - return headerTime; - } - async deleteCacheAndMetadata() { - for (const [cacheName, cacheExpiration] of this._cacheExpirations) { - await self.caches.delete(cacheName); - await cacheExpiration.delete(); - } - this._cacheExpirations = /* @__PURE__ */ new Map(); - } - }; - - // sw.js - function waitUntil2(event, asyncFn) { - const returnPromise = asyncFn(); - event.waitUntil(returnPromise); - return returnPromise; - } - var offlineAlert = async (url) => { - console.log(`fetch failure - we are offline, cannot access ${url}`); - const clients = await self.clients.matchAll({ type: "window" }); - let payload = "generic"; - if (/\.(?:png|gif|webm|jpg|webp|jpeg|svg)$/m.test(url)) - payload = "image"; - else if (/\.json$/m.test(url)) - payload = "json"; - for (const client of clients) { - client.postMessage({ type: "FETCH_ERROR", payload }); - } - }; - var resetAll = async () => { - const cacheNames2 = await caches.keys(); - for (const cacheName of cacheNames2) { - await caches.delete(cacheName); - const cacheExpiration = new CacheExpiration(cacheName, { maxEntries: 1 }); - await cacheExpiration.delete(); - console.log(`deleted cache "${cacheName}"`); - } - await self.registration.unregister(); - const clients = await self.clients.matchAll(); - clients.forEach((client) => client.navigate(client.url)); - }; - addEventListener("message", (event) => { - switch (event.data.type) { - case "RESET": { - console.log("Resetting..."); - event.waitUntil(resetAll()); - break; - } - } - }); - precacheAndRoute([{ "revision": "7e949d5952ab64690b1627141158d5b5", "url": "js/abilities.js" }, { "revision": "adcb0a482e48de5b8bbb1dfd81425d64", "url": "js/actions.js" }, { "revision": "61aaeee9b159854c0f032b22105c2545", "url": "js/adventure.js" }, { "revision": "21771bc05dd0464b1aa9e4649c2e16eb", "url": "js/adventures.js" }, { "revision": "0f82e1aeb2232f77e834890e47490d77", "url": "js/afflictions.js" }, { "revision": "003b094822955971899460729f1ef65e", "url": "js/ancestries.js" }, { "revision": "c1f3746659b15a4a24b1172b6a68c17b", "url": "js/archetypes.js" }, { "revision": "52335573df1f6003573a124a86cdac0f", "url": "js/backgrounds.js" }, { "revision": "baf8ba92a2a04ae2bccb904c5ea2c1af", "url": "js/bestiary-encounterbuilder.js" }, { "revision": "edb66ea23ead626b3c309d8bee7a5903", "url": "js/bestiary.js" }, { "revision": "e2f42425112f388bf1a51b5be9cf5ec2", "url": "js/blacklist.js" }, { "revision": "fdb1c3a0212bd25dd422a427812e3da1", "url": "js/book.js" }, { "revision": "9bcc769ac4898ad4ca69defd9d83814c", "url": "js/books.js" }, { "revision": "2bb08db00ab38596c02fd448c47aba99", "url": "js/bookslist.js" }, { "revision": "c3c783549c4f0fe486c6ddb290587c0c", "url": "js/bookutils.js" }, { "revision": "8bb8ed8c10d8d474a44293a4045a1be9", "url": "js/browsercheck.js" }, { "revision": "2ea73d8c42bd54c00bf0f01459a23ad5", "url": "js/classes.js" }, { "revision": "acac9acfa8ac82230603f38ed85b4eb9", "url": "js/companionsfamiliars.js" }, { "revision": "5229964912670180f3a584178628c600", "url": "js/conditions.js" }, { "revision": "19b463d35b8790b19c554f7672ce86a2", "url": "js/converter.js" }, { "revision": "6802d4b9d9fbd8089e573155a7c216ca", "url": "js/converterutils.js" }, { "revision": "16131f19f9027cf586d2bfe7e7277557", "url": "js/deepbg.js" }, { "revision": "96247cd9de97ef3f206e3f8eb8a450d2", "url": "js/deities.js" }, { "revision": "9b955e8e8bd978ae94b5700b99ba04e3", "url": "js/encountergen.js" }, { "revision": "5352d236bca92f5653eeb4759ea91bda", "url": "js/feats.js" }, { "revision": "e2c890f54802f3dc2e29d1ba7f556f88", "url": "js/filter-abilities.js" }, { "revision": "dfd57c8244d6d0409960710f43381209", "url": "js/filter-actions.js" }, { "revision": "2f6936194afe875ca23d2f0d5bd7ef14", "url": "js/filter-afflictions.js" }, { "revision": "d98e1cf5210c7af53c708d98f9ee1b32", "url": "js/filter-ancestries.js" }, { "revision": "f38d67c451ece7e5c7d3b5116d1fb111", "url": "js/filter-archetypes.js" }, { "revision": "a8d67d5657213aac8172eab7f556b71f", "url": "js/filter-backgrounds.js" }, { "revision": "19a0afcb0d05ccdf451e8e3dc68b1a65", "url": "js/filter-bestiary.js" }, { "revision": "8cc995f92a4ba3ff6b4f727b45078861", "url": "js/filter-classes.js" }, { "revision": "135d34dbb90f3c5823420ae76d7b2036", "url": "js/filter-companionsfamiliars.js" }, { "revision": "be67b652c59bfca13ae2dfa1a53ff8df", "url": "js/filter-conditions.js" }, { "revision": "a8959376fd665913ee116956bd23b6a7", "url": "js/filter-deities.js" }, { "revision": "8cba93a5fde8a3a57b617e49148336c4", "url": "js/filter-feats.js" }, { "revision": "7c270870b9dfc417373a328b0cfe6403", "url": "js/filter-hazards.js" }, { "revision": "c059a71e3f5c7775a492f757829c74ae", "url": "js/filter-items.js" }, { "revision": "7d409c372a3b5679d336447894dab9cd", "url": "js/filter-languages.js" }, { "revision": "90cf0c8ea7a5490c7176fa32eba9dec2", "url": "js/filter-optionalfeatures.js" }, { "revision": "726b3fac3f53b3745e614d06482f4128", "url": "js/filter-organizations.js" }, { "revision": "ed719db1351f48c6fbe53cb735af4c11", "url": "js/filter-places.js" }, { "revision": "7e5100cb82172b0efe10d58fadc76dee", "url": "js/filter-rituals.js" }, { "revision": "a870df2f14d606023afab8cb621695a4", "url": "js/filter-spells.js" }, { "revision": "1a66c97336877234e1e95cc592934da1", "url": "js/filter-tables.js" }, { "revision": "2947025006376a0c46432272a301b110", "url": "js/filter-traits.js" }, { "revision": "ced5b81eaa6b6968aee339052d498b16", "url": "js/filter-variantrules.js" }, { "revision": "291f440dd1b34f30bce7af7c1bf4d9e0", "url": "js/filter-vehicles.js" }, { "revision": "e9e35f0e24093e87c66111992d21399c", "url": "js/filter.js" }, { "revision": "b918393b488c94f17f3aae526913be18", "url": "js/genutils.js" }, { "revision": "ce4d531479463db31e1671be891bebae", "url": "js/gmscreen-counter.js" }, { "revision": "ea02079b1955c7af12e0418561f6f4cf", "url": "js/gmscreen-initiativetracker.js" }, { "revision": "b27a0e033f574ad2efaad2f03446d967", "url": "js/gmscreen-mapper.js" }, { "revision": "7086e2c4f27fa1b6e8c18de668406a1b", "url": "js/gmscreen-moneyconverter.js" }, { "revision": "807def90ceacbd00b0da2dd6d1ba6795", "url": "js/gmscreen-playerinitiativetracker.js" }, { "revision": "6e353bbf66b1b80f210064e67af4f787", "url": "js/gmscreen-timetracker.js" }, { "revision": "71048ed1b1f007cb77900b36f544a333", "url": "js/gmscreen.js" }, { "revision": "01cf3b549851deb976708b7d7e84102f", "url": "js/hazards.js" }, { "revision": "fe621e48fa923f682d31fbf6677e838a", "url": "js/hist.js" }, { "revision": "9948771a03f77f4a1c8d4ec3ca9084b9", "url": "js/initiativetrackerutils.js" }, { "revision": "fc687277a94712c304678389dd191333", "url": "js/inittrackerplayerview.js" }, { "revision": "4515e147b7b48ef42674b3ce6c430e02", "url": "js/items-runebuilder.js" }, { "revision": "ed47bae3cfe9aa0bff48e73a1b81f22a", "url": "js/items.js" }, { "revision": "5af89260cf41c44ea047fc0275e45f96", "url": "js/langdemo.js" }, { "revision": "453df8120a0f7c7e7597177064dda26e", "url": "js/langdemo2.js" }, { "revision": "3030328d4efb34ea18e73c329c06027e", "url": "js/languages.js" }, { "revision": "324bfb789fb5128414dfec177be287a4", "url": "js/list2.js" }, { "revision": "14884bd5353c583927286dc2dedc1282", "url": "js/listpage.js" }, { "revision": "f8d0b4fcf44162e50d30aceafca7f03e", "url": "js/managebrew.js" }, { "revision": "fa7ea74e1df4e5328ac3486ddceb7cd7", "url": "js/multisource.js" }, { "revision": "450720adfe5544f4dcafa3f3f1f08fe7", "url": "js/navigation.js" }, { "revision": "64428668c97e27a7d2e9298783a34e10", "url": "js/omnidexer.js" }, { "revision": "ebf344ae9608c6c6f3123902f99cbfa9", "url": "js/omnisearch.js" }, { "revision": "0068661f46e7765dcf17a573b2c19572", "url": "js/optionalfeatures.js" }, { "revision": "3f5028596820b68693994c7d87a22339", "url": "js/organizations.js" }, { "revision": "5b2880f23bb5659698aa2d6563fc549d", "url": "js/parser.js" }, { "revision": "06b625b60f6911d2b65275448f0fe5ae", "url": "js/places.js" }, { "revision": "140816e674533979f522f02970780444", "url": "js/quickreference.js" }, { "revision": "15a9b390a1b82f52342a011fbe89a3d3", "url": "js/render-dice.js" }, { "revision": "ef7adf7b06925b8143a14b1bafad3251", "url": "js/render-map.js" }, { "revision": "63ec58eb0949ef12cfb429360f8f854e", "url": "js/render.js" }, { "revision": "bdcd0d0ec164abbd8ae81854951614c3", "url": "js/renderdemo.js" }, { "revision": "25f700f035aa50408d9688f26f9aa46a", "url": "js/rituals.js" }, { "revision": "680994cb961eeaaa22a0a10715a9fcbd", "url": "js/rolang.js" }, { "revision": "175e532e5c51339b99fd25751563c62f", "url": "js/scalecreature.js" }, { "revision": "b823cf704b3f8a1aa3a24f0bf1c6735d", "url": "js/search.js" }, { "revision": "0c333c70f3c4d894b4785840eff3c992", "url": "js/seo-loader.js" }, { "revision": "74a399749b92e9d6c2b2f4e0b89a75ad", "url": "js/spells.js" }, { "revision": "3687490b20e78d4414d388f1f923f6d8", "url": "js/styleswitch.js" }, { "revision": "ba3ec2d14497337b47ccdf9d31738570", "url": "js/tablepage.js" }, { "revision": "8a1ab0bfa508055a179b3fa01aa7fd67", "url": "js/tables.js" }, { "revision": "fa4a762039c737de1422140258c45804", "url": "js/textconverter.js" }, { "revision": "962c9d925c78f63a24020f0f67936ff4", "url": "js/tokenizer.js" }, { "revision": "6f5d4c18beff74ca0fc15a9c69c693c7", "url": "js/traits.js" }, { "revision": "4d0c372242ba98d838d756da18dc9c0d", "url": "js/utils-changelog.js" }, { "revision": "ce389a1ad746ffd019bb30189f5bbf4a", "url": "js/utils-licenses.js" }, { "revision": "2f85195e8ff0dc06089f486f7eea14cb", "url": "js/utils-list.js" }, { "revision": "3e9239b11afe89a33d5eaad63847b5bc", "url": "js/utils-p2p.js" }, { "revision": "aff1d95a1fac35eceea351cdab89770f", "url": "js/utils-proporder.js" }, { "revision": "82adb2c24289fc25abb32163f08056b2", "url": "js/utils-ui.js" }, { "revision": "ebcbb72e253bf8f5e055343e582c9408", "url": "js/utils.js" }, { "revision": "65d4253bd1636a9a26d4d59e9b808720", "url": "js/variantrules.js" }, { "revision": "2838d4562ea735105a75477c12c8a66e", "url": "js/vehicles.js" }, { "revision": "b36e7c94c751656285d8e977cc152b10", "url": "lib/ace.js" }, { "revision": "f841812c750b396f454daee1aa5c4213", "url": "lib/bootstrap-select.min.js" }, { "revision": "cad6941d32006acbc61f7bab05918150", "url": "lib/bootstrap.min.js" }, { "revision": "7ba761cdbfa62922c3b750ac78f866eb", "url": "lib/elasticlunr.js" }, { "revision": "28dd3c8bf663c55bc9aa3d8f92945871", "url": "lib/ext-searchbox.js" }, { "revision": "a8e8282fcf516551d39204e076624b55", "url": "lib/jquery-ui-slider-pip.js" }, { "revision": "e858f6a2725af4140c1c424cf024a808", "url": "lib/jquery-ui.js" }, { "revision": "a6b6350ee94a3ea74595c065cbf58af0", "url": "lib/jquery.js" }, { "revision": "04680cb5d0adf90731746e92ef05a87b", "url": "lib/jquery.panzoom.js" }, { "revision": "862e9e065bcfe3944871cbf66229b3fd", "url": "lib/localforage.js" }, { "revision": "522bc8c23346ddf54992d531acabcb3e", "url": "lib/lzma.js" }, { "revision": "2378a4fa58c2e66792c81641346a4a40", "url": "lib/peerjs.js" }, { "revision": "fcf66afa34d87ce0bd47437c0c31816e", "url": "css/bootstrap-select.min.css" }, { "revision": "1264a8c9b7b1a57b2213a96859326e9f", "url": "css/bootstrap.css" }, { "revision": "de97b7db2b1195829599af9cfeb914c6", "url": "css/classes.css" }, { "revision": "354613438d26956a4530d57badd1711d", "url": "css/fontawesome.css" }, { "revision": "01ef22f83fa30e6bed564ab061a79f54", "url": "css/jquery-ui-slider-pips.css" }, { "revision": "4ef12b83b1ef3ff34d711c6a78421f55", "url": "css/jquery-ui.css" }, { "revision": "a6fc67670251132e3eb14a807aa466de", "url": "css/list-page--grouped.css" }, { "revision": "939fd45be687b473e266348825fb5697", "url": "css/search.css" }, { "revision": "79c7a7724188ae77b5570bacc9672e76", "url": "css/style.css" }, { "revision": "f8c7f17547945d8f710506491ef99275", "url": "homebrew/index.json" }, { "revision": "c7651e283ebe9f716db023a3db4549ca", "url": "data/abilities.json" }, { "revision": "10fc8ecdbcbbac89bfc1a324397529e2", "url": "data/actions.json" }, { "revision": "6d9a1634cfdfcaab46fa23df8dd32295", "url": "data/adventures.json" }, { "revision": "802874607e81bda278adcd5727acfadd", "url": "data/afflictions.json" }, { "revision": "20ae3e2bf8313d65f51e007ed980bb97", "url": "data/archetypes.json" }, { "revision": "a5d127e2658052e99b38e61cb9db857a", "url": "data/books.json" }, { "revision": "7cfeb9ef5ae30cafd829ed06be5d15bd", "url": "data/changelog.json" }, { "revision": "716ec7c14fb7186b2ceb4ae35232bb62", "url": "data/companionsfamiliars.json" }, { "revision": "d6f2779bd4842c1951994d4c73624d0b", "url": "data/conditions.json" }, { "revision": "bd31f6a24ec12f938b23681eb857c412", "url": "data/deities.json" }, { "revision": "d465ddfac916a507fa4da1fbd248dcdf", "url": "data/domains.json" }, { "revision": "eccb8be6f03bd7ce922df7de7e6adbee", "url": "data/fluff-deities.json" }, { "revision": "bf70ec7a1eea74eaa370a596306b60bf", "url": "data/fluff-items.json" }, { "revision": "309b2f5c47389945fbedb5fba0d4241b", "url": "data/fluff-organizations.json" }, { "revision": "93d8f7fda4f90c3488625e3bc5b2a1be", "url": "data/generic.json" }, { "revision": "317c438dd61985f25c83ed48fa7a5955", "url": "data/groups.json" }, { "revision": "9a793f41f33087e33a2251b8b04be708", "url": "data/hazards.json" }, { "revision": "5335bc187f19681fb6224029c78ed72f", "url": "data/languages.json" }, { "revision": "60cbd4da822064baa65ee9c9724bcf50", "url": "data/licenses.json" }, { "revision": "5d98fa27005a70b26c77a6bca146a1ff", "url": "data/optionalfeatures.json" }, { "revision": "27881ff3355c10aa0b159cfbe2b8f908", "url": "data/organizations.json" }, { "revision": "678ea78039df5b0a4364890b8b688f8e", "url": "data/places.json" }, { "revision": "d7acfb04262bf3702833d0436e73acc7", "url": "data/quickrules.json" }, { "revision": "51eb8da797e31575fdac2c17f00d6310", "url": "data/renderdemo.json" }, { "revision": "497ef12912ed74f2ea061b0e2ecbc801", "url": "data/rituals.json" }, { "revision": "8c40cc0410ef298d287aadc13a9eb096", "url": "data/skills.json" }, { "revision": "fe4bf555bfa7ce552551e721a71adad9", "url": "data/tables.json" }, { "revision": "69126e137cb202a1150fc56887f6418b", "url": "data/traits.json" }, { "revision": "3c7d3438c8108400b916b7ea0ddf3e96", "url": "data/variantrules.json" }, { "revision": "4c379abbeefba69c19ff049b69f9c612", "url": "data/vehicles.json" }, { "revision": "eac1504c86d4e721f84554e90b2ef75f", "url": "data/ancestries/ancestry-anadi.json" }, { "revision": "43db5a73d17604e64a929e52d5dc1d7a", "url": "data/ancestries/ancestry-android.json" }, { "revision": "52169c24b9092430fbcf464977da7c82", "url": "data/ancestries/ancestry-automaton.json" }, { "revision": "4833d9e5468d8998583b0e070054dce4", "url": "data/ancestries/ancestry-azarketi.json" }, { "revision": "eba3f3b51248e7641a7810851c40bfc1", "url": "data/ancestries/ancestry-catfolk.json" }, { "revision": "32cb1becd16681fef16b925a3b12c775", "url": "data/ancestries/ancestry-conrasu.json" }, { "revision": "7a37e7263845259f370adcdb3e6e9f95", "url": "data/ancestries/ancestry-dwarf.json" }, { "revision": "5400a2be713e868c998401aae6a46b98", "url": "data/ancestries/ancestry-elf.json" }, { "revision": "12fe01516d6988c52ff3c258a784ff5f", "url": "data/ancestries/ancestry-fetchling.json" }, { "revision": "6292dc839ba6e9c3fd01a1e27e2f75e9", "url": "data/ancestries/ancestry-fleshwarp.json" }, { "revision": "e27f2934df76cb7d3a8d03eb53b4d370", "url": "data/ancestries/ancestry-gnoll.json" }, { "revision": "07d857b70553093109569f3327a9c9ee", "url": "data/ancestries/ancestry-gnome.json" }, { "revision": "795155e42f463729c3f6d0d3cb0abbff", "url": "data/ancestries/ancestry-goblin.json" }, { "revision": "936ac0fdafce3426b3ec370ad22b4ec8", "url": "data/ancestries/ancestry-goloma.json" }, { "revision": "c50199f28f46ec8ea9eb747b2253f138", "url": "data/ancestries/ancestry-grippli.json" }, { "revision": "2e40114fe9f2ce7c8edd336012f90ab6", "url": "data/ancestries/ancestry-halfling.json" }, { "revision": "70aa479c415b6b16699a393576829d0b", "url": "data/ancestries/ancestry-hobgoblin.json" }, { "revision": "ddabaf43eb61ca7dfaee67b3849885ee", "url": "data/ancestries/ancestry-human.json" }, { "revision": "cfe7d2de113c3fa491aa4998abf43b93", "url": "data/ancestries/ancestry-kitsune.json" }, { "revision": "76b14dd0be4a89b940ec7b28468cad4b", "url": "data/ancestries/ancestry-kobold.json" }, { "revision": "d73251c994a0360635662941d5b26497", "url": "data/ancestries/ancestry-leshy.json" }, { "revision": "d9d090e02138fa9e241e50a346d77545", "url": "data/ancestries/ancestry-lizardfolk.json" }, { "revision": "c0728e22baa8f03b79971ea580fce8c1", "url": "data/ancestries/ancestry-orc.json" }, { "revision": "1ca4f40b90a82cbc31c1844a742a4df0", "url": "data/ancestries/ancestry-poppet.json" }, { "revision": "d6911baec43e9bdd936a77168d940814", "url": "data/ancestries/ancestry-ratfolk.json" }, { "revision": "97cb40e2dc74a6f4720ab51c96198789", "url": "data/ancestries/ancestry-shisk.json" }, { "revision": "049fd2c8e91840635a0a6523cb57bf1a", "url": "data/ancestries/ancestry-shoony.json" }, { "revision": "09674c8569e5c5c9505badfb4a3e0f00", "url": "data/ancestries/ancestry-sprite.json" }, { "revision": "212065274467b502793bd73973365f1e", "url": "data/ancestries/ancestry-strix.json" }, { "revision": "10457eda4027efd545376a9992fdcf74", "url": "data/ancestries/ancestry-tengu.json" }, { "revision": "fb580b2bac849b64ded21975ae8acaf4", "url": "data/ancestries/index.json" }, { "revision": "36a96d49c651a28caded19b8820d4363", "url": "data/ancestries/versatile-heritages.json" }, { "revision": "48a5f08aceaf321c5fb2fa7e0f0a0ae6", "url": "data/backgrounds/backgrounds-aoa0.json" }, { "revision": "18a6fc08bf3cb566a46c6535e9397e14", "url": "data/backgrounds/backgrounds-aoa4.json" }, { "revision": "e078edee16911bf4a3ccc83a7612d58a", "url": "data/backgrounds/backgrounds-aoa6.json" }, { "revision": "e7ae09fb69ba497618aff151b7f8e491", "url": "data/backgrounds/backgrounds-aoe0.json" }, { "revision": "760e7f38b5727a3c4653ed20f5cd6d66", "url": "data/backgrounds/backgrounds-aoe4.json" }, { "revision": "a6de8ebeba03cfd4c208bc9ea276b7da", "url": "data/backgrounds/backgrounds-apg.json" }, { "revision": "ed95dfaff9809b458f1291453823f43c", "url": "data/backgrounds/backgrounds-av0.json" }, { "revision": "31b8e7593bac4fc20ac9f2ddb44b972f", "url": "data/backgrounds/backgrounds-crb.json" }, { "revision": "55b2b3708dbb199a5024aadd48e95ac4", "url": "data/backgrounds/backgrounds-ec0.json" }, { "revision": "8b1a3269a92a9ab29c0b2f5caabce7dd", "url": "data/backgrounds/backgrounds-ec3.json" }, { "revision": "fd1aadd0f3706f228562645c33efa9c2", "url": "data/backgrounds/backgrounds-frp0.json" }, { "revision": "fb547891fe70a7bcc90d52caaca7d625", "url": "data/backgrounds/backgrounds-g&g.json" }, { "revision": "1b6367a8644861eef6a518f8db93aca9", "url": "data/backgrounds/backgrounds-lopsg.json" }, { "revision": "31d2ad0e100c0ec5553da4929de67c6f", "url": "data/backgrounds/backgrounds-lowg.json" }, { "revision": "806220dea90d2b4e023e1e4964f335df", "url": "data/backgrounds/backgrounds-som.json" }, { "revision": "de810bc4c27dd0a67496b2a7fddc0d1f", "url": "data/backgrounds/backgrounds-sot0.json" }, { "revision": "5c92d8542c71097c784cab0b30d3d7de", "url": "data/backgrounds/fluff-backgrounds.json" }, { "revision": "a2f92b44517232ad4ed1a4e9482a5b83", "url": "data/backgrounds/index.json" }, { "revision": "0b850dd4c8a7040553a9d1c997248fcb", "url": "data/bestiary/creatures-aoa1.json" }, { "revision": "e4a8cd184061a03fc6c9b880148ba8c1", "url": "data/bestiary/creatures-aoa2.json" }, { "revision": "715164269c71a4324524ab30da5bab4a", "url": "data/bestiary/creatures-aoa3.json" }, { "revision": "7cb0cbb0558c53fb083663c7f874b5d5", "url": "data/bestiary/creatures-aoa4.json" }, { "revision": "7c233f850225412be9caf8cabf5c1f51", "url": "data/bestiary/creatures-aoa5.json" }, { "revision": "9a0817cadbec252452158a075107233a", "url": "data/bestiary/creatures-aoa6.json" }, { "revision": "e780a7545eee634b7ba1e628a4ee15df", "url": "data/bestiary/creatures-aoe1.json" }, { "revision": "d6335de58326aacd63bc0f81b7a9f773", "url": "data/bestiary/creatures-aoe2.json" }, { "revision": "c2f1e8489c215d9961530476dabed26b", "url": "data/bestiary/creatures-aoe3.json" }, { "revision": "221f4c910e1b9c5a1e7256b1905f5efe", "url": "data/bestiary/creatures-aoe4.json" }, { "revision": "a848e34df2643accda1c5269ce234e6f", "url": "data/bestiary/creatures-aoe5.json" }, { "revision": "99bf643056ea4d835fdd228cbca2c046", "url": "data/bestiary/creatures-aoe6.json" }, { "revision": "1be05aeb9d5e9d95e7553d734133b011", "url": "data/bestiary/creatures-av1.json" }, { "revision": "8dcd6f41314fa09887dab6caa034c9f5", "url": "data/bestiary/creatures-av2.json" }, { "revision": "9af8ec398cff61eebac5776f92edb571", "url": "data/bestiary/creatures-av3.json" }, { "revision": "dbe18c91fbec07bd5cb0cfd2aed6bb33", "url": "data/bestiary/creatures-bst.json" }, { "revision": "623c22a3bddabee288f034463e6c7fa2", "url": "data/bestiary/creatures-bst2.json" }, { "revision": "618ddb6e1cd5a713209d5c6b6f8feb72", "url": "data/bestiary/creatures-bst3.json" }, { "revision": "8a75db30b88f5d42eb3b4a7bc4c2ce9e", "url": "data/bestiary/creatures-crb.json" }, { "revision": "8b77786f96b2d8f322e602e6b34fb4d2", "url": "data/bestiary/creatures-ec1.json" }, { "revision": "cc33d262f776576a8907f29fd8ac2185", "url": "data/bestiary/creatures-ec2.json" }, { "revision": "89755eed2292da1b2658c23efa13663b", "url": "data/bestiary/creatures-ec3.json" }, { "revision": "9c03b36b1df28d76e526bb2bd7213fec", "url": "data/bestiary/creatures-ec4.json" }, { "revision": "8398753f5f0a03f9687f053d286ee2fc", "url": "data/bestiary/creatures-ec5.json" }, { "revision": "e2254bc8370e4eb5586a3c87e0584c5c", "url": "data/bestiary/creatures-ec6.json" }, { "revision": "1a1af4381228411393e048293f57661f", "url": "data/bestiary/creatures-fop.json" }, { "revision": "52d1baa16351fd77e010f7b8329918a8", "url": "data/bestiary/creatures-frp1.json" }, { "revision": "2148a988c3d17cbf2f87b95e249c650e", "url": "data/bestiary/creatures-frp2.json" }, { "revision": "615bfefd7aaa276f9db7328d6763c9dd", "url": "data/bestiary/creatures-frp3.json" }, { "revision": "5ac93049a1b36f00b96a24a39565e127", "url": "data/bestiary/creatures-gmg.json" }, { "revision": "85a0c8f45d74c1426c34dd8cc5afd0cd", "url": "data/bestiary/creatures-lome.json" }, { "revision": "09435fb1095df05bc2f96528b4037824", "url": "data/bestiary/creatures-ltiba.json" }, { "revision": "66b4d1584e6343c24581426a705d33ed", "url": "data/bestiary/creatures-sli.json" }, { "revision": "b6ba17cf63df89118d22bceb2cf17dde", "url": "data/bestiary/creatures-sot1.json" }, { "revision": "3aa74359f22bd885bb1b92138bbcc977", "url": "data/bestiary/creatures-sot2.json" }, { "revision": "2ba3eb9647247da5030d370911f2b6fc", "url": "data/bestiary/creatures-tio.json" }, { "revision": "caaf16707e3febba9ac5420f425f79cd", "url": "data/bestiary/fluff-creatures-av3.json" }, { "revision": "dd66d2e74a7e02e82338e38cf78134ef", "url": "data/bestiary/fluff-creatures-bst.json" }, { "revision": "ad1ea53a67b96993f54a1c1c09e57b18", "url": "data/bestiary/fluff-creatures-bst2.json" }, { "revision": "c8d15754edddccdf287755048301fa09", "url": "data/bestiary/fluff-creatures-bst3.json" }, { "revision": "c152becb0a3a50acc61ad3c62285a4e8", "url": "data/bestiary/fluff-creatures-gmg.json" }, { "revision": "f0b6aa97a48a31b2bd5950ff175a6f69", "url": "data/bestiary/fluff-creatures-lome.json" }, { "revision": "7bf32f0c2d3988d2dec16d3adb6a98eb", "url": "data/bestiary/fluff-creatures-sot1.json" }, { "revision": "2b4cae20bcc16c52f61717284a1e8cd1", "url": "data/bestiary/fluff-index.json" }, { "revision": "1ba3a93d9770376187a7d248e3cbbb74", "url": "data/bestiary/index.json" }, { "revision": "e1c1e170fa70afe7878cefca2bf887cd", "url": "data/book/book-crb.json" }, { "revision": "4509b9d3735db93dacca5a4b81a7e579", "url": "data/book/book-gmg.json" }, { "revision": "71d482f2e999e734734a6c5ba18a5ad3", "url": "data/book/book-lowg.json" }, { "revision": "3d1a97431a05bf51a9d1b26273a1ca39", "url": "data/book/book-som.json" }, { "revision": "afcc7ee26993b519eb7bc1c87b98fe32", "url": "data/class/class-alchemist.json" }, { "revision": "6ac8359cdd1b9254c4813b0d10f6f0de", "url": "data/class/class-barbarian.json" }, { "revision": "c09c04e5c67f9776891b896688ab2899", "url": "data/class/class-bard.json" }, { "revision": "1a6b057e3f3fd34e83a4d322cedad591", "url": "data/class/class-champion.json" }, { "revision": "d211c0233ce44d727f7aa4dc028409e0", "url": "data/class/class-cleric.json" }, { "revision": "808ede376b0446671ff2085940771068", "url": "data/class/class-druid.json" }, { "revision": "e8e6181d11ffb9a16b264f6351f08f13", "url": "data/class/class-fighter.json" }, { "revision": "c179d68e41d1aa2004aa7b2a2f460a4e", "url": "data/class/class-gunslinger.json" }, { "revision": "7f011cf0941eeae16a818024cef1050b", "url": "data/class/class-inventor.json" }, { "revision": "bb32bf415e250953797da10fa74ec804", "url": "data/class/class-investigator.json" }, { "revision": "068cdf9bd235418bb89c461d4371175d", "url": "data/class/class-magus.json" }, { "revision": "4f9083f694872857da95d961c89ea460", "url": "data/class/class-monk.json" }, { "revision": "e80fba83b1daf23c6a6c6950c37e49e9", "url": "data/class/class-oracle.json" }, { "revision": "c4783027db6d8f20d8e21d3a65ddde2a", "url": "data/class/class-ranger.json" }, { "revision": "09c62ea26a6b7f5e4b02cef18d689631", "url": "data/class/class-rogue.json" }, { "revision": "d3d8c246444c8edfbd9a833aec2487a7", "url": "data/class/class-sorcerer.json" }, { "revision": "9b93a2778a02d6619c5ff65dd0993c62", "url": "data/class/class-summoner.json" }, { "revision": "5412eabc7ef4d0ac03efae79ace1881c", "url": "data/class/class-swashbuckler.json" }, { "revision": "50b68496cee4834f52f123d08b0e8814", "url": "data/class/class-witch.json" }, { "revision": "170aa168ae264e8ea58afbf2a92f6b13", "url": "data/class/class-wizard.json" }, { "revision": "394724d537ab681ff5d7725e7672bfaf", "url": "data/class/index.json" }, { "revision": "564b1e5e95b98f88beb4780726c6befc", "url": "data/feats/feats-aoa3.json" }, { "revision": "ab80eb4fecffa4e207dc960d924c97fa", "url": "data/feats/feats-aoa4.json" }, { "revision": "46f9c12cd5f088a0b58e5316ce39c7b0", "url": "data/feats/feats-aoa5.json" }, { "revision": "c00eec5f10785095d63c1019c5ac7a9c", "url": "data/feats/feats-aoa6.json" }, { "revision": "f915c88fcdc6c7090f2ef67b6b1a5030", "url": "data/feats/feats-aoe1.json" }, { "revision": "8c4c47f150adc7bd2ac7cc264d1738c5", "url": "data/feats/feats-aoe2.json" }, { "revision": "1b6c5ab64c9997e617e9224682a8d82e", "url": "data/feats/feats-aoe3.json" }, { "revision": "c8d6a7afd79c252c3154d0eda55c92ec", "url": "data/feats/feats-apg.json" }, { "revision": "2d22f151d21d8b27790707d6247b56d2", "url": "data/feats/feats-av1.json" }, { "revision": "e4fb1e1fc8d52cbbee3ad2073ea6423b", "url": "data/feats/feats-av2.json" }, { "revision": "d5588bc945dd7308def53e556b6912eb", "url": "data/feats/feats-av3.json" }, { "revision": "aac16cd7a4f9c39c61f3370c83d9f981", "url": "data/feats/feats-crb.json" }, { "revision": "f7195ecc4e9a5be7554989a73e9d0fc5", "url": "data/feats/feats-ec1.json" }, { "revision": "0a024a20a78b5dbda524c17a0916cff4", "url": "data/feats/feats-ec2.json" }, { "revision": "330dd2395fcd3a3e1d12eae48895eb8c", "url": "data/feats/feats-ec3.json" }, { "revision": "7f31c727001efdf2ad8cdabe932c008f", "url": "data/feats/feats-ec6.json" }, { "revision": "7cb4e24e5153cead893bc588640e7075", "url": "data/feats/feats-fop.json" }, { "revision": "b125f2f3aee4058f88b1723cd7e92d1e", "url": "data/feats/feats-frp1.json" }, { "revision": "f92d1ba95a4688a124f0ab2d9d7e1d72", "url": "data/feats/feats-frp2.json" }, { "revision": "62d76771f8a07c2f35dfe8d177355a8b", "url": "data/feats/feats-frp3.json" }, { "revision": "3f5223626620b0c587849212946c8db5", "url": "data/feats/feats-g&g.json" }, { "revision": "90aa7169925660c88133037ca2862b16", "url": "data/feats/feats-gmg.json" }, { "revision": "12d7a4452d76f0760c73c7a51932a5db", "url": "data/feats/feats-loag.json" }, { "revision": "4d84e856fc4f49eb69294470484823bf", "url": "data/feats/feats-locg.json" }, { "revision": "27cb93f5b8a02dbe0efaac3bfda74bff", "url": "data/feats/feats-logm.json" }, { "revision": "8f1c4e73c86335296e1e0f179208b179", "url": "data/feats/feats-lol.json" }, { "revision": "bcb7347218e25b293fc00e5715ef9cd4", "url": "data/feats/feats-lome.json" }, { "revision": "9f915de6e93f9f5f798c88ade23e9599", "url": "data/feats/feats-lopsg.json" }, { "revision": "85fe1b667c8e2efcd360118b673644a6", "url": "data/feats/feats-lotgb.json" }, { "revision": "bc55a43bfe3fedd996f826294f427ba4", "url": "data/feats/feats-lowg.json" }, { "revision": "8120b6dfff1a035457d00e443b026a5d", "url": "data/feats/feats-ltiba.json" }, { "revision": "76395bbf6fad7760da8e9a9771a94b9d", "url": "data/feats/feats-sli.json" }, { "revision": "1428f0c5d650664366d5c2cabb5436fb", "url": "data/feats/feats-som.json" }, { "revision": "197c90beb23ac311ac2c58b343492d0a", "url": "data/feats/feats-sot2.json" }, { "revision": "46bc1cbabc1cca1d6500e08f2c41dd49", "url": "data/feats/feats-sot3.json" }, { "revision": "1fe0b2a76d8ca518409e4e0869072729", "url": "data/feats/index.json" }, { "revision": "07b4a3fb8b7bf167a3500545ac1abd8d", "url": "data/generated/bookref-gmscreen-index.json" }, { "revision": "3dc6d29b394bfa60d3cfabc7aae39dc7", "url": "data/generated/bookref-gmscreen.json" }, { "revision": "5e8ae77fdf3171d8f6f395b53304f2ce", "url": "data/generated/bookref-quick.json" }, { "revision": "688a74016f76e2edf07802a3f0ba58f4", "url": "data/generated/gendata-nav-adventure-book-index.json" }, { "revision": "f777aa8770309ea288fc832c5bc374c9", "url": "data/items/baseitems.json" }, { "revision": "ca81ca4408f056ea5249ed5b7895ff44", "url": "data/items/fluff-index.json" }, { "revision": "1fc0fcdbb0518e8fd10d16c8c67efd6f", "url": "data/items/fluff-items-crb.json" }, { "revision": "6fae85f819f6d19210a0c8eb3116dbcf", "url": "data/items/index.json" }, { "revision": "57763bc7a10903fb428bb3949edfaca0", "url": "data/items/items-aoa1.json" }, { "revision": "05bf8b6f43d4e31f0ada817be2d6a0cc", "url": "data/items/items-aoa2.json" }, { "revision": "1cc5fb1f62519f8d8db09dea691b2ec0", "url": "data/items/items-aoa3.json" }, { "revision": "cdd38f85a901047fcd9cc23d03f4f34c", "url": "data/items/items-aoa4.json" }, { "revision": "6d5c3365305a173f69c7db09f041172a", "url": "data/items/items-aoa5.json" }, { "revision": "faacf9080b90bfc89a0cacb0cc64a22a", "url": "data/items/items-aoa6.json" }, { "revision": "14d12700308b3f144b68c47b98448e5e", "url": "data/items/items-aoe1.json" }, { "revision": "2a889adb54ff184e69c7275b421d410e", "url": "data/items/items-aoe2.json" }, { "revision": "ea4e78794024814a38cca52e0689204f", "url": "data/items/items-aoe3.json" }, { "revision": "ea1668a62ce655dd2590c27587fb0c75", "url": "data/items/items-aoe4.json" }, { "revision": "03bbf04acc19d18f42382b497dfe1890", "url": "data/items/items-aoe5.json" }, { "revision": "19578d13ad63d9bb4fece79cd1e153d8", "url": "data/items/items-aoe6.json" }, { "revision": "650ff2c2d4e59064cadf7674b0dde18a", "url": "data/items/items-apg.json" }, { "revision": "3d677af7d9c5ffa734817ac3f427cf75", "url": "data/items/items-av1.json" }, { "revision": "0b61bf4d8b0817ef924449f6813567af", "url": "data/items/items-av2.json" }, { "revision": "bbbe7259fe67a403f73eed44715a0e9f", "url": "data/items/items-av3.json" }, { "revision": "322f33f53372a19d8aa83f2d75ca0d62", "url": "data/items/items-crb.json" }, { "revision": "7d9c86eceb8050ead124fb9745c8d627", "url": "data/items/items-ec1.json" }, { "revision": "1181b982bbb95bc52ac31f65a06cf38d", "url": "data/items/items-ec2.json" }, { "revision": "521ac165c8df3174b1f7e7b40efc9432", "url": "data/items/items-ec3.json" }, { "revision": "086cb09f7ea6a7154c8f0dcc3486b9af", "url": "data/items/items-ec4.json" }, { "revision": "d9076746d19915d7dd5a2cedc433214c", "url": "data/items/items-ec5.json" }, { "revision": "573a6e030d30553442713c6a16da3772", "url": "data/items/items-ec6.json" }, { "revision": "8fcdec71f529a10ecb108d6bdc6bdc75", "url": "data/items/items-fop.json" }, { "revision": "4b68b8842e213c4c92ea66b1c6251cb6", "url": "data/items/items-frp1.json" }, { "revision": "e4f341ac6eafbe88c5629bac89017287", "url": "data/items/items-frp2.json" }, { "revision": "0b4acc987901b5fcf6c6a832b29a6828", "url": "data/items/items-g&g.json" }, { "revision": "1d2e57367c371feb80ad5a184bb1075f", "url": "data/items/items-gmg.json" }, { "revision": "39b40da0da37b66d85b1649ca27ef231", "url": "data/items/items-loag.json" }, { "revision": "681febf3b660f21c2b030351bd829126", "url": "data/items/items-locg.json" }, { "revision": "307837027b8e4ec9f8ef4a3ea34265f0", "url": "data/items/items-logm.json" }, { "revision": "fe93de984edc8e67136d34cf542d741b", "url": "data/items/items-lol.json" }, { "revision": "20a73cf06ea2340e652f72ecd739bbe6", "url": "data/items/items-lome.json" }, { "revision": "2cb87a1d87ad3f94512ee14787be18fb", "url": "data/items/items-lopsg.json" }, { "revision": "fe0ce0869334aab9aa723137c6c2c1eb", "url": "data/items/items-lotgb.json" }, { "revision": "5fc458aa024fff22e51b79635dc419f3", "url": "data/items/items-lowg.json" }, { "revision": "cf35fb704e6e806f6355deed48fe6b1d", "url": "data/items/items-ltiba.json" }, { "revision": "f4ab1784a0f20554a5d47ed978bf6430", "url": "data/items/items-sli.json" }, { "revision": "7695f16bf62405c5d61bc81695e68570", "url": "data/items/items-som.json" }, { "revision": "4376aa1db6345f1d5a28b2e59d44f7b3", "url": "data/items/items-sot1.json" }, { "revision": "7efede606cf3f03cc5d3236d79dc81a8", "url": "data/items/items-sot2.json" }, { "revision": "b2aba46af0fcc3d399d6f7214de7aee9", "url": "data/items/items-sot3.json" }, { "revision": "94431013053bbed5cedcc37a7f858e94", "url": "data/items/items-tio.json" }, { "revision": "8a80554c91d9fca8acb82f023de02f11", "url": "data/spells/fluff-index.json" }, { "revision": "b406db2efe683c1dc84157222dff6880", "url": "data/spells/index.json" }, { "revision": "7bede3adc55d0bf7800575d0bae7d385", "url": "data/spells/spells-aoa3.json" }, { "revision": "70c7e3cc8eeaf8800d50e347e0150596", "url": "data/spells/spells-aoa4.json" }, { "revision": "ce0062cd7c3bb2d5e6760b48b95c8011", "url": "data/spells/spells-aoa6.json" }, { "revision": "3ba8e77e7abbfcd7caf4df300248c140", "url": "data/spells/spells-aoe2.json" }, { "revision": "3144f5c33257222d0571b7e86f0c216a", "url": "data/spells/spells-aoe4.json" }, { "revision": "1b0f8d4578f939e5b7952212a69d49a4", "url": "data/spells/spells-aoe5.json" }, { "revision": "dc87d7a7c1a1524e0edf6c79ab1f314b", "url": "data/spells/spells-aoe6.json" }, { "revision": "8aebef0ec12f2ee3f7af60d81d4a9fd9", "url": "data/spells/spells-apg.json" }, { "revision": "0b3fc32dbe5715e7d597e905a8ba3237", "url": "data/spells/spells-av1.json" }, { "revision": "511ab491bd01d1fc13438054a051bd44", "url": "data/spells/spells-av2.json" }, { "revision": "3efa28cf371374af7fa4c9f53ac82da7", "url": "data/spells/spells-av3.json" }, { "revision": "5cd9a83e7eac4a082de094b84b12b864", "url": "data/spells/spells-crb.json" }, { "revision": "77a5573db90ff44e49d0b3582d04a34f", "url": "data/spells/spells-ec1.json" }, { "revision": "e68aca95a6ba2b183a5c8932f383a2b9", "url": "data/spells/spells-ec2.json" }, { "revision": "4363b944273c6b61f2c71a9896910de7", "url": "data/spells/spells-ec3.json" }, { "revision": "0a033714de3e3946bab0ccf207612757", "url": "data/spells/spells-ec4.json" }, { "revision": "bd28ffe624cf2952f6d0087b959c2ae9", "url": "data/spells/spells-ec5.json" }, { "revision": "2054324fdf57d1e24dacdc961eb0a222", "url": "data/spells/spells-ec6.json" }, { "revision": "5f24d32570c27a7675546e95abbcc82a", "url": "data/spells/spells-frp1.json" }, { "revision": "785fa24e272f133c25704d13796aa578", "url": "data/spells/spells-frp3.json" }, { "revision": "9c10f0330df8fa74e706e60ecc5179cc", "url": "data/spells/spells-locg.json" }, { "revision": "4d80b765271d2e7a802fab79a5305a68", "url": "data/spells/spells-logm.json" }, { "revision": "42eee42bcbb8f03db24e9050601ff993", "url": "data/spells/spells-lol.json" }, { "revision": "086c1aa5a4f00139224834f7b796c528", "url": "data/spells/spells-lopsg.json" }, { "revision": "9abeb5242112a6257766c5f6bb7554a2", "url": "data/spells/spells-lowg.json" }, { "revision": "36d947c2a46102c2bdc9a9ce4eed027b", "url": "data/spells/spells-som.json" }, { "revision": "8ac48f4118ae012d2727e6967b07ab6b", "url": "data/spells/spells-sot1.json" }, { "revision": "d7114a5327af86e19c1462c5739c20b7", "url": "data/spells/spells-sot3.json" }, { "revision": "4d30098a93e1b3de38ea661b3aed95a5", "url": "abilities.html" }, { "revision": "45e674213259f82f4d1724e658550935", "url": "actions.html" }, { "revision": "1df5cfea4d0143108be6df12c603d178", "url": "adventure.html" }, { "revision": "064f1aab3a0b194cc930813db2f78ed8", "url": "adventures.html" }, { "revision": "719f1b15116292a6f76f5caca717943a", "url": "afflictions.html" }, { "revision": "d685f1f9de61393bf087e93071829060", "url": "ancestries.html" }, { "revision": "e13f5275f7140000fb3847042f3e25bf", "url": "archetypes.html" }, { "revision": "c57039ea5c6c8cc8fd370d95dc6fd2ef", "url": "backgrounds.html" }, { "revision": "df834b8d68a5ff74e7585f6ff6740e1a", "url": "bestiary.html" }, { "revision": "2ca8c1914c92e7489cc1dfbe970122c6", "url": "blacklist.html" }, { "revision": "128e03c7caa7ad0de6c01965fbcbc53b", "url": "book.html" }, { "revision": "8c93c39cde65be9d90321054079b8b90", "url": "books.html" }, { "revision": "9dd45817118ec898363cb4f09f52d380", "url": "changelog.html" }, { "revision": "d573495c5d64cd000a6e98fefc99a4a2", "url": "classes.html" }, { "revision": "f58637255c12732a1eaeb091f010bb07", "url": "companionsfamiliars.html" }, { "revision": "edc076f47e0bb5deb9c4419da456fe3e", "url": "conditions.html" }, { "revision": "0f97080fcd19913b2b7681844c515f41", "url": "deities.html" }, { "revision": "f433280b3ad9d97acbc0c290b9b60682", "url": "donate.html" }, { "revision": "4b27fc77a19bf4e93fd83661dd7cb7bc", "url": "feats.html" }, { "revision": "39f97b348d41cf8a97c197ba602965d2", "url": "gmscreen.html" }, { "revision": "ff32aba6400842a60a712afef0a63b9d", "url": "hazards.html" }, { "revision": "b7b0a44ef3361b7f62f66a731b794078", "url": "index.html" }, { "revision": "298e11b359967b37d2c23d8b0942781d", "url": "inittrackerplayerview.html" }, { "revision": "7e699ee518fb89661e5ff6cf6f42dcd2", "url": "items.html" }, { "revision": "52e63b01c5697f5f68003ce4285b0553", "url": "langdemo.html" }, { "revision": "14ee89bf592cd0e18349c9469d48db78", "url": "languages.html" }, { "revision": "6c5eadde0c4fc3149a71e5e6a84921df", "url": "licenses.html" }, { "revision": "fb282ffd69f619cc583423403e82e4ae", "url": "managebrew.html" }, { "revision": "3ac875c1710306dce6431ce2549e7cae", "url": "optionalfeatures.html" }, { "revision": "fc02ecf1afb90e4e0c52d4c32817ea46", "url": "organizations.html" }, { "revision": "14cdd2d2a26bd643781d17f14217221d", "url": "Pf2eTools.html" }, { "revision": "5ff8a7cdef3e0381ddc4518fdc17d8d8", "url": "places.html" }, { "revision": "345fa1f7f5471ab11192237c03f2c86e", "url": "privacy-policy.html" }, { "revision": "4d1f7f70f7bdb4e7cb8ea28949927fd9", "url": "quickreference.html" }, { "revision": "6a155ecb78441a94b117e52df26b134c", "url": "renderdemo.html" }, { "revision": "735062d33d767fb4c2ce52917533ca2b", "url": "rituals.html" }, { "revision": "d19c1e7c1199a72d71daac27cd7f3e14", "url": "search.html" }, { "revision": "0dc24ba6fb44e77afe4ef248c913d107", "url": "spells.html" }, { "revision": "6c24153f82a044dc047001f6805254f5", "url": "tables.html" }, { "revision": "af5f4672ec879916d5a61ba628a8c29f", "url": "textconverter.html" }, { "revision": "728f8a10bb3e8afe858465f1cadf04ae", "url": "traits.html" }, { "revision": "abe874e1bebc1df6e4adaa724ae19eba", "url": "variantrules.html" }, { "revision": "1453f603d4bf89028def5efc6f96ebfb", "url": "vehicles.html" }, { "revision": "fdd1e05cf7a26db6172e45740dbdb313", "url": "search/index-alt-spell.json" }, { "revision": "a2c797a51147f62dc30cc0c616e035c2", "url": "search/index-item.json" }, { "revision": "597da3b45a1f90b0bc5b22bd3d7398ec", "url": "search/index.json" }, { "revision": "1142a1f60b5dbc19b5a0bfca0504ada1", "url": "search/traits.json" }, { "revision": "4050573dedbe1cc64b4fdcad04351daa", "url": "manifest.webmanifest" }, { "revision": "448c34a56d699c29117adc64c43affeb", "url": "fonts/glyphicons-halflings-regular.woff2" }, { "revision": "e18bbf611f2a2e43afc071aa2f4e1512", "url": "fonts/glyphicons-halflings-regular.ttf" }, { "revision": "d09e5b926b6fdb2a506e5909de33de23", "url": "fonts/good-pro-400.ttf" }, { "revision": "9f6134a15b7dfc5a119bc65376dbe269", "url": "fonts/good-pro-400.woff" }, { "revision": "ff1abe8ed0ef061106b68d844c8dab4d", "url": "fonts/good-pro-400.woff2" }, { "revision": "361e7ff40e96db6bbbfe90889d95afdc", "url": "fonts/good-pro-700.ttf" }, { "revision": "1997214212f12c3e4a68f5195e68cb5d", "url": "fonts/good-pro-700.woff" }, { "revision": "0fea4b7d69bbcb12a33f0922262c6421", "url": "fonts/good-pro-700.woff2" }, { "revision": "a11892b605845bf613d1a8bb06c00b04", "url": "fonts/good-pro-condensed-400.ttf" }, { "revision": "6421dccde27db5dba3399149e69f71d3", "url": "fonts/good-pro-condensed-400.woff" }, { "revision": "ea4d723a4099259aba94b84e333034f8", "url": "fonts/good-pro-condensed-700.ttf" }, { "revision": "fc0455882bdfe0c48aa7186da15c85f3", "url": "fonts/good-pro-condensed-700.woff" }, { "revision": "46aa1be77a9022bb5ee43a8513fb3057", "url": "fonts/good-pro-condensed-700.woff2" }, { "revision": "51853144d912fd5553eeb7d39c3b53bf", "url": "fonts/good-pro-condensed-italic-400.ttf" }, { "revision": "41d2455a8dea4aac5165b82743681efa", "url": "fonts/good-pro-condensed-italic-400.woff" }, { "revision": "5a10bdbc21e43df2acd07e2487820d60", "url": "fonts/good-pro-condensed-italic-700.ttf" }, { "revision": "556dd5c152d5b0739a5121f37a2baff4", "url": "fonts/good-pro-condensed-italic-700.woff" }, { "revision": "1bc04907c2bf079908e90e0313239bcd", "url": "fonts/good-pro-condensed-italic-700.woff2" }, { "revision": "ff1eae181861f44db0ab1431879a49f9", "url": "fonts/good-pro-italic-400.ttf" }, { "revision": "a9ed15953b80fedb8137f8f25839fb96", "url": "fonts/good-pro-italic-400.woff" }, { "revision": "1b23ad64d84c8cee844cf53e466e6eed", "url": "fonts/good-pro-italic-400.woff2" }, { "revision": "55ee8f359a01d66ab3b8b22d02d9ed55", "url": "fonts/good-pro-italic-700.ttf" }, { "revision": "6ee51b012748f002f234b578ab1268b7", "url": "fonts/good-pro-italic-700.woff" }, { "revision": "7489b33e26f603728567f2ccee7e508e", "url": "fonts/good-pro-italic-700.woff2" }, { "revision": "2640ba59a59d7dfbb88d0d477f7bdb0a", "url": "fonts/Pathfinder2eActions.ttf" }, { "revision": "c153508add58cc58db1ef0be5c9f8adf", "url": "fonts/Gin-Regular.ttf" }, { "revision": "b0bf2c218bf460993111010eb83a0fa8", "url": "fonts/SabonLTStd-Bold.ttf" }, { "revision": "1b97aaf6b6e56d43d0b9e370c4f50876", "url": "fonts/SabonLTStd-BoldItalic.ttf" }, { "revision": "d69ef52beb7ca47462a0f89ff028a2f3", "url": "fonts/SabonLTStd-Italic.ttf" }, { "revision": "d6e119cff761a4bee40d2f640db5af1e", "url": "fonts/SabonLTStd-Roman.ttf" }, { "revision": "778896312671ade54c606724f278bf36", "url": "fonts/AlbertusMT.ttf" }, { "revision": "918ab3311bf65e4da491aaba2f2ca5bc", "url": "fonts/Basing.ttf" }, { "revision": "2f95108599bc770e0fc66a063b0f5906", "url": "fonts/Taroca.ttf" }, { "revision": "c18c5f06b696ed2d4c1e5eda8cc204ca", "url": "img/gmscreen/moon.webp" }, { "revision": "183504177c2f7e2ccc6b88461af6000d", "url": "img/letter-dark.webp" }, { "revision": "43877a1bc57da60ca9a9aafeac9d8e2f", "url": "img/letter.webp" }, { "revision": "4279516591cee28c697c6d2f84d84da1", "url": "img/patreon.webp" }, { "revision": "12f8d0eeba4504e025f30e4bf6326cd6", "url": "fonts/fa-light-300.eot" }, { "revision": "da5526bf0f7fae09080945b15da77066", "url": "fonts/fa-light-300.ttf" }, { "revision": "83c52b7102d3b3586554677f947792e7", "url": "fonts/fa-light-300.woff" }, { "revision": "1d4e499e402761b86c26b5fa3ad51c30", "url": "fonts/fa-light-300.woff2" }, { "revision": "09554888dac30eee041e8047d3dc75b4", "url": "sw-injector.js" }]); - var RevisionCacheFirst = class extends Strategy { - cacheRoutesAbortController = null; - constructor() { - super({ cacheName: "runtime-revision" }); - this.activate = this.activate.bind(this); - this.cacheRoutes = this.cacheRoutes.bind(this); - addEventListener("message", (event) => { - switch (event.data.type) { - case "CACHE_ROUTES": { - this.cacheRoutesAbortController = new AbortController(); - event.waitUntil(this.cacheRoutes(event.data, this.cacheRoutesAbortController.signal)); - break; - } - case "CANCEL_CACHE_ROUTES": { - console.log("aborting cache!"); - this.cacheRoutesAbortController?.abort(); - this.cacheRoutesAbortController = null; - break; - } - } - }); - } - async _handle(request, handler) { - const url = request.url; - const cacheKey = createCacheKey({ url, revision: runtimeManifest.get(url) }).cacheKey; - console.log(`trying to resolve ${url} with key ${cacheKey}`); - const cacheResponse = await handler.cacheMatch(cacheKey); - if (cacheResponse !== void 0) - return cacheResponse; - console.log(`fetching ${url} over the network for RevisionFirstCache`); - try { - const fetchResponse = await handler.fetch(request); - handler.cachePut(cacheKey, fetchResponse.clone()); - return fetchResponse; - } catch (e) { - offlineAlert(url); - return new Response(); - } - } - activate(event) { - return waitUntil2(event, async () => { - const cache = await caches.open(this.cacheName); - const currentCacheKeys = (await cache.keys()).map((request) => request.url); - const validCacheKeys = new Set(Array.from(runtimeManifest).map(([url, revision]) => createCacheKey({ url, revision }).cacheKey)); - await Promise.allSettled(currentCacheKeys.map(async (key) => { - if (!validCacheKeys.has(key)) { - console.log(`deleting ${key} from the cache because its revision does not match`); - await cache.delete(key); - } - })); - }); - } - async cacheRoutes(data, signal) { - const cache = await caches.open(this.cacheName); - const currentCacheKeys = new Set((await cache.keys()).map((request) => request.url)); - const validCacheKeys = Array.from(runtimeManifest).map(([url, revision]) => createCacheKey({ url, revision }).cacheKey); - const routeRegex = data.payload.routeRegex; - const routesToCache = validCacheKeys.filter((key) => !currentCacheKeys.has(key) && routeRegex.test(key)); - const fetchTotal = routesToCache.length; - let fetched = 0; - const postProgress = async () => { - const clients = await self.clients.matchAll({ type: "window" }); - for (const client of clients) { - client.postMessage({ type: "CACHE_ROUTES_PROGRESS", payload: { fetched, fetchTotal } }); - } - }; - await postProgress(); - if (fetchTotal === 0) - return; - const concurrentFetches = 5; - const fetchPromise = async () => { - while (true) { - const url = routesToCache.pop(); - if (url === void 0 || signal.aborted) - return; - const cleanUrl = url.replace(/\?__WB_REVISION__=\w+$/m, ""); - const response = await fetch(cleanUrl); - await cache.put(url, response); - fetched++; - postProgress(); - } - }; - const fetchPromises = []; - for (let i = 0; i < concurrentFetches; i++) { - fetchPromises.push(fetchPromise()); - } - const fetchResults = await Promise.allSettled(fetchPromises); - const errorResults = fetchResults.filter((fetchResult) => fetchResult.status === "rejected"); - if (errorResults.length > 0) { - const clients = await self.clients.matchAll({ type: "window" }); - for (const client of clients) - client.postMessage({ type: "CACHE_ROUTES_ERROR", payload: { errors: errorResults } }); - } - } - }; - var runtimeManifest = new Map([["data/adventure/adventure-id.json", "1c29701a3abdebba387f6b92237fcff5"], ["img/covers/blank.webp", "9b2781e05d13f720e91891cbb929fe20"], ["img/covers/CRB-100.webp", "7650bb7365cbf84b20ee97c6b7c0a189"], ["img/covers/CRB-25.webp", "716475fd096ad77eee0ed1b47c3a1431"], ["img/covers/CRB-33.webp", "d7ef321523e2f1321fe8a5324ed4643c"], ["img/covers/CRB.webp", "bfc8f8b52b8faeee86027947182edcf8"], ["img/covers/GMG-100.webp", "75c327c893ef10c786f963236b4fe9d0"], ["img/covers/GMG-25.webp", "a67231c72c04e4a4c018bbd33110198b"], ["img/covers/GMG-33.webp", "6b05c52c0af37ef6ae43cf6f5d719a9c"], ["img/covers/GMG.webp", "d3610c80b6d79213177340f0c5f8db06"], ["img/covers/LOWG-100.webp", "266ffa70d70230e300ed454c612e59cf"], ["img/covers/LOWG-25.webp", "61855c40cd160dcf3bc8c39dc10844c3"], ["img/covers/LOWG-33.webp", "138e39219a0a4da133f3519125e9bc3f"], ["img/covers/LOWG.webp", "1adccec87cc1324fecd5e34ebeef69d4"], ["img/covers/SoM-100.webp", "ed511ca0c38bbe1644ec1b8729e7fb9b"], ["img/covers/SoM-25.webp", "51f0a78fa32ece446abc13ada184a2bc"], ["img/covers/SoM-33.webp", "675e9f72483daeaf814cd1ac38e232c7"], ["img/covers/SoM.webp", "880dd82ad81eda61b903d28e4bdde4f9"], ["img/gmscreen/moon.webp", "c18c5f06b696ed2d4c1e5eda8cc204ca"], ["img/letter-dark.webp", "183504177c2f7e2ccc6b88461af6000d"], ["img/letter.webp", "43877a1bc57da60ca9a9aafeac9d8e2f"], ["img/patreon.webp", "4279516591cee28c697c6d2f84d84da1"], ["img/logo/Background.svg", "c6ec599d06aa5b773e600881ceeb0460"], ["img/logo/No%20Background.svg", "6d3b2f0a213f7bc5beba9e88f20667f7"], ["android-chrome-192x192.png", "9c862118ab3423bc2d01ab42f755e07b"], ["android-chrome-256x256.png", "fad8c4a79079fa54737cb9532e141aa0"], ["android-chrome-384x384.png", "4f2267d39b6bd3389138f074c45dfe67"], ["apple-touch-icon-120x120.png", "fe434a800beb3381ad59197e29e68a2a"], ["apple-touch-icon-152x152.png", "3b23873f540b0c5271201c5f91a0c7ed"], ["apple-touch-icon-167x167.png", "e19815500c57552e18f8218fbdb5cb72"], ["apple-touch-icon-180x180.png", "c9ecf9df6e7f7f55974f45f7110d9890"], ["apple-touch-icon-360x360.png", "b5d0e83a94f7fbea21006b7479d8a898"], ["favicon-128x128.png", "c7b2e3d1de45c84588bc4711a4b50c6d"], ["favicon-144x144.png", "6770b376fb68b50e546e60d4a0dae9aa"], ["favicon-16x16.png", "3dbac8b48aaa087a66f7e3a16af56994"], ["favicon-256x256.png", "e31f4ad5d254f7faedf87bd8ac8e3d1c"], ["favicon-32x32.png", "61f449203da4d72d7669df93ef5d1a0c"], ["favicon-48x48.png", "5144e32c3e7170887ec5c99adeeaaed2"], ["favicon-64x64.png", "be61a655807353c6f8dcb86ff896c581"], ["mstile-144x144.png", "9f6d0f9700426867bddb7614da8ece66"], ["mstile-150x150.png", "ba04e45075fa41f85441a1d070b40710"], ["mstile-310x150.png", "e37a7cc30a0283d5357fd38901cb6f56"], ["mstile-310x310.png", "80a2fed08dac45aa2cfc55ddaa5b69fa"], ["mstile-70x70.png", "798a4847c77967a489d66a40ef1d8801"], ["favicon.svg", "959b9c72ddadfdf4a067012231a84afb"], ["safari-pinned-tab.svg", "e84a2ecd6fd15fb32fc3f75293ef467c"]].map(([ - route, - revision - ]) => [ - `${self.location.origin}/${route}`, - revision - ])); - var revisionCacheFirst = new RevisionCacheFirst(); - registerRoute(({ request }) => runtimeManifest.has(request.url), revisionCacheFirst); - addEventListener("activate", revisionCacheFirst.activate); - registerRoute(({ request }) => request.destination === "font", new CacheFirst({ - cacheName: "font-cache" - })); - registerRoute(({ request }) => request.destination === "image", new NetworkFirst({ - cacheName: "external-image-cache", - plugins: [ - new ExpirationPlugin({ maxAgeSeconds: 7 * 24 * 60 * 60, maxEntries: 100, purgeOnQuotaError: true }) - ] - })); - addEventListener("install", () => { - self.skipWaiting(); - }); - addEventListener("activate", (event) => { - event.waitUntil((async () => { - const cacheNames2 = await caches.keys(); - for (const cacheName of cacheNames2) { - if (/\d+\.\d+\.\d+/.test(cacheName)) { - await caches.delete(cacheName); - console.log(`deleted cache: ${cacheName} because it is from old service worker`); - } - } - })()); - }); -})(); +(()=>{try{self["workbox:core:6.5.2"]&&_()}catch{}var Le=(a,...e)=>{let r=a;return e.length>0&&(r+=` :: ${JSON.stringify(e)}`),r};var be=Le;var d=class extends Error{constructor(e,r){let s=be(e,r);super(s),this.name=e,this.details=r}};var v={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:typeof registration<"u"?registration.scope:""},Y=a=>[v.prefix,a,v.suffix].filter(e=>e&&e.length>0).join("-"),Se=a=>{for(let e of Object.keys(v))a(e)},w={updateDetails:a=>{Se(e=>{typeof a[e]=="string"&&(v[e]=a[e])})},getGoogleAnalyticsName:a=>a||Y(v.googleAnalytics),getPrecacheName:a=>a||Y(v.precache),getPrefix:()=>v.prefix,getRuntimeName:a=>a||Y(v.runtime),getSuffix:()=>v.suffix};function X(a,e){let r=e();return a.waitUntil(r),r}try{self["workbox:precaching:6.5.2"]&&_()}catch{}var Pe="__WB_REVISION__";function R(a){if(!a)throw new d("add-to-cache-list-unexpected-type",{entry:a});if(typeof a=="string"){let o=new URL(a,location.href);return{cacheKey:o.href,url:o.href}}let{revision:e,url:r}=a;if(!r)throw new d("add-to-cache-list-unexpected-type",{entry:a});if(!e){let o=new URL(r,location.href);return{cacheKey:o.href,url:o.href}}let s=new URL(r,location.href),t=new URL(r,location.href);return s.searchParams.set(Pe,e),{cacheKey:s.href,url:t.href}}var V=class{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:e,state:r})=>{r&&(r.originalRequest=e)},this.cachedResponseWillBeUsed=async({event:e,state:r,cachedResponse:s})=>{if(e.type==="install"&&r&&r.originalRequest&&r.originalRequest instanceof Request){let t=r.originalRequest.url;s?this.notUpdatedURLs.push(t):this.updatedURLs.push(t)}return s}}};var F=class{constructor({precacheController:e}){this.cacheKeyWillBeUsed=async({request:r,params:s})=>{let t=s?.cacheKey||this._precacheController.getCacheKeyForURL(r.url);return t?new Request(t,{headers:r.headers}):r},this._precacheController=e}};var D;function he(){if(D===void 0){let a=new Response("");if("body"in a)try{new Response(a.body),D=!0}catch{D=!1}D=!1}return D}async function me(a,e){let r=null;if(a.url&&(r=new URL(a.url).origin),r!==self.location.origin)throw new d("cross-origin-copy-response",{origin:r});let s=a.clone(),t={headers:new Headers(s.headers),status:s.status,statusText:s.statusText},o=e?e(t):t,i=he()?s.body:await s.blob();return new Response(i,o)}var Z=a=>new URL(String(a),location.href).href.replace(new RegExp(`^${location.origin}`),"");function ge(a,e){let r=new URL(a);for(let s of e)r.searchParams.delete(s);return r.href}async function ve(a,e,r,s){let t=ge(e.url,r);if(e.url===t)return a.match(e,s);let o=Object.assign(Object.assign({},s),{ignoreSearch:!0}),i=await a.keys(e,o);for(let n of i){let c=ge(n.url,r);if(t===c)return a.match(n,s)}}var I=class{constructor(){this.promise=new Promise((e,r)=>{this.resolve=e,this.reject=r})}};var W=new Set;async function we(){for(let a of W)await a()}function ee(a){return new Promise(e=>setTimeout(e,a))}try{self["workbox:strategies:6.5.2"]&&_()}catch{}function K(a){return typeof a=="string"?new Request(a):a}var T=class{constructor(e,r){this._cacheKeys={},Object.assign(this,r),this.event=r.event,this._strategy=e,this._handlerDeferred=new I,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(let s of this._plugins)this._pluginStateMap.set(s,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){let{event:r}=this,s=K(e);if(s.mode==="navigate"&&r instanceof FetchEvent&&r.preloadResponse){let i=await r.preloadResponse;if(i)return i}let t=this.hasCallback("fetchDidFail")?s.clone():null;try{for(let i of this.iterateCallbacks("requestWillFetch"))s=await i({request:s.clone(),event:r})}catch(i){if(i instanceof Error)throw new d("plugin-error-request-will-fetch",{thrownErrorMessage:i.message})}let o=s.clone();try{let i;i=await fetch(s,s.mode==="navigate"?void 0:this._strategy.fetchOptions);for(let n of this.iterateCallbacks("fetchDidSucceed"))i=await n({event:r,request:o,response:i});return i}catch(i){throw t&&await this.runCallbacks("fetchDidFail",{error:i,event:r,originalRequest:t.clone(),request:o.clone()}),i}}async fetchAndCachePut(e){let r=await this.fetch(e),s=r.clone();return this.waitUntil(this.cachePut(e,s)),r}async cacheMatch(e){let r=K(e),s,{cacheName:t,matchOptions:o}=this._strategy,i=await this.getCacheKey(r,"read"),n=Object.assign(Object.assign({},o),{cacheName:t});s=await caches.match(i,n);for(let c of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await c({cacheName:t,matchOptions:o,cachedResponse:s,request:i,event:this.event})||void 0;return s}async cachePut(e,r){let s=K(e);await ee(0);let t=await this.getCacheKey(s,"write");if(!r)throw new d("cache-put-with-no-response",{url:Z(t.url)});let o=await this._ensureResponseSafeToCache(r);if(!o)return!1;let{cacheName:i,matchOptions:n}=this._strategy,c=await self.caches.open(i),l=this.hasCallback("cacheDidUpdate"),m=l?await ve(c,t.clone(),["__WB_REVISION__"],n):null;try{await c.put(t,l?o.clone():o)}catch(b){if(b instanceof Error)throw b.name==="QuotaExceededError"&&await we(),b}for(let b of this.iterateCallbacks("cacheDidUpdate"))await b({cacheName:i,oldResponse:m,newResponse:o.clone(),request:t,event:this.event});return!0}async getCacheKey(e,r){let s=`${e.url} | ${r}`;if(!this._cacheKeys[s]){let t=e;for(let o of this.iterateCallbacks("cacheKeyWillBeUsed"))t=K(await o({mode:r,request:t,event:this.event,params:this.params}));this._cacheKeys[s]=t}return this._cacheKeys[s]}hasCallback(e){for(let r of this._strategy.plugins)if(e in r)return!0;return!1}async runCallbacks(e,r){for(let s of this.iterateCallbacks(e))await s(r)}*iterateCallbacks(e){for(let r of this._strategy.plugins)if(typeof r[e]=="function"){let s=this._pluginStateMap.get(r);yield o=>{let i=Object.assign(Object.assign({},o),{state:s});return r[e](i)}}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){let e;for(;e=this._extendLifetimePromises.shift();)await e}destroy(){this._handlerDeferred.resolve(null)}async _ensureResponseSafeToCache(e){let r=e,s=!1;for(let t of this.iterateCallbacks("cacheWillUpdate"))if(r=await t({request:this.request,response:r,event:this.event})||void 0,s=!0,!r)break;return s||r&&r.status!==200&&(r=void 0),r}};var u=class{constructor(e={}){this.cacheName=w.getRuntimeName(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){let[r]=this.handleAll(e);return r}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});let r=e.event,s=typeof e.request=="string"?new Request(e.request):e.request,t="params"in e?e.params:void 0,o=new T(this,{event:r,request:s,params:t}),i=this._getResponse(o,s,r),n=this._awaitComplete(i,o,s,r);return[i,n]}async _getResponse(e,r,s){await e.runCallbacks("handlerWillStart",{event:s,request:r});let t;try{if(t=await this._handle(r,e),!t||t.type==="error")throw new d("no-response",{url:r.url})}catch(o){if(o instanceof Error){for(let i of e.iterateCallbacks("handlerDidError"))if(t=await i({error:o,event:s,request:r}),t)break}if(!t)throw o}for(let o of e.iterateCallbacks("handlerWillRespond"))t=await o({event:s,request:r,response:t});return t}async _awaitComplete(e,r,s,t){let o,i;try{o=await e}catch{}try{await r.runCallbacks("handlerDidRespond",{event:t,request:s,response:o}),await r.doneWaiting()}catch(n){n instanceof Error&&(i=n)}if(await r.runCallbacks("handlerDidComplete",{event:t,request:s,response:o,error:i}),r.destroy(),i)throw i}};var p=class extends u{constructor(e={}){e.cacheName=w.getPrecacheName(e.cacheName),super(e),this._fallbackToNetwork=e.fallbackToNetwork!==!1,this.plugins.push(p.copyRedirectedCacheableResponsesPlugin)}async _handle(e,r){let s=await r.cacheMatch(e);return s||(r.event&&r.event.type==="install"?await this._handleInstall(e,r):await this._handleFetch(e,r))}async _handleFetch(e,r){let s,t=r.params||{};if(this._fallbackToNetwork){let o=t.integrity,i=e.integrity,n=!i||i===o;if(s=await r.fetch(new Request(e,{integrity:i||o})),o&&n){this._useDefaultCacheabilityPluginIfNeeded();let c=await r.cachePut(e,s.clone())}}else throw new d("missing-precache-entry",{cacheName:this.cacheName,url:e.url});return s}async _handleInstall(e,r){this._useDefaultCacheabilityPluginIfNeeded();let s=await r.fetch(e);if(!await r.cachePut(e,s.clone()))throw new d("bad-precaching-response",{url:e.url,status:s.status});return s}_useDefaultCacheabilityPluginIfNeeded(){let e=null,r=0;for(let[s,t]of this.plugins.entries())t!==p.copyRedirectedCacheableResponsesPlugin&&(t===p.defaultPrecacheCacheabilityPlugin&&(e=s),t.cacheWillUpdate&&r++);r===0?this.plugins.push(p.defaultPrecacheCacheabilityPlugin):r>1&&e!==null&&this.plugins.splice(e,1)}};p.defaultPrecacheCacheabilityPlugin={async cacheWillUpdate({response:a}){return!a||a.status>=400?null:a}};p.copyRedirectedCacheableResponsesPlugin={async cacheWillUpdate({response:a}){return a.redirected?await me(a):a}};var U=class{constructor({cacheName:e,plugins:r=[],fallbackToNetwork:s=!0}={}){this._urlsToCacheKeys=new Map,this._urlsToCacheModes=new Map,this._cacheKeysToIntegrities=new Map,this._strategy=new p({cacheName:w.getPrecacheName(e),plugins:[...r,new F({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this._strategy}precache(e){this.addToCacheList(e),this._installAndActiveListenersAdded||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this._installAndActiveListenersAdded=!0)}addToCacheList(e){let r=[];for(let s of e){typeof s=="string"?r.push(s):s&&s.revision===void 0&&r.push(s.url);let{cacheKey:t,url:o}=R(s),i=typeof s!="string"&&s.revision?"reload":"default";if(this._urlsToCacheKeys.has(o)&&this._urlsToCacheKeys.get(o)!==t)throw new d("add-to-cache-list-conflicting-entries",{firstEntry:this._urlsToCacheKeys.get(o),secondEntry:t});if(typeof s!="string"&&s.integrity){if(this._cacheKeysToIntegrities.has(t)&&this._cacheKeysToIntegrities.get(t)!==s.integrity)throw new d("add-to-cache-list-conflicting-integrities",{url:o});this._cacheKeysToIntegrities.set(t,s.integrity)}if(this._urlsToCacheKeys.set(o,t),this._urlsToCacheModes.set(o,i),r.length>0){let n=`Workbox is precaching URLs without revision info: ${r.join(", ")} +This is generally NOT safe. Learn more at https://bit.ly/wb-precache`}}}install(e){return X(e,async()=>{let r=new V;this.strategy.plugins.push(r);for(let[o,i]of this._urlsToCacheKeys){let n=this._cacheKeysToIntegrities.get(i),c=this._urlsToCacheModes.get(o),l=new Request(o,{integrity:n,cache:c,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:i},request:l,event:e}))}let{updatedURLs:s,notUpdatedURLs:t}=r;return{updatedURLs:s,notUpdatedURLs:t}})}activate(e){return X(e,async()=>{let r=await self.caches.open(this.strategy.cacheName),s=await r.keys(),t=new Set(this._urlsToCacheKeys.values()),o=[];for(let i of s)t.has(i.url)||(await r.delete(i),o.push(i.url));return{deletedURLs:o}})}getURLsToCacheKeys(){return this._urlsToCacheKeys}getCachedURLs(){return[...this._urlsToCacheKeys.keys()]}getCacheKeyForURL(e){let r=new URL(e,location.href);return this._urlsToCacheKeys.get(r.href)}getIntegrityForCacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){let r=e instanceof Request?e.url:e,s=this.getCacheKeyForURL(r);if(s)return(await self.caches.open(this.strategy.cacheName)).match(s)}createHandlerBoundToURL(e){let r=this.getCacheKeyForURL(e);if(!r)throw new d("non-precached-url",{url:e});return s=>(s.request=new Request(e),s.params=Object.assign({cacheKey:r},s.params),this.strategy.handle(s))}};var re,y=()=>(re||(re=new U),re);try{self["workbox:routing:6.5.2"]&&_()}catch{}var B="GET";var k=a=>a&&typeof a=="object"?a:{handle:a};var h=class{constructor(e,r,s=B){this.handler=k(r),this.match=e,this.method=s}setCatchHandler(e){this.catchHandler=k(e)}};var O=class extends h{constructor(e,r,s){let t=({url:o})=>{let i=e.exec(o.href);if(!!i&&!(o.origin!==location.origin&&i.index!==0))return i.slice(1)};super(t,r,s)}};var $=class{constructor(){this._routes=new Map,this._defaultHandlerMap=new Map}get routes(){return this._routes}addFetchListener(){self.addEventListener("fetch",e=>{let{request:r}=e,s=this.handleRequest({request:r,event:e});s&&e.respondWith(s)})}addCacheListener(){self.addEventListener("message",e=>{if(e.data&&e.data.type==="CACHE_URLS"){let{payload:r}=e.data,s=Promise.all(r.urlsToCache.map(t=>{typeof t=="string"&&(t=[t]);let o=new Request(...t);return this.handleRequest({request:o,event:e})}));e.waitUntil(s),e.ports&&e.ports[0]&&s.then(()=>e.ports[0].postMessage(!0))}})}handleRequest({request:e,event:r}){let s=new URL(e.url,location.href);if(!s.protocol.startsWith("http"))return;let t=s.origin===location.origin,{params:o,route:i}=this.findMatchingRoute({event:r,request:e,sameOrigin:t,url:s}),n=i&&i.handler,c=[],l=e.method;if(!n&&this._defaultHandlerMap.has(l)&&(n=this._defaultHandlerMap.get(l)),!n)return;let m;try{m=n.handle({url:s,request:e,event:r,params:o})}catch(j){m=Promise.reject(j)}let b=i&&i.catchHandler;return m instanceof Promise&&(this._catchHandler||b)&&(m=m.catch(async j=>{if(b)try{return await b.handle({url:s,request:e,event:r,params:o})}catch(C){C instanceof Error&&(j=C)}if(this._catchHandler)return this._catchHandler.handle({url:s,request:e,event:r});throw j})),m}findMatchingRoute({url:e,sameOrigin:r,request:s,event:t}){let o=this._routes.get(s.method)||[];for(let i of o){let n,c=i.match({url:e,sameOrigin:r,request:s,event:t});if(c)return n=c,(Array.isArray(n)&&n.length===0||c.constructor===Object&&Object.keys(c).length===0||typeof c=="boolean")&&(n=void 0),{route:i,params:n}}return{}}setDefaultHandler(e,r=B){this._defaultHandlerMap.set(r,k(e))}setCatchHandler(e){this._catchHandler=k(e)}registerRoute(e){this._routes.has(e.method)||this._routes.set(e.method,[]),this._routes.get(e.method).push(e)}unregisterRoute(e){if(!this._routes.has(e.method))throw new d("unregister-route-but-not-found-with-method",{method:e.method});let r=this._routes.get(e.method).indexOf(e);if(r>-1)this._routes.get(e.method).splice(r,1);else throw new d("unregister-route-route-not-registered")}};var L,H=()=>(L||(L=new $,L.addFetchListener(),L.addCacheListener()),L);function N(a,e,r){let s;if(typeof a=="string"){let o=new URL(a,location.href),i=({url:n})=>n.href===o.href;s=new h(i,e,r)}else if(a instanceof RegExp)s=new O(a,e,r);else if(typeof a=="function")s=new h(a,e,r);else if(a instanceof h)s=a;else throw new d("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});return H().registerRoute(s),s}function ye(a,e=[]){for(let r of[...a.searchParams.keys()])e.some(s=>s.test(r))&&a.searchParams.delete(r);return a}function*je(a,{ignoreURLParametersMatching:e=[/^utm_/,/^fbclid$/],directoryIndex:r="index.html",cleanURLs:s=!0,urlManipulation:t}={}){let o=new URL(a,location.href);o.hash="",yield o.href;let i=ye(o,e);if(yield i.href,r&&i.pathname.endsWith("/")){let n=new URL(i.href);n.pathname+=r,yield n.href}if(s){let n=new URL(i.href);n.pathname+=".html",yield n.href}if(t){let n=t({url:o});for(let c of n)yield c.href}}var S=class extends h{constructor(e,r){let s=({request:t})=>{let o=e.getURLsToCacheKeys();for(let i of je(t.url,r)){let n=o.get(i);if(n){let c=e.getIntegrityForCacheKey(n);return{cacheKey:n,integrity:c}}}};super(s,e.strategy)}};function ae(a){let e=y(),r=new S(e,a);N(r)}function se(a){y().precache(a)}function te(a,e){se(a),ae(e)}var P=class extends u{async _handle(e,r){let s=[],t=await r.cacheMatch(e),o;if(!t)try{t=await r.fetchAndCachePut(e)}catch(i){i instanceof Error&&(o=i)}if(!t)throw new d("no-response",{url:e.url,error:o});return t}};var oe={cacheWillUpdate:async({response:a})=>a.status===200||a.status===0?a:null};var q=class extends u{constructor(e={}){super(e),this.plugins.some(r=>"cacheWillUpdate"in r)||this.plugins.unshift(oe),this._networkTimeoutSeconds=e.networkTimeoutSeconds||0}async _handle(e,r){let s=[],t=[],o;if(this._networkTimeoutSeconds){let{id:c,promise:l}=this._getTimeoutPromise({request:e,logs:s,handler:r});o=c,t.push(l)}let i=this._getNetworkPromise({timeoutId:o,request:e,logs:s,handler:r});t.push(i);let n=await r.waitUntil((async()=>await r.waitUntil(Promise.race(t))||await i)());if(!n)throw new d("no-response",{url:e.url});return n}_getTimeoutPromise({request:e,logs:r,handler:s}){let t;return{promise:new Promise(i=>{t=setTimeout(async()=>{i(await s.cacheMatch(e))},this._networkTimeoutSeconds*1e3)}),id:t}}async _getNetworkPromise({timeoutId:e,request:r,logs:s,handler:t}){let o,i;try{i=await t.fetchAndCachePut(r)}catch(n){n instanceof Error&&(o=n)}return e&&clearTimeout(e),(o||!i)&&(i=await t.cacheMatch(r)),i}};function G(a){a.then(()=>{})}var qe=(a,e)=>e.some(r=>a instanceof r),Ee,Ne;function Ae(){return Ee||(Ee=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function Me(){return Ne||(Ne=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}var xe=new WeakMap,ne=new WeakMap,Re=new WeakMap,ie=new WeakMap,de=new WeakMap;function Ve(a){let e=new Promise((r,s)=>{let t=()=>{a.removeEventListener("success",o),a.removeEventListener("error",i)},o=()=>{r(g(a.result)),t()},i=()=>{s(a.error),t()};a.addEventListener("success",o),a.addEventListener("error",i)});return e.then(r=>{r instanceof IDBCursor&&xe.set(r,a)}).catch(()=>{}),de.set(e,a),e}function Fe(a){if(ne.has(a))return;let e=new Promise((r,s)=>{let t=()=>{a.removeEventListener("complete",o),a.removeEventListener("error",i),a.removeEventListener("abort",i)},o=()=>{r(),t()},i=()=>{s(a.error||new DOMException("AbortError","AbortError")),t()};a.addEventListener("complete",o),a.addEventListener("error",i),a.addEventListener("abort",i)});ne.set(a,e)}var ce={get(a,e,r){if(a instanceof IDBTransaction){if(e==="done")return ne.get(a);if(e==="objectStoreNames")return a.objectStoreNames||Re.get(a);if(e==="store")return r.objectStoreNames[1]?void 0:r.objectStore(r.objectStoreNames[0])}return g(a[e])},set(a,e,r){return a[e]=r,!0},has(a,e){return a instanceof IDBTransaction&&(e==="done"||e==="store")?!0:e in a}};function _e(a){ce=a(ce)}function Ie(a){return a===IDBDatabase.prototype.transaction&&!("objectStoreNames"in IDBTransaction.prototype)?function(e,...r){let s=a.call(z(this),e,...r);return Re.set(s,e.sort?e.sort():[e]),g(s)}:Me().includes(a)?function(...e){return a.apply(z(this),e),g(xe.get(this))}:function(...e){return g(a.apply(z(this),e))}}function We(a){return typeof a=="function"?Ie(a):(a instanceof IDBTransaction&&Fe(a),qe(a,Ae())?new Proxy(a,ce):a)}function g(a){if(a instanceof IDBRequest)return Ve(a);if(ie.has(a))return ie.get(a);let e=We(a);return e!==a&&(ie.set(a,e),de.set(e,a)),e}var z=a=>de.get(a);function Ce(a,e,{blocked:r,upgrade:s,blocking:t,terminated:o}={}){let i=indexedDB.open(a,e),n=g(i);return s&&i.addEventListener("upgradeneeded",c=>{s(g(i.result),c.oldVersion,c.newVersion,g(i.transaction))}),r&&i.addEventListener("blocked",()=>r()),n.then(c=>{o&&c.addEventListener("close",()=>o()),t&&c.addEventListener("versionchange",()=>t())}).catch(()=>{}),n}function De(a,{blocked:e}={}){let r=indexedDB.deleteDatabase(a);return e&&r.addEventListener("blocked",()=>e()),g(r).then(()=>{})}var Ke=["get","getKey","getAll","getAllKeys","count"],Be=["put","add","delete","clear"],fe=new Map;function ke(a,e){if(!(a instanceof IDBDatabase&&!(e in a)&&typeof e=="string"))return;if(fe.get(e))return fe.get(e);let r=e.replace(/FromIndex$/,""),s=e!==r,t=Be.includes(r);if(!(r in(s?IDBIndex:IDBObjectStore).prototype)||!(t||Ke.includes(r)))return;let o=async function(i,...n){let c=this.transaction(i,t?"readwrite":"readonly"),l=c.store;return s&&(l=l.index(n.shift())),(await Promise.all([l[r](...n),t&&c.done]))[0]};return fe.set(e,o),o}_e(a=>({...a,get:(e,r,s)=>ke(e,r)||a.get(e,r,s),has:(e,r)=>!!ke(e,r)||a.has(e,r)}));try{self["workbox:expiration:6.5.2"]&&_()}catch{}var He="workbox-expiration",A="cache-entries",Te=a=>{let e=new URL(a,location.href);return e.hash="",e.href},Q=class{constructor(e){this._db=null,this._cacheName=e}_upgradeDb(e){let r=e.createObjectStore(A,{keyPath:"id"});r.createIndex("cacheName","cacheName",{unique:!1}),r.createIndex("timestamp","timestamp",{unique:!1})}_upgradeDbAndDeleteOldDbs(e){this._upgradeDb(e),this._cacheName&&De(this._cacheName)}async setTimestamp(e,r){e=Te(e);let s={url:e,timestamp:r,cacheName:this._cacheName,id:this._getId(e)},o=(await this.getDb()).transaction(A,"readwrite",{durability:"relaxed"});await o.store.put(s),await o.done}async getTimestamp(e){let s=await(await this.getDb()).get(A,this._getId(e));return s?.timestamp}async expireEntries(e,r){let s=await this.getDb(),t=await s.transaction(A).store.index("timestamp").openCursor(null,"prev"),o=[],i=0;for(;t;){let c=t.value;c.cacheName===this._cacheName&&(e&&c.timestamp=r?o.push(t.value):i++),t=await t.continue()}let n=[];for(let c of o)await s.delete(A,c.id),n.push(c.url);return n}_getId(e){return this._cacheName+"|"+Te(e)}async getDb(){return this._db||(this._db=await Ce(He,1,{upgrade:this._upgradeDbAndDeleteOldDbs.bind(this)})),this._db}};var x=class{constructor(e,r={}){this._isRunning=!1,this._rerunRequested=!1,this._maxEntries=r.maxEntries,this._maxAgeSeconds=r.maxAgeSeconds,this._matchOptions=r.matchOptions,this._cacheName=e,this._timestampModel=new Q(e)}async expireEntries(){if(this._isRunning){this._rerunRequested=!0;return}this._isRunning=!0;let e=this._maxAgeSeconds?Date.now()-this._maxAgeSeconds*1e3:0,r=await this._timestampModel.expireEntries(e,this._maxEntries),s=await self.caches.open(this._cacheName);for(let t of r)await s.delete(t,this._matchOptions);this._isRunning=!1,this._rerunRequested&&(this._rerunRequested=!1,G(this.expireEntries()))}async updateTimestamp(e){await this._timestampModel.setTimestamp(e,Date.now())}async isURLExpired(e){if(this._maxAgeSeconds){let r=await this._timestampModel.getTimestamp(e),s=Date.now()-this._maxAgeSeconds*1e3;return r!==void 0?r{if(!o)return null;let i=this._isResponseDateFresh(o),n=this._getCacheExpiration(t);G(n.expireEntries());let c=n.updateTimestamp(s.url);if(r)try{r.waitUntil(c)}catch{}return i?o:null},this.cacheDidUpdate=async({cacheName:r,request:s})=>{let t=this._getCacheExpiration(r);await t.updateTimestamp(s.url),await t.expireEntries()},this._config=e,this._maxAgeSeconds=e.maxAgeSeconds,this._cacheExpirations=new Map,e.purgeOnQuotaError&&Ue(()=>this.deleteCacheAndMetadata())}_getCacheExpiration(e){if(e===w.getRuntimeName())throw new d("expire-custom-caches-only");let r=this._cacheExpirations.get(e);return r||(r=new x(e,this._config),this._cacheExpirations.set(e,r)),r}_isResponseDateFresh(e){if(!this._maxAgeSeconds)return!0;let r=this._getDateHeaderTimestamp(e);if(r===null)return!0;let s=Date.now();return r>=s-this._maxAgeSeconds*1e3}_getDateHeaderTimestamp(e){if(!e.headers.has("date"))return null;let r=e.headers.get("date"),t=new Date(r).getTime();return isNaN(t)?null:t}async deleteCacheAndMetadata(){for(let[e,r]of this._cacheExpirations)await self.caches.delete(e),await r.delete();this._cacheExpirations=new Map}};function Ge(a,e){let r=e();return a.waitUntil(r),r}var ze=async a=>{let e=await self.clients.matchAll({type:"window"}),r="generic";/\.(?:png|gif|webm|jpg|webp|jpeg|svg)$/m.test(a)?r="image":/\.json$/m.test(a)&&(r="json");for(let s of e)s.postMessage({type:"FETCH_ERROR",payload:r})},Qe=async()=>{let a=await caches.keys();for(let r of a)await caches.delete(r),await new x(r,{maxEntries:1}).delete();await self.registration.unregister(),(await self.clients.matchAll()).forEach(r=>r.navigate(r.url))};addEventListener("message",a=>{switch(a.data.type){case"RESET":{a.waitUntil(Qe());break}}});te([{revision:"ea9668afe866cf94144aea54975de4c1",url:"js/abilities.js"},{revision:"adcb0a482e48de5b8bbb1dfd81425d64",url:"js/actions.js"},{revision:"61aaeee9b159854c0f032b22105c2545",url:"js/adventure.js"},{revision:"21771bc05dd0464b1aa9e4649c2e16eb",url:"js/adventures.js"},{revision:"0f82e1aeb2232f77e834890e47490d77",url:"js/afflictions.js"},{revision:"003b094822955971899460729f1ef65e",url:"js/ancestries.js"},{revision:"74f73b966ea21dd1f8159b1115b5f5e5",url:"js/archetypes.js"},{revision:"52335573df1f6003573a124a86cdac0f",url:"js/backgrounds.js"},{revision:"baf8ba92a2a04ae2bccb904c5ea2c1af",url:"js/bestiary-encounterbuilder.js"},{revision:"edb66ea23ead626b3c309d8bee7a5903",url:"js/bestiary.js"},{revision:"e2f42425112f388bf1a51b5be9cf5ec2",url:"js/blacklist.js"},{revision:"fdb1c3a0212bd25dd422a427812e3da1",url:"js/book.js"},{revision:"9bcc769ac4898ad4ca69defd9d83814c",url:"js/books.js"},{revision:"2bb08db00ab38596c02fd448c47aba99",url:"js/bookslist.js"},{revision:"c3c783549c4f0fe486c6ddb290587c0c",url:"js/bookutils.js"},{revision:"8bb8ed8c10d8d474a44293a4045a1be9",url:"js/browsercheck.js"},{revision:"c10b6b3a618969a6938a7e4812d01537",url:"js/classes.js"},{revision:"acac9acfa8ac82230603f38ed85b4eb9",url:"js/companionsfamiliars.js"},{revision:"5229964912670180f3a584178628c600",url:"js/conditions.js"},{revision:"19b463d35b8790b19c554f7672ce86a2",url:"js/converter.js"},{revision:"6802d4b9d9fbd8089e573155a7c216ca",url:"js/converterutils.js"},{revision:"16131f19f9027cf586d2bfe7e7277557",url:"js/deepbg.js"},{revision:"96247cd9de97ef3f206e3f8eb8a450d2",url:"js/deities.js"},{revision:"9b955e8e8bd978ae94b5700b99ba04e3",url:"js/encountergen.js"},{revision:"5352d236bca92f5653eeb4759ea91bda",url:"js/feats.js"},{revision:"e2c890f54802f3dc2e29d1ba7f556f88",url:"js/filter-abilities.js"},{revision:"dfd57c8244d6d0409960710f43381209",url:"js/filter-actions.js"},{revision:"2f6936194afe875ca23d2f0d5bd7ef14",url:"js/filter-afflictions.js"},{revision:"d98e1cf5210c7af53c708d98f9ee1b32",url:"js/filter-ancestries.js"},{revision:"0b8221a47bdc08e19e44fc0667d5ace3",url:"js/filter-archetypes.js"},{revision:"a8d67d5657213aac8172eab7f556b71f",url:"js/filter-backgrounds.js"},{revision:"19a0afcb0d05ccdf451e8e3dc68b1a65",url:"js/filter-bestiary.js"},{revision:"e9cf6676f8908546f18dac3f042f4a49",url:"js/filter-classes.js"},{revision:"135d34dbb90f3c5823420ae76d7b2036",url:"js/filter-companionsfamiliars.js"},{revision:"be67b652c59bfca13ae2dfa1a53ff8df",url:"js/filter-conditions.js"},{revision:"a8959376fd665913ee116956bd23b6a7",url:"js/filter-deities.js"},{revision:"8cba93a5fde8a3a57b617e49148336c4",url:"js/filter-feats.js"},{revision:"7c270870b9dfc417373a328b0cfe6403",url:"js/filter-hazards.js"},{revision:"c059a71e3f5c7775a492f757829c74ae",url:"js/filter-items.js"},{revision:"7d409c372a3b5679d336447894dab9cd",url:"js/filter-languages.js"},{revision:"90cf0c8ea7a5490c7176fa32eba9dec2",url:"js/filter-optionalfeatures.js"},{revision:"726b3fac3f53b3745e614d06482f4128",url:"js/filter-organizations.js"},{revision:"ed719db1351f48c6fbe53cb735af4c11",url:"js/filter-places.js"},{revision:"7e5100cb82172b0efe10d58fadc76dee",url:"js/filter-rituals.js"},{revision:"a870df2f14d606023afab8cb621695a4",url:"js/filter-spells.js"},{revision:"1a66c97336877234e1e95cc592934da1",url:"js/filter-tables.js"},{revision:"2947025006376a0c46432272a301b110",url:"js/filter-traits.js"},{revision:"ced5b81eaa6b6968aee339052d498b16",url:"js/filter-variantrules.js"},{revision:"291f440dd1b34f30bce7af7c1bf4d9e0",url:"js/filter-vehicles.js"},{revision:"e9e35f0e24093e87c66111992d21399c",url:"js/filter.js"},{revision:"b918393b488c94f17f3aae526913be18",url:"js/genutils.js"},{revision:"ce4d531479463db31e1671be891bebae",url:"js/gmscreen-counter.js"},{revision:"3fa97bb961b93d53b906da85b8c705f4",url:"js/gmscreen-initiativetracker.js"},{revision:"b27a0e033f574ad2efaad2f03446d967",url:"js/gmscreen-mapper.js"},{revision:"7086e2c4f27fa1b6e8c18de668406a1b",url:"js/gmscreen-moneyconverter.js"},{revision:"807def90ceacbd00b0da2dd6d1ba6795",url:"js/gmscreen-playerinitiativetracker.js"},{revision:"6e353bbf66b1b80f210064e67af4f787",url:"js/gmscreen-timetracker.js"},{revision:"7fe457e1b1e47c1b327b9c229503b95b",url:"js/gmscreen.js"},{revision:"01cf3b549851deb976708b7d7e84102f",url:"js/hazards.js"},{revision:"fe621e48fa923f682d31fbf6677e838a",url:"js/hist.js"},{revision:"9948771a03f77f4a1c8d4ec3ca9084b9",url:"js/initiativetrackerutils.js"},{revision:"fc687277a94712c304678389dd191333",url:"js/inittrackerplayerview.js"},{revision:"4515e147b7b48ef42674b3ce6c430e02",url:"js/items-runebuilder.js"},{revision:"ed47bae3cfe9aa0bff48e73a1b81f22a",url:"js/items.js"},{revision:"5af89260cf41c44ea047fc0275e45f96",url:"js/langdemo.js"},{revision:"453df8120a0f7c7e7597177064dda26e",url:"js/langdemo2.js"},{revision:"3030328d4efb34ea18e73c329c06027e",url:"js/languages.js"},{revision:"324bfb789fb5128414dfec177be287a4",url:"js/list2.js"},{revision:"14884bd5353c583927286dc2dedc1282",url:"js/listpage.js"},{revision:"f8d0b4fcf44162e50d30aceafca7f03e",url:"js/managebrew.js"},{revision:"fa7ea74e1df4e5328ac3486ddceb7cd7",url:"js/multisource.js"},{revision:"450720adfe5544f4dcafa3f3f1f08fe7",url:"js/navigation.js"},{revision:"64428668c97e27a7d2e9298783a34e10",url:"js/omnidexer.js"},{revision:"ebf344ae9608c6c6f3123902f99cbfa9",url:"js/omnisearch.js"},{revision:"0068661f46e7765dcf17a573b2c19572",url:"js/optionalfeatures.js"},{revision:"3f5028596820b68693994c7d87a22339",url:"js/organizations.js"},{revision:"5b2880f23bb5659698aa2d6563fc549d",url:"js/parser.js"},{revision:"06b625b60f6911d2b65275448f0fe5ae",url:"js/places.js"},{revision:"140816e674533979f522f02970780444",url:"js/quickreference.js"},{revision:"15a9b390a1b82f52342a011fbe89a3d3",url:"js/render-dice.js"},{revision:"ef7adf7b06925b8143a14b1bafad3251",url:"js/render-map.js"},{revision:"03cbc42c1d49180e063886d5157f8200",url:"js/render.js"},{revision:"bdcd0d0ec164abbd8ae81854951614c3",url:"js/renderdemo.js"},{revision:"25f700f035aa50408d9688f26f9aa46a",url:"js/rituals.js"},{revision:"680994cb961eeaaa22a0a10715a9fcbd",url:"js/rolang.js"},{revision:"175e532e5c51339b99fd25751563c62f",url:"js/scalecreature.js"},{revision:"b823cf704b3f8a1aa3a24f0bf1c6735d",url:"js/search.js"},{revision:"0c333c70f3c4d894b4785840eff3c992",url:"js/seo-loader.js"},{revision:"74a399749b92e9d6c2b2f4e0b89a75ad",url:"js/spells.js"},{revision:"3687490b20e78d4414d388f1f923f6d8",url:"js/styleswitch.js"},{revision:"ba3ec2d14497337b47ccdf9d31738570",url:"js/tablepage.js"},{revision:"8a1ab0bfa508055a179b3fa01aa7fd67",url:"js/tables.js"},{revision:"fa4a762039c737de1422140258c45804",url:"js/textconverter.js"},{revision:"962c9d925c78f63a24020f0f67936ff4",url:"js/tokenizer.js"},{revision:"6f5d4c18beff74ca0fc15a9c69c693c7",url:"js/traits.js"},{revision:"4d0c372242ba98d838d756da18dc9c0d",url:"js/utils-changelog.js"},{revision:"ce389a1ad746ffd019bb30189f5bbf4a",url:"js/utils-licenses.js"},{revision:"2f85195e8ff0dc06089f486f7eea14cb",url:"js/utils-list.js"},{revision:"3e9239b11afe89a33d5eaad63847b5bc",url:"js/utils-p2p.js"},{revision:"aff1d95a1fac35eceea351cdab89770f",url:"js/utils-proporder.js"},{revision:"82adb2c24289fc25abb32163f08056b2",url:"js/utils-ui.js"},{revision:"f9d7966943bbd201a8abace0bc78d8e8",url:"js/utils.js"},{revision:"65d4253bd1636a9a26d4d59e9b808720",url:"js/variantrules.js"},{revision:"2838d4562ea735105a75477c12c8a66e",url:"js/vehicles.js"},{revision:"b36e7c94c751656285d8e977cc152b10",url:"lib/ace.js"},{revision:"f841812c750b396f454daee1aa5c4213",url:"lib/bootstrap-select.min.js"},{revision:"cad6941d32006acbc61f7bab05918150",url:"lib/bootstrap.min.js"},{revision:"7ba761cdbfa62922c3b750ac78f866eb",url:"lib/elasticlunr.js"},{revision:"28dd3c8bf663c55bc9aa3d8f92945871",url:"lib/ext-searchbox.js"},{revision:"a8e8282fcf516551d39204e076624b55",url:"lib/jquery-ui-slider-pip.js"},{revision:"e858f6a2725af4140c1c424cf024a808",url:"lib/jquery-ui.js"},{revision:"a6b6350ee94a3ea74595c065cbf58af0",url:"lib/jquery.js"},{revision:"04680cb5d0adf90731746e92ef05a87b",url:"lib/jquery.panzoom.js"},{revision:"862e9e065bcfe3944871cbf66229b3fd",url:"lib/localforage.js"},{revision:"522bc8c23346ddf54992d531acabcb3e",url:"lib/lzma.js"},{revision:"2378a4fa58c2e66792c81641346a4a40",url:"lib/peerjs.js"},{revision:"fcf66afa34d87ce0bd47437c0c31816e",url:"css/bootstrap-select.min.css"},{revision:"1264a8c9b7b1a57b2213a96859326e9f",url:"css/bootstrap.css"},{revision:"de97b7db2b1195829599af9cfeb914c6",url:"css/classes.css"},{revision:"354613438d26956a4530d57badd1711d",url:"css/fontawesome.css"},{revision:"01ef22f83fa30e6bed564ab061a79f54",url:"css/jquery-ui-slider-pips.css"},{revision:"4ef12b83b1ef3ff34d711c6a78421f55",url:"css/jquery-ui.css"},{revision:"a6fc67670251132e3eb14a807aa466de",url:"css/list-page--grouped.css"},{revision:"939fd45be687b473e266348825fb5697",url:"css/search.css"},{revision:"79c7a7724188ae77b5570bacc9672e76",url:"css/style.css"},{revision:"f8c7f17547945d8f710506491ef99275",url:"homebrew/index.json"},{revision:"0f7a7b78f07aeb8aff1b40a7eb80f63f",url:"data/abilities.json"},{revision:"f4a14ccd49bd73421947df6c72177f90",url:"data/actions.json"},{revision:"6d9a1634cfdfcaab46fa23df8dd32295",url:"data/adventures.json"},{revision:"802874607e81bda278adcd5727acfadd",url:"data/afflictions.json"},{revision:"daf546e7b17b3ae85a41d9a1e569efad",url:"data/archetypes.json"},{revision:"a5d127e2658052e99b38e61cb9db857a",url:"data/books.json"},{revision:"d77f62d2b49c1a0a281b0e6e3ee0c222",url:"data/changelog.json"},{revision:"12946f64cd9a96b7ac625be8e4273c0f",url:"data/companionsfamiliars.json"},{revision:"65aab6f5c613c666ed5223b1e9b8fca4",url:"data/conditions.json"},{revision:"bd31f6a24ec12f938b23681eb857c412",url:"data/deities.json"},{revision:"d465ddfac916a507fa4da1fbd248dcdf",url:"data/domains.json"},{revision:"eccb8be6f03bd7ce922df7de7e6adbee",url:"data/fluff-deities.json"},{revision:"bf70ec7a1eea74eaa370a596306b60bf",url:"data/fluff-items.json"},{revision:"309b2f5c47389945fbedb5fba0d4241b",url:"data/fluff-organizations.json"},{revision:"93d8f7fda4f90c3488625e3bc5b2a1be",url:"data/generic.json"},{revision:"317c438dd61985f25c83ed48fa7a5955",url:"data/groups.json"},{revision:"9a793f41f33087e33a2251b8b04be708",url:"data/hazards.json"},{revision:"5335bc187f19681fb6224029c78ed72f",url:"data/languages.json"},{revision:"60cbd4da822064baa65ee9c9724bcf50",url:"data/licenses.json"},{revision:"5d98fa27005a70b26c77a6bca146a1ff",url:"data/optionalfeatures.json"},{revision:"27881ff3355c10aa0b159cfbe2b8f908",url:"data/organizations.json"},{revision:"678ea78039df5b0a4364890b8b688f8e",url:"data/places.json"},{revision:"bc0fbcd5cffae107ab5660e244f32e61",url:"data/quickrules.json"},{revision:"51eb8da797e31575fdac2c17f00d6310",url:"data/renderdemo.json"},{revision:"497ef12912ed74f2ea061b0e2ecbc801",url:"data/rituals.json"},{revision:"951784b2f1ad050835d7cfdcc40b3702",url:"data/skills.json"},{revision:"4153e7b6d19bb8ba53742726a10727d8",url:"data/tables.json"},{revision:"6cd9bb0a9d9cb9ef0a4771c79206dd1a",url:"data/traits.json"},{revision:"197babc7b246ff73efa8075781a631d3",url:"data/variantrules.json"},{revision:"bf86305ec6591e2b97f56a2693291096",url:"data/vehicles.json"},{revision:"eac1504c86d4e721f84554e90b2ef75f",url:"data/ancestries/ancestry-anadi.json"},{revision:"43db5a73d17604e64a929e52d5dc1d7a",url:"data/ancestries/ancestry-android.json"},{revision:"52169c24b9092430fbcf464977da7c82",url:"data/ancestries/ancestry-automaton.json"},{revision:"4833d9e5468d8998583b0e070054dce4",url:"data/ancestries/ancestry-azarketi.json"},{revision:"eba3f3b51248e7641a7810851c40bfc1",url:"data/ancestries/ancestry-catfolk.json"},{revision:"32cb1becd16681fef16b925a3b12c775",url:"data/ancestries/ancestry-conrasu.json"},{revision:"7a37e7263845259f370adcdb3e6e9f95",url:"data/ancestries/ancestry-dwarf.json"},{revision:"5400a2be713e868c998401aae6a46b98",url:"data/ancestries/ancestry-elf.json"},{revision:"12fe01516d6988c52ff3c258a784ff5f",url:"data/ancestries/ancestry-fetchling.json"},{revision:"6292dc839ba6e9c3fd01a1e27e2f75e9",url:"data/ancestries/ancestry-fleshwarp.json"},{revision:"e27f2934df76cb7d3a8d03eb53b4d370",url:"data/ancestries/ancestry-gnoll.json"},{revision:"07d857b70553093109569f3327a9c9ee",url:"data/ancestries/ancestry-gnome.json"},{revision:"795155e42f463729c3f6d0d3cb0abbff",url:"data/ancestries/ancestry-goblin.json"},{revision:"936ac0fdafce3426b3ec370ad22b4ec8",url:"data/ancestries/ancestry-goloma.json"},{revision:"c50199f28f46ec8ea9eb747b2253f138",url:"data/ancestries/ancestry-grippli.json"},{revision:"2e40114fe9f2ce7c8edd336012f90ab6",url:"data/ancestries/ancestry-halfling.json"},{revision:"70aa479c415b6b16699a393576829d0b",url:"data/ancestries/ancestry-hobgoblin.json"},{revision:"ddabaf43eb61ca7dfaee67b3849885ee",url:"data/ancestries/ancestry-human.json"},{revision:"cfe7d2de113c3fa491aa4998abf43b93",url:"data/ancestries/ancestry-kitsune.json"},{revision:"76b14dd0be4a89b940ec7b28468cad4b",url:"data/ancestries/ancestry-kobold.json"},{revision:"d73251c994a0360635662941d5b26497",url:"data/ancestries/ancestry-leshy.json"},{revision:"d9d090e02138fa9e241e50a346d77545",url:"data/ancestries/ancestry-lizardfolk.json"},{revision:"c0728e22baa8f03b79971ea580fce8c1",url:"data/ancestries/ancestry-orc.json"},{revision:"1ca4f40b90a82cbc31c1844a742a4df0",url:"data/ancestries/ancestry-poppet.json"},{revision:"d6911baec43e9bdd936a77168d940814",url:"data/ancestries/ancestry-ratfolk.json"},{revision:"97cb40e2dc74a6f4720ab51c96198789",url:"data/ancestries/ancestry-shisk.json"},{revision:"049fd2c8e91840635a0a6523cb57bf1a",url:"data/ancestries/ancestry-shoony.json"},{revision:"09674c8569e5c5c9505badfb4a3e0f00",url:"data/ancestries/ancestry-sprite.json"},{revision:"212065274467b502793bd73973365f1e",url:"data/ancestries/ancestry-strix.json"},{revision:"10457eda4027efd545376a9992fdcf74",url:"data/ancestries/ancestry-tengu.json"},{revision:"fb580b2bac849b64ded21975ae8acaf4",url:"data/ancestries/index.json"},{revision:"36a96d49c651a28caded19b8820d4363",url:"data/ancestries/versatile-heritages.json"},{revision:"48a5f08aceaf321c5fb2fa7e0f0a0ae6",url:"data/backgrounds/backgrounds-aoa0.json"},{revision:"18a6fc08bf3cb566a46c6535e9397e14",url:"data/backgrounds/backgrounds-aoa4.json"},{revision:"e078edee16911bf4a3ccc83a7612d58a",url:"data/backgrounds/backgrounds-aoa6.json"},{revision:"e7ae09fb69ba497618aff151b7f8e491",url:"data/backgrounds/backgrounds-aoe0.json"},{revision:"760e7f38b5727a3c4653ed20f5cd6d66",url:"data/backgrounds/backgrounds-aoe4.json"},{revision:"a6de8ebeba03cfd4c208bc9ea276b7da",url:"data/backgrounds/backgrounds-apg.json"},{revision:"ed95dfaff9809b458f1291453823f43c",url:"data/backgrounds/backgrounds-av0.json"},{revision:"31b8e7593bac4fc20ac9f2ddb44b972f",url:"data/backgrounds/backgrounds-crb.json"},{revision:"55b2b3708dbb199a5024aadd48e95ac4",url:"data/backgrounds/backgrounds-ec0.json"},{revision:"8b1a3269a92a9ab29c0b2f5caabce7dd",url:"data/backgrounds/backgrounds-ec3.json"},{revision:"fd1aadd0f3706f228562645c33efa9c2",url:"data/backgrounds/backgrounds-frp0.json"},{revision:"fb547891fe70a7bcc90d52caaca7d625",url:"data/backgrounds/backgrounds-g&g.json"},{revision:"1b6367a8644861eef6a518f8db93aca9",url:"data/backgrounds/backgrounds-lopsg.json"},{revision:"31d2ad0e100c0ec5553da4929de67c6f",url:"data/backgrounds/backgrounds-lowg.json"},{revision:"806220dea90d2b4e023e1e4964f335df",url:"data/backgrounds/backgrounds-som.json"},{revision:"de810bc4c27dd0a67496b2a7fddc0d1f",url:"data/backgrounds/backgrounds-sot0.json"},{revision:"5c92d8542c71097c784cab0b30d3d7de",url:"data/backgrounds/fluff-backgrounds.json"},{revision:"a2f92b44517232ad4ed1a4e9482a5b83",url:"data/backgrounds/index.json"},{revision:"0b850dd4c8a7040553a9d1c997248fcb",url:"data/bestiary/creatures-aoa1.json"},{revision:"e4a8cd184061a03fc6c9b880148ba8c1",url:"data/bestiary/creatures-aoa2.json"},{revision:"715164269c71a4324524ab30da5bab4a",url:"data/bestiary/creatures-aoa3.json"},{revision:"7cb0cbb0558c53fb083663c7f874b5d5",url:"data/bestiary/creatures-aoa4.json"},{revision:"7c233f850225412be9caf8cabf5c1f51",url:"data/bestiary/creatures-aoa5.json"},{revision:"9a0817cadbec252452158a075107233a",url:"data/bestiary/creatures-aoa6.json"},{revision:"e780a7545eee634b7ba1e628a4ee15df",url:"data/bestiary/creatures-aoe1.json"},{revision:"d6335de58326aacd63bc0f81b7a9f773",url:"data/bestiary/creatures-aoe2.json"},{revision:"c2f1e8489c215d9961530476dabed26b",url:"data/bestiary/creatures-aoe3.json"},{revision:"221f4c910e1b9c5a1e7256b1905f5efe",url:"data/bestiary/creatures-aoe4.json"},{revision:"a848e34df2643accda1c5269ce234e6f",url:"data/bestiary/creatures-aoe5.json"},{revision:"99bf643056ea4d835fdd228cbca2c046",url:"data/bestiary/creatures-aoe6.json"},{revision:"1be05aeb9d5e9d95e7553d734133b011",url:"data/bestiary/creatures-av1.json"},{revision:"8dcd6f41314fa09887dab6caa034c9f5",url:"data/bestiary/creatures-av2.json"},{revision:"9af8ec398cff61eebac5776f92edb571",url:"data/bestiary/creatures-av3.json"},{revision:"dbe18c91fbec07bd5cb0cfd2aed6bb33",url:"data/bestiary/creatures-bst.json"},{revision:"623c22a3bddabee288f034463e6c7fa2",url:"data/bestiary/creatures-bst2.json"},{revision:"618ddb6e1cd5a713209d5c6b6f8feb72",url:"data/bestiary/creatures-bst3.json"},{revision:"8a75db30b88f5d42eb3b4a7bc4c2ce9e",url:"data/bestiary/creatures-crb.json"},{revision:"8b77786f96b2d8f322e602e6b34fb4d2",url:"data/bestiary/creatures-ec1.json"},{revision:"cc33d262f776576a8907f29fd8ac2185",url:"data/bestiary/creatures-ec2.json"},{revision:"89755eed2292da1b2658c23efa13663b",url:"data/bestiary/creatures-ec3.json"},{revision:"9c03b36b1df28d76e526bb2bd7213fec",url:"data/bestiary/creatures-ec4.json"},{revision:"8398753f5f0a03f9687f053d286ee2fc",url:"data/bestiary/creatures-ec5.json"},{revision:"e2254bc8370e4eb5586a3c87e0584c5c",url:"data/bestiary/creatures-ec6.json"},{revision:"1a1af4381228411393e048293f57661f",url:"data/bestiary/creatures-fop.json"},{revision:"52d1baa16351fd77e010f7b8329918a8",url:"data/bestiary/creatures-frp1.json"},{revision:"2148a988c3d17cbf2f87b95e249c650e",url:"data/bestiary/creatures-frp2.json"},{revision:"615bfefd7aaa276f9db7328d6763c9dd",url:"data/bestiary/creatures-frp3.json"},{revision:"5ac93049a1b36f00b96a24a39565e127",url:"data/bestiary/creatures-gmg.json"},{revision:"85a0c8f45d74c1426c34dd8cc5afd0cd",url:"data/bestiary/creatures-lome.json"},{revision:"09435fb1095df05bc2f96528b4037824",url:"data/bestiary/creatures-ltiba.json"},{revision:"66b4d1584e6343c24581426a705d33ed",url:"data/bestiary/creatures-sli.json"},{revision:"b6ba17cf63df89118d22bceb2cf17dde",url:"data/bestiary/creatures-sot1.json"},{revision:"3aa74359f22bd885bb1b92138bbcc977",url:"data/bestiary/creatures-sot2.json"},{revision:"2ba3eb9647247da5030d370911f2b6fc",url:"data/bestiary/creatures-tio.json"},{revision:"caaf16707e3febba9ac5420f425f79cd",url:"data/bestiary/fluff-creatures-av3.json"},{revision:"dd66d2e74a7e02e82338e38cf78134ef",url:"data/bestiary/fluff-creatures-bst.json"},{revision:"ad1ea53a67b96993f54a1c1c09e57b18",url:"data/bestiary/fluff-creatures-bst2.json"},{revision:"c8d15754edddccdf287755048301fa09",url:"data/bestiary/fluff-creatures-bst3.json"},{revision:"c152becb0a3a50acc61ad3c62285a4e8",url:"data/bestiary/fluff-creatures-gmg.json"},{revision:"f0b6aa97a48a31b2bd5950ff175a6f69",url:"data/bestiary/fluff-creatures-lome.json"},{revision:"7bf32f0c2d3988d2dec16d3adb6a98eb",url:"data/bestiary/fluff-creatures-sot1.json"},{revision:"2b4cae20bcc16c52f61717284a1e8cd1",url:"data/bestiary/fluff-index.json"},{revision:"1ba3a93d9770376187a7d248e3cbbb74",url:"data/bestiary/index.json"},{revision:"2ceaf5f6d8a96aecc56a458ad5855228",url:"data/book/book-crb.json"},{revision:"4509b9d3735db93dacca5a4b81a7e579",url:"data/book/book-gmg.json"},{revision:"71d482f2e999e734734a6c5ba18a5ad3",url:"data/book/book-lowg.json"},{revision:"3d1a97431a05bf51a9d1b26273a1ca39",url:"data/book/book-som.json"},{revision:"afcc7ee26993b519eb7bc1c87b98fe32",url:"data/class/class-alchemist.json"},{revision:"6ac8359cdd1b9254c4813b0d10f6f0de",url:"data/class/class-barbarian.json"},{revision:"c09c04e5c67f9776891b896688ab2899",url:"data/class/class-bard.json"},{revision:"1a6b057e3f3fd34e83a4d322cedad591",url:"data/class/class-champion.json"},{revision:"5ccfb1eddfdb91287fd6182c69166d3a",url:"data/class/class-cleric.json"},{revision:"b2d2ae4ca129a9963df9cf7edd80e495",url:"data/class/class-druid.json"},{revision:"e8e6181d11ffb9a16b264f6351f08f13",url:"data/class/class-fighter.json"},{revision:"c179d68e41d1aa2004aa7b2a2f460a4e",url:"data/class/class-gunslinger.json"},{revision:"7f011cf0941eeae16a818024cef1050b",url:"data/class/class-inventor.json"},{revision:"bb32bf415e250953797da10fa74ec804",url:"data/class/class-investigator.json"},{revision:"068cdf9bd235418bb89c461d4371175d",url:"data/class/class-magus.json"},{revision:"4f9083f694872857da95d961c89ea460",url:"data/class/class-monk.json"},{revision:"e80fba83b1daf23c6a6c6950c37e49e9",url:"data/class/class-oracle.json"},{revision:"c4783027db6d8f20d8e21d3a65ddde2a",url:"data/class/class-ranger.json"},{revision:"c80a2e2bfaf99c0f168a0e3748c16324",url:"data/class/class-rogue.json"},{revision:"d3d8c246444c8edfbd9a833aec2487a7",url:"data/class/class-sorcerer.json"},{revision:"9b93a2778a02d6619c5ff65dd0993c62",url:"data/class/class-summoner.json"},{revision:"5412eabc7ef4d0ac03efae79ace1881c",url:"data/class/class-swashbuckler.json"},{revision:"50b68496cee4834f52f123d08b0e8814",url:"data/class/class-witch.json"},{revision:"28ec5c2922a11bcbf8dcc44cbd0e9e27",url:"data/class/class-wizard.json"},{revision:"394724d537ab681ff5d7725e7672bfaf",url:"data/class/index.json"},{revision:"564b1e5e95b98f88beb4780726c6befc",url:"data/feats/feats-aoa3.json"},{revision:"ab80eb4fecffa4e207dc960d924c97fa",url:"data/feats/feats-aoa4.json"},{revision:"46f9c12cd5f088a0b58e5316ce39c7b0",url:"data/feats/feats-aoa5.json"},{revision:"c00eec5f10785095d63c1019c5ac7a9c",url:"data/feats/feats-aoa6.json"},{revision:"f915c88fcdc6c7090f2ef67b6b1a5030",url:"data/feats/feats-aoe1.json"},{revision:"8c4c47f150adc7bd2ac7cc264d1738c5",url:"data/feats/feats-aoe2.json"},{revision:"1b6c5ab64c9997e617e9224682a8d82e",url:"data/feats/feats-aoe3.json"},{revision:"fb4a886f7020a7bdca795bcc499d647b",url:"data/feats/feats-apg.json"},{revision:"2d22f151d21d8b27790707d6247b56d2",url:"data/feats/feats-av1.json"},{revision:"e4fb1e1fc8d52cbbee3ad2073ea6423b",url:"data/feats/feats-av2.json"},{revision:"d5588bc945dd7308def53e556b6912eb",url:"data/feats/feats-av3.json"},{revision:"c1eeade9ff788fa759c7da2b5d087033",url:"data/feats/feats-crb.json"},{revision:"f7195ecc4e9a5be7554989a73e9d0fc5",url:"data/feats/feats-ec1.json"},{revision:"0a024a20a78b5dbda524c17a0916cff4",url:"data/feats/feats-ec2.json"},{revision:"330dd2395fcd3a3e1d12eae48895eb8c",url:"data/feats/feats-ec3.json"},{revision:"7f31c727001efdf2ad8cdabe932c008f",url:"data/feats/feats-ec6.json"},{revision:"7cb4e24e5153cead893bc588640e7075",url:"data/feats/feats-fop.json"},{revision:"b125f2f3aee4058f88b1723cd7e92d1e",url:"data/feats/feats-frp1.json"},{revision:"f92d1ba95a4688a124f0ab2d9d7e1d72",url:"data/feats/feats-frp2.json"},{revision:"62d76771f8a07c2f35dfe8d177355a8b",url:"data/feats/feats-frp3.json"},{revision:"3f5223626620b0c587849212946c8db5",url:"data/feats/feats-g&g.json"},{revision:"90aa7169925660c88133037ca2862b16",url:"data/feats/feats-gmg.json"},{revision:"12d7a4452d76f0760c73c7a51932a5db",url:"data/feats/feats-loag.json"},{revision:"4d84e856fc4f49eb69294470484823bf",url:"data/feats/feats-locg.json"},{revision:"27cb93f5b8a02dbe0efaac3bfda74bff",url:"data/feats/feats-logm.json"},{revision:"8f1c4e73c86335296e1e0f179208b179",url:"data/feats/feats-lol.json"},{revision:"e47b698d6797ac60e6f607c8b4932715",url:"data/feats/feats-lome.json"},{revision:"9f915de6e93f9f5f798c88ade23e9599",url:"data/feats/feats-lopsg.json"},{revision:"85fe1b667c8e2efcd360118b673644a6",url:"data/feats/feats-lotgb.json"},{revision:"bc55a43bfe3fedd996f826294f427ba4",url:"data/feats/feats-lowg.json"},{revision:"8120b6dfff1a035457d00e443b026a5d",url:"data/feats/feats-ltiba.json"},{revision:"76395bbf6fad7760da8e9a9771a94b9d",url:"data/feats/feats-sli.json"},{revision:"1428f0c5d650664366d5c2cabb5436fb",url:"data/feats/feats-som.json"},{revision:"197c90beb23ac311ac2c58b343492d0a",url:"data/feats/feats-sot2.json"},{revision:"46bc1cbabc1cca1d6500e08f2c41dd49",url:"data/feats/feats-sot3.json"},{revision:"1fe0b2a76d8ca518409e4e0869072729",url:"data/feats/index.json"},{revision:"07b4a3fb8b7bf167a3500545ac1abd8d",url:"data/generated/bookref-gmscreen-index.json"},{revision:"cd44d6e74a62616b66876e4b62e936fe",url:"data/generated/bookref-gmscreen.json"},{revision:"75124fa94f73f68aedc8ad5f6b7cb693",url:"data/generated/bookref-quick.json"},{revision:"688a74016f76e2edf07802a3f0ba58f4",url:"data/generated/gendata-nav-adventure-book-index.json"},{revision:"f777aa8770309ea288fc832c5bc374c9",url:"data/items/baseitems.json"},{revision:"ca81ca4408f056ea5249ed5b7895ff44",url:"data/items/fluff-index.json"},{revision:"1fc0fcdbb0518e8fd10d16c8c67efd6f",url:"data/items/fluff-items-crb.json"},{revision:"6fae85f819f6d19210a0c8eb3116dbcf",url:"data/items/index.json"},{revision:"57763bc7a10903fb428bb3949edfaca0",url:"data/items/items-aoa1.json"},{revision:"05bf8b6f43d4e31f0ada817be2d6a0cc",url:"data/items/items-aoa2.json"},{revision:"1cc5fb1f62519f8d8db09dea691b2ec0",url:"data/items/items-aoa3.json"},{revision:"cdd38f85a901047fcd9cc23d03f4f34c",url:"data/items/items-aoa4.json"},{revision:"6d5c3365305a173f69c7db09f041172a",url:"data/items/items-aoa5.json"},{revision:"faacf9080b90bfc89a0cacb0cc64a22a",url:"data/items/items-aoa6.json"},{revision:"14d12700308b3f144b68c47b98448e5e",url:"data/items/items-aoe1.json"},{revision:"2a889adb54ff184e69c7275b421d410e",url:"data/items/items-aoe2.json"},{revision:"ea4e78794024814a38cca52e0689204f",url:"data/items/items-aoe3.json"},{revision:"ea1668a62ce655dd2590c27587fb0c75",url:"data/items/items-aoe4.json"},{revision:"03bbf04acc19d18f42382b497dfe1890",url:"data/items/items-aoe5.json"},{revision:"19578d13ad63d9bb4fece79cd1e153d8",url:"data/items/items-aoe6.json"},{revision:"650ff2c2d4e59064cadf7674b0dde18a",url:"data/items/items-apg.json"},{revision:"3d677af7d9c5ffa734817ac3f427cf75",url:"data/items/items-av1.json"},{revision:"0b61bf4d8b0817ef924449f6813567af",url:"data/items/items-av2.json"},{revision:"bbbe7259fe67a403f73eed44715a0e9f",url:"data/items/items-av3.json"},{revision:"d71d3092749f0607f58e1a7f2062add1",url:"data/items/items-crb.json"},{revision:"7d9c86eceb8050ead124fb9745c8d627",url:"data/items/items-ec1.json"},{revision:"1181b982bbb95bc52ac31f65a06cf38d",url:"data/items/items-ec2.json"},{revision:"521ac165c8df3174b1f7e7b40efc9432",url:"data/items/items-ec3.json"},{revision:"086cb09f7ea6a7154c8f0dcc3486b9af",url:"data/items/items-ec4.json"},{revision:"d9076746d19915d7dd5a2cedc433214c",url:"data/items/items-ec5.json"},{revision:"573a6e030d30553442713c6a16da3772",url:"data/items/items-ec6.json"},{revision:"8fcdec71f529a10ecb108d6bdc6bdc75",url:"data/items/items-fop.json"},{revision:"4b68b8842e213c4c92ea66b1c6251cb6",url:"data/items/items-frp1.json"},{revision:"e4f341ac6eafbe88c5629bac89017287",url:"data/items/items-frp2.json"},{revision:"0b4acc987901b5fcf6c6a832b29a6828",url:"data/items/items-g&g.json"},{revision:"1d2e57367c371feb80ad5a184bb1075f",url:"data/items/items-gmg.json"},{revision:"39b40da0da37b66d85b1649ca27ef231",url:"data/items/items-loag.json"},{revision:"681febf3b660f21c2b030351bd829126",url:"data/items/items-locg.json"},{revision:"307837027b8e4ec9f8ef4a3ea34265f0",url:"data/items/items-logm.json"},{revision:"fe93de984edc8e67136d34cf542d741b",url:"data/items/items-lol.json"},{revision:"20a73cf06ea2340e652f72ecd739bbe6",url:"data/items/items-lome.json"},{revision:"2cb87a1d87ad3f94512ee14787be18fb",url:"data/items/items-lopsg.json"},{revision:"fe0ce0869334aab9aa723137c6c2c1eb",url:"data/items/items-lotgb.json"},{revision:"5fc458aa024fff22e51b79635dc419f3",url:"data/items/items-lowg.json"},{revision:"cf35fb704e6e806f6355deed48fe6b1d",url:"data/items/items-ltiba.json"},{revision:"f4ab1784a0f20554a5d47ed978bf6430",url:"data/items/items-sli.json"},{revision:"7695f16bf62405c5d61bc81695e68570",url:"data/items/items-som.json"},{revision:"4376aa1db6345f1d5a28b2e59d44f7b3",url:"data/items/items-sot1.json"},{revision:"7efede606cf3f03cc5d3236d79dc81a8",url:"data/items/items-sot2.json"},{revision:"b2aba46af0fcc3d399d6f7214de7aee9",url:"data/items/items-sot3.json"},{revision:"94431013053bbed5cedcc37a7f858e94",url:"data/items/items-tio.json"},{revision:"8a80554c91d9fca8acb82f023de02f11",url:"data/spells/fluff-index.json"},{revision:"b406db2efe683c1dc84157222dff6880",url:"data/spells/index.json"},{revision:"7bede3adc55d0bf7800575d0bae7d385",url:"data/spells/spells-aoa3.json"},{revision:"70c7e3cc8eeaf8800d50e347e0150596",url:"data/spells/spells-aoa4.json"},{revision:"ce0062cd7c3bb2d5e6760b48b95c8011",url:"data/spells/spells-aoa6.json"},{revision:"3ba8e77e7abbfcd7caf4df300248c140",url:"data/spells/spells-aoe2.json"},{revision:"3144f5c33257222d0571b7e86f0c216a",url:"data/spells/spells-aoe4.json"},{revision:"1b0f8d4578f939e5b7952212a69d49a4",url:"data/spells/spells-aoe5.json"},{revision:"dc87d7a7c1a1524e0edf6c79ab1f314b",url:"data/spells/spells-aoe6.json"},{revision:"8aebef0ec12f2ee3f7af60d81d4a9fd9",url:"data/spells/spells-apg.json"},{revision:"0b3fc32dbe5715e7d597e905a8ba3237",url:"data/spells/spells-av1.json"},{revision:"511ab491bd01d1fc13438054a051bd44",url:"data/spells/spells-av2.json"},{revision:"3efa28cf371374af7fa4c9f53ac82da7",url:"data/spells/spells-av3.json"},{revision:"1f79f4c879041e07e6321bda2575dcec",url:"data/spells/spells-crb.json"},{revision:"77a5573db90ff44e49d0b3582d04a34f",url:"data/spells/spells-ec1.json"},{revision:"e68aca95a6ba2b183a5c8932f383a2b9",url:"data/spells/spells-ec2.json"},{revision:"4363b944273c6b61f2c71a9896910de7",url:"data/spells/spells-ec3.json"},{revision:"0a033714de3e3946bab0ccf207612757",url:"data/spells/spells-ec4.json"},{revision:"bd28ffe624cf2952f6d0087b959c2ae9",url:"data/spells/spells-ec5.json"},{revision:"2054324fdf57d1e24dacdc961eb0a222",url:"data/spells/spells-ec6.json"},{revision:"5f24d32570c27a7675546e95abbcc82a",url:"data/spells/spells-frp1.json"},{revision:"785fa24e272f133c25704d13796aa578",url:"data/spells/spells-frp3.json"},{revision:"9c10f0330df8fa74e706e60ecc5179cc",url:"data/spells/spells-locg.json"},{revision:"4d80b765271d2e7a802fab79a5305a68",url:"data/spells/spells-logm.json"},{revision:"42eee42bcbb8f03db24e9050601ff993",url:"data/spells/spells-lol.json"},{revision:"086c1aa5a4f00139224834f7b796c528",url:"data/spells/spells-lopsg.json"},{revision:"9abeb5242112a6257766c5f6bb7554a2",url:"data/spells/spells-lowg.json"},{revision:"c546c991a5c6523af6808d232acf8102",url:"data/spells/spells-som.json"},{revision:"8ac48f4118ae012d2727e6967b07ab6b",url:"data/spells/spells-sot1.json"},{revision:"d7114a5327af86e19c1462c5739c20b7",url:"data/spells/spells-sot3.json"},{revision:"4d30098a93e1b3de38ea661b3aed95a5",url:"abilities.html"},{revision:"45e674213259f82f4d1724e658550935",url:"actions.html"},{revision:"1df5cfea4d0143108be6df12c603d178",url:"adventure.html"},{revision:"064f1aab3a0b194cc930813db2f78ed8",url:"adventures.html"},{revision:"719f1b15116292a6f76f5caca717943a",url:"afflictions.html"},{revision:"d685f1f9de61393bf087e93071829060",url:"ancestries.html"},{revision:"08598b89973d46e338716c40b3bb5fd7",url:"archetypes.html"},{revision:"c57039ea5c6c8cc8fd370d95dc6fd2ef",url:"backgrounds.html"},{revision:"df834b8d68a5ff74e7585f6ff6740e1a",url:"bestiary.html"},{revision:"2ca8c1914c92e7489cc1dfbe970122c6",url:"blacklist.html"},{revision:"128e03c7caa7ad0de6c01965fbcbc53b",url:"book.html"},{revision:"8c93c39cde65be9d90321054079b8b90",url:"books.html"},{revision:"9dd45817118ec898363cb4f09f52d380",url:"changelog.html"},{revision:"d573495c5d64cd000a6e98fefc99a4a2",url:"classes.html"},{revision:"f58637255c12732a1eaeb091f010bb07",url:"companionsfamiliars.html"},{revision:"edc076f47e0bb5deb9c4419da456fe3e",url:"conditions.html"},{revision:"0f97080fcd19913b2b7681844c515f41",url:"deities.html"},{revision:"f433280b3ad9d97acbc0c290b9b60682",url:"donate.html"},{revision:"4b27fc77a19bf4e93fd83661dd7cb7bc",url:"feats.html"},{revision:"39f97b348d41cf8a97c197ba602965d2",url:"gmscreen.html"},{revision:"ff32aba6400842a60a712afef0a63b9d",url:"hazards.html"},{revision:"b7b0a44ef3361b7f62f66a731b794078",url:"index.html"},{revision:"298e11b359967b37d2c23d8b0942781d",url:"inittrackerplayerview.html"},{revision:"7e699ee518fb89661e5ff6cf6f42dcd2",url:"items.html"},{revision:"52e63b01c5697f5f68003ce4285b0553",url:"langdemo.html"},{revision:"14ee89bf592cd0e18349c9469d48db78",url:"languages.html"},{revision:"6c5eadde0c4fc3149a71e5e6a84921df",url:"licenses.html"},{revision:"fb282ffd69f619cc583423403e82e4ae",url:"managebrew.html"},{revision:"3ac875c1710306dce6431ce2549e7cae",url:"optionalfeatures.html"},{revision:"fc02ecf1afb90e4e0c52d4c32817ea46",url:"organizations.html"},{revision:"14cdd2d2a26bd643781d17f14217221d",url:"Pf2eTools.html"},{revision:"5ff8a7cdef3e0381ddc4518fdc17d8d8",url:"places.html"},{revision:"345fa1f7f5471ab11192237c03f2c86e",url:"privacy-policy.html"},{revision:"4d1f7f70f7bdb4e7cb8ea28949927fd9",url:"quickreference.html"},{revision:"6a155ecb78441a94b117e52df26b134c",url:"renderdemo.html"},{revision:"735062d33d767fb4c2ce52917533ca2b",url:"rituals.html"},{revision:"d19c1e7c1199a72d71daac27cd7f3e14",url:"search.html"},{revision:"0dc24ba6fb44e77afe4ef248c913d107",url:"spells.html"},{revision:"6c24153f82a044dc047001f6805254f5",url:"tables.html"},{revision:"af5f4672ec879916d5a61ba628a8c29f",url:"textconverter.html"},{revision:"728f8a10bb3e8afe858465f1cadf04ae",url:"traits.html"},{revision:"abe874e1bebc1df6e4adaa724ae19eba",url:"variantrules.html"},{revision:"1453f603d4bf89028def5efc6f96ebfb",url:"vehicles.html"},{revision:"fdd1e05cf7a26db6172e45740dbdb313",url:"search/index-alt-spell.json"},{revision:"a2c797a51147f62dc30cc0c616e035c2",url:"search/index-item.json"},{revision:"954c0472af2a6a21008fe114ca26d4f5",url:"search/index.json"},{revision:"bf8641d5e6b7357a8761dc3fbb6adf3a",url:"search/traits.json"},{revision:"4050573dedbe1cc64b4fdcad04351daa",url:"manifest.webmanifest"},{revision:"448c34a56d699c29117adc64c43affeb",url:"fonts/glyphicons-halflings-regular.woff2"},{revision:"e18bbf611f2a2e43afc071aa2f4e1512",url:"fonts/glyphicons-halflings-regular.ttf"},{revision:"d09e5b926b6fdb2a506e5909de33de23",url:"fonts/good-pro-400.ttf"},{revision:"9f6134a15b7dfc5a119bc65376dbe269",url:"fonts/good-pro-400.woff"},{revision:"ff1abe8ed0ef061106b68d844c8dab4d",url:"fonts/good-pro-400.woff2"},{revision:"361e7ff40e96db6bbbfe90889d95afdc",url:"fonts/good-pro-700.ttf"},{revision:"1997214212f12c3e4a68f5195e68cb5d",url:"fonts/good-pro-700.woff"},{revision:"0fea4b7d69bbcb12a33f0922262c6421",url:"fonts/good-pro-700.woff2"},{revision:"a11892b605845bf613d1a8bb06c00b04",url:"fonts/good-pro-condensed-400.ttf"},{revision:"6421dccde27db5dba3399149e69f71d3",url:"fonts/good-pro-condensed-400.woff"},{revision:"ea4d723a4099259aba94b84e333034f8",url:"fonts/good-pro-condensed-700.ttf"},{revision:"fc0455882bdfe0c48aa7186da15c85f3",url:"fonts/good-pro-condensed-700.woff"},{revision:"46aa1be77a9022bb5ee43a8513fb3057",url:"fonts/good-pro-condensed-700.woff2"},{revision:"51853144d912fd5553eeb7d39c3b53bf",url:"fonts/good-pro-condensed-italic-400.ttf"},{revision:"41d2455a8dea4aac5165b82743681efa",url:"fonts/good-pro-condensed-italic-400.woff"},{revision:"5a10bdbc21e43df2acd07e2487820d60",url:"fonts/good-pro-condensed-italic-700.ttf"},{revision:"556dd5c152d5b0739a5121f37a2baff4",url:"fonts/good-pro-condensed-italic-700.woff"},{revision:"1bc04907c2bf079908e90e0313239bcd",url:"fonts/good-pro-condensed-italic-700.woff2"},{revision:"ff1eae181861f44db0ab1431879a49f9",url:"fonts/good-pro-italic-400.ttf"},{revision:"a9ed15953b80fedb8137f8f25839fb96",url:"fonts/good-pro-italic-400.woff"},{revision:"1b23ad64d84c8cee844cf53e466e6eed",url:"fonts/good-pro-italic-400.woff2"},{revision:"55ee8f359a01d66ab3b8b22d02d9ed55",url:"fonts/good-pro-italic-700.ttf"},{revision:"6ee51b012748f002f234b578ab1268b7",url:"fonts/good-pro-italic-700.woff"},{revision:"7489b33e26f603728567f2ccee7e508e",url:"fonts/good-pro-italic-700.woff2"},{revision:"2640ba59a59d7dfbb88d0d477f7bdb0a",url:"fonts/Pathfinder2eActions.ttf"},{revision:"c153508add58cc58db1ef0be5c9f8adf",url:"fonts/Gin-Regular.ttf"},{revision:"b0bf2c218bf460993111010eb83a0fa8",url:"fonts/SabonLTStd-Bold.ttf"},{revision:"1b97aaf6b6e56d43d0b9e370c4f50876",url:"fonts/SabonLTStd-BoldItalic.ttf"},{revision:"d69ef52beb7ca47462a0f89ff028a2f3",url:"fonts/SabonLTStd-Italic.ttf"},{revision:"d6e119cff761a4bee40d2f640db5af1e",url:"fonts/SabonLTStd-Roman.ttf"},{revision:"778896312671ade54c606724f278bf36",url:"fonts/AlbertusMT.ttf"},{revision:"918ab3311bf65e4da491aaba2f2ca5bc",url:"fonts/Basing.ttf"},{revision:"2f95108599bc770e0fc66a063b0f5906",url:"fonts/Taroca.ttf"},{revision:"c18c5f06b696ed2d4c1e5eda8cc204ca",url:"img/gmscreen/moon.webp"},{revision:"183504177c2f7e2ccc6b88461af6000d",url:"img/letter-dark.webp"},{revision:"43877a1bc57da60ca9a9aafeac9d8e2f",url:"img/letter.webp"},{revision:"4279516591cee28c697c6d2f84d84da1",url:"img/patreon.webp"},{revision:"12f8d0eeba4504e025f30e4bf6326cd6",url:"fonts/fa-light-300.eot"},{revision:"da5526bf0f7fae09080945b15da77066",url:"fonts/fa-light-300.ttf"},{revision:"83c52b7102d3b3586554677f947792e7",url:"fonts/fa-light-300.woff"},{revision:"1d4e499e402761b86c26b5fa3ad51c30",url:"fonts/fa-light-300.woff2"},{revision:"3cce3b697f11b5a95f19194484d1bb96",url:"sw-injector.js"}]);var le=class extends u{cacheRoutesAbortController=null;constructor(){super({cacheName:"runtime-revision"}),this.activate=this.activate.bind(this),this.cacheRoutes=this.cacheRoutes.bind(this),addEventListener("message",e=>{switch(e.data.type){case"CACHE_ROUTES":{this.cacheRoutesAbortController=new AbortController,e.waitUntil(this.cacheRoutes(e.data,this.cacheRoutesAbortController.signal));break}case"CANCEL_CACHE_ROUTES":{this.cacheRoutesAbortController?.abort(),this.cacheRoutesAbortController=null;break}}})}async _handle(e,r){let s=e.url,t=R({url:s,revision:J.get(s)}).cacheKey,o=await r.cacheMatch(t);if(o!==void 0)return o;try{let i=await r.fetch(e);return r.cachePut(t,i.clone()),i}catch{return ze(s),new Response}}activate(e){return Ge(e,async()=>{let r=await caches.open(this.cacheName),s=(await r.keys()).map(o=>o.url),t=new Set(Array.from(J).map(([o,i])=>R({url:o,revision:i}).cacheKey));await Promise.allSettled(s.map(async o=>{t.has(o)||await r.delete(o)}))})}async cacheRoutes(e,r){let s=await caches.open(this.cacheName),t=new Set((await s.keys()).map(f=>f.url)),o=Array.from(J).map(([f,E])=>R({url:f,revision:E}).cacheKey),i=e.payload.routeRegex,n=o.filter(f=>!t.has(f)&&i.test(f)),c=n.length,l=0,m=async()=>{let f=await self.clients.matchAll({type:"window"});for(let E of f)E.postMessage({type:"CACHE_ROUTES_PROGRESS",payload:{fetched:l,fetchTotal:c}})};if(await m(),c===0)return;let b=5,j=async()=>{for(;;){let f=n.pop();if(f===void 0||r.aborted)return;let E=f.replace(/\?__WB_REVISION__=\w+$/m,""),$e=await fetch(E);await s.put(f,$e),l++,m()}},C=[];for(let f=0;ff.status==="rejected");if(ue.length>0){let f=await self.clients.matchAll({type:"window"});for(let E of f)E.postMessage({type:"CACHE_ROUTES_ERROR",payload:{errors:ue}})}}},J=new Map([["data/adventure/adventure-id.json","1c29701a3abdebba387f6b92237fcff5"],["img/covers/blank.webp","9b2781e05d13f720e91891cbb929fe20"],["img/covers/CRB-100.webp","7650bb7365cbf84b20ee97c6b7c0a189"],["img/covers/CRB-25.webp","716475fd096ad77eee0ed1b47c3a1431"],["img/covers/CRB-33.webp","d7ef321523e2f1321fe8a5324ed4643c"],["img/covers/CRB.webp","bfc8f8b52b8faeee86027947182edcf8"],["img/covers/GMG-100.webp","75c327c893ef10c786f963236b4fe9d0"],["img/covers/GMG-25.webp","a67231c72c04e4a4c018bbd33110198b"],["img/covers/GMG-33.webp","6b05c52c0af37ef6ae43cf6f5d719a9c"],["img/covers/GMG.webp","d3610c80b6d79213177340f0c5f8db06"],["img/covers/LOWG-100.webp","266ffa70d70230e300ed454c612e59cf"],["img/covers/LOWG-25.webp","61855c40cd160dcf3bc8c39dc10844c3"],["img/covers/LOWG-33.webp","138e39219a0a4da133f3519125e9bc3f"],["img/covers/LOWG.webp","1adccec87cc1324fecd5e34ebeef69d4"],["img/covers/SoM-100.webp","ed511ca0c38bbe1644ec1b8729e7fb9b"],["img/covers/SoM-25.webp","51f0a78fa32ece446abc13ada184a2bc"],["img/covers/SoM-33.webp","675e9f72483daeaf814cd1ac38e232c7"],["img/covers/SoM.webp","880dd82ad81eda61b903d28e4bdde4f9"],["img/gmscreen/moon.webp","c18c5f06b696ed2d4c1e5eda8cc204ca"],["img/letter-dark.webp","183504177c2f7e2ccc6b88461af6000d"],["img/letter.webp","43877a1bc57da60ca9a9aafeac9d8e2f"],["img/patreon.webp","4279516591cee28c697c6d2f84d84da1"],["img/logo/Background.svg","c6ec599d06aa5b773e600881ceeb0460"],["img/logo/No%20Background.svg","6d3b2f0a213f7bc5beba9e88f20667f7"],["android-chrome-192x192.png","9c862118ab3423bc2d01ab42f755e07b"],["android-chrome-256x256.png","fad8c4a79079fa54737cb9532e141aa0"],["android-chrome-384x384.png","4f2267d39b6bd3389138f074c45dfe67"],["apple-touch-icon-120x120.png","fe434a800beb3381ad59197e29e68a2a"],["apple-touch-icon-152x152.png","3b23873f540b0c5271201c5f91a0c7ed"],["apple-touch-icon-167x167.png","e19815500c57552e18f8218fbdb5cb72"],["apple-touch-icon-180x180.png","c9ecf9df6e7f7f55974f45f7110d9890"],["apple-touch-icon-360x360.png","b5d0e83a94f7fbea21006b7479d8a898"],["favicon-128x128.png","c7b2e3d1de45c84588bc4711a4b50c6d"],["favicon-144x144.png","6770b376fb68b50e546e60d4a0dae9aa"],["favicon-16x16.png","3dbac8b48aaa087a66f7e3a16af56994"],["favicon-256x256.png","e31f4ad5d254f7faedf87bd8ac8e3d1c"],["favicon-32x32.png","61f449203da4d72d7669df93ef5d1a0c"],["favicon-48x48.png","5144e32c3e7170887ec5c99adeeaaed2"],["favicon-64x64.png","be61a655807353c6f8dcb86ff896c581"],["mstile-144x144.png","9f6d0f9700426867bddb7614da8ece66"],["mstile-150x150.png","ba04e45075fa41f85441a1d070b40710"],["mstile-310x150.png","e37a7cc30a0283d5357fd38901cb6f56"],["mstile-310x310.png","80a2fed08dac45aa2cfc55ddaa5b69fa"],["mstile-70x70.png","798a4847c77967a489d66a40ef1d8801"],["favicon.svg","959b9c72ddadfdf4a067012231a84afb"],["safari-pinned-tab.svg","e84a2ecd6fd15fb32fc3f75293ef467c"]].map(([a,e])=>[`${self.location.origin}/${a}`,e])),Oe=new le;N(({request:a})=>J.has(a.url),Oe);addEventListener("activate",Oe.activate);N(({request:a})=>a.destination==="font",new P({cacheName:"font-cache"}));N(({request:a})=>a.destination==="image",new q({cacheName:"external-image-cache",plugins:[new M({maxAgeSeconds:7*24*60*60,maxEntries:100,purgeOnQuotaError:!0})]}));addEventListener("install",()=>{self.skipWaiting()});addEventListener("activate",a=>{a.waitUntil((async()=>{let e=await caches.keys();for(let r of e)/\d+\.\d+\.\d+/.test(r)&&await caches.delete(r)})())});})();