diff --git a/.gitignore b/.gitignore index 665c98b0..2d486fd0 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,8 @@ txt/ *.csv package-lock.json package.json -*.DS_Store \ No newline at end of file +*.DS_Store +*.mp4 +*.mp3 +*.wav +*.jpg \ No newline at end of file diff --git a/packages/backend/src/__main__.py b/packages/backend/src/__main__.py index 13b96328..d0e322d2 100644 --- a/packages/backend/src/__main__.py +++ b/packages/backend/src/__main__.py @@ -1,7 +1,7 @@ import logging from dotenv import find_dotenv, load_dotenv -from preprocessor import create_db_from_youtube_urls_and_pdfs, create_embeddings +from preprocessor import create_vector_dbs, create_embeddings load_dotenv(find_dotenv()) @@ -20,13 +20,12 @@ def main(): general_embeddings, in_depth_embeddings = create_embeddings() # create_db_from_fc_youtube_urls(FC_INPUT_VIDEO_URLS) - create_db_from_youtube_urls_and_pdfs( + create_vector_dbs( fc_json_directory, cj_json_directory, pdf_directory, pc_json_directory, news_json_directory, - general_embeddings, in_depth_embeddings, ) diff --git a/packages/backend/src/cache/.gitignore b/packages/backend/src/cache/.gitignore index cfde13c8..cc5122cb 100644 --- a/packages/backend/src/cache/.gitignore +++ b/packages/backend/src/cache/.gitignore @@ -1,2 +1,7 @@ /faiss_index_general /faiss_index_in_depth +/faiss_index_in_depth_pdf +/faiss_index_in_depth_pc +/faiss_index_in_depth_news +/faiss_index_in_depth_fc +/faiss_index_in_depth_cj diff --git a/packages/backend/src/cache/faiss_index_in_depth_cj.dvc b/packages/backend/src/cache/faiss_index_in_depth_cj.dvc new file mode 100644 index 00000000..86b714b9 --- /dev/null +++ b/packages/backend/src/cache/faiss_index_in_depth_cj.dvc @@ -0,0 +1,6 @@ +outs: +- md5: 9c2090ec6ee84ddf3792866364b35b0f.dir + size: 23116757 + nfiles: 2 + hash: md5 + path: faiss_index_in_depth_cj diff --git a/packages/backend/src/cache/faiss_index_in_depth_fc.dvc b/packages/backend/src/cache/faiss_index_in_depth_fc.dvc new file mode 100644 index 00000000..e67fea50 --- /dev/null +++ b/packages/backend/src/cache/faiss_index_in_depth_fc.dvc @@ -0,0 +1,6 @@ +outs: +- md5: ad7c688f8fff83d65f8728a403c864dd.dir + size: 63799934 + nfiles: 2 + hash: md5 + path: faiss_index_in_depth_fc diff --git a/packages/backend/src/cache/faiss_index_in_depth_news.dvc b/packages/backend/src/cache/faiss_index_in_depth_news.dvc new file mode 100644 index 00000000..625cf616 --- /dev/null +++ b/packages/backend/src/cache/faiss_index_in_depth_news.dvc @@ -0,0 +1,6 @@ +outs: +- md5: d08e6dfb04e5afcff49028b2bffed7ad.dir + size: 526418 + nfiles: 2 + hash: md5 + path: faiss_index_in_depth_news diff --git a/packages/backend/src/cache/faiss_index_in_depth_pc.dvc b/packages/backend/src/cache/faiss_index_in_depth_pc.dvc new file mode 100644 index 00000000..171e7ff6 --- /dev/null +++ b/packages/backend/src/cache/faiss_index_in_depth_pc.dvc @@ -0,0 +1,6 @@ +outs: +- md5: 75d23bd607ac91d67d994f624fb2e4c2.dir + size: 2097501 + nfiles: 2 + hash: md5 + path: faiss_index_in_depth_pc diff --git a/packages/backend/src/cache/faiss_index_in_depth_pdf.dvc b/packages/backend/src/cache/faiss_index_in_depth_pdf.dvc new file mode 100644 index 00000000..5913b763 --- /dev/null +++ b/packages/backend/src/cache/faiss_index_in_depth_pdf.dvc @@ -0,0 +1,6 @@ +outs: +- md5: 28bfb00c7d3ebfbb4de620e9915e75b3.dir + size: 53418928 + nfiles: 2 + hash: md5 + path: faiss_index_in_depth_pdf diff --git a/packages/backend/src/minutes_agendas_directory/At lincoln beach volunteer caretakers plead for help from new orleans city hall.json b/packages/backend/src/minutes_agendas_directory/At lincoln beach volunteer caretakers plead for help from new orleans city hall.json new file mode 100644 index 00000000..b202fc3c --- /dev/null +++ b/packages/backend/src/minutes_agendas_directory/At lincoln beach volunteer caretakers plead for help from new orleans city hall.json @@ -0,0 +1,9 @@ +{ + "messages": [ + { + "page_content": "Skip to main content\nHomes\nCalendar\nStore\nPublic Notices\nE-Edition\nNewsletters\nSubscribe for $1\nAt Lincoln Beach, volunteer caretakers plead for help from New Orleans City Hall\nResidents, officials try to cooperate as redevelopment unfold\nBy BEN MYERS | Staff writer\nSep 4, 2022\n3 min to read\n1 of 3\nReggie Ford takes a picture from a sailboat that washed up at Lincoln Beach in New Orleans on Tuesday, Aug. 30, 2022.\nSTAFF PHOTO BY SOPHIA GERMER\nFacebook\nTwitter\nEmail\nPrint\nCopy article link\nSave\nWhen it comes to Lincoln Beach, the long-neglected New Orleans East recreation spot that\u2019s recently had a quiet revival, city officials and the volunteers who tend to it say they want the same thing: a newly restored, pristine Lake Pontchartrain beachfront for everyone to enjoy.\nBut in recent months, as City Hall has begun developing plans to rehabilitate the area, Lincoln Beach advocates say they\u2019ve been frustrated by the slow pace of government action.\nSick of the lack of progress over four mayoral administrations, residents adopted the beach in the early days of the COVID-19 pandemic. They took it upon themselves to clear thickets, build tables and walking trails, gather thousands of bags of garbage and even install a rudimentary drainage system.\nA pipe that is part of the draining and irrigation system helps move water under a walkway at Lincoln Beach in New Orleans on Tuesday, Aug. 30, 2022.\nSTAFF PHOTO BY SOPHIA GERMER\nOfficials in Mayor LaToya Cantrell\u2019s administration, meanwhile, say they are pursuing a development plan filled with contracting procedures, permitting requirements and grant applications. Cantrell has set aside $5 million in money borrowed via bond issues, and the Department of Public Works has submitted a formal proposal for money from the BP oil disaster settlement.\nAmid the plodding bureacratic process, garbage continues to accumulate on the 15-acre site. Volunteers have hung signs directing visitors to dispose of waste properly, in strategically placed bins, and warning that glass is not allowed. They have pleaded with City Hall to clear a massive pile of garbage bags - large enough to fill a small apartment - that they have collected under a pavilion.\nBut officials have resisted. They are quick to point out that, technically, nothing is allowed at Lincoln Beach: Setting foot on it is trespassing.\nSpace is cleared of debris at Lincoln Beach in New Orleans on Tuesday, Aug. 30, 2022.\nSTAFF PHOTO BY SOPHIA GERMER\n\u201cLincoln Beach is closed. It\u2019s not a safe place to be right now,\u201d Cheryn Robles, the Cantrell administration\u2019s project manager, said during a City Council committee meeting on Wednesday. \u201cIn terms of priorities of how we should be addressing illegal dumping, I would say it's more important for us to be addressing it on roads that are open.\u201d\nThe latest plans \nThe Cantrell administration\u2019s Lincoln Beach revival plans are the latest in a succession of fitful efforts dating from the 1990s. Plans call for a natural recreation environment, and roughly half of the needed money has been committed. The administration produced a site assessment in April 2021, and Robles said designs are in the works. A request for proposals for a master planner could be issued soon, and a construction timeline ready by spring.\nBut residents have grown frustrated with the lack of visible progress and clear information, especially as they continue to maintain the site on their own time and dime.\nReggie Ford walks along a wall next to a ramp that has crumbled in the past few years at Lincoln Beach in New Orleans on Tuesday, Aug. 30, 2022.\nSTAFF PHOTO BY SOPHIA GERMER\n\u201cI just bought a $600 lawn mower, and it broke in a week because it hit some old rebar. said artist Reggie Ford, who has worked with community activist Michael Pellet on the site\u2019s upkeep. \"I\u2019m about to buy another one. This is like my fourth lawn mower,\u201d \nFord said he spends as many as six hours a day working at Lincoln Beach, and has spent more than $20,000 on it. Pellet, who also goes by Sage Michael, said he started organizing volunteers in March 2020 so New Orleans East could \u201chave something.\u201d\n\u201cFor this community that's been suffering from disaster after disaster, after false promises after lack of investment,\u201d Michael said.\nClashing priorities \nThe Cantrell administration formed the Lincoln Beach Community Advisory Committee to encourage the volunteers\u2019 commitment, even as officials tiptoe around the appearance of inviting liability. The idea is to consult with residents and report on the latest developments in planning.\nBut there hasn\u2019t been much to report over the last 1\u00bd years, said Blyss Wallace, the group\u2019s president. Getting clear information has been \u201clike pulling teeth,\u201d she said.\nA sign asks visitors to dispose of trash at Lincoln Beach in New Orleans on Tuesday, Aug. 30, 2022.\nSTAFF PHOTO BY SOPHIA GERMER\nStill, Wallace said she is hopeful for renewed momentum, and better relations with city officials, after the City Council committee meeting on Wednesday. That will start with clearing the trash, which officials finally agreed to help with this month.\nFollowing through on that promise will show good faith, Wallace said.\n\u201cEverybody's so zoned in on [the garbage], and with every right to be,\u201d Wallace said. \u201cRemoving that will show that they're actually working with us.\u201d\nFears of getting left behind\nPart of the reason for concerns about Lincoln Beach\u2019s progress relates to the news last month that Pontchartrain Beach had been turned over to a nonprofit for redevelopment, with plans for a wetlands preserve, dog park and a small marina near the University of New Orleans.\nPontchartrain Beach was a popular attraction but was off limits to Black residents during the Jim Crow era. Lincoln Beach, located far from where most people lived at the time, was offered up as a consolation prize. It was hard to reach, but it hosted a full-fledged amusement park, with a Ferris wheel, roller coaster, swimming pools and a performance venue that drew big-name artists.\nReggie Ford picks up concrete blocks so visitors do not hurt themselves near a sailboat that washed up at Lincoln Beach in New Orleans on Tuesday, Aug. 30, 2022.\nSTAFF PHOTO BY SOPHIA GERMER\nCity Hall left Lincoln Beach to nature once Pontchartrain Beach was desegregated with the 1964 Civil Rights Act. But even with the end of legal segregation at Pontchartrain Beach Black residents were never entirely welcome there.\nSome Black New Orleanians worry that Lincoln Beach will get left behind again, said Dawn Hebert, president of the East New Orleans Neighborhood Advisory Commission.\n\u201cLincoln Beach is more of an African American historical site that the community wants to restore,\u201d Hebert said. \u201cThe city just decided to abandon Lincoln Beach completely.\u201d\nEmail Ben Myers at bmyers@theadvocate.com. Follow Ben Myers on Twitter, @blevimyers.\nFacebook\nTwitter\nEmail\nPrint\nCopy article link\nSave\nThis Day in History\nSponsored by Connatix\nRecommended for you\nRecommended by\nSECTIONS\nHOME\nNEWS\nOPINION\nSPORTS\nENTERTAINMENT/LIFE\nNEWSLETTERS\nGAMES\nSERVICES\nCLASSIFIEDS\nSEARCH\nSUBSCRIBE | GROUPS\nDIGITAL ADVERTISING\nHELP/CONTACT US\nRSS FEEDS\nMEDIA KIT\nEEDITION\nCAREERS\nTEACHER'S LINK\nREVIEWING THE RECORD\nOUR SITES\nOBITUARIES\nJOBS\nCELEBRATIONS\nNIE\nCLASSIFIEDS\nHOMES\nPETS\nARCHIVES\nSTORE\nCONTACT INFORMATION\nnola.com\n840 St. Charles Avenue\nNew Orleans, LA 70130\nPhone: 504-529-0522\n\nNews Tips:\nnolanewstips@theadvocate.com\nOther questions:\nsubscriberservices@theadvocate.com\nNeed help?\nReport a delivery issue\nCreate a temporary stop\nSign up for recurring payments\nPay your bill\nUpdate your billing info\n\n\u00a9 Copyright 2023 NOLA.com 840 St. Charles Avenue, New Orleans, LA | Terms of Use | Privacy Policy\nPowered by BLOX Content Management System from BLOX Digital.\nThis website stores data such as cookies to enable essential website functionality, marketing, personalization and analytics. By remaining on this website you indicate your consent. See updated terms and conditions.\n ", + "url": "https://www.nola.com/news/politics/at-lincoln-beach-volunteer-caretakers-plead-for-help-from-new-orleans-city-hall/article_2cd4c6e4-2b98-11ed-b0b7-1b46c1cb095d.html", + "title": "At lincoln beach volunteer caretakers plead for help from new orleans city hall" + } + ] +} \ No newline at end of file diff --git a/packages/backend/src/minutes_agendas_directory/Cantrell administration should boost transparency on 388 million in federal funds BGR says.json b/packages/backend/src/minutes_agendas_directory/Cantrell administration should boost transparency on 388 million in federal funds BGR says.json new file mode 100644 index 00000000..d789f44b --- /dev/null +++ b/packages/backend/src/minutes_agendas_directory/Cantrell administration should boost transparency on 388 million in federal funds BGR says.json @@ -0,0 +1,9 @@ +{ + "messages": [ + { + "page_content": "Skip to main content\nHomes\nCalendar\nStore\nPublic Notices\nE-Edition\nNewsletters\nSubscribe for $1\nCantrell administration should boost transparency on $388 million in federal funds, BGR says\nBY MATT SLEDGE | Staff writer\nDec 18, 2022\n4 min to read\n1 of 8\nMayor LaToya Cantrell answers questions during the Community Budget Meeting at Lakeview Christian Center in New Orleans, Thursday, Aug. 18, 2022. (Photo by Sophia Germer, NOLA.com, The Times-Picayune | The New Orleans Advocate)\nSophia Germer\nFacebook\nTwitter\nEmail\nPrint\nCopy article link\nSave\nWhen the New Orleans City Council passed a massive, $262 million amendment to the 2023 budget in the waning hours before a Dec. 1 deadline, local activists were surprised.\nThere\u2019d been no formal notice that Mayor LaToya Cantrell and the council had hammered out a deal to tap hundreds of millions of dollars in federal pandemic relief funds and other money, said Maxwell Ciardullo, the spokesperson for the Louisiana Fair Housing Action Center.\n\u201cEveryone was totally caught off guard,\u201d Ciardullo said.\nNow, organizers are preparing for another debate early next year over how to use the rest of the city\u2019s one-time funds.\nWhen that happens, the Cantrell administration should open the curtain on how it is spending American Rescue Plan Act funds and a huge general fund balance, the Bureau of Governmental Research said in a report this week.\nThat report faults the administration for a lack of transparency thus far. But it also notes that there is time for a course correction given the huge sums yet to be spent.\nA growing surplus\nWhen the pandemic walloped the city\u2019s tourism industry in 2020, the Cantrell administration prepared for a downturn in sales and hotel taxes for years to come. The city planned employee furloughs in 2021 that would save $26 million, plus another $92 million in general budget cuts, according to the BGR report.\nHowever, in March 2021, the U.S. Congress passed into law the American Rescue Plan Act, which was designed to provide a lifeline to local governments. Suddenly, New Orleans was in line to receive $388 million in federal funds in two installments.\nThe federal law placed some limits on how local governments could spend the money. The city plugged $187 million from the first installment into the police and fire departments, freeing up general fund dollars that would have been spent there as the city saw fit.\nThat didn\u2019t violate federal law. But the fact that the city only explained how it was using the money on the front end in an online dashboard, the Bureau of Governmental Research said, \u201cdoes not provide the public with the information necessary to understand ARPA\u2019s real impact on funding for other departments or the city\u2019s finances.\"\nMayor LaToya Cantrell answers questions during the Community Budget Meeting at Lakeview Christian Center in New Orleans, Thursday, Aug. 18, 2022. (Photo by Sophia Germer, NOLA.com, The Times-Picayune | The New Orleans Advocate)\nSophia Germer\nIn addition to the federal aid, another factor bulked up the city\u2019s bank account. Hundreds of unfilled positions, many in the New Orleans Police Department, contributed to a huge balance of leftover funds at the end of 2021. In total, the city spent $532 million in 2021, $100 million short of its trimmed-down budget.\nThe BGR report found that even without the federal funds, last year the city would have been able to meet all of its expenses while generating a $25 million surplus. In effect, the federal relief dollars helped grow the city's fund balance.\nThe Cantrell administration has portrayed its conservative budgeting as a prudent response to the uncertainty of the pandemic. Even after Congress passed ARPA it warned of budget shortfalls lasting into 2025. It has also said that the savings have allowed it to sock money into a much-needed rainy-day fund. Yet the drop in spending coincided with widespread complaints about the quality of municipal services.\nRebecca Mowbray, the president and CEO of BGR, said the group didn\u2019t try to determine how the two factors were related.\n\u201cOur task here really was just to follow the money and see where it went. We didn\u2019t so much make judgments about how they were spending it,\u201d she said.\nSpending the pot\nThis summer, the federal government sent the city its second, $194 million block of pandemic relief funds. Heading into the November budget season, Cantrell held a series of town halls.\nIn some settings, Cantrell didn't typically distinguish between sources of funds and the timing of City Council votes. But administration officials also stated that the city would allocate general funds through the ordinary budget process before turning to the federal dollars.\nInstead, the Cantrell administration and the City Council passed the last-minute amendments to the mayor\u2019s proposed budget that caught organizers off-guard. Those amendments allocated $124 million in ARPA funds and $151 million in fund balance dollars, according to BGR.\n\u201cUltimately, they went ahead and passed everything all at once, not really giving citizens the opportunity to know the details,\u201d said Susie Dudis, a BGR research analyst.\nIn a statement, a city spokesperson pushed back at the idea that there wasn\u2019t advance notice, pointing to the town halls and budget hearings. John Lawson, the spokesperson, said the amendment included priorities that had emerged as consensus priorities, like fighting crime and blight.\n\u201cThe first set of appropriations invested in projects and initiatives in response to what we heard from the public as core/vital basic needs,\u201d said Lawson.\nGilbert Monta\u00f1o, bottom center, chief administrative officer for New Orleans, talks about the details of Mayor LaToya Cantrell's 2023 operating budget to the New Orleans City Council on Tuesday, October 25, 2022 at City Hall. (Photo by Chris Granger | The Times-Picayune | The New Orleans Advocate)\nSTAFF PHOTO BY CHRIS GRANGER\nThe budget amendment, unlike previous appropriations, sends the federal relief funds to specific departments rather than flowing it through police and fire. But even with that added level of detail, BGR\u2019s report faulted the administration for falling short on transparency.\nA $5 million outlay for \u201cunhoused populations,\u201d for example, was described in an internal memo as going to a \u201cfull-time staff member and consulting team to develop a comprehensive program to support unhoused populations in the city.\u201d\nThe BGR, Dudis said, is \u201choping we will see more of the actual plan details... their time frame, what are the objectives, what is the population of people being served. That, we don\u2019t have at this point.\u201d\nMoney in the bank\nDistrict A Council member Joe Giarrusso, the chair of the City Council budget committee, agreed with the Cantrell administration that the budget amendments reflected a broad consensus. But he also agreed with BGR that the city and council could have done a better job of communicating how they planned to allocate ARPA funds.\nThe issues raised in the BGR report, he said, pointed to the larger problem of compressing complex budget discussions into November. He favors expanding budget season to include October.\nGiarrusso said he expects to hold hearings on how to spend the remainder of one-time dollars from ARPA and the fund balance in January and February. That amounts to about $70 million in federal dollars plus at least as many fund-balance dollars, he\u2019s said previously.\nCiardullo and other activists are pushing for the city to spend the money on a wide variety of needs. His group\u2019s priority is up to $90 million to tackle what he called \u201ca tremendous shortage of affordable rental housing.\u201d\nGiarrusso said that under a new approach he is pioneering next year, there will also be quarterly hearings on how the city is spending its money. The Cantrell administration said that it will also be expanding an online dashboard in early 2023 to include spending outcomes and the use of fund balance dollars.\nEmail Matt Sledge at msledge@theadvocate.com.\nFacebook\nTwitter\nEmail\nPrint\nCopy article link\nSave\nThis Day in History\nSponsored by Connatix\nRecommended for you\nRecommended by\nSECTIONS\nHOME\nNEWS\nOPINION\nSPORTS\nENTERTAINMENT/LIFE\nNEWSLETTERS\nGAMES\nSERVICES\nCLASSIFIEDS\nSEARCH\nSUBSCRIBE | GROUPS\nDIGITAL ADVERTISING\nHELP/CONTACT US\nRSS FEEDS\nMEDIA KIT\nEEDITION\nCAREERS\nTEACHER'S LINK\nREVIEWING THE RECORD\nOUR SITES\nOBITUARIES\nJOBS\nCELEBRATIONS\nNIE\nCLASSIFIEDS\nHOMES\nPETS\nARCHIVES\nSTORE\nCONTACT INFORMATION\nnola.com\n840 St. Charles Avenue\nNew Orleans, LA 70130\nPhone: 504-529-0522\n\nNews Tips:\nnolanewstips@theadvocate.com\nOther questions:\nsubscriberservices@theadvocate.com\nNeed help?\nReport a delivery issue\nCreate a temporary stop\nSign up for recurring payments\nPay your bill\nUpdate your billing info\n\n\u00a9 Copyright 2023 NOLA.com 840 St. Charles Avenue, New Orleans, LA | Terms of Use | Privacy Policy\nPowered by BLOX Content Management System from BLOX Digital.\nThis website stores data such as cookies to enable essential website functionality, marketing, personalization and analytics. By remaining on this website you indicate your consent. See updated terms and conditions.\n ", + "url": "https://www.nola.com/news/politics/cantrell-administration-should-boost-transparency-on-388-million-in-federal-funds-bgr-says/article_6b591a1a-7d7c-11ed-b58f-0371d99e2538.html", + "title": "Cantrell administration should boost transparency on 388 million in federal funds BGR says" + } + ] +} \ No newline at end of file diff --git a/packages/backend/src/minutes_agendas_directory/Frequent outages could lead to big fines for entergy new orleans under new standards.json b/packages/backend/src/minutes_agendas_directory/Frequent outages could lead to big fines for entergy new orleans under new standards.json new file mode 100644 index 00000000..baf7079f --- /dev/null +++ b/packages/backend/src/minutes_agendas_directory/Frequent outages could lead to big fines for entergy new orleans under new standards.json @@ -0,0 +1,9 @@ +{ + "messages": [ + { + "page_content": "HOME\nABOUT\nSUBSCRIBE\nDONATE\nELECTION 2023\nGOVT + POLITICS\nENVIRONMENT\nHEALTH\nCRIMINAL JUSTICE\nEDUCATION\nBUSINESS + LABOR\nGOVT + POLITICS\nWEATHER\nFrequent outages could lead to big fines for Entergy New Orleans under new standards\nBY: MICHAEL ISAAC STEIN, VERITE - FEBRUARY 18, 2023 10:00 AM\nEntergy\u2019s New Orleans Power Station. (Photo by Julie Dermansky)\nThe New Orleans City Council established a new set of reliability standards Thursday for Entergy New Orleans that could lead to fines up to $3.7 million per year if the number of annual blackouts exceeds those standards. The council is the regulator of Entergy New Orleans.\n\u201cEntergy New Orleans must meet our standards or owe the people of New Orleans, their customers, millions of dollars in fines,\u201d Councilwoman Helena Moreno said at a utility committee meeting this month. \u201cI believe we\u2019re one of the only regulators in the southern region that\u2019s set up these types of reliability standards.\u201d\nThe council hopes the new standards will finally allow it to collect a $1 million fine it imposed on Entergy in 2019 over frequent outages. The fine was levied after a council investigation found that the grid\u2019s reliability fell sharply shortly after the company cut millions of dollars from its budget to maintain it.\nEntergy challenged the fine in court, arguing it was unfair because the council hadn\u2019t established reliability standards. An Orleans Parish Civil District Court judge ruled in Entergy\u2019s favor in June.\nMoreno\u2019s chief of staff Andrew Tuozzolo told Verite that the council\u2019s plan was now to re-levy the $1 million fine, in the hopes that the new reliability standards will make it easier to defend in court.\nThe new standards only apply to \u201cfair-weather day\u201d outages, and exclude outages caused by major events like hurricanes. The council is currently conducting a separate process to create new rules and improvement plans for the grid\u2019s storm resilience.\nWhile hurricane-related outages are a well-known and deadly occurrence in New Orleans, the city has also struggled for years with frequent outages on sunny days. In fact, the process to pass these new rules began in 2017, when complaints grew about the number of blackouts happening on clear days, when the grid should have been operating normally.\nIn 2019, a council investigation found that Entergy failed in its responsibility to maintain an adequate grid. It found the city experienced 2,599 outages between June 1, 2016 and May 31, 2017 alone, the majority of which occurred on fair weather days. The report said the main cause of the outages were equipment failures in the local distribution grid \u2014 the poles and lines that run down every street and deliver electricity directly to buildings.\nThe investigation also found that the grid\u2019s reliability started to fall shortly after Entergy New Orleans made multi-million dollar cuts to investing in distribution system maintenance and improvement. That investigation led to the council\u2019s decision to fine Entergy $1 million.\nUnder the measure passed Thursday, Entergy will have three new reliability standards that could lead to the fine.\nThe first standard is how many fair weather outages New Orleans customers face each year. That\u2019s based on an industry standard called the system average interruption frequency index (SAIFI). The minimum SAIFI established by the council is 1.53 \u2014 meaning that a customer in New Orleans should experience, on average, 1.53 outages per year. The exact fine depends on how off that mark Entergy was in a given year, with a maximum penalty of $2.7 million.\nSUPPORT NEWS YOU TRUST.\nDONATE\nThe second standard is about the duration of fair weather outages every year, based on the system average interruption duration index (SAIDI). The maximum baseline SAIDI score for Entergy was set at 178.2, meaning New Orleans customers on average would experience 178.2 minutes \u2014 roughly three hours \u2014 of outages each year. Entergy could face an annual fine of $500,000 for failing to achieve that.\nThe last standard could lead to fines up to $500,000 if Entergy fails to adequately improve the grid\u2019s worst performing feeders \u2014 a piece of equipment in the distribution system that has been blamed for outages in the past.\nThe council\u2019s ordinance notes that under the newly established fine schedule, Entergy\u2019s poor reliability in 2016 and 2017 \u2014 for which the council originally levied a $1 million fine \u2014 would have resulted in a fine of almost the exact same amount \u2014 $1,005,000.\nRepresentatives of the Alliance for Affordable Energy, which advocates on behalf of customers, applauded the move. But they also said they believe the council should go farther and use these new standards as a starting point.\n\u201cWe\u2019re certainly supportive of having them in place, but we\u2019d like to note this is merely a first step,\u201d Alliance policy director Jesse George said at the utility meeting this month. \u201cWe encourage the council to continue making these standards more stringent over time.\u201d\nThe council\u2019s utility advisers noted that from 2013 through 2021, Entergy New Orleans would have only run afoul of the new standards in two years, 2016 and 2017.\n\u201cI think if you ask the average New Orleanian whether their electric service was reliable over the last five years they would probably say no,\u201d George said in a recent Facebook video.\nMoreno said during the committee meeting that because of pressure from the council, Entergy New Orleans had improved its reliability.\n\u201cTheir reliability is definitely not perfect, but it has improved due to insistence from the City Council,\u201d Moreno said. \u201cEntergy New Orleans has now increased its reliability performance to just above the national average. This is progress, but we are certainly far from done.\u201d\nEntergy did not respond to a request for comment.\nThis article first appeared on Verite and is republished here under a Creative Commons license.\nREPUBLISH\nOur stories may be republished online or in print under Creative Commons license CC BY-NC-ND 4.0. We ask that you edit only for style or to shorten, provide proper attribution and link to our web site. Please see our republishing guidelines for use of photos and graphics.\nMICHAEL ISAAC STEIN, VERITE\nBefore joining Verite, Michael Isaac Stein spent five years as an investigative reporter at The Lens, a nonprofit New Orleans news publication, covering local government, housing and labor issues. Before working at The Lens, Stein was a reporter for WWNO New Orleans Public Radio and freelanced for various national publications including The Intercept, The New Republic and Bloomberg\u2019s CityLab. He holds a bachelor\u2019s degree from the University of Michigan\u2019s Ford School of Public Policy.\nMORE FROM AUTHOR\nRELATED NEWS\nEntergy threatens \u2018expensive litigation\u2019 over $1 million\u2026\nBY MICHAEL ISAAC STEIN, VERITE\nMay 13, 2023\nEntergy can recover $170 million in Ida costs from\u2026\nBY MICHAEL ISAAC STEIN, VERITE\nAugust 28, 2023\nSHINING A LIGHT ON THE BAYOU STATE\nDemocracy Toolkit //\nRegister to vote\n|\nFind your voting precinct\n|\nBecome an election worker\n|\nConduct a voter registration drive\n|\nContact your state and federal lawmakers\nABOUT US\nThe Louisiana Illuminator is an independent, nonprofit, nonpartisan news organization with a mission to cast light on how decisions in Baton Rouge are made and how they affect the lives of everyday Louisianians. Our in-depth investigations and news stories, news briefs and commentary help residents make sense of how state policies help or hurt them and their neighbors statewide.\nOur stories may be republished online or in print under Creative Commons license CC BY-NC-ND 4.0. We ask that you edit only for style or to shorten, provide proper attribution and link to our web site.\nDEIJ Policy | Ethics Policy | Privacy Policy\n\u00a9 Louisiana Illuminator, 2023", + "url": "https://lailluminator.com/2023/02/18/frequent-outages-could-lead-to-big-fines-for-entergy-new-orleans-under-new-standards/", + "title": "Frequent outages could lead to big fines for entergy new orleans under new standards" + } + ] +} \ No newline at end of file diff --git a/packages/backend/src/minutes_agendas_directory/Meeting people where they are How a new orleans group is addressing youth crime.json b/packages/backend/src/minutes_agendas_directory/Meeting people where they are How a new orleans group is addressing youth crime.json new file mode 100644 index 00000000..4e8353a4 --- /dev/null +++ b/packages/backend/src/minutes_agendas_directory/Meeting people where they are How a new orleans group is addressing youth crime.json @@ -0,0 +1,9 @@ +{ + "messages": [ + { + "page_content": "Skip to main content\nHomes\nCalendar\nStore\nPublic Notices\nE-Edition\nNewsletters\nSubscribe for $1\nMeeting people where they are. How a New Orleans group is addressing youth crime\nBy JONI HESS | Staff writer\nFeb 19, 2023\n4 min to read\n1 of 4\nErnest Johnson, founder of the Ubuntu Village, poses at the Broadmoor Community Church in New Orleans, Thursday, Jan. 26, 2023. The organization helps families navigate the juvenile justice system. (Photo by Sophia Germer, NOLA.com, The Times-Picayune | The New Orleans Advocate)\nSophia Germer\nFacebook\nTwitter\nEmail\nPrint\nCopy article link\nSave\nUbuntu is a South African term meaning I am because we are. Ubuntu Village, a New Orleans-based nonprofit, is building a coalition of families whose lives have been impacted by a myriad of factors, including a lack of community investment compounded by confrontations with the juvenile justice system.\nErnest Johnson, the director and co-founder of Ubuntu, has a deep desire to help families, as he was incarcerated at a young age. He feared that he would succumb to a trajectory commonly associated with Black men in America, so he decided to do something about it. \nSeeking to remove himself from that narrative, Johnson became self-employed. He didn't want to fall under the constraint of minimum wage work, so he started a lawn care business, as well as other small entrepreneurial ventures. He made peace with his life, started a family and began organizing around social justice issues.\nAccording to the Vera Institute, in Louisiana, Black people constituted 33% of state residents, but 52% of people in jail and 67% of people in prison. In New Orleans, Black people are more likely to have received fewer years of traditional schooling, with 23% obtaining a college degree compared to nearly 70% of White people. \nErnest Johnson, founder of the Ubuntu Village, poses at the Broadmoor Community Church in New Orleans, Thursday, Jan. 26, 2023. The organization helps families navigate the juvenile justice system. (Photo by Sophia Germer, NOLA.com, The Times-Picayune | The New Orleans Advocate)\nSophia Germer\nWhen his 14-year-old son was accused of a crime, Johnson sought to advocate for his son at all costs, even taking some of the blame. But disbelief weighed heavy.\n\u201cIs this karma or a generational curse?\u201d he said. \nIn a city where juvenile gun violence seems to be normalized and a juvenile justice center nears a tipping point in capacity, organizations like Ubuntu are working to meet families where they are.\nChange how we care\nJohnson said that from its inception, Ubuntu Village has been intentional about empowering vulnerable communities through a holistic perspective. As such, they've rallied behind a series of initiatives that address underlying life circumstances: housing instability, mental health issues and poverty.\n\u201cUntil we change the philosophy on how we care, or the type of lens through which we look at individuals, we're going to continue with this cycle we see,\u201d Johnson said.\nTo break that cycle, Ubuntu has established a mentor program at the Juvenile Justice Intervention Center and the Bridge City Center for Youth where they also help cultivate social/emotional skills through theatre and dance. Additionally, Ubuntu hosts a series of programs, including parent leadership classes where groups meet regularly as a means of support.\nIn 2021, Ubuntu helped to pass a bill into law that called for the elimination of administrative fees such as drug testing or electronic monitoring costs in the juvenile court system, an issue that was particularly stressful on vulnerable communities.\nIn cases where someone can't afford bail, recognizing a need for alternatives other than jail time, the nonprofit created a program to help people resume their lives after an arrest. The program helps people avoid some of life's pitfalls \u2014 job loss because of missing work, home loss because of missing income or missing school \u2014 all problems that may arise while someone is waiting to be formally charged.\nWhen Tiffany Hicks' son was incarcerated for six months in 2017 during his senior year of high school, she became affiliated with Ubuntu and started attending parent meetings. Eventually she became a parent navigator, a role she still carries out today, despite her son's current enrollment in his third year of college.\n\u201cI love it,\u201d she said. \u201cI get to meet different parents. We bond over things that are meant to take us down.\u201d\nNavigating the courts\nThe Parent Navigator Program at Orleans Parish Juvenile Court enlists two peers who help educate and empower other parents so that they are able to fully participate in their child\u2019s court proceedings. Parents or guardians who have completed parent leadership classes and undergo training can volunteer to assist other parents to navigate and help make sense of the legal process.\nTo get involved with the program, interested parties can stop by the Ubuntu Village office located at 2021 South Dupre St. in New Orleans \u2014 or visit their website for more information. \nJohnson said he was able to work his way through the court system on his son\u2019s behalf with a sense of boldness and familiarity not embraced by everyone, especially Black mothers and grandmothers who make up the majority of court attendants. Johnson said the women often seemed \u201cbeat down\u201d by the complicated, cumbersome and overwhelming process.\nSome families reported having to wait four or more hours in the courtroom, only for their case to be delayed another day \u2014 delays which cause individuals to take more time off work and put their jobs at risk. \nHaving been through the court system himself, Johnson understood the landscape and felt more informed. He said he went in with little trust for the judges, lawyers and the overall process. \nUbuntu Village's Delinquency Case Flow Chart breaks down what happens when a child is arrested at the Broadmoor Community Church in New Orleans, Thursday, Jan. 26, 2023. The organization helps families navigate the juvenile justice system. (Photo by Sophia Germer, NOLA.com, The Times-Picayune | The New Orleans Advocate)\nSophia Germer\n\u201c[These women] are dealing with the hustle and bustle of everyday life. Now they have to entrust a lawyer, a judge and an institution,\u201d Johnson said.\nJohnson and his team at Ubuntu compiled research that details some of the core issues that plague families of system-involved youth \u2014 including the difficult task of deciphering legal jargon, which is important to understand to advocate for their children. \nAn ill-equipped system\nThe report also notes a lack of long-term support for families and formerly incarcerated youth, who often leave the judicial system ill-equipped to manage existing trauma worsened by their detention stay.\n\u201cOur juvenile system perpetuates a numbness,\u201d Johnson said. \u201cIf behavior isn\u2019t curtailed, they end up in the adult system.\u201d\nThe organization hopes to continue its advocacy efforts by building relationships and changing the storyline, including the false narrative that parents don't care.\n\"Even in the worst circumstances, I\u2019ve seen that parents care about their children,\" Johnson said. \"Have they done everything they were supposed to do? Maybe not. But from the heart, the care and the love is always there.\"\nJohnson and other leaders in the justice reform arena recently developed an art exhibit at the Tulane Newcomb Art Museum, \"Unthinkable Imagination: A Creative Response to the Juvenile Justice Crisis.\"\nThe exhibit showcases the experiences of more than 20 judicial system-impacted youth through painting, sculpture, performance and other mediums. \nCommunity members can view the exhibit until June 10, 2023, on Tulane's campus, 6823 St. Charles Ave., New Orleans, 70118.\nEmail Joni Hess at joni.hess@theadvocate.com.\nFacebook\nTwitter\nEmail\nPrint\nCopy article link\nSave\nSECTIONS\nHOME\nNEWS\nOPINION\nSPORTS\nENTERTAINMENT/LIFE\nNEWSLETTERS\nGAMES\nSERVICES\nCLASSIFIEDS\nSEARCH\nSUBSCRIBE | GROUPS\nDIGITAL ADVERTISING\nHELP/CONTACT US\nRSS FEEDS\nMEDIA KIT\nEEDITION\nCAREERS\nTEACHER'S LINK\nREVIEWING THE RECORD\nOUR SITES\nOBITUARIES\nJOBS\nCELEBRATIONS\nNIE\nCLASSIFIEDS\nHOMES\nPETS\nARCHIVES\nSTORE\nCONTACT INFORMATION\nnola.com\n840 St. Charles Avenue\nNew Orleans, LA 70130\nPhone: 504-529-0522\n\nNews Tips:\nnolanewstips@theadvocate.com\nOther questions:\nsubscriberservices@theadvocate.com\nNeed help?\nReport a delivery issue\nCreate a temporary stop\nSign up for recurring payments\nPay your bill\nUpdate your billing info\n\n\u00a9 Copyright 2023 NOLA.com 840 St. Charles Avenue, New Orleans, LA | Terms of Use | Privacy Policy\nPowered by BLOX Content Management System from BLOX Digital.\nThis website stores data such as cookies to enable essential website functionality, marketing, personalization and analytics. By remaining on this website you indicate your consent. See updated terms and conditions.\n ", + "url": "https://www.nola.com/louisiana_inspired/meeting-people-where-they-are-how-a-new-orleans-group-is-addressing-youth-crime/article_13c74dca-a70d-11ed-9d8f-9b9d4dc1239f.html", + "title": "Meeting people where they are How a new orleans group is addressing youth crime" + } + ] +} \ No newline at end of file diff --git a/packages/backend/src/minutes_agendas_directory/New Orleans police use of facial recognition nets Zero arrests in Nine Months.json b/packages/backend/src/minutes_agendas_directory/New Orleans police use of facial recognition nets Zero arrests in Nine Months.json new file mode 100644 index 00000000..63ae8feb --- /dev/null +++ b/packages/backend/src/minutes_agendas_directory/New Orleans police use of facial recognition nets Zero arrests in Nine Months.json @@ -0,0 +1,9 @@ +{ + "messages": [ + { + "page_content": "HOME\nABOUT\nSUBSCRIBE\nDONATE\nELECTION 2023\nGOVT + POLITICS\nENVIRONMENT\nHEALTH\nCRIMINAL JUSTICE\nEDUCATION\nCRIMINAL JUSTICE\nNew Orleans police use of facial recognition nets zero arrests in nine months\nBY: MICHAEL ISAAC STEIN, VERITE - JULY 28, 2023 6:00 AM\nNew Orleans Police Department officers stand at attention. (Image courtesy of NOPD)\nNEW ORLEANS \u2014 Facial recognition technology that has been touted as an important tool to reduce violent crime in the city was used by the New Orleans Police Department only 13 times from Oct. 1, 2022, to July 1, 2023, resulting in zero arrests, according to a new report from City Council consultant AH Datalytics.\nThe technology provided potential identities in just five cases, two of which were deemed \u201cbad matches,\u201d the report said.\nThe report comes roughly a year after the council lifted a ban on the controversial surveillance technology following pressure from the NOPD, Mayor LaToya Cantrell and a civic group called the NOLA Coalition.\n\u201cLast year, some argued overturning [the council\u2019s] ban on Facial Recognition tech was \u2018key\u2019 to solving violent crime. \u2026 They were wrong,\u201d Andrew Tuozzolo, chief of staff to Councilwoman Helena Moreno, said on Twitter earlier this month.\nNOPD policy requires officers to submit a request form to utilize facial recognition through a partnership with a state surveillance hub called the Louisiana State Analytical and Fusion Exchange. According to data the NOPD provided to the City Council, the 15 requests in the nine-month period included 14 requests to identify a Black male and one for a Black woman.\nOne of the requests was canceled because the suspect was identified through other means. Another request in an identity fraud case was denied because it violated NOPD policy, which says that facial recognition can only be used in connection with a \u201ccrime of violence\u201d or to find a missing person.\nIn the remaining 13 cases, facial recognition provided a match in only five of them. Two of those were considered \u201cbad matches,\u201d the report said. In another case, the NOPD arrested a different man than the one identified through facial recognition, noting that the \u201clead may have been bad information, match\u2019s subject was not in the area during the homicide.\u201d The last two cases that had a match are still open.\n\u201cThere have been no arrests of an individual matched by facial recognition per data from NOPD,\u201d the report said.\nAbout half of the 15 requests came from specialized NOPD offices focused on the most serious crimes, including the homicide division and the FBI-NOPD combined task force. The other half came from officers assigned to the NOPD\u2019s 8th District, which covers the French Quarter and the Central Business District. The request in the identity fraud case came from the 4th District, which covers the West Bank.\nEye on Surveillance, a leading local anti-surveillance coalition, was instrumental in passing the original facial recognition ban, and strongly opposed the council reversing it. Organizers told Verite that the report validated one of their central arguments in favor of the facial recognition ban \u2014 that mass crime camera systems simply aren\u2019t very effective, and are a waste of public dollars needed to address the root causes of crime, like the lack of housing, education and jobs.\n\u201cThis is a bittersweet moment because although it\u2019s rewarding to witness the validation of what we\u2019ve stated for years about this surveillance technology\u2019s inefficacy, we\u2019re disappointed that neither our coalition nor the people of New Orleans who resoundingly opposed the repeal were believed to begin with,\u201d an emailed statement from the organization said.\nThree council members at the time \u2014 Moreno, JP Morrell and Leslie Harris \u2014 opposed lifting the surveillance ban and likewise questioned whether facial recognition and crime cameras were vital to reducing crime.\n\u201cAs the data continues to show, facial recognition is not one of NOPD\u2019s main crime fighting tools,\u201d Harris told Verite in an email.\nAn NOPD spokesperson didn\u2019t respond directly to questions about the system\u2019s effectiveness.\n\u201cFacial recognition is one of the many tools available to investigators to assist in trying to generate leads in investigations and to identify criminal offenders,\u201d an NOPD spokesperson told Verite in an email. \u201cAny leads or results that are formed through technology are thoroughly vetted to ensure the correct outcome.\u201d\nGET THE MORNING HEADLINES DELIVERED TO YOUR INBOX\nSUBSCRIBE\nQuestions of reliability, racial discrimination\nNew Orleans\u2019 vast network of crime cameras was born under former Mayor Mitch Landrieu in 2017, and has progressed rapidly under Mayor LaToya Cantrell. The city\u2019s surveillance hub, the Real Time Crime Center, now has access to more than 1,000 live camera feeds around the clock, seven days a week. About half of those come from city-owned cameras and half from private residents and businesses who pay to give the city direct access to their cameras\u2019 live feeds.\nCivil rights and privacy advocates voiced concerns from the jump, which only grew when it became clear that the city was bolstering the power of its camera network with powerful, military-grade software that could automatically and instantly search footage for specific people, vehicles and more.\nSome objected to the technology because of the massive amount of power it would give to the police and criminal justice apparatus. Others pointed to the facial recognition technology\u2019s well-documented biases and inaccuracies.\nSeveral studies, including one by a federal agency, showed that facial recognition is far more unreliable at identifying people who aren\u2019t white, leading to more false matches and, in some cases, false arrests.\nFor example, last year, the Jefferson Parish Sheriff\u2019s Office used facial recognition to identify and issue an arrest warrant for a suspect in a robbery of luxury purses in Metairie. But the software identified the wrong person, a man in Georgia who was falsely arrested and kept in jail for a week as a result.\nIn November 2020, The Lens reported that despite years of denials, the city had in fact been utilizing facial recognition technology. That revelation, combined with the fact that it was apparently being done without the knowledge of the NOPD superintendent, convinced some council members that the NOPD shouldn\u2019t have access to facial recognition.\nIn December 2020, the council approved a new law limiting the city\u2019s surveillance capabilities and putting bans on four pieces of technology, including facial recognition and predictive policing software.\nThe 2020 surveillance law was already much less restrictive than critics like Eye on Surveillance originally pitched. But council members at the time \u2014 including Moreno and current District Attorney Jason Williams \u2014 said the ordinance would set a baseline to build on, and that more restrictions would be added in the future.\nBut public support for surveillance restrictions began to drop among elected officials as New Orleans, like most major cities in the United States, started experiencing a spike in violent crime. Also similar to other cities, New Orleans police force shrank to its lowest numbers in decades.\nPressure began building on the council to loosen the surveillance restrictions to help curb violent crime. The pressure came not just from the NOPD and Cantrell, but also from certain community groups \u2014 namely the NOLA Coalition, a partnership of more than a hundred local businesses and groups that claimed to form to try and reduce violent crime in the city.\nOne of the first things the group advocated for was lifting the city\u2019s surveillance bans. The group declined to comment on this story through a spokesperson Matt Wolfe, vice president of communications at Greater New Orleans, Inc.\nAs District Attorney, Williams was asked about lifting the ban and told the council \u201cit could be an amazing tool\u201d and could be a \u201cforce multiplier\u201d for the NOPD. That\u2019s despite the fact that Williams helped author the original ban when he was a council member.\nIn July 2022, the council voted 4-2 to lift the surveillance bans and loosen other surveillance restrictions. Council members Eugene Green, Freddie King, Joe Giarrusso and Oliver Thomas voted in favor. Morrell and Harris voted against. Moreno was absent for the vote but had spoken in opposition to it. Moreno, Harris and Morrell later authored an ordinance, which the council approved unanimously in August 2022, to create some limited guardrails on surveillance usage. The law requires the NOPD to share certain data with the council, including the facial recognition use included in the recent council report from AH Datalytics.\nThis article first appeared on Verite and is republished here under a Creative Commons license.\nREPUBLISH\nOur stories may be republished online or in print under Creative Commons license CC BY-NC-ND 4.0. We ask that you edit only for style or to shorten, provide proper attribution and link to our web site. Please see our republishing guidelines for use of photos and graphics.\nMICHAEL ISAAC STEIN, VERITE\nBefore joining Verite, Michael Isaac Stein spent five years as an investigative reporter at The Lens, a nonprofit New Orleans news publication, covering local government, housing and labor issues. Before working at The Lens, Stein was a reporter for WWNO New Orleans Public Radio and freelanced for various national publications including The Intercept, The New Republic and Bloomberg\u2019s CityLab. He holds a bachelor\u2019s degree from the University of Michigan\u2019s Ford School of Public Policy.\nMORE FROM AUTHOR\nRELATED NEWS\nLawsuit shows growth in surveillance-based police stops,\u2026\nBY MICHAEL ISAAC STEIN, VERITE\nMarch 18, 2023\nSurveillance cameras recorded you. Who should be able to\u2026\nBY MICHAEL ISAAC STEIN, VERITE\nJanuary 14, 2023\nSHINING A LIGHT ON THE BAYOU STATE\nDemocracy Toolkit //\nRegister to vote\n|\nFind your voting precinct\n|\nBecome an election worker\n|\nConduct a voter registration drive\n|\nContact your state and federal lawmakers\nABOUT US\nThe Louisiana Illuminator is an independent, nonprofit, nonpartisan news organization with a mission to cast light on how decisions in Baton Rouge are made and how they affect the lives of everyday Louisianians. Our in-depth investigations and news stories, news briefs and commentary help residents make sense of how state policies help or hurt them and their neighbors statewide.\nOur stories may be republished online or in print under Creative Commons license CC BY-NC-ND 4.0. We ask that you edit only for style or to shorten, provide proper attribution and link to our web site.\nDEIJ Policy | Ethics Policy | Privacy Policy\n\u00a9 Louisiana Illuminator, 2023", + "url": "https://lailluminator.com/2023/07/28/new-orleans-police-use-of-facial-recognition-nets-zero-arrests-in-9-months/", + "title": "New orleans police use of facial recognition nets zero arrests in nine months" + } + ] +} \ No newline at end of file diff --git a/packages/backend/src/minutes_agendas_directory/New orleans facial recognition tool mostly used against black suspects.json b/packages/backend/src/minutes_agendas_directory/New orleans facial recognition tool mostly used against black suspects.json new file mode 100644 index 00000000..9ede98d0 --- /dev/null +++ b/packages/backend/src/minutes_agendas_directory/New orleans facial recognition tool mostly used against black suspects.json @@ -0,0 +1,9 @@ +{ + "messages": [ + { + "page_content": "Subscribe\nMenu\nNEWS\nSPORTS\nVOICES\nCULTURE\nLIFESTYLE\nTRAVEL\nPREMIUM\nNewsWorldAmericas\nNew Orleans facial recognition tool mostly used against Black suspects\nOnly six of the 15 facial recognition requests resulted in matches \u2014 and half of those were erroneous\nKelly Rissman\nTuesday 31 October 2023 22:42 GMT\nComments\nRelated video: New Orleans struggles with solutions to deadly gun violence\nSign up to our Evening Headlines email for your daily guide to the latest news\nSIGN UP\nI would like to be emailed about offers, events and updates from The Independent. Read our privacy notice\nAfter the New Orleans City Council voted to allow the use of facial recognition software to identify criminals more readily and accurately, reports indicate that the technology was ineffective and erroneous.\nThis system went into effect in the summer of 2022, and Politico obtained records of the year\u2019s worth of results. The outlet found that not only was the facial recognition tool vastly incapable of identifying suspects, but it was also disproportionately used on Black people.\nAnd from October 2022 to August 2023, almost every facial recognition request regarded a Black suspect.\nPolitico reported that in total, the department made 19 requests. However, two of them were thrown out because police had identified the suspect before the system\u2019s results came back, while two others were rejected because the program\u2019s application didn\u2019t extend to those crimes.\nSo, of the 15 requests made by the New Orleans Police Department, 14 concerned Black suspects, the outlet wrote. On top of this, only six of these requests turned up with matches \u2014 and half of those were erroneous \u2014 while the remaining nine did not pull up a match.\nFacial recognition technology has long been controversial. The city of New Orleans previously had banned the use of facial recognition software, which went into effect in 2020 following the death of George Floyd. Then, in 2022, the city reversed course, allowing it to be used.\nIn the wake of the reversal, the ACLU of Louisiana Advocacy Director Chris Kaiser called the new ordinance \u201cdeeply flawed.\u201d He not only pointed out research that indicated that \u201cracial and gender bias\u201d affected the program\u2019s accuracy but also highlighted privacy concerns around the data that the program relies on when identifying potential suspects.\nA previous investigation by The Independent revealed that at least six people around the US have been falsely arrested using facial ID technology; all of them are Black. One such arrest occurred in Louisiana, where the use of facial recognition technology led to the wrongful arrest of a Georgia man for a string of purse thefts.\nRegardless of the false arrests, at least half of federal law enforcement agencies with officers and a quarter of state and local agencies are using it.\nAt least one council member acknowledged the shortcomings of this technology. \u201cThis department hung their hat on this,\u201d New Orleans Councilmember At-Large JP Morrell told Politico. Mr Morrell voted against using facial recognition last year. After seeing the police department\u2019s data and usage, he said the tool is \u201cwholly ineffective and pretty obviously racist.\u201d\n\u201cThe data has pretty much proven that advocates were mostly correct,\u201d Mr Morell continued. \u201cIt\u2019s primarily targeted towards African Americans and it doesn\u2019t actually lead to many, if any, arrests.\u201d\nCity councillor Eugene Green, who introduced the measure to lift the ban, holds a different view. He told Politico that he still supports the agency\u2019s use of facial recognition. \u201cIf we have it for 10 years and it only solves one crime, but there\u2019s no abuse, then that\u2019s a victory for the citizens of New Orleans.\u201d\nIt is important to note that despite hiccups with the system\u2019s results, the agency\u2019s use has led to any known false arrests.\n\u201cWe needed to have significant accountability on this controversial technology,\u201d council member Helena Moreno, who co-authored the initial ban, told the outlet.\nNew Orleans has a system in place in which the police department is required to provide details of how the tool was used to the City Council on a monthly basis; although Politico disclosed that the department agreed with the council that it could share the data quarterly.\nWhen asking about the potential flaws with the facial recognition tool, as outlined by Politico\u2019s reporting, a New Orleans Police Department spokesperson told The Independent that \u201crace and ethnicity are not a determining factor for which images and crimes are suitable for Facial Recognition review. However, a description of the perpetrator, including race, is a logical part of any search for a suspect and is always a criterion in any investigation.\u201d\nThe department spokesperson also emphasised that its investigators do not rely solely on facial recognition, \u201cbut it is one of multiple tools that can be used to aid in investigations,\u201d like evidence and/or forensics, adding that officers are trained to conduct \u201cbias-free investigations.\u201d\n\u201cThe lack of arrests in which Facial Recognition Technology was used as a tool, is evidence that NOPD investigators are being thorough in their investigations,\u201d the statement concluded.\nMore aboutNew OrleansPoliceAIFacial Recognition\nJoin our commenting forum\nJoin thought-provoking conversations, follow other Independent readers and see their replies\nComments\nGET IN TOUCH\nContact us\nOUR PRODUCTS\nSubscribe\nRegister\nNewsletters\nDonate\nToday\u2019s Edition\nInstall our app\nArchive\nOTHER PUBLICATIONS\nInternational editions\nIndependent en Espa\u00f1ol\nIndependent Arabia\nIndependent Turkish\nIndependent Persian\nIndependent Urdu\nEvening Standard\nEXTRAS\nAdvisor\nPuzzles\nAll topics\nBetting\nVoucher codes\nCompetitions and offers\nIndependent Advertising\nIndependent Ignite\nSyndication\nWorking at The Independent\nLEGAL\nCode of conduct and complaints\nContributors\nCookie policy\nDonations Terms & Conditions\nPrivacy notice\nUser policies\nModern Slavery Act", + "url": "https://www.independent.co.uk/news/world/americas/new-orleans-facial-recognition-black-b2439294.html", + "title": "New orleans facial recognition tool mostly used against black suspects" + } + ] +} \ No newline at end of file diff --git a/packages/backend/src/minutes_agendas_directory/New orleans has a long history of street vending and crackdowns How do we stop this cycle.json b/packages/backend/src/minutes_agendas_directory/New orleans has a long history of street vending and crackdowns How do we stop this cycle.json new file mode 100644 index 00000000..618108c0 --- /dev/null +++ b/packages/backend/src/minutes_agendas_directory/New orleans has a long history of street vending and crackdowns How do we stop this cycle.json @@ -0,0 +1,9 @@ +{ + "messages": [ + { + "page_content": "New Orleans Has a Long History of Street Vending\u2014and Crackdowns. How Do We Stop This Cycle?\nBy MaCCNO\nNovember 2023\nStreet vending, in one form or another, has always had a place in New Orleans. Zella Palmer, chair and director of the Dillard University Ray Charles Program in African American Material Culture, has described (via 64 Parishes) a pre-Civil War \u201cstreet-food economy\u201d created by \u201cprimarily enslaved women who were allowed to sell products on behalf of their owners\u201d at stalls at or near the French Market. One of their most prominent representatives was the famous Rose Nicaud, who purchased her freedom selling coffee and calas to churchgoers as they were leaving Mass. A number of the French Quarter\u2019s earliest photographs show street vending\u2014there is even footage of a child that is likely a young Louis Armstrong selling newspapers on a bustling Canal Street in 1915. Though street sales provided a notable avenue for marginalized populations to do everything from meeting their basic needs to achieving social mobility, Palmer notes that by the mid 20th century the once ubiquitous street vendors began to be deterred by new fines and restrictive ordinances.\nWhile crackdowns on street vending have persisted for some time, the past decade or so has been especially active, with a series of enforcement actions leading to multiple new regulations and permitting processes. In August 2011, the Landrieu administration announced that it would begin citing unlicensed vendors, including those at second line parades. The outcry was swift and significant, largely driven by the fact that the City code had no applicable permit for mobile vendors\u2014which meant that there was no way for any second line vendor to operate legally, and vendors selling at a parade could be subject to a $500 fine or jail time. In this case, the community pressure largely worked. Mayor Landrieu\u2019s advisor for the cultural economy, Scott Hutcheson, met with vendors and the Social Aid and Pleasure Club Task Force off and on for roughly a year, and a $25 annual permit for second line vendors was created and unanimously approved by the City Council. Since that time, vending at second line parades has continued more or less unchanged.\nIn 2013, the focus shifted away from barbecues on neutral grounds to larger trucks posted up outside of businesses and barrooms. Around the country, food trucks were surging in popularity, and New Orleans was not immune. However, a series of archaic, half-century-old laws created serious limits on the operations of food trucks and severely limited the number of available permits. Drawing from the burgeoning national movement, a campaign to expand the legal rights and number of allowable permits for food trucks was launched. Unlike most other instances, this was not driven by top-down enforcement, but rather proactive lobbying from The New Orleans Food Truck Coalition and the Institute for Justice, a Virginia-based libertarian nonprofit law firm known for opposing business licensing. Food truck owners found a champion in then-Councilmember Stacy Head, who spearheaded an ordinance that lifted many of the 50-year-old restrictions and nearly doubled the number of allowable permits.\nFast forward to August 2020. With the city reeling from the onslaught of the COVID pandemic and most businesses shuttered, street vendors started showing up in increasing numbers, filling a gap for needed services and providing a source of income for residents who found their financial safety net rapidly depleting. Citing adopted COVID mitigation restrictions, a crackdown from the City soon followed, with a particular focus on the popular vending area under the Claiborne Avenue bridge. One vendor, in possession of the aforementioned second line permit, was issued a $300 ticket. Though he had a permit, he was told that it only allowed him to sell at second lines, but nowhere else. No parade, no sales.\nBy late 2021, this effort to shut down unlicensed \u201cpop-up\u201d businesses was set to expand citywide, with both New Orleans East and, once again, Claiborne Avenue, cited as illegal vending hotspots. Public debate swirled around the difficulty vendors\u2014many of whom would have liked to become licensed but found themselves unable to\u2014faced when dealing with the Department of Safety and Permits, whose myriad regulations often created an almost insurmountable barrier. In response, the City Council, led by Councilmember Helena Moreno, passed an ordinance streamlining the permitting process for pop-up food vendors, eliminating some of the red tape, and lowering fees for both vendors and brick-and-mortar businesses that hosted periodic food pop-ups.\nDespite these new regulations, vendor crackdowns have continued, most recently made evident by widely publicized enforcement activity on St. Claude Avenue and Bourbon Street, locations that have both seen a significant increase in unlicensed vending as COVID restrictions have eased.\nSo, how can this cycle be broken? Most importantly, the City should prioritize stewardship of vending hotspots rather than relying on punitive crackdowns. While some types of vending\u2014alcohol sales, for example\u2014will likely (and rightly) continue to face a higher level of scrutiny, other activities\u2014like late night food sales and small jewelry, clothing, or trinket vending\u2014could and should be normalized and encouraged. It is imperative the City develop solutions that do not simply rely on overbearing \u201csweeps\u201d of hotspots, particularly as street vending has a long history of providing economic opportunity for communities that have been otherwise largely shut out of the city\u2019s tourism economy. This has become even more urgent with the recent election of Jeff Landry as Louisiana\u2019s governor, as his dogwhistle-filled campaign has made it clear that he is committed to policies that will criminalize predominantly Black people and people of color\u2014the same populations that have always benefited most from vending, both formal and informal. While the past decade has shown that crackdowns often lead to new policy, there is no need to continue this punitive cycle that prioritizes punishment and enforcement over compliance and stewardship of public space. We need a vending policy that unlocks the potential for economic development and creates equity of opportunity; one that has been created in conjunction with the vendors that want to play by the rules but have been stymied by outdated regulations and an inhospitable bureaucracy. There is a better way, we just need the continued leadership and advocacy to get it done.\nThe Music and Culture Coalition of New Orleans (MaCCNO) is a broad-based coalition and registered 501c3 non-profit corporation that collaborates with, organizes, and empowers the New Orleans music and cultural community to preserve and nurture the city\u2019s culture, to translate community vision into policy change, and to create positive economic impact.\nThis space is provided to MaCCNO as a community service and does not necessarily reflect the opinions or editorial policies of ANTIGRAVITY.\nFacebook\nTwitter\n\u00a9 2023 ANTIGRAVITY MAGAZINE 2004-2023 | P.O. BOX 2215 GRETNA, LA 70054 | INFO@ANTIGRAVITYMAGAZINE.COM", + "url": "https://antigravitymagazine.com/column/new-orleans-has-a-long-history-of-street-vending-and-crackdowns-how-do-we-stop-this-cycle/", + "title": "New orleans has a long history of street vending and crackdowns How do we stop this cycle" + } + ] +} \ No newline at end of file diff --git a/packages/backend/src/minutes_agendas_directory/New orleans program steers women leaving prison to careers in health care.json b/packages/backend/src/minutes_agendas_directory/New orleans program steers women leaving prison to careers in health care.json new file mode 100644 index 00000000..ef924957 --- /dev/null +++ b/packages/backend/src/minutes_agendas_directory/New orleans program steers women leaving prison to careers in health care.json @@ -0,0 +1,9 @@ +{ + "messages": [ + { + "page_content": "Skip to main content\nHomes\nCalendar\nStore\nPublic Notices\nE-Edition\nNewsletters\nSubscribe for $1\nNew Orleans program steers women leaving prison to careers in health care\nBY JOHN SIMERMAN | Staff writer\nNov 17, 2022\n5 min to read\n1 of 3\nParticipants of Operation Restoration learn how to do a urine culture test at the New Orleans Career Center in New Orleans, Monday, Oct. 3, 2022. Operation Restoration is a group that helps train formerly incarcerated women and family members effected by incarceration to become medical lab assistants. (Photo by Sophia Germer, NOLA.com, The Times-Picayune | The New Orleans Advocate)\nSophia Germer\nFacebook\nTwitter\nEmail\nPrint\nCopy article link\nSave\nZelda Welch received an 18-year prison sentence for a raft of thievery in Jefferson Parish, but she won parole after eight years thanks to a slate of 2017 reforms that helped slim a state incarceration rate that led the nation.\nWelch, 54, said she came out of prison eager to impress employers, even if it meant free tryouts, \u201cjust to gain their trust, to show them I learned from my mistakes and that this is my past and it doesn\u2019t disqualify me for a better future.\u201d\nRotanya Fair and Mykelle Dawson go over a quiz results at the New Orleans Career Center in New Orleans, Monday, Oct. 3, 2022. Operation Restoration is a group that helps train formerly incarcerated women and family members effected by incarceration to become medical lab assistants. (Photo by Sophia Germer, NOLA.com, The Times-Picayune | The New Orleans Advocate)\nSophia Germer\nSuch hopes drew Welch and more than a dozen other women to the New Orleans Career Center in Treme over the past few months to attend a new training program aimed at clearing a path to careers in health care for women out of prison or impacted by it.\nThey logged hours studying \u201cEssentials of Medical Laboratory Practice,\" peering into microscopes, and learning urinalysis and other protocols \u2014 the mechanics of working in a hospital or private lab.\nIt marked the third class for an upstart program launched this year by Operation Restoration, an advocacy group founded by Syrita Steib, whose own prison-to-success story helped win her a pardon from President Donald Trump in 2020.\nKamisha Redmond looks at a fecal culture slide at the New Orleans Career Center in New Orleans, Monday, Oct. 3, 2022. Operation Restoration is a group that helps train formerly incarcerated women and family members effected by incarceration to become medical lab assistants. (Photo by Sophia Germer, NOLA.com, The Times-Picayune | The New Orleans Advocate)\nSophia Germer\nSteib led a successful campaign that made Louisiana the first state to \u201cban the box\u201d indicating criminal convictions on college applications. This month, she took a run at elected politics, finishing fourth in a race to unseat U.S. Sen. John Kennedy, who won handily.\nSteib is also a program model. Imprisoned as a teen after pleading guilty to participating in a burglary and arson in Texas, she served more than nine years and then yearned to become a doctor.\nDenied acceptance to the University of New Orleans, she removed the check mark from the box, reapplied and got in. Steib went on to a laboratory science degree at LSU\u2019s Health Sciences Center, working at Ochsner and other hospitals before shifting to advocacy.\n\u201cThe hoops that we have to jump through to make people think you are valuable, you are important, to make people take a chance on you \u2026 and it\u2019s all based on this conviction,\u201d Steib said.\nInstructor Pearl Thompson teaches participants of Operation Restoration how to test urine with chem strips at the New Orleans Career Center in New Orleans, Monday, Oct. 3, 2022. Operation Restoration is a group that helps train formerly incarcerated women and family members effected by incarceration to become medical lab assistants. (Photo by Sophia Germer, NOLA.com, The Times-Picayune | The New Orleans Advocate)\nSophia Germer\n\u201cI just wanted to create pathways for women who had been impacted by incarceration to get into careers in the medical field in a low-barrier, entry level. And then it\u2019s like, hey, the sky's the limit.\u201d\nThe nascent program is among a smattering devoted to smoothing the path to reentry for women prisoners in Louisiana, who comprise a small minority of the inmate population but can face crushing barriers. \nKamisha Redmond and Mykelle Dawson work together to read a chem strip used to test urine at the New Orleans Career Center in New Orleans, Monday, Oct. 3, 2022. Operation Restoration is a group that helps train formerly incarcerated women and family members effected by incarceration to become medical lab assistants. (Photo by Sophia Germer, NOLA.com, The Times-Picayune | The New Orleans Advocate)\nSophia Germer\nWomen account for just 5% of prisoners in state custody \u2014 with about 1,400 now in state or local facilities, down from more than 2,000 in 2017, according to state data. Half of women prisoners are in for drug or property crimes.\nDomestic or sexual violence factor into the histories of many women prisoners, two-thirds of whom have a history of mental health problems.\nA state task force on women\u2019s incarceration issued a 2020 report that also found a rate of post-traumatic stress disorder three times higher for imprisoned women than men. Most women prisoners have minor children.\nSteib sat on the state task force, which also found few transitional work programs focused on women prisoners.\nRotanya Fair and Mykelle Dawson go over a quiz results at the New Orleans Career Center in New Orleans, Monday, Oct. 3, 2022. Operation Restoration is a group that helps train formerly incarcerated women and family members effected by incarceration to become medical lab assistants. (Photo by Sophia Germer, NOLA.com, The Times-Picayune | The New Orleans Advocate)\nSophia Germer\nReentry and other prisoner programs are often geared toward the much larger male populations, said Susan Dewey, a University of Alabama criminology professor who studies incarcerated women.\n\u201cThey\u2019re the forgotten offenders,\u201d she said. \u201cPost-prison trauma in itself is real. Add to that a woman who has a serious and persistent mental health issue, and we have a real recipe for hardship. She\u2019s going on the street already 10 steps behind.\u201d\nA state corrections spokesman said the COVID-19 pandemic shelved plans for the agency to team with Operation Restoration to create a lab training program within the women\u2019s prison in St. Gabriel. Spokesman Ken Pastorick said talks to resurrect that plan are starting up.\nIn the meantime, Operation Restoration currently offers a bachelor's program in partnership with Tulane University to women prisoners. Pastorick pointed to literacy, cosmetology, horticulture and other programs available to them, while noting limitations.\nFlooding of the women's prison six years ago left corrections officials to divide those prisoners among state and local facilities. Prison officials have promised expanded programs for women with a new $146 million facility due to open in late 2024.\nDewey praised Louisiana officials for their efforts, while highlighting \u201cenormous\u201d challenges for women exiting prison, including stigma.\n\u201cThe expectation is women will always be the caregivers and that women who have struggled with addiction somehow are bad mothers choosing drugs over their children,\u201d Dewey said, \u201cnot recognizing the fact the majority of women have been victims of trauma.\u201d\nWelch described a history of abuse before a habit of stealing credit cards led to guilty pleas to 11 felony counts and a lengthy prison term as a habitual offender.\nKamisha Redmond and Mykelle Dawson work together to read a chem strip used to test urine at the New Orleans Career Center in New Orleans, Monday, Oct. 3, 2022. Operation Restoration is a group that helps train formerly incarcerated women and family members effected by incarceration to become medical lab assistants. (Photo by Sophia Germer, NOLA.com, The Times-Picayune | The New Orleans Advocate)\nSophia Germer\nShe grew up poor in the Fisher public housing project in Algiers, where she said she was molested and had her first baby at age 14, dropping out of school. In 1999, Welch said, her ex-husband \u201cleft me for dead\u201d in Harvey after she threatened to leave.\n\u201cHe drug me into that house and beat me in different areas,\u201d she said. \u201cI deal with the pain almost every day, with the swelling.\u201d\nIf anything, she said, prison taught her persistence.\n\u201cIt\u2019s your past, but it still haunts you sometimes,\u201d she said. \u201cI know I didn\u2019t survive through this life of being abused, misused and everything just to be thrown to the trash. And I want to make something of myself.\u201d\nA mother and daughter duo have been among the students enrolled since the first lab training class rolled out in April.\nAbrais Nedd, 37, described a hectic life as she settled behind a table at the front of the class recently. She gave birth this year while locked up in the St. Tammany Parish jail, she said, and for months tried to bond with her infant son in Zoom calls.\nNedd said she landed in a mental health institution before her recent criminal trouble but was now living in a New Orleans shelter and arranging visits with her baby, who is now in foster care. A felony charge looms for obstruction of justice, an allegation she denies but can't shake.\n\u201cWhen I found out about this (program), I thought it was maybe something I could do to earn a living where my background may not be a factor,\u201d she said.\nThrough grants, Operation Restoration also provides laptops, child care, rides and other support to help recently incarcerated women land on their feet.\nThe third class for lab assistant training graduated 14 women, including Nedd and Welch, though the successes so far in securing jobs and licenses for graduates has been lean.\nAt least two women have gained jobs through the program since the first class in April, one at a local hospital and the other in a private lab, said the instructors.\nThe licensing includes a background check and can take six months. So far, none of the women in the program has gained a license from the state Board of Medical Examiners.\nDr. Vincent Culotta, executive director for the board, said a criminal conviction may not disqualify an applicant, though each is investigated for a decision to approve, deny, or attach probation to a license. He said the board has helped Operation Restoration with the application process, including creating a system to let it pay the fees for students in the training. \nAs she praised the organization\u2019s housing director, Dolfinette Martin, for taking an interest, Nedd suggested there's more to the training program than a license. \n\u201cEverything that I\u2019m going through, she\u2019s been teaching me I can trust again,\u201d said Nedd, \u201cthat everybody is not going to hurt me. That they\u2019re here to help me.\u201d\nInvestigative reporting is more essential than ever, which is why we\u2019ve established the Louisiana Investigative Journalism Fund, a non-profit supported by our readers.\n\nTo learn more, please click here.\n\n\nFacebook\nTwitter\nEmail\nPrint\nCopy article link\nSave\nSECTIONS\nHOME\nNEWS\nOPINION\nSPORTS\nENTERTAINMENT/LIFE\nNEWSLETTERS\nGAMES\nSERVICES\nCLASSIFIEDS\nSEARCH\nSUBSCRIBE | GROUPS\nDIGITAL ADVERTISING\nHELP/CONTACT US\nRSS FEEDS\nMEDIA KIT\nEEDITION\nCAREERS\nTEACHER'S LINK\nREVIEWING THE RECORD\nOUR SITES\nOBITUARIES\nJOBS\nCELEBRATIONS\nNIE\nCLASSIFIEDS\nHOMES\nPETS\nARCHIVES\nSTORE\nCONTACT INFORMATION\nnola.com\n840 St. Charles Avenue\nNew Orleans, LA 70130\nPhone: 504-529-0522\n\nNews Tips:\nnolanewstips@theadvocate.com\nOther questions:\nsubscriberservices@theadvocate.com\nNeed help?\nReport a delivery issue\nCreate a temporary stop\nSign up for recurring payments\nPay your bill\nUpdate your billing info\n\n\u00a9 Copyright 2023 NOLA.com 840 St. Charles Avenue, New Orleans, LA | Terms of Use | Privacy Policy\nPowered by BLOX Content Management System from BLOX Digital.\nThis website stores data such as cookies to enable essential website functionality, marketing, personalization and analytics. By remaining on this website you indicate your consent. See updated terms and conditions.\n ", + "url": "https://www.nola.com/louisiana_inspired/operation-restoration-gives-women-in-prison-health-care-path/article_a7d64b56-6081-11ed-8509-57a5911972bf.html", + "title": "New orleans program steers women leaving prison to careers in health care" + } + ] +} \ No newline at end of file diff --git a/packages/backend/src/minutes_agendas_directory/QA Jane place neighborhood sustainability initiative chief on increasing housing security.json b/packages/backend/src/minutes_agendas_directory/QA Jane place neighborhood sustainability initiative chief on increasing housing security.json new file mode 100644 index 00000000..aae6698b --- /dev/null +++ b/packages/backend/src/minutes_agendas_directory/QA Jane place neighborhood sustainability initiative chief on increasing housing security.json @@ -0,0 +1,9 @@ +{ + "messages": [ + { + "page_content": "The Kresge Foundation\nNavigation Toggle\nSearch\nAbout Us\nOUR STORY\nSupporting human progress since 1924, expanding opportunity today\nOUR STAFF\nOur work is made possible by a staff of mission-driven professionals\nDIVERSITY, EQUITY AND INCLUSION\nCentral to how we operate and fund, we center DEI in all we do\nCAREERS\nCheck for new openings and learn about working at The Kresge Foundation\nBOARD OF TRUSTEES\nLeaders who provide governance, expertise and support to our work\nPRESS ROOM\nResources and information for commnunications professional\nOur Work\nPROGRAMS & PRACTICES\nAMERICAN CITIES\nEffective, inclusive community development in U.S. cities\nARTS & CULTURE\nCreative Placemaking as a driver of more just communities\nDETROIT\nExpanding long-term, equitable opportunity in our hometown\nEDUCATION\nAddressing postsecondary attainment and closing equity gaps\nENVIRONMENT\nHelping cities with equitable climate resilience strategies\nHEALTH\nBuilding equity-focused systems of health to achieve well-being\nHUMAN SERVICES\nIncreasing social-economic mobility for people with low incomes\nSOCIAL INVESTMENT PRACTICE\nUnlocking capital for community development\nMORE ABOUT OUR WORK\nSTRATEGIC LEARNING, RESEARCH & EVALUATION\nBuilding a culture of learning across the organization and support community learning priorities\nINITIATIVES\nOur time-bound funding programs can bring multiple Kresge teams together to co-create strategies\nGrants & Social Investments\nGRANTS AWARDED\nA database of grants dating back to 2009\nSOCIAL INVESTMENTS MADE\nA database of PRIs, guarantees and other investments\nCURRENT FUNDING OPPORTUNITIES\nAll open funding opportunities are listed by program\nHOW TO APPLY\nDetails on eligibility, FAQs, Fluxx guidance and more\nFOR CURRENT GRANTEES\nFAQs for partners, communicating about your work and more\nNews & Views\nResources\nSubscribe & Connect\nFEATURE STORY\nQ&A: Jane Place Neighborhood Sustainability Initiative chief on increasing housing security\nNovember 8, 2023\nAmerican Cities, Health\nShare\nEmail\nVeronica Reed is the executive director of Jane Place Neighborhood Sustainability Initiative, a New Orleans-based nonprofit and Kresge Foundation grantee with a mission to transform unjust housing policies, discriminatory practices and inequitable development. Founded in 2008, staff at Jane Place engage in strategies that increase housing security and expand access to affordable rental housing.\nIn this interview by Loren Berlin, Reed discusses how the state of Louisiana\u2019s 150-year-old tenant landlord laws provide no protections for vulnerable renters. She also explains why the organization\u2019s founders decided to create a community land trust, a nonprofit corporation that purchases and stewards land on behalf of a community to promote affordable housing.\nIn a traditional residential community land trust model, typically an individual or family purchases a home that sits on land owned by the community land trust. Because the buyer is only purchasing the house \u2013 as opposed to the underlying land, as well \u2013 the home is more affordable to the homebuyer. As part of the deal, the homeowner agrees that when the time comes to sell the home, the sale price will remain restricted to ensure long-term affordability. Nevertheless, the homeowner may still be able to realize property appreciation depending on improvements they make while living in the home. Today there are more than 225 community land trusts in the United States, and the strategy is growing more popular as communities seek ways to preserve affordable housing. The Jane Place community land trust is different in that it only stewards permanently affordable rental housing.\nQ: Why did Jane\u2019s Place decide to create a community land trust (CLT)?\nOur founders saw what was happening in our Mid-City neighborhood after Hurricane Katrina with the changing demographics and gentrification, and thought that one of the ways we might be able to make a real impact would be by purchasing land to ensure it would remain owned and controlled by community members in perpetuity.\nQ: What does it mean in practice for the properties to be \u201ccommunity controlled\u201d?\nWe are a nonprofit with a 15-member board made up of one third of folks who are residents of the land trust, a third who live within the boundaries of the land trust, and a third are community-minded individuals who are committed to our mission. That board ensures that we live up to our mission and our bylaws.\nQ: I saw that Jane Place is committed to keeping the organization\u2019s rental units permanently affordable to residents with lower incomes. How is the organization able to do that?\nOur rents are set using HUD HOME Program rents, but we have not raised rents since 2019. It just hasn\u2019t made sense to do so because we went through the pandemic, and now there is inflation. And while it would be nice to have a little more with regard to the organization\u2019s bottom line, we know we can find that money from someplace instead of our tenants. It\u2019s our job to raise funds to do our work. The extra $20 a month rent increase might be the difference between our tenant being able to pay the electricity bill for the month. It\u2019s not worth it to add to the financial burden of our tenants.\nQ: Over time, Jane Place has expanded to address housing policy issues in New Orleans. What prompted that evolution?\nIt wasn\u2019t exactly an evolution. We were always both a CLT and housing justice organizer. It was important for us to be able to affect systems level change. We have been able to have an impact beyond the boundaries of the land trust through our housing justice work. Whether we are fighting in coalition with partners for housing quality standards or for stronger ordinances to stem the proliferation of short-term rentals in our neighborhoods, we are using policy to make system-level changes. For example, we successfully fought for and won the Right to Counsel for tenants in eviction court. That work supports housing security. We also have community organizers working with renters in affordable apartment complexes and buildings across Orleans Parish. Unfortunately, many affordable rental housing units tend to have habitability issues like mold and pests. We are providing tenant education in both English and Spanish and helping them organize two tenant unions so far. Low-income renters are the most vulnerable population in the New Orleans housing market. We want to help them harness their power.\nQ: Seems like there is a lot of need for renter protections. If I understand your website correctly, the state of Louisiana has failed to update its tenant protections in 150 years?\nYes, we like things old here in the Deep South. On a serious note, we are working in coalition with partners locally to expand tenant protections. That work has resulted in Right to Counsel and the Healthy Homes ordinances. Healthy Homes identified minimum standards for rental housing to be maintained by property owner or managers and enforced by the city. Tenants can report an issue and because of an anti-retaliation clause cannot be evicted because of the complaint.\nQ: What sort of repercussions are you seeing from such outdated legislation?\nIn Louisiana, an eviction can be filed against a tenant if they are a day late and a dollar short on their rent. And if that eviction is filed and depending on how efficient the court is and what the lease says, the tenant could be served, in eviction court, given a 24-hour notice to vacate and out of the home all in less than 14 days. And the sad part is that here in the Orleans Parish, the majority of folks who end up in eviction court are multigenerational households headed by Black women. I have been in court where there is a grandmother, a mother, and children there for the eviction hearing, and the woman will say \u2018Your honor, my youngest is three months old,\u2019 and the judge will say, \u2018Then I will give you a week instead of 24 hours.\u2019\u201d You can\u2019t find housing in New Orleans in a week.\nThat was the situation before the pandemic. Thankfully now, we have Right to Counsel money through the American Rescue Plan Act (ARPA) and so rental assistance is available for folks as long as the landlord will accept the payment. Right now, those funds are a band aid for the system.\nQ: As you look to the future, where do you see exciting opportunities to continue Jane Place\u2019s work?\nOne of the things we are trying to do is develop some of our housing free of government restrictions. It\u2019s not an issue of compliance, but rather how government defines household and citizen, and the like. We don\u2019t want to say \u2018no\u2019 to blended immigrant families. We don\u2019t want to police who is and who is not documented. We operate in the neighborhood with the largest concentration of Spanish-speaking households in the city of New Orleans and currently we don\u2019t have a single Spanish-speaking resident in any of our rental units. And that\u2019s because folks have to be documented since we have government money.\nThe other piece of this is related to how you define a family. Under the government rules, if there are minor children in the household, the adult has to be their legal guardian. But we know that there are a lot of situations where aunts, grandmothers, older siblings, or other family members are not the legal guardians of the children they are caring for but still need housing.\nSo, we are having to say \u2018no\u2019 to some of the most vulnerable members of our community before they can even submit an application. Now we are looking to fund some of our property acquisition and development without government dollars. So far, I\u2019ve raised almost $1.2 million, and I\u2019m very excited about that.\nI\u2019m also excited very about the fact that we own a large double lot and are starting to conceptualize the development of 10-12 units of affordable housing on it. This will be the biggest project we have ever undertaken. It will be new construction, and will hopefully include solar energy and include handicapped accessible units, things we haven\u2019t been able to in past projects. I\u2019m am going to begin raising money for the project in 2024.\nRELATED\nFEATURE STORY\nSmart Growth America, Kresge work to address climate change, land use, housing policy\nOctober 19, 2023\nAmerican Cities, Arts & Culture, Detroit, Environment\nNEWS\nTruFund Financial secures $11.5M for under-resourced affordable housing developers\nOctober 4, 2023\nAmerican Cities, Social Investment Practice\nExpanding Opportunities in America's Cities\n3215 W. Big Beaver Road\nTroy, MI 48084\n+1 248-643-9630\nContact Us\nGet the Kresge Newsletter\nEmail\nSUBMIT\nfacebook\ninstagram\nlinkedin\ntwitter\nyoutube\nAmerican Cities\nArts & Culture\nDetroit\nEducation\nEnvironment\nHealth\nHuman Services\nSocial Investment Practice\n\u00a9 2023 Kresge Foundation\nLegal Scam Alert", + "url": "https://kresge.org/news-views/qa-jane-place-neighborhood-sustainability-initiative-chief-on-increasing-housing-security/", + "title": "QA Jane place neighborhood sustainability initiative chief on increasing housing security" + } + ] +} \ No newline at end of file diff --git a/packages/backend/src/minutes_agendas_directory/there s no end in sight Entergy bills rising at historic pace.json b/packages/backend/src/minutes_agendas_directory/there s no end in sight Entergy bills rising at historic pace.json new file mode 100644 index 00000000..2f4f3860 --- /dev/null +++ b/packages/backend/src/minutes_agendas_directory/there s no end in sight Entergy bills rising at historic pace.json @@ -0,0 +1,9 @@ +{ + "messages": [ + { + "page_content": "HOME\nABOUT\nSUBSCRIBE\nDONATE\nELECTION 2023\nGOVT + POLITICS\nENVIRONMENT\nHEALTH\nCRIMINAL JUSTICE\nEDUCATION\nUNCATEGORIZED\n\u2018There\u2019s no end in sight\u2019: Entergy bills rising at historic pace\nBY: MICHAEL ISAAC STEIN, VERITE - NOVEMBER 2, 2023 2:00 PM\nTransmission towers carry electricity in LaPlace on Dec. 28, 2021. (Wes Muller/Louisiana Illuminator)\nNEW ORLEANS \u2014 You don\u2019t need to be an expert to know energy costs in New Orleans are rising. Spend enough time at your closest grocery or dive bar and you\u2019ll soon hear neighbors expressing shock at their latest Entergy bills.\n\u201cEveryone\u2019s feeling it,\u201d said Logan Burke, executive director of the New Orleans-based Alliance for Affordable Energy.\nEntergy officials have continued to claim the company offers \u201csome of the lowest electricity rates in the nation,\u201d and blamed the recent sticker shock on gas prices and higher customer energy use during heat waves and winter storms.\nBut the data tells another story.\nVerite compiled 20 years of Entergy New Orleans\u2019 electric and gas rates, finding that energy bills are rising at the fastest pace in nearly two decades, even for customers who kept their energy usage exactly the same.\nThe average New Orleans resident in 2019 paid $1,345 for a year of electricity, or about $112 per month. In 2022, that same customer using the same exact amount of electricity would pay $2,148, or $179 per month \u2014 a 60% increase, Verite\u2019s analysis found. If you add gas charges, average monthly bills rose from $135 to $215.\nBills will would rise even higher if the New Orleans City Council approves Entergy\u2019s controversial $1.3 billion proposal for storm resilience upgrades, which calls for another 20% bill hike over the next decade.\nSources: Entergy New Orleans customer bills, sample bills produced by Entergy and regulatory filings with the city council. Charges were calculated based on 2019 average monthly residential electric and gas usage, according to data from the federal Energy Information Agency. Verite then applied the 2019 consumption to ENO\u2019s rates from 2004 through October 2023. For months where data on variable charges, such as fuel costs, were not available, Verite filled in average rates from surrounding years. See the underlying data.\n\u201cIt looks like a runaway charge, and there\u2019s no end in sight,\u201d Monique Harden, an advocate with the Deep South Center for Environmental Justice, told Verite.\nCosts are growing for a number of reasons, according to council officials, including new storm fees, fuel costs, new power plants, electric reliability upgrades, inflation and an overhaul of the city\u2019s gas infrastructure.\nBut those costs don\u2019t account for the entire bill increase, Verite\u2019s analysis found. And some local affordable-energy advocates are calling for the New Orleans City Council, which regulates Entergy New Orleans, to audit how the company is spending customer money.\nThe rise in New Orleans\u2019 bills also appears to be outpacing the rest of the country. Data from the U.S. Energy Information Administration shows that Entergy New Orleans\u2019 price per kilowatt hour \u2014 the standard unit of measure for electricity \u2014 has risen by 40% since 2020. That\u2019s twice the national average for the same period.\nThe federal data also shows that the average energy costs paid by New Orleans residents was 7% below the national average in April 2020, but rose to 7% above the average in April 2023.\nThe rising bills have an outsized impact in a city like New Orleans, where typical household incomes lag behind much of the rest of the country.\n\u201cWe\u2019re a poor city and Louisiana is a very poor state,\u201d Harden said. \u201cSo we have a lot of folks living paycheck to paycheck, or even in more dire situations. For lots of people, an average Entergy bill is already going to be a challenge.\u201d\nThe energy burden \u2014 the percentage of income used to pay energy bills \u2014 is now 70% higher for a median income New Orleans household than the US average, according to the federal data.\nEntergy New Orleans officials have repeatedly declined to say how many customers have fallen behind on bills in recent years, but told the City Council late last year that 38,000 customers \u2014 roughly one in five New Orleans accounts \u2014 had entered payment plans to pay off bill debt. Officials last month said that customers owed nearly $7 million in past-due gas and electric bills.\nThe company did not respond to any of Verite\u2019s findings or answer questions. In a brief statement, Entergy New Orleans spokesman Beau Tidwell acknowledged that there had been \u201cincreased costs for many customers,\u201d but maintained it was largely out of the company\u2019s control.\n\u201cThe last two summers have seen record levels of heat, and last summer natural gas prices were very high,\u201d Tidwell said. \u201cBoth elements contributed to increased costs for customers, and while they were outside of our control, we are sensitive to the impact they created.\u201d\nNot everyone agrees with that assessment. Councilwoman Helena Moreno told Verite that she also blamed costs from the construction of the New Orleans Power Station, Entergy\u2019s controversial gas plant in New Orleans East, which went online in 2020.\nMoreno came into office shortly after the council voted to approve the plant in 2018 and unsuccessfully attempted to stop its construction after she took office.\nMoreno told Verite this week that she is considering whether to force Entergy to sell the plant, which would let customers off the hook for paying off its $210 million construction cost, as well as roughly $450 million the company is allowed to collect for interest payments, operations and profit.\n\u201cI believe an option to eliminate the cost of NOPS from ratepayers bills should be examined,\u201d Moreno said.\nBut the gas plant only accounts for a small part of local bill increases (roughly $6.96 per month, according to information provided by the council\u2019s utility consultants). Some Entergy critics argue that there is also a broader and more simple reason bills are rising so fast \u2014 Entergy is favoring its shareholders over its customers.\n\u201cEntergy\u2019s mission is to enrich shareholders, so it\u2019s a contributing factor for certain,\u201d Harden said. \u201cIt\u2019s about trapping New Orleans residents to ensure we\u2019re always paying high bills, a cycle of billing we have no control over.\u201d\nSource on dividend payments: Entergy Corp. public reports. Graph compares Entergy Corp.\u2019s total shareholder dividend payouts on a 12-month rolling basis vs. monthly Entergy New Orleans bills for an average residential electric and gas customer. Average monthly bills were calculated using average ENO residential monthly 2019 gas and electric consumption, according to data from the federal Energy Information Agency. See the underlying data.\nAt the same time as bills have reached historic highs, so have dividend payments to Entergy shareholders. Entergy New Orleans\u2019 parent company, Entergy Corp., has paid out $3.2 billion in shareholder dividends since 2020.\nBurke and other advocates have long warned that the company has effectively shifted most of the risk of the business onto the shoulders of customers, who have to deal with erratic bills while shareholders enjoy steady, rising profits.\n\u201cWhy should only residents be the ones who suffer as a result of climate change and international markets?\u201d Burke said. \u201cWhy should people, especially in cities like New Orleans where a vast percentage of our population is in poverty, be holding up these Fortune 500 companies and their shareholders who are insulated from every risk at every turn? I don\u2019t think there\u2019s any world in which that is just or equitable.\u201d\nA historic rise\nThe only time New Orleans has seen a similar spike in energy bills over the last 20 years was in 2006, the year after hurricane Katrina, when Entergy New Orleans was facing serious trouble.\nSources: Entergy New Orleans customer bills, sample bills produced by Entergy and regulatory filings with the City Council. Charges were calculated based on 2019 average monthly residential electric and gas usage, according to data from the federal Energy Information Agency. Verite then applied the 2019 consumption to ENO\u2019s rates from 2004 through October 2023. For months where data on variable charges, such as fuel costs, were not available, Verite filled in average rates from surrounding years. See the underlying data.\nEntergy New Orleans was in the hole for over half a billion dollars in damage caused during and after the storm. And because of the massive displacement of New Orleans residents, the company\u2019s customer base was cut in half, leading to a sharp revenue decline. The company even filed for bankruptcy.\nThe bill increase over the last few years hasn\u2019t been quite as steep as in the years following Katrina. But as Burke pointed out, the company isn\u2019t facing nearly the same challenges now. In fact, just this week the company announced it was raising shareholder dividends by another six percent.\n\u201cI mean, we were dealing with bankruptcy following Katrina,\u201d Burke said. \u201cAnd that\u2019s not where we are now. It\u2019s a different situation entirely. Is the company in dire straits? It doesn\u2019t look like it. It seems as though the company is continuing to deliver dividends and continuing to benefit shareholders.\u201d\nEntergy\u2019s rising bills come at a tough time for residents, who have faced a barrage of financial burdens in recent years \u2014 including rising housing costs and insurance rates, hurricane damage, inflation and the COVID pandemic \u2014 that have made it increasingly difficult to afford life in New Orleans.\nAndreanecia Morris, executive director of affordable housing group HousingNOLA, said local government officials have \u201cfailed\u201d to properly respond to rising utility bills, which she said are a major contributor to the city\u2019s affordable housing crisis.\n\u201cThe calculations around affordability don\u2019t just include basic housing costs like mortgages and rents \u2014 utilities are also a key part,\u201d Morris said in an email. \u201cThis data shows that the failure to act has direct, and dire, consequences and reinforces the need for policy makers to introduce meaningful reforms that allow folks to keep a roof over their heads and keep the lights on.\u201d\nWhy are bills climbing this time?\nWhen previously questioned about rising prices in recent years by local media or the City Council, Entergy New Orleans has cited two central reasons: higher gas prices and extreme weather.\nHeat waves and winter storms have indeed driven up usage as people try to heat and cool New Orleans\u2019 notoriously energy inefficient homes. And a series of hurricanes have caused hundreds of millions of dollars in damage, mainly from Hurricane Ida in 2021.\n\u201cThis is climate change on our bills right now,\u201d Burke said.\nBut those two factors alone don\u2019t explain the recent bill hikes. Verite\u2019s analysis shows that bills rose significantly even for customers who kept their energy consumption constant. And average monthly storm fees make up less than a dollar of the total monthly increase.\nCouncilmember JP Morrell and the council\u2019s utility advisors provided four additional explanations and the monthly bill impact compared to 2019: electric reliability upgrades ($3.96 per month), gas infrastructure investments ($5.52 per month), and the construction of two power plants: the New Orleans Power Station ($6.96 per month) and the New Orleans Solar Station ($1.10 per month).\nThe NOPS plant is a particularly controversial charge. The council approved the gas plant in 2018 after Entergy hired actors to pose as supporters of the proposal at council meetings. Questions have swirled ever since about whether it was financially prudent or provides the hurricane protection that officials originally promised.\n\u201cWe are now captive to a gas plant we didn\u2019t need,\u201d Harden said. \u201cNone of the shifting justifications were ever fulfilled by this gas plant. But now we\u2019re paying it for the next 30 plus years. People who are yet to be born will be paying for this gas plant.\u201d\nAltogether, while the explanations from Entergy and the City Council account for the majority of bill increases since 2019, it doesn\u2019t explain the whole spike. And it isn\u2019t entirely clear what makes up the remaining portion \u2014 about $25 per month for an average customer.\nWhen you break down a bill, the majority of the recent increases don\u2019t come from storm fees or fuel costs, but from the base electric and gas charges, which, like all Entergy charges, are approved by the City Council.\nSources: Entergy New Orleans customer bills, sample bills produced by Entergy and regulatory filings with the city council. Charges were calculated based on 2019 average monthly residential electric and gas usage, according to data from the federal Energy Information Agency. Verite then applied the 2019 consumption to ENO\u2019s rates from 2004 through October 2023. For months where data on variable charges, such as fuel costs, were not available, Verite filled in average rates from surrounding years. See the underlying data.\nUnlike other elements of an Entergy bill, it is difficult to decipher exactly why base energy charges have increased. While fuel charges and storm fees are used for one specific purpose, the base energy charge pays for virtually everything Entergy does, from hiring linemen to buying wire to paying executive bonuses.\nLocal advocates including Burke and Harden say the company\u2019s regulators \u2014 the City Council \u2014 need to dive into Entergy\u2019s books to figure out exactly how customer money is being used, especially before they consider Entergy\u2019s $1.3 billion storm hardening plan.\n\u201cFor every dollar that residents pay to Entergy, what is it being used for exactly?\u201d Harden said. \u201cAnd what are the benefits returning to the residents? It\u2019s really basic.\u201d\nThe City Council questioned Entergy New Orleans\u2019 spending decisions in the wake of Hurricane Ida. The storm caused a city-wide blackout, during which time 21 people died, mostly from extreme heat exposure. The tragedy raised questions about why Entergy\u2019s grid wasn\u2019t more prepared, especially as climate change increases the frequency and intensity of storms.\n\u201cSince Hurricane Katrina, the council has approved requests for funding around storm hardening,\u201d Harden said. \u201cWhere is that? What has that gotten us? Because there hasn\u2019t been any audit or review of that. But each and every time there\u2019s a hurricane, there\u2019s Entergy with its hand out again.\u201d\nThe council voted in late 2021 to launch an internal management audit of Entergy New Orleans to answer the very questions Harden is asking. But the audit never happened. The council put out public bids to hire an independent auditor twice, but no firms applied for the job and the effort lost momentum.\nMorrell, who is chair of the council utility committee, did not respond to questions about whether the council would make another effort to follow through with an audit.\nThe $1.3 billion question\nAs customers struggle with bills, Entergy has launched a public relations campaign to convince residents and the council to get on board with its $1.3 billion plan to harden the grid against future hurricanes.\nThe plan was written at the direction of the council in the aftermath of Hurricane Ida and is linked to an $8 billion storm hardening plan from another Entergy subsidiary \u2014 Entergy Louisiana. The company argues that the investment wouldn\u2019t only keep us safer during storms, but save money in the long run by reducing the damage caused by storms, which customers have to pay to fix.\n\u201cFrom my perspective, there are things within Entergy\u2019s plan that I would argue are no regrets investments,\u201d Burke said.\nAt the same time, many customers are simply at their limit for what they can afford. And Burke and Harden agree that some of the items Entergy is asking customers to pay for, like routine operations and maintenance, are things the company should already be doing with the money they\u2019re collecting from customers.\n\u201cWe\u2019re not getting things we\u2019re already paying for,\u201d Harden said.\nBurke added that it\u2019s hard to believe Entergy\u2019s argument that it can\u2019t afford to provide basic, reliable services without bill hikes, while its parent company continues to hand out record-setting dividends to shareholders.\nHowever, Burke said there was reason for optimism, and that after years of advocates sounding the alarm, regulators with the City Council and the Louisiana Public Service Commission are finally starting to seriously question Entergy\u2019s budgeting decisions.\n\u201cRegulators are starting to ask these questions,\u201d Burke said. \u201cWe can only hope these decision makers will address the existing system and make it work for people and not just corporations.\u201d\nThis article first appeared on Verite News and is republished here under a Creative Commons license.\nREPUBLISH\nOur stories may be republished online or in print under Creative Commons license CC BY-NC-ND 4.0. We ask that you edit only for style or to shorten, provide proper attribution and link to our web site. Please see our republishing guidelines for use of photos and graphics.\nMICHAEL ISAAC STEIN, VERITE\nBefore joining Verite, Michael Isaac Stein spent five years as an investigative reporter at The Lens, a nonprofit New Orleans news publication, covering local government, housing and labor issues. Before working at The Lens, Stein was a reporter for WWNO New Orleans Public Radio and freelanced for various national publications including The Intercept, The New Republic and Bloomberg\u2019s CityLab. He holds a bachelor\u2019s degree from the University of Michigan\u2019s Ford School of Public Policy.\nMORE FROM AUTHOR\nRELATED NEWS\nNew Orleans Musicians\u2019 Clinic employees cite toxic workplace\u2026\nBY DREW HAWKINS\nAugust 20, 2023\nNew U.S. House Natural Resources chair opposes limits on\u2026\nBY JACOB FISCHLER\nJanuary 31, 2023\nSHINING A LIGHT ON THE BAYOU STATE\nDemocracy Toolkit //\nRegister to vote\n|\nFind your voting precinct\n|\nBecome an election worker\n|\nConduct a voter registration drive\n|\nContact your state and federal lawmakers\nABOUT US\nThe Louisiana Illuminator is an independent, nonprofit, nonpartisan news organization with a mission to cast light on how decisions in Baton Rouge are made and how they affect the lives of everyday Louisianians. Our in-depth investigations and news stories, news briefs and commentary help residents make sense of how state policies help or hurt them and their neighbors statewide.\nOur stories may be republished online or in print under Creative Commons license CC BY-NC-ND 4.0. We ask that you edit only for style or to shorten, provide proper attribution and link to our web site.\nDEIJ Policy | Ethics Policy | Privacy Policy\n\u00a9 Louisiana Illuminator, 2023", + "url": "https://lailluminator.com/2023/11/02/entergy-bills/", + "title": "there s no end in sight Entergy bills rising at historic pace" + } + ] +} \ No newline at end of file diff --git a/packages/backend/src/minutes_agendas_directory/zombie bill to ban trans youth healthcare advances from louisiana senate committee.json b/packages/backend/src/minutes_agendas_directory/zombie bill to ban trans youth healthcare advances from louisiana senate committee.json new file mode 100644 index 00000000..d37c81a3 --- /dev/null +++ b/packages/backend/src/minutes_agendas_directory/zombie bill to ban trans youth healthcare advances from louisiana senate committee.json @@ -0,0 +1,9 @@ +{ + "messages": [ + { + "page_content": "HOME\nABOUT\nSUBSCRIBE\nDONATE\nELECTION 2023\nGOVT + POLITICS\nENVIRONMENT\nHEALTH\nCRIMINAL JUSTICE\nEDUCATION\nGOVT + POLITICS\nLEGISLATIVE\nLGBTQ\n\u2018Zombie bill\u2019 to ban trans youth healthcare advances from Louisiana Senate committee\nBY: PIPER HUTCHINSON - JUNE 2, 2023 3:33 PM\nA student at Ben Franklin High School in New Orleans holds a transgender Pride sign during a walkout event at the school Friday, March 31, 2023, to mark Transgender Day of Visibility. (Greg LaRose/Louisiana Illuminator)\nIn a hurried, six-minute hearing Friday with no Democrats present, a Louisiana Senate committee advanced a ban on gender affirming healthcare for trans youth that had been shot down last week but revived in an unusual procedural move. \nHouse Bill 648 by Rep. Gabe Firment, R-Pollock, is similar to proposals filed in at least 17 other states, including every other one on the Gulf Coast. An Associated Press analysis found most of these bills have strong similarities to model legislation right-wing organizations have put forward. \nFirment\u2019s bill failed May 25 in the Senate Health and Welfare Committee. Senate members voted Thursday to discharge the bill from that committee and assign it to Senate Judiciary A, which typically handles a broad list of matters involving criminal justice and civil court proceedings. \nDemocrats on Judiciary A \u2014 Sens. Jimmy Harris of New Orleans, Cleo Fields of Baton Rouge and Jay Luneau of Alexandria \u2014 boycotted the meeting. Republicans approving the bill were Sens. Barrow Peacock of Bossier City, Jeremy Stine of Lake Charles, Heather Cloud of Turkey Creek and Robert Mills of Minden. \n\u201cWe gave this bill a lengthy and fair hearing in Health and Welfare,\u201d Luneau said in a statement to the Illuminator. \u201cI can say that with authority as I serve on that committee. The bill is not germane to Jud A, a committee I also serve on.\u201d \nIn an interview, Senate President Page Cortez, R-Lafayette, said Firment\u2019s bill is relevant to Judiciary A because similar legislation has been met with federal lawsuits. \nAlso notably absent from the hearing were the dozens of LGBTQ+ rights advocates who usually testify against anti-LGBTQ+ legislation. \nPeyton Rose Michelle, executive director of Louisiana Trans Advocates, said she was concerned for their safety. \n\u201cDo not come to the capitol today,\u201d Michelle wrote in an email to supporters. \u201cThis zombie bill is being heard in Judiciary A today at 1 p.m., but it\u2019ll be a physically unsafe environment for queer folks.\u201d \nIn an interview, Michelle expressed disappointment that the committee\u2019s Democrats did not attend the meeting. \n\u201cI personally would have preferred the Democrats to show up and do their jobs and say what they were elected to do. But I guess I would say I know the levels of unsafety extended to them, and so I understand why they didn\u2019t show up either,\u201d Michelle said. \nGET THE MORNING HEADLINES DELIVERED TO YOUR INBOX\nSUBSCRIBE\nLuneau confirmed in a statement to the Illuminator that he has received threats. He made the motion to kill Firment\u2019s bill in the Health and Welfare Committee last week. \nThe Judiciary A Committee adopted amendments to the bill that would change its effective date from July 1 to Jan. 1, 2024, and extended the deadline to take trans youth off their course of treatment from the end of this year to the end of next year. Doctors who specialize in gender-affirming care for trans youth say there is no amount of time that would make ending care safe.\nOther than these amendments, committee members endeavored to keep discussion limited to the provisions of the bill related to legal remedies for violating the ban, rather than the ban itself. \nNo members of the public testified in support or opposition of the bill, though several people filed cards signaling their views. \nGender-affirming care is a catch-all term for medical treatments given to people to align their physical bodies with their identified gender. It is sought by transgender people, who identify as a gender different from their sex assigned at birth, as well cisgender people, who identify as their assigned sex.\n Treatments are individualized to the patient. Some young patients will be prescribed fully reversible puberty blockers, giving the patient time to consider their options. \nLater, hormone treatments might be given to young people so they can go through puberty in a way that allows their body to change in ways that align with their gender identity. These treatments are partially reversible. \nMinors typically are not provided with surgical procedures such as top surgery, which adds or removes breast tissue, or bottom surgery, which constructs a vagina or penis. While much of the conversation on Firment\u2019s bill has centered on these procedures, such surgeries are not recommended for minors, according to Dr. Kathryn Lowe, a pediatrician who represents the American Academy of Pediatrics Section on LGBTQ+ health and wellness. \nFirment\u2019s bill faces a compressed timeline as the legislative session must end no later than 6 p.m. June 8. \nThe bill still has to receive Senate backing as well as House approval of the new amendments before the legislature adjourns. If not acted upon immediately, the legislation faces a constitutional provision that requires two-thirds of each chamber to approve calling up a bill for a vote in the last 72 hours of a session.\nJulie O\u2019Donoghue contributed reporting to this article\nGET THE MORNING HEADLINES DELIVERED TO YOUR INBOX\nSUBSCRIBE\nREPUBLISH\nOur stories may be republished online or in print under Creative Commons license CC BY-NC-ND 4.0. We ask that you edit only for style or to shorten, provide proper attribution and link to our web site. Please see our republishing guidelines for use of photos and graphics.\nPIPER HUTCHINSON\nPiper Hutchinson is a reporter for the Louisiana Illuminator. She has covered the Legislature and state government extensively for the LSU Manship News Service and The Reveille, where she was named editor in chief for summer 2022.\nMORE FROM AUTHOR\nRELATED NEWS\nLaws banning gender-affirming treatments can block trans\u2026\nBY ANNA CLAIRE VOLLERS\nJuly 27, 2023\nBan on healthcare for trans youth one step away from final\u2026\nBY PIPER HUTCHINSON\nJune 5, 2023\nSHINING A LIGHT ON THE BAYOU STATE\nDemocracy Toolkit //\nRegister to vote\n|\nFind your voting precinct\n|\nBecome an election worker\n|\nConduct a voter registration drive\n|\nContact your state and federal lawmakers\nABOUT US\nThe Louisiana Illuminator is an independent, nonprofit, nonpartisan news organization with a mission to cast light on how decisions in Baton Rouge are made and how they affect the lives of everyday Louisianians. Our in-depth investigations and news stories, news briefs and commentary help residents make sense of how state policies help or hurt them and their neighbors statewide.\nOur stories may be republished online or in print under Creative Commons license CC BY-NC-ND 4.0. We ask that you edit only for style or to shorten, provide proper attribution and link to our web site.\nDEIJ Policy | Ethics Policy | Privacy Policy\n\u00a9 Louisiana Illuminator, 2023", + "url": "https://lailluminator.com/2023/06/02/zombie-bill-to-ban-trans-youth-healthcare-advances-from-louisiana-senate-committee/", + "title": "zombie bill to ban trans youth healthcare advances from louisiana senate committee" + } + ] +} \ No newline at end of file diff --git a/packages/backend/src/preprocessor.py b/packages/backend/src/preprocessor.py index 96d7ee17..b2b276ea 100644 --- a/packages/backend/src/preprocessor.py +++ b/packages/backend/src/preprocessor.py @@ -1,14 +1,13 @@ import logging import os -from langchain.document_loaders import ( - JSONLoader, -) +from langchain_community.document_loaders import JSONLoader from langchain.text_splitter import RecursiveCharacterTextSplitter -from langchain.embeddings import OpenAIEmbeddings +from langchain_openai import OpenAIEmbeddings + from langchain.chains import LLMChain, HypotheticalDocumentEmbedder from langchain.prompts import PromptTemplate -from langchain.vectorstores.faiss import FAISS -from langchain.llms import OpenAI +from langchain_community.vectorstores import FAISS +from langchain_openai import OpenAI from pathlib import Path import shutil @@ -48,7 +47,7 @@ def create_embeddings(): llm_chain=llm_chain_in_depth, base_embeddings=base_embeddings ) - return base_embeddings, base_embeddings + return general_embeddings, in_depth_embeddings def metadata_func_minutes_and_agendas(record: dict, metadata: dict) -> dict: @@ -74,7 +73,7 @@ def create_db_from_minutes_and_agendas(doc_directory): data = loader.load() text_splitter = RecursiveCharacterTextSplitter( - chunk_size=4000, chunk_overlap=1000 + chunk_size=2000, chunk_overlap=100 ) docs = text_splitter.split_documents(data) all_docs.extend(docs) @@ -104,7 +103,7 @@ def create_db_from_news_transcripts(news_json_directory): data = loader.load() text_splitter = RecursiveCharacterTextSplitter( - chunk_size=10000, chunk_overlap=5000 + chunk_size=2000, chunk_overlap=100 ) docs = text_splitter.split_documents(data) all_docs.extend(docs) @@ -137,7 +136,7 @@ def create_db_from_cj_transcripts(cj_json_directory): data = loader.load() text_splitter = RecursiveCharacterTextSplitter( - chunk_size=15000, chunk_overlap=7500 + chunk_size=2000, chunk_overlap=100 ) docs = text_splitter.split_documents(data) @@ -170,7 +169,7 @@ def create_db_from_fc_transcripts(fc_json_directory): data = loader.load() text_splitter = RecursiveCharacterTextSplitter( - chunk_size=15000, chunk_overlap=7500 + chunk_size=2000, chunk_overlap=100 ) docs = text_splitter.split_documents(data) # Append the publish date to the end of page_content @@ -200,7 +199,7 @@ def create_db_from_public_comments(pc_json_directory): data = loader.load() text_splitter = RecursiveCharacterTextSplitter( - chunk_size=10000, chunk_overlap=5000 + chunk_size=2000, chunk_overlap=100 ) docs = text_splitter.split_documents(data) all_docs.extend(docs) @@ -208,55 +207,48 @@ def create_db_from_public_comments(pc_json_directory): return all_docs -def create_db_from_youtube_urls_and_pdfs( +def create_vector_dbs( fc_json_directory, cj_json_directory, doc_directory, pc_directory, news_directory, - general_embeddings, in_depth_embeddings, ): + # Create databases from transcripts and documents fc_video_docs = create_db_from_fc_transcripts(fc_json_directory) cj_video_docs = create_db_from_cj_transcripts(cj_json_directory) pdf_docs = create_db_from_minutes_and_agendas(doc_directory) pc_docs = create_db_from_public_comments(pc_directory) news_docs = create_db_from_news_transcripts(news_directory) - all_docs = fc_video_docs + cj_video_docs + news_docs + pc_docs + pdf_docs - - db_general = FAISS.from_documents(all_docs, general_embeddings) - db_in_depth = FAISS.from_documents(all_docs, in_depth_embeddings) - - cache_dir = dir.joinpath("cache") - if not os.path.exists(cache_dir): - os.makedirs(cache_dir) + # Function to create, save, and copy FAISS index + def create_save_and_copy_faiss(docs, embeddings, doc_type): + # Create FAISS index + db = FAISS.from_documents(docs, embeddings) - save_dir_general = cache_dir.joinpath("faiss_index_general") - save_dir_in_depth = cache_dir.joinpath("faiss_index_in_depth") + cache_dir = dir.joinpath("cache") - db_general.save_local(save_dir_general) - db_in_depth.save_local(save_dir_in_depth) + # Save locally + local_save_dir = cache_dir.joinpath(f"faiss_index_in_depth_{doc_type}") + db.save_local(local_save_dir) + logger.info(f"Local FAISS index for {doc_type} saved to {local_save_dir}") - db_general.save_local(save_dir_general) - db_in_depth.save_local(save_dir_in_depth) - - logger.info( - f"Combined database for general model transcripts created frfom all video URLs and PDF files saved to {save_dir_general}" - ) - logger.info( - f"Combined database for in-depth model transcripts created from all video URLs and PDF files saved to {save_dir_in_depth}" - ) + # Copy to Google Cloud directory + cloud_dir = dir.parent.parent.joinpath( + f"googlecloud/functions/getanswer/cache/faiss_index_in_depth_{doc_type}" + ) + shutil.copytree(local_save_dir, cloud_dir, dirs_exist_ok=True) + logger.info(f"FAISS index for {doc_type} copied to Google Cloud directory: {cloud_dir}") - # copy results to cloud function - dest_dir_general = dir.parent.parent.joinpath( - "googlecloud/functions/getanswer/cache/faiss_index_general" - ) - dest_dir_in_depth = dir.parent.parent.joinpath( - "googlecloud/functions/getanswer/cache/faiss_index_in_depth" - ) + return db - shutil.copytree(save_dir_general, dest_dir_general, dirs_exist_ok=True) - shutil.copytree(save_dir_in_depth, dest_dir_in_depth, dirs_exist_ok=True) + # Creating, saving, and copying FAISS indices for each document type + faiss_fc = create_save_and_copy_faiss(fc_video_docs, in_depth_embeddings, "fc") + faiss_cj = create_save_and_copy_faiss(cj_video_docs, in_depth_embeddings, "cj") + faiss_pdf = create_save_and_copy_faiss(pdf_docs, in_depth_embeddings, "pdf") + faiss_pc = create_save_and_copy_faiss(pc_docs, in_depth_embeddings, "pc") + faiss_news = create_save_and_copy_faiss(news_docs, in_depth_embeddings, "news") - return db_general, db_in_depth + # Return the FAISS indices + return faiss_fc, faiss_cj, faiss_pdf, faiss_pc, faiss_news diff --git a/packages/googlecloud/functions/getanswer/__main__.py b/packages/googlecloud/functions/getanswer/__main__.py index f4862d45..d778930b 100644 --- a/packages/googlecloud/functions/getanswer/__main__.py +++ b/packages/googlecloud/functions/getanswer/__main__.py @@ -5,13 +5,11 @@ from dotenv import find_dotenv, load_dotenv from inquirer import answer_query from helper import get_dbs -from api import RESPONSE_TYPE_GENERAL, RESPONSE_TYPE_DEPTH +from api import RESPONSE_TYPE_DEPTH # Add the relative path of the directory where preprocessor.py is located sys.path.append(os.path.join(os.path.dirname(__file__), "../../../backend/src")) -# Now you should be able to import create_embeddings - logging.basicConfig( format="%(asctime)s - %(levelname)s - %(message)s", level=logging.INFO ) @@ -21,7 +19,7 @@ def main(): query_memory = [] - db_general, db_in_depth, voting_roll_df = get_dbs() + db_fc, db_cj, db_pdf, db_pc, db_news, voting_roll_df = get_dbs() while True: query_input = input("Enter your query with response type (or 'quit' to exit): ") @@ -30,26 +28,33 @@ def main(): # Split the query_input into the response_type and the query query_parts = query_input.split(": ", 1) - response_type = query_parts[0] - query = query_parts[1] + if len(query_parts) != 2: + print("Invalid input format. Please use 'Response Type: Query'") + continue + + response_type, query = query_parts # map response type to the required format response_type_map = { - "General Summary": RESPONSE_TYPE_GENERAL, "In-Depth Response": RESPONSE_TYPE_DEPTH, } + if response_type not in response_type_map: print( - "Invalid response type. Please start your query with either 'General Summary' or 'In-Depth Response'." + "Invalid response type. Please use 'In-Depth Response'." ) continue + # Handling the query based on the response type response = answer_query( query, response_type_map[response_type], voting_roll_df, - db_general, - db_in_depth, + db_fc, + db_cj, + db_pdf, + db_pc, + db_news ) print(response) query_memory.append(query) diff --git a/packages/googlecloud/functions/getanswer/cache/.gitignore b/packages/googlecloud/functions/getanswer/cache/.gitignore index bda0e6e5..f0737f0b 100644 --- a/packages/googlecloud/functions/getanswer/cache/.gitignore +++ b/packages/googlecloud/functions/getanswer/cache/.gitignore @@ -1,3 +1,8 @@ /faiss_index_in_depth /faiss_index_general /parsed_voting_rolls.csv +/faiss_index_in_depth_cj +/faiss_index_in_depth_fc +/faiss_index_in_depth_news +/faiss_index_in_depth_pc +/faiss_index_in_depth_pdf diff --git a/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_cj.dvc b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_cj.dvc new file mode 100644 index 00000000..86b714b9 --- /dev/null +++ b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_cj.dvc @@ -0,0 +1,6 @@ +outs: +- md5: 9c2090ec6ee84ddf3792866364b35b0f.dir + size: 23116757 + nfiles: 2 + hash: md5 + path: faiss_index_in_depth_cj diff --git a/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_faiss_index_in_depth_cj/index.faiss b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_faiss_index_in_depth_cj/index.faiss new file mode 100644 index 00000000..e03bff35 Binary files /dev/null and b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_faiss_index_in_depth_cj/index.faiss differ diff --git a/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_faiss_index_in_depth_cj/index.pkl b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_faiss_index_in_depth_cj/index.pkl new file mode 100644 index 00000000..496be106 Binary files /dev/null and b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_faiss_index_in_depth_cj/index.pkl differ diff --git a/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_faiss_index_in_depth_fc/index.faiss b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_faiss_index_in_depth_fc/index.faiss new file mode 100644 index 00000000..33885be3 Binary files /dev/null and b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_faiss_index_in_depth_fc/index.faiss differ diff --git a/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_faiss_index_in_depth_fc/index.pkl b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_faiss_index_in_depth_fc/index.pkl new file mode 100644 index 00000000..2ce0268a Binary files /dev/null and b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_faiss_index_in_depth_fc/index.pkl differ diff --git a/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_fc.dvc b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_fc.dvc new file mode 100644 index 00000000..e67fea50 --- /dev/null +++ b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_fc.dvc @@ -0,0 +1,6 @@ +outs: +- md5: ad7c688f8fff83d65f8728a403c864dd.dir + size: 63799934 + nfiles: 2 + hash: md5 + path: faiss_index_in_depth_fc diff --git a/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_news.dvc b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_news.dvc new file mode 100644 index 00000000..625cf616 --- /dev/null +++ b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_news.dvc @@ -0,0 +1,6 @@ +outs: +- md5: d08e6dfb04e5afcff49028b2bffed7ad.dir + size: 526418 + nfiles: 2 + hash: md5 + path: faiss_index_in_depth_news diff --git a/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_pc.dvc b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_pc.dvc new file mode 100644 index 00000000..171e7ff6 --- /dev/null +++ b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_pc.dvc @@ -0,0 +1,6 @@ +outs: +- md5: 75d23bd607ac91d67d994f624fb2e4c2.dir + size: 2097501 + nfiles: 2 + hash: md5 + path: faiss_index_in_depth_pc diff --git a/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_pdf.dvc b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_pdf.dvc new file mode 100644 index 00000000..5913b763 --- /dev/null +++ b/packages/googlecloud/functions/getanswer/cache/faiss_index_in_depth_pdf.dvc @@ -0,0 +1,6 @@ +outs: +- md5: 28bfb00c7d3ebfbb4de620e9915e75b3.dir + size: 53418928 + nfiles: 2 + hash: md5 + path: faiss_index_in_depth_pdf diff --git a/packages/googlecloud/functions/getanswer/helper.py b/packages/googlecloud/functions/getanswer/helper.py index 8cefe51d..91c6fcae 100644 --- a/packages/googlecloud/functions/getanswer/helper.py +++ b/packages/googlecloud/functions/getanswer/helper.py @@ -26,15 +26,25 @@ def get_dbs(): dir = Path(__file__).parent.absolute() general_embeddings, in_depth_embeddings = create_embeddings() - general_faiss_index_path = dir.joinpath("cache/faiss_index_general") - in_depth_faiss_index_path = dir.joinpath("cache/faiss_index_in_depth") - voting_roll_df_path = dir.joinpath("cache/parsed_voting_rolls.csv") + # New FAISS indices paths for each document type + faiss_fc_index_path = dir.joinpath("cache/faiss_index_in_depth_fc") + faiss_cj_index_path = dir.joinpath("cache/faiss_index_in_depth_cj") + faiss_pdf_index_path = dir.joinpath("cache/faiss_index_in_depth_pdf") + faiss_pc_index_path = dir.joinpath("cache/faiss_index_in_depth_pc") + faiss_news_index_path = dir.joinpath("cache/faiss_index_in_depth_news") + + # Loading new FAISS indices for each document type + db_fc = FAISS.load_local(faiss_fc_index_path, in_depth_embeddings) + db_cj = FAISS.load_local(faiss_cj_index_path, in_depth_embeddings) + db_pdf = FAISS.load_local(faiss_pdf_index_path, in_depth_embeddings) + db_pc = FAISS.load_local(faiss_pc_index_path, in_depth_embeddings) + db_news = FAISS.load_local(faiss_news_index_path, in_depth_embeddings) - db_general = FAISS.load_local(general_faiss_index_path, general_embeddings) - db_in_depth = FAISS.load_local(in_depth_faiss_index_path, in_depth_embeddings) - logger.info("Loaded databases from faiss_index_general and faiss_index_in_depth") + voting_roll_df_path = dir.joinpath("cache/parsed_voting_rolls.csv") voting_roll_df = pd.read_csv(voting_roll_df_path) - return db_general, db_in_depth, voting_roll_df + + logger.info("Loaded databases from specific FAISS indices") + return db_fc, db_cj, db_pdf, db_pc, db_news, voting_roll_df def create_embeddings(): @@ -71,7 +81,7 @@ def create_embeddings(): return general_embeddings, in_depth_embeddings -def sort_retrived_documents(doc_list): +def sort_retrieved_documents(doc_list): docs = sorted(doc_list, key=lambda x: x[1], reverse=True) third = len(docs) // 3 diff --git a/packages/googlecloud/functions/getanswer/inquirer.py b/packages/googlecloud/functions/getanswer/inquirer.py index 7e659ff1..9c36af69 100644 --- a/packages/googlecloud/functions/getanswer/inquirer.py +++ b/packages/googlecloud/functions/getanswer/inquirer.py @@ -2,13 +2,31 @@ import os import logging -from langchain.chat_models import ChatOpenAI from langchain.prompts import PromptTemplate from langchain.chains import LLMChain -from langchain.chat_models import ChatOpenAI +from langchain_openai import ChatOpenAI from datetime import datetime -from helper import sort_retrived_documents +from langchain_core.output_parsers import StrOutputParser +from langchain_core.prompts import ChatPromptTemplate +from langchain_core.runnables import RunnableLambda, RunnableParallel + +from langchain.retrievers import ContextualCompressionRetriever + + +from langchain.retrievers import ContextualCompressionRetriever +from langchain.retrievers.document_compressors import ( + DocumentCompressorPipeline, + EmbeddingsFilter, + LLMChainExtractor, + LLMChainFilter, +) +from langchain.text_splitter import CharacterTextSplitter +from langchain_community.document_transformers import EmbeddingsRedundantFilter +from langchain_openai import OpenAIEmbeddings + + +from helper import sort_retrieved_documents from api import RESPONSE_TYPE_DEPTH, RESPONSE_TYPE_GENERAL logger = logging.getLogger(__name__) @@ -19,154 +37,178 @@ def convert_date_format(date_str): if not isinstance(date_str, str): return "Invalid input: not a string" - if '/' in date_str: + if "/" in date_str: return date_str - input_format = "%m-%d-%Y" + input_format = "%m-%d-%Y" try: date_obj = datetime.strptime(date_str, input_format) except ValueError: try: - input_format = "%-m-%-d-%Y" + input_format = "%-m-%-d-%Y" date_obj = datetime.strptime(date_str, input_format) except ValueError: return "Invalid date format" - + return date_obj.strftime("%m/%d/%Y") def timestamp_to_seconds(timestamp): if "timestamp not available" in timestamp: return None # or another default value like -1 or 0 - + start_time = timestamp.split("-")[0] # Split by '-' and take the first part print(start_time) - + time_parts = [int(i) for i in start_time.split(":")] - + if len(time_parts) == 3: h, m, s = time_parts elif len(time_parts) == 2: h, m = time_parts - s = 0 + s = 0 else: raise ValueError("Invalid timestamp format: " + timestamp) return h * 3600 + m * 60 + s -def process_responses_llm(responses_llm, docs=None): - generated_responses = responses_llm.split("\n\n") - responses = [] - citations = [] - - if docs: - generated_titles = [ - doc[0].metadata.get("title", doc[0].metadata.get("source", "")) - for doc in docs - ] - page_numbers = [doc[0].metadata.get("page_number") for doc in docs] - generated_sources = [ - doc[0].metadata.get("source", "source not available") for doc in docs - ] - publish_dates = [ - convert_date_format(doc[0].metadata.get("publish_date", "date not available")) for doc in docs - ] - timestamps = [ - doc[0].metadata.get("timestamp", "timestamp not available") for doc in docs - ] - urls = [doc[0].metadata.get("url", "url not available") for doc in docs] - - def gen_responses(i): - section = {} - section["response"] = ( - generated_responses[i] if i < len(generated_responses) else None - ) - section["source_title"] = ( - generated_titles[i] if i < len(generated_titles) else None - ) - section["source_name"] = ( - os.path.basename(generated_sources[i]) - if i < len(generated_sources) - else None - ) - section["source_page_number"] = ( - page_numbers[i] if i < len(page_numbers) else None +def process_streamed_responses_llm(response_chunks, docs): + final_json_object = {"card_type": "in_depth", "responses": [], "citations": []} + unique_citations = set() + + for chunk in response_chunks: + # Update citations for each chunk + citations = [] + for doc in docs: + citation_signature = ( + doc.metadata.get("title", doc.metadata.get("source", "")), + doc.metadata.get("url", "url not available"), + doc.metadata.get("timestamp", "timestamp not available"), + os.path.basename(doc.metadata.get("source", "source not available")), + doc.metadata.get("page_number"), ) - section["source_publish_date"] = ( - publish_dates[i] if i < len(publish_dates) else None - ) - section["source_timestamp"] = timestamps[i] if i < len(timestamps) else None - section["source_url"] = urls[i] if i < len(urls) else None - - if section["source_url"] and section["source_timestamp"]: - time_in_seconds = timestamp_to_seconds(section["source_timestamp"]) - if time_in_seconds is not None: # Make sure the timestamp was available - if "?" in section["source_url"]: - section["source_url"] += f"&t={time_in_seconds}s" - else: - section["source_url"] += f"?t={time_in_seconds}s" - - citation = {} - if section["source_title"] is not None: - citation["Title"] = section["source_title"] - if section["source_publish_date"] is not None: - citation["Published"] = section["source_publish_date"] - if section["source_url"] is not None: - citation["URL"] = section["source_url"] # Add this line - if section["source_timestamp"] is not None: - citation["Video timestamp"] = section["source_timestamp"] - if section["source_name"] is not None: - citation["Name"] = section["source_name"] - if section["source_page_number"] is not None: - citation["Page Number"] = section["source_page_number"] - - return section["response"], citation - - num_responses = len(generated_responses) - for i in range(num_responses): - response, citation = gen_responses(i) - - if response: - responses.append({"response": response}) - - if citation: + if citation_signature not in unique_citations: + unique_citations.add(citation_signature) + citation = { + "Title": citation_signature[0], + "Published": convert_date_format( + doc.metadata.get("publish_date", "date not available") + ), + "URL": citation_signature[1], + "Video timestamp": citation_signature[2], + "Name": citation_signature[3], + "Page Number": citation_signature[4], + } citations.append(citation) - else: - if generated_responses: - responses.append({"response": generated_responses[0]}) + # Append the current chunk and its citations to the final JSON object + final_json_object["responses"].append({"response": chunk.strip()}) + final_json_object["citations"].extend(citations) + + return final_json_object + + +def extract_document_metadata(docs): + generated_titles = [ + doc.metadata.get("title", doc.metadata.get("source", "")) for doc in docs + ] + page_numbers = [doc.metadata.get("page_number") for doc in docs] + generated_sources = [ + doc.metadata.get("source", "source not available") for doc in docs + ] + publish_dates = [ + convert_date_format(doc.metadata.get("publish_date", "date not available")) + for doc in docs + ] + timestamps = [ + doc.metadata.get("timestamp", "timestamp not available") for doc in docs + ] + urls = [doc.metadata.get("url", "url not available") for doc in docs] - card = { - "card_type": RESPONSE_TYPE_DEPTH, - "responses": responses, - "citations": citations, + return ( + generated_titles, + page_numbers, + generated_sources, + publish_dates, + timestamps, + urls, + ) + + +def timestamp_to_seconds(timestamp): + if "timestamp not available" in timestamp: + return None + + time_parts = timestamp.split(":") + seconds = sum( + int(part) * 60**index for index, part in enumerate(reversed(time_parts)) + ) + return seconds + + +def generate_response_section( + i, + response, + generated_titles, + page_numbers, + generated_sources, + publish_dates, + timestamps, + urls, +): + section = {"response": response} + section["source_title"] = generated_titles[i] if i < len(generated_titles) else None + section["source_name"] = ( + os.path.basename(generated_sources[i]) if i < len(generated_sources) else None + ) + section["source_page_number"] = page_numbers[i] if i < len(page_numbers) else None + section["source_publish_date"] = ( + publish_dates[i] if i < len(publish_dates) else None + ) + section["source_timestamp"] = timestamps[i] if i < len(timestamps) else None + section["source_url"] = urls[i] if i < len(urls) else None + + if section["source_url"] and section["source_timestamp"]: + time_in_seconds = timestamp_to_seconds(section["source_timestamp"]) + if time_in_seconds is not None: + section["source_url"] += ( + f"&t={time_in_seconds}s" + if "?" in section["source_url"] + else f"?t={time_in_seconds}s" + ) + + citation = { + key: value + for key, value in section.items() + if value is not None and key.startswith("source_") } - card_json = json.dumps(card) - return card_json + return section, citation def append_metadata_to_content(doc_list): updated_docs = [] for doc_tuple in doc_list: - doc, score = doc_tuple + doc, score = doc_tuple metadata = doc.metadata publish_date = metadata.get("publish_date") if publish_date is not None: - updated_content = f"Document: {doc.page_content} (Published on: {publish_date})" + updated_content = ( + f"Document: {doc.page_content} (Published on: {publish_date})" + ) else: updated_content = doc.page_content updated_doc_info = { - 'content': updated_content, - 'metadata': metadata, - 'score': score + "content": updated_content, + "metadata": metadata, + "score": score, } - + updated_docs.append(updated_doc_info) return updated_docs @@ -175,90 +217,120 @@ def append_metadata_to_content(doc_list): def transform_query_for_date(query): return ( query - + "Note for the model: this query related to a specific time period, therefore, you should sort the documents by the relevant publish date" + + "(SYSTEM NOTE: this query related to a specific time period, therefore, you should sort the documents by the publish dates to best answer the query)" ) -def get_indepth_response_from_query(df, db, query, k): - logger.info("Performing in-depth summary query...") - - llm = ChatOpenAI(model_name="gpt-4-1106-preview") +def process_and_concat_documents(retrieved_docs): + combined_docs_content = [] + original_documents = [] - template_date_detection = """ - Analyze the following query: "{query}". - Does this query pertain to a specific date or time period, or require sorting the city council documents by date? - Respond with 'yes' or 'no'. - """ + for source, docs in retrieved_docs.items(): + for doc in docs: + combined_docs_content.append(doc.page_content) + original_documents.append(doc) - prompt_date = PromptTemplate( - input_variables=["query"], - template=template_date_detection, - ) - is_date_related_chain = LLMChain(llm=llm, prompt=prompt_date) + combined_content = "\n\n".join(combined_docs_content) + return combined_content, original_documents - is_date_related = is_date_related_chain.run(query=query) - # Modify the query if it is date-related - if is_date_related.strip().lower() == "yes": - print("Date related") - query = transform_query_for_date(query) +def get_indepth_response_from_query(df, db_fc, db_cj, db_pdf, db_pc, db_news, query, k): + logger.info("Performing in-depth summary query...") - doc_list = db.similarity_search_with_score(query, k=k) + llm = ChatOpenAI(model_name="gpt-3.5-turbo-1106", streaming=True) + embeddings = OpenAIEmbeddings() - docs = sort_retrived_documents(doc_list) + # Initialize compressors and transformers + splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=0, separator=". ") + redundant_filter = EmbeddingsRedundantFilter(embeddings=embeddings) + relevant_filter = EmbeddingsFilter(embeddings=embeddings, similarity_threshold=0.76) - docs_page_content = append_metadata_to_content(docs) + # Create a compressor pipeline + pipeline_compressor = DocumentCompressorPipeline( + transformers=[splitter, redundant_filter, relevant_filter] + ) - template = """ - Question: {question} + # Wrap base retrievers with the compressor pipeline + compressed_retrievers = [ + ContextualCompressionRetriever( + base_compressor=pipeline_compressor, base_retriever=db.as_retriever() + ) + for db in [db_fc, db_cj, db_pdf, db_pc, db_news] + ] + retriever_names = ["fc", "cj", "pdf",] + + # Initialize parallel retrieval with compressed retrievers + retrieval_chains = { + name: RunnableLambda(lambda q, db=db: db.get_relevant_documents(q, k=25)) + for name, db in zip(retriever_names, compressed_retrievers) + } + retrievals = RunnableParallel(retrieval_chains) - ### Bias Guidelines: - - Please be aware of inherent biases within the document corpus, especially an overrepresentation of certain types of documents. - These biases may result in the retrieval of documents that are irrelevant to the question. - When analyzing documents to answer the question, it is crucial to critically evaluate their relevance to the question at hand. - To ensure accuracy and relevance in your analysis you must identify and disregard irrelevant documents by actively identifying documents that, despite being returned by the database, do not substantively address the question. - Such documents should be disregarded in the analysis. + compressed_docs = retrievals.invoke(query) - ### Response Guidelines: + combined_docs_content, original_documents = process_and_concat_documents( + compressed_docs + ) + # print(combined_docs_content) - Based on the information from the New Orleans city council documents provided, answer the following question: {question}. - Your answer must not exceed 5,000 tokens. - Please provide direct and concise responses without unnecessary verbosity. + template = """ + ### Response Guidelines + Your primary task is to answer the specific question: '{question}'. Extract and include information from the New Orleans city council documents provided that is directly relevant to this question. Refrain from including any additional analysis, context, or details that do not contribute to a concise and direct answer to the question. - If possible, extract the key points, decisions, and actions discussed during the city council meetings relevant to {question}; + ### Additional Guidelines + Follow the guidelines below if they assist in providing a more clear answer to {question} + If relevant, extract the key points, decisions, and actions discussed during the city council meetings relevant to {question}; highlight any immediate shortcomings, mistakes, or negative actions by the city council relevant to {question}; elaborate on the implications and broader societal or community impacts of the identified issues relevant to {question}; investigate any underlying biases or assumptions present in the city council's discourse or actions relevant to {question}. + If not relevant to the question, answer the question without expanding on these points. - If your response includes technical or uncommon terms related to city council that may not be widely understood, provide a brief definition for those terms at the end of your response in the following format where each definition is on a new line: + ### Relevance Evaluation: + When analyzing documents, critically assess whether each piece of information improves the response's relevance and accuracy. Include information only if it directly answers or is essential to understanding the context of the question. Disregard information that is tangential or unrelated. - Definitions: - - Word: Definition - - Word: Definition - - Word: Definition + ### Bias Guidelines: + Be mindful of biases in the document corpus. Prioritize and analyze documents that are most likely to contain direct and relevant information to the question. Avoid including details from documents that do not substantively contribute to a focused and accurate response. - The final output should be in paragraph form without any formatting, such as prefixing your points with "a.", "b.", or "c." + The final output should be in paragraph form without any formatting, such as prefixing your points with "a.", "b.", or "c.", "-", or "1." The final output should not include any reference to the model's active sorting by date. The final output should not include any reference to the publish date. For example, all references to "(published on mm/dd/yyyy)" should be omitted. - Documents: {docs} + ### Documents to Analyze + {docs} """ + prompt_response = ChatPromptTemplate.from_template(template) + response_chain = prompt_response | llm | StrOutputParser() - prompt = PromptTemplate( - input_variables=["question", "docs"], - template=template, - ) + unique_citations = set() - chain_llm = LLMChain(llm=llm, prompt=prompt) - responses_llm = chain_llm.run(question=query, docs=docs_page_content, temperature=1) - print(responses_llm) + final_result = {"card_type": "in_depth", "responses": [], "citations": []} + accumulated_text = "" + word_count = 0 + + for chunk in response_chain.stream({"question": query, "docs": combined_docs_content}): + accumulated_text += chunk + words = accumulated_text.split() + + if len(words) - word_count >= 3: + new_content = " ".join(words[word_count:]) + print(new_content) + final_result["responses"].append({"response": new_content}) + word_count = len(words) + + partial_result = process_streamed_responses_llm([chunk], original_documents) + for citation in partial_result["citations"]: + citation_signature = (citation["Title"], citation["Published"], citation["URL"]) + if citation_signature not in unique_citations: + unique_citations.add(citation_signature) + final_result["citations"].append(citation) + + remaining_text = " ".join(words[word_count:]) + if remaining_text: + final_result["responses"].append({"response": remaining_text}) + + return final_result - return process_responses_llm(responses_llm, docs) def get_general_summary_response_from_query(db, query, k): @@ -286,21 +358,28 @@ def get_general_summary_response_from_query(db, query, k): return card_json -def route_question(df, db_general, db_in_depth, query, query_type, k=20): +def route_question(df, db_fc, db_cj, db_pdf, db_pc, db_news, query, query_type, k=20): if query_type == RESPONSE_TYPE_DEPTH: - return get_indepth_response_from_query(df, db_in_depth, query, k) - elif query_type == RESPONSE_TYPE_GENERAL: - return get_general_summary_response_from_query(db_general, query, k) + return get_indepth_response_from_query( + df, db_fc, db_cj, db_pdf, db_pc, db_news, query, k + ) else: raise ValueError( - f"Invalid query_type. Expected {RESPONSE_TYPE_DEPTH} or {RESPONSE_TYPE_GENERAL}, got: {query_type}" + f"Invalid query_type. Expected {RESPONSE_TYPE_DEPTH}, got: {query_type}" ) def answer_query( - query: str, response_type: str, df: any, db_general: any, db_in_depth: any + query: str, + response_type: str, + df: any, + db_fc: any, + db_cj: any, + db_pdf: any, + db_pc: any, + db_news: any, ) -> str: - final_response = route_question(df, db_general, db_in_depth, query, response_type) - + final_response = route_question( + df, db_fc, db_cj, db_pdf, db_pc, db_news, query, response_type + ) return final_response - diff --git a/packages/googlecloud/functions/getanswer/main.py b/packages/googlecloud/functions/getanswer/main.py index 1734b14a..6cc66f41 100644 --- a/packages/googlecloud/functions/getanswer/main.py +++ b/packages/googlecloud/functions/getanswer/main.py @@ -16,7 +16,7 @@ API_VERSION = "0.0.1" -db_general, db_in_depth, voting_roll_df = get_dbs() +db_fc, db_cj, db_pdf, db_pc, db_news, voting_roll_df = get_dbs() # Setup Supabase client load_dotenv(find_dotenv()) @@ -34,27 +34,44 @@ supabase = create_client(supabase_url, supabase_key) -def update_supabase(responses, citations, card_id, processing_time_ms): - transformed_citations = [] - for citation in citations: - transformed_citations.append({ - "source_title": citation.get("Title"), - "source_name": citation.get("Name"), - "source_publish_date": citation.get("Published"), - "source_url": citation.get("URL"), - "source_page_number": citation.get("Page Number") - }) + +def update_responses(response_chunk, card_id): + try: + current_data = supabase.table("cards").select("responses").eq("id", card_id).execute() + + if current_data.data and "responses" in current_data.data[0]: + updated_responses = current_data.data[0]["responses"] + updated_responses.append({"response": response_chunk}) + else: + updated_responses = [{"response": response_chunk}] + + supabase.table("cards").update({"responses": updated_responses}).eq("id", card_id).execute() + logging.info("Response data successfully updated in Supabase") + except Exception as e: + logging.error(f"Failed to update Supabase responses: {e}") + + +def update_citations(citations, card_id, processing_time_ms): + transformed_citations = [ + { + "source_title": cit["Title"], + "source_name": cit["Name"], + "source_publish_date": cit["Published"], + "source_url": cit["URL"], + "source_page_number": cit["Page Number"], + } + for cit in citations + ] try: supabase.table("cards").update( - {"responses": responses, - "citations": transformed_citations, - "processing_time_ms": processing_time_ms} # Update this line + { + "citations": transformed_citations, + "processing_time_ms": processing_time_ms, + } ).eq("id", card_id).execute() - logging.info("Data successfully updated in Supabase") except Exception as e: - logging.error(f"Failed to update Supabase: {e}") - + logging.error(f"Failed to update Supabase citations: {e}") @functions_framework.http @@ -101,30 +118,16 @@ def getanswer(request): logging.info("Request parsed") - answer = answer_query(query, response_type, voting_roll_df, db_general, db_in_depth) - - try: - answer = json.loads(answer) - except json.JSONDecodeError as e: - logging.error(f"Failed to parse answer string to JSON: {e}") - return ("Failed to process answer", 500, headers) - - print(f"Answer: {answer}") - responses_data = answer.get("responses") - - print(f"Responses: {responses_data}") - citations_data = answer.get("citations") + final_response = answer_query( + query, response_type, voting_roll_df, db_fc, db_cj, db_pdf, db_pc, db_news + ) - print(f"Citations: {citations_data}") + for response_chunk in final_response["responses"]: + update_responses(response_chunk["response"], card_id) - end = time.time() - elapsed = int((end - start) * 1000) + elapsed = int((time.time() - start) * 1000) + update_citations(final_response["citations"], card_id, elapsed) - update_supabase(responses_data, citations_data, card_id, elapsed) logging.info(f"Completed getanswer in {elapsed} seconds") - print(f"\n\t--------- Completed getanswer in {elapsed} seconds --------\n") return ("Answer successfully submitted to Supabase", 200, headers) - - - diff --git a/packages/googlecloud/functions/getanswer/requirements.txt b/packages/googlecloud/functions/getanswer/requirements.txt index afe2d170..ef61a26f 100644 --- a/packages/googlecloud/functions/getanswer/requirements.txt +++ b/packages/googlecloud/functions/getanswer/requirements.txt @@ -3,7 +3,8 @@ functions-framework flask google-cloud-error-reporting python-dotenv -langchain==0.0.349 +langchain +langchain-openai openai google-api-python-client # Google API google-search-results # SerpAPI @@ -14,4 +15,5 @@ faiss-cpu wikipedia pandas tabulate -supabase \ No newline at end of file +supabase +simsimd \ No newline at end of file diff --git a/packages/web/app/@modal/(.)s/[cardId]/ClientCard.tsx b/packages/web/app/@modal/(.)s/[cardId]/ClientCard.tsx index 7ae559dc..09b0f81c 100644 --- a/packages/web/app/@modal/(.)s/[cardId]/ClientCard.tsx +++ b/packages/web/app/@modal/(.)s/[cardId]/ClientCard.tsx @@ -1,7 +1,7 @@ "use client"; -import BetaCard from "@/components/BetaCard"; -import { useCardResults } from "@/components/CardResultsProvider"; +import { useCardResults } from "@/app/feedback/CardResultsProvider"; +import BetaCard from "@/components/Card/BetaCard"; import { faClose } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useRouter } from "next/navigation"; @@ -12,7 +12,7 @@ export default async function ClientCard({ cardId }: { cardId: string }) { const router = useRouter(); return ( -
+
router.back()} diff --git a/packages/web/app/@modal/(.)s/[cardId]/page.tsx b/packages/web/app/@modal/(.)s/[cardId]/page.tsx index 9206a7c0..63c0919a 100644 --- a/packages/web/app/@modal/(.)s/[cardId]/page.tsx +++ b/packages/web/app/@modal/(.)s/[cardId]/page.tsx @@ -10,7 +10,7 @@ export default async function CardModal({ return ( -
+
diff --git a/packages/web/app/about/about.module.scss b/packages/web/app/about/about.module.scss new file mode 100644 index 00000000..d1f5ca4f --- /dev/null +++ b/packages/web/app/about/about.module.scss @@ -0,0 +1,17 @@ +@use "../../app/custom-css/1-helpers/variables" as var; +@use "../../app/custom-css/1-helpers/mixins" as mix; + +.about-content { + p, li{ + color:var.$altPrimary; + } + h2{ + color:var.$secondary + } + h3 { + color:var.$altSecondary + } + div{ + border-color: var.$altPrimary; + } +} \ No newline at end of file diff --git a/packages/web/app/about/page.tsx b/packages/web/app/about/page.tsx index 608ca756..ed4341cd 100644 --- a/packages/web/app/about/page.tsx +++ b/packages/web/app/about/page.tsx @@ -1,6 +1,7 @@ import { getPageMetadata } from "@/lib/paths"; import Link from "next/link"; import React from "react"; +import styles from "./about.module.scss"; const Step = ({ title, text }: { title: string; text: string }) => { return ( @@ -15,93 +16,95 @@ export const metadata = getPageMetadata("About"); const AboutPage: React.FC = () => { return ( -
-
-
-
-

About Sawt

-

- - Eye on Surveillance - {" "} - created Sawt as a tool for New Orleanians to more easily find out - what is being shared and discussed in City Council meetings. The app - uses advanced language modeling, a form of artificial intelligence, - to: -

-
    -
  1. - Create transcripts of all City Council meetings from 2023 to - Present. -
  2. -
  3. - When you ask Sawt a question, the app searches through those - transcripts to find any instances when somebody said something - relevant to your query. -
  4. -
  5. - The results (a summary as well as direct quotes) then show up in - the Sawt feed, where you can also see other queries and results. -
  6. -
-

How it works

-
- - - -
-

About the results

-

- The results are produced from AI-generated transcripts of City - Council meetings and records. There may be inaccuracies in the - transcriptions, and there may be other relevant data available in - the original source materials not uncovered by Sawt. There may also - be inaccuracies in what is stated or presented during a City Council - meeting – Sawt is not a fact checker. -

-

- The results provided by Sawt are great starting points for further - research and exploration, and you’ll want to fact check any - information and figures that you might use for informational, - research, and advocacy purposes. Here are some follow-up steps that - you could take: -

-
    -
  • - Look at the metadata for your Sawt results to understand when, - who, and where something was shared or stated in the course of a - meeting. -
  • -
  • - Watch the City Council meeting recording to understand the context - within which something was said. -
  • -
  • - Follow up with the speaker and/or file a public records request to - find official records and documentation in regards to a particular - topic. -
  • -
  • - Verify and contextualize Sawt results with other sources of data, - such as news reports, civic organization and monitor reports and - analysis, etc. -
  • -
-
+
+
+
+
+
+

About Sawt

+

+ + Eye on Surveillance + {" "} + created Sawt as a tool for New Orleanians to more easily find out + what is being shared and discussed in City Council meetings. The + app uses advanced language modeling, a form of artificial + intelligence, to: +

+
    +
  1. + Create transcripts of all City Council meetings from 2023 to + Present. +
  2. +
  3. + When you ask Sawt a question, the app searches through those + transcripts to find any instances when somebody said something + relevant to your query. +
  4. +
  5. + The results (a summary as well as direct quotes) then show up in + the Sawt feed, where you can also see other queries and results. +
  6. +
+

How it works

+
+ + + +
+

About the results

+

+ The results are produced from AI-generated transcripts of City + Council meetings and records. There may be inaccuracies in the + transcriptions, and there may be other relevant data available in + the original source materials not uncovered by Sawt. There may + also be inaccuracies in what is stated or presented during a City + Council meeting – Sawt is not a fact checker. +

+

+ The results provided by Sawt are great starting points for further + research and exploration, and you’ll want to fact check any + information and figures that you might use for informational, + research, and advocacy purposes. Here are some follow-up steps + that you could take: +

+
    +
  • + Look at the metadata for your Sawt results to understand when, + who, and where something was shared or stated in the course of a + meeting. +
  • +
  • + Watch the City Council meeting recording to understand the + context within which something was said. +
  • +
  • + Follow up with the speaker and/or file a public records request + to find official records and documentation in regards to a + particular topic. +
  • +
  • + Verify and contextualize Sawt results with other sources of + data, such as news reports, civic organization and monitor + reports and analysis, etc. +
  • +
+
+
+
-
); }; diff --git a/packages/web/app/custom-css/1-helpers/_mixins.scss b/packages/web/app/custom-css/1-helpers/_mixins.scss new file mode 100644 index 00000000..e69de29b diff --git a/packages/web/app/custom-css/1-helpers/_variables.scss b/packages/web/app/custom-css/1-helpers/_variables.scss new file mode 100644 index 00000000..3c96e678 --- /dev/null +++ b/packages/web/app/custom-css/1-helpers/_variables.scss @@ -0,0 +1,35 @@ +// Fonts +$montserrat: "Montserrat Variable", sans-serif; +$openSans: "Open Sans Variable", sans-serif; + +// Mix +$box-shadow: 0 0px 24px rgba(0, 0, 0, 0.04); +$tilebox-shadow: 0 0px 24px rgba(0, 0, 0, 0.04), 0 12px 32px rgba(0, 0, 0, 0.08); +$inner-shadow: 0 3px 24px rgba(0, 0, 0, 0.16); + +$overlay: rgba(65, 65, 65, 0.7); + +$menuTransition: opacity z-index background-color height 0.6s + cubic-bezier(0.85, 0, 0.15, 1); + +// Breakpoints +$mobile-l: 34.375rem; +$tablet: 48rem; +$tablet-l: 64rem; +$laptop: 85.375rem; +$desktop: 120rem; +$uhd: 160rem; + +//Max Widths +$sm: 20rem; +$md: 38rem; +$lg: 71rem; +$xl: 82.5rem; + +// Colors +$primary: #2c2c2c; +$altPrimary: #e1e1da; +$secondary: #f35610; +$altSecondary: #6b93c3; + +// Gradients diff --git a/packages/web/app/custom-css/2-basics/_base.scss b/packages/web/app/custom-css/2-basics/_base.scss new file mode 100644 index 00000000..458132e8 --- /dev/null +++ b/packages/web/app/custom-css/2-basics/_base.scss @@ -0,0 +1,3 @@ +body { + background-color: grey; +} diff --git a/packages/web/app/custom-css/main.scss b/packages/web/app/custom-css/main.scss new file mode 100644 index 00000000..ea116e41 --- /dev/null +++ b/packages/web/app/custom-css/main.scss @@ -0,0 +1,9 @@ +// 1--Helpers +@forward "1-helpers/variables"; +@forward "1-helpers/mixins"; +//2--Basics +//3--Basics +@use "2-basics/base"; +@use "2-basics/utils"; +@use "2-basics/typography"; +@use "2-basics/buttons"; \ No newline at end of file diff --git a/packages/web/app/favicon.ico b/packages/web/app/favicon.ico index 53b58a89..6eee4058 100644 Binary files a/packages/web/app/favicon.ico and b/packages/web/app/favicon.ico differ diff --git a/packages/web/components/CardResultsProvider.tsx b/packages/web/app/feedback/CardResultsProvider.tsx similarity index 100% rename from packages/web/components/CardResultsProvider.tsx rename to packages/web/app/feedback/CardResultsProvider.tsx diff --git a/packages/web/components/CommentBoxes.tsx b/packages/web/app/feedback/CommentBoxes.tsx similarity index 90% rename from packages/web/components/CommentBoxes.tsx rename to packages/web/app/feedback/CommentBoxes.tsx index 35d15d34..05e03bc3 100644 --- a/packages/web/components/CommentBoxes.tsx +++ b/packages/web/app/feedback/CommentBoxes.tsx @@ -2,6 +2,7 @@ import { ICard } from "@/lib/api"; import { faComment } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useState } from "react"; +import styles from "./feedback.module.scss"; interface CommentBoxProps { scores: Record; @@ -50,10 +51,10 @@ export default function CommentBox({ placeholder="Add feedback here" >
-
+
diff --git a/packages/web/components/Rubric.tsx b/packages/web/app/feedback/Rubric.tsx similarity index 95% rename from packages/web/components/Rubric.tsx rename to packages/web/app/feedback/Rubric.tsx index ad89567f..d554c6b3 100644 --- a/packages/web/components/Rubric.tsx +++ b/packages/web/app/feedback/Rubric.tsx @@ -17,7 +17,8 @@ const Rubric: React.FC = ({ criteria, scores, onScoreChange }) => { margin: "5px", fontWeight: scores[criterionId] === score ? "bold" : "normal", outline: "none", - border: scores[criterionId] === score ? "2px solid blue" : "1px solid grey", + border: + scores[criterionId] === score ? "2px solid #6b93c3" : "1px solid grey", }); const submitButtonStyle = { padding: "10px 20px", diff --git a/packages/web/app/feedback/ThreeCardLayout.css b/packages/web/app/feedback/ThreeCardLayout.css new file mode 100644 index 00000000..7a492ebd --- /dev/null +++ b/packages/web/app/feedback/ThreeCardLayout.css @@ -0,0 +1,56 @@ +/* ThreeCardLayout.css */ +.dropdown-container { + position: relative; +} + +.dropdown-header { + cursor: pointer; + padding: 8px; + border: 1px solid #ccc; + border-radius: 4px; + display: flex; + justify-content: space-between; + align-items: center; +} + +.dropdown-content { + position: absolute; + top: 100%; + left: 0; + background-color: #fff; + border: 1px solid #ccc; + border-top: none; + border-radius: 0 0 4px 4px; + padding: 8px; + z-index: 1; + overflow: scroll; +} + +/* Rotate chevron down icon when dropdown is open */ +.rotate-180 { + transform: rotate(180deg); +} + +.dropdown-content { + position: absolute; + top: 100%; + left: 0; + background-color: #fff; + border: 1px solid #ccc; + border-top: none; + border-radius: 0 0 4px 4px; + padding: 8px; + z-index: 1; + width: 100%; +} + +/* Adjust styles for screens smaller than 600px */ +@media (max-width: 600px) { + .dropdown-header { + font-size: 14px; + } + + .dropdown-content { + padding: 10px; + } +} diff --git a/packages/web/components/ThreeCardLayout.tsx b/packages/web/app/feedback/ThreeCardLayout.tsx similarity index 97% rename from packages/web/components/ThreeCardLayout.tsx rename to packages/web/app/feedback/ThreeCardLayout.tsx index de2b9dfc..6c1fb8bf 100644 --- a/packages/web/components/ThreeCardLayout.tsx +++ b/packages/web/app/feedback/ThreeCardLayout.tsx @@ -4,7 +4,7 @@ import { ICard } from "@/lib/api"; // import { CARD_SHOW_PATH, getPageURL } from "@/lib/paths"; import { supabase } from "@/lib/supabase/supabaseClient"; // import Link from "next/link"; -import Rubric from "@/components/Rubric"; +import Rubric from "@/app/feedback/Rubric"; import { TABLES } from "@/lib/supabase/db"; import { faCheckCircle, @@ -13,9 +13,8 @@ import { } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useState } from "react"; -import Citation from "./Citation"; +import Citation from "../../components/Card/Citation"; import CommentBox from "./CommentBoxes"; - const criteria = [ { id: "Accuracy", description: "Accuracy" }, { id: "Helpfulness", description: "Helpfulness" }, @@ -145,7 +144,7 @@ export default function ThreeCardLayout({ return (
{ diff --git a/packages/web/app/feedback/feedback.module.scss b/packages/web/app/feedback/feedback.module.scss new file mode 100644 index 00000000..a0e3f25f --- /dev/null +++ b/packages/web/app/feedback/feedback.module.scss @@ -0,0 +1,21 @@ +@use "../../app/custom-css/1-helpers/variables" as var; +@use "../../app/custom-css/1-helpers/mixins" as mix; + +.feedback-content { + label, + span { + color: var.$secondary; + } +} + +.feedback-submit-button { + button { + background-color: var.$secondary; + color: var.$altPrimary; + border-radius: 5rem; + margin: 0 auto; + display: flex; + padding: 1rem; + justify-content: center; + } +} diff --git a/packages/web/app/feedback/page.tsx b/packages/web/app/feedback/page.tsx index dcc18992..f5d4a35c 100644 --- a/packages/web/app/feedback/page.tsx +++ b/packages/web/app/feedback/page.tsx @@ -1,13 +1,13 @@ "use client"; // Import necessary modules and components -import ThreeCardLayout from "../../components/ThreeCardLayout"; +import ThreeCardLayout from "./ThreeCardLayout"; // import NextButton from '@/components/NextButton'; import { ICard } from "@/lib/api"; import { TABLES } from "@/lib/supabase/db"; import { supabase } from "@/lib/supabase/supabaseClient"; import { useEffect, useState } from "react"; - +import styles from "./feedback.module.scss"; export const dynamic = "force-dynamic"; export default function UserFeedback() { @@ -124,43 +124,47 @@ export default function UserFeedback() { } return ( -
-
-
-
- -
- +
+
+
+
+
+ +
+ +
+ + {answered.size === 3 && ( +
+ +
+ )} + +

+ {process.env.NEXT_PUBLIC_FEEDBACK_VERSION} +

- - {answered.size === 3 && ( - - )} - -

- {process.env.NEXT_PUBLIC_FEEDBACK_VERSION} -

+
-
); } diff --git a/packages/web/app/globals.css b/packages/web/app/globals.css index b5c61c95..f0f887c7 100644 --- a/packages/web/app/globals.css +++ b/packages/web/app/globals.css @@ -1,3 +1,6 @@ @tailwind base; @tailwind components; @tailwind utilities; +body { + background-color: #2c2c2c; +} \ No newline at end of file diff --git a/packages/web/app/layout.module.scss b/packages/web/app/layout.module.scss new file mode 100644 index 00000000..152dd479 --- /dev/null +++ b/packages/web/app/layout.module.scss @@ -0,0 +1,32 @@ +@use "../app/custom-css/1-helpers/variables" as var; +@use "../app/custom-css/1-helpers/mixins" as mix; + +.nav-header { + background-color: #1c1919; + color: var.$altPrimary; + position: fixed; + top: 0; + left: 0; + width: 100vw; + z-index: 1000; /* Adjust the z-index as needed */ + header { + height: 7rem; + } + + a { + color: var.$altPrimary; + &:hover { + /* Use "&" to denote the parent selector */ + color: var.$secondary; + } + } + img { + width: 8rem; + } + svg { + width: 2rem; + } +} +.content { + padding-top: 10rem; /* Adjust the value to match the height of your fixed header */ +} diff --git a/packages/web/app/layout.tsx b/packages/web/app/layout.tsx index f7c30f6d..01091341 100644 --- a/packages/web/app/layout.tsx +++ b/packages/web/app/layout.tsx @@ -1,8 +1,8 @@ "use strict"; -import CardResultsProvider from "@/components/CardResultsProvider"; -import Footer from "@/components/Footer"; -import Navbar from "@/components/Navbar"; +import CardResultsProvider from "@/app/feedback/CardResultsProvider"; +import Footer from "@/components/Footer/Footer"; +import Navbar from "@/components/NavBar/Navbar"; import { ECardStatus } from "@/lib/api"; import { TABLES } from "@/lib/supabase/db"; import { config } from "@fortawesome/fontawesome-svg-core"; @@ -11,6 +11,7 @@ import { createServerComponentClient } from "@supabase/auth-helpers-nextjs"; import { Analytics } from "@vercel/analytics/react"; import { cookies } from "next/headers"; import "./globals.css"; +import styles from "./layout.module.scss"; config.autoAddCss = false; @@ -42,15 +43,19 @@ export default async function RootLayout({ queries created by the current user. */}
-
- -
-
- {children} -
-
-
-
+
+
+ +
+
+
+
+ {children} +
+
+
+
+
{modal}
diff --git a/packages/web/app/page.tsx b/packages/web/app/page.tsx index ae3fb1ed..4f9b5ca5 100644 --- a/packages/web/app/page.tsx +++ b/packages/web/app/page.tsx @@ -1,18 +1,43 @@ -import { getPageMetadata } from "@/lib/paths"; -import HomeBanner from "../components/HomeBanner"; -import HomeLearnMore from "../components/HomeLearnMore"; -import HomeResults from "../components/HomeResults"; +"use client"; -export const dynamic = "force-dynamic"; +import { useState } from "react"; +import SignUp from "../components/Alerts/SignUp"; +import HomeLearnMore from "../components/Footer/HomeLearnMore"; +import HomeBanner from "../components/HomeBanner/HomeBanner"; +import HomeResults from "../components/HomeResults/HomeResults"; -export const metadata = getPageMetadata("Eye on Surveillance"); +export default function Home() { + const [isSignUpComplete, setIsSignUpComplete] = useState(false); + + const handleSignUpComplete = () => { + setIsSignUpComplete(true); + }; + + // Inline styles for the overlay + const overlayStyle: React.CSSProperties = { + position: "fixed", + top: 0, + left: 0, + width: "100%", + height: "100%", + backgroundColor: "rgba(0, 0, 0, 0.5)", + display: "flex", + justifyContent: "center", + alignItems: "center", + zIndex: 100, // Make sure this is above other content + }; -export default async function Home() { return ( - <> +
+ {!isSignUpComplete && ( +
+ +
+ )} + - +
); } diff --git a/packages/web/app/s/[cardId]/page.tsx b/packages/web/app/s/[cardId]/page.tsx index 804bbede..0467b015 100644 --- a/packages/web/app/s/[cardId]/page.tsx +++ b/packages/web/app/s/[cardId]/page.tsx @@ -1,4 +1,4 @@ -import BetaCard from "@/components/BetaCard"; +import BetaCard from "@/components/Card/BetaCard"; import { getPageMetadata } from "@/lib/paths"; import { TABLES } from "@/lib/supabase/db"; import { supabase } from "@/lib/supabase/supabaseClient"; diff --git a/packages/web/app/tips/page.tsx b/packages/web/app/tips/page.tsx index 078669e0..7fb45b31 100644 --- a/packages/web/app/tips/page.tsx +++ b/packages/web/app/tips/page.tsx @@ -1,5 +1,6 @@ import { getPageMetadata } from "@/lib/paths"; import React from "react"; +import styles from "./step.module.scss"; const Step = ({ title, text }: { title: string; text: string }) => { return ( @@ -14,59 +15,61 @@ export const metadata = getPageMetadata("Tips"); const TipsPage: React.FC = () => { return ( -
-
-
-
-

- I’m not quite sure how to use this app. What kinds of questions can - I ask? -

-

- Think about the kinds of topics that are covered during City Council - meetings, and the different people who speak. This includes - councilmembers, mayoral staff, public agency representatives, - activists, and other civic actors. Instead of watching many hours of - City Council recordings to find out what has been said about a - topic, use this app to do that search for you in fewer than 60 - seconds! -

+
+
+
+
+
+

+ I’m not quite sure how to use this app. What kinds of questions + can I ask? +

+

+ Think about the kinds of topics that are covered during City + Council meetings, and the different people who speak. This + includes councilmembers, mayoral staff, public agency + representatives, activists, and other civic actors. Instead of + watching many hours of City Council recordings to find out what + has been said about a topic, use this app to do that search for + you in fewer than 60 seconds! +

-

- We suggest building questions around the following: -

-
    -
  • - A particular topic, technology, policy, or issue that you’d like - to find out about – e.g., surveillance, incarceration, criminal - justice reform, crime cameras, etc. -
  • -
  • - AND a particular person, agency, or other stakeholder that may - have reported data, findings, questions, or concerns in relation - to that topic – e.g., NOPD, City Council, the Mayor. -
  • -
  • - For example, you could ask: “What data does NOPD have to show the - effectiveness of crime cameras in New Orleans?” -
  • -
  • - Or you could ask: “What is City Council doing to address racial - inequality in the criminal justice system?” -
  • -
  • - Visit the homepage to see questions asked by other people and - organizations, and also case studies on how results were used. -
  • -
-

- The app is in development – feel free to use it for asking different - kinds of questions, and this will help EOS improve the app and make - it more useful. -

-
+

+ We suggest building questions around the following: +

+
    +
  • + A particular topic, technology, policy, or issue that you’d like + to find out about – e.g., surveillance, incarceration, criminal + justice reform, crime cameras, etc. +
  • +
  • + AND a particular person, agency, or other stakeholder that may + have reported data, findings, questions, or concerns in relation + to that topic – e.g., NOPD, City Council, the Mayor. +
  • +
  • + For example, you could ask: “What data does NOPD have to show + the effectiveness of crime cameras in New Orleans?” +
  • +
  • + Or you could ask: “What is City Council doing to address racial + inequality in the criminal justice system?” +
  • +
  • + Visit the homepage to see questions asked by other people and + organizations, and also case studies on how results were used. +
  • +
+

+ The app is in development – feel free to use it for asking + different kinds of questions, and this will help EOS improve the + app and make it more useful. +

+
+
+
-
); }; diff --git a/packages/web/app/tips/step.module.scss b/packages/web/app/tips/step.module.scss new file mode 100644 index 00000000..6a426042 --- /dev/null +++ b/packages/web/app/tips/step.module.scss @@ -0,0 +1,13 @@ +@use "../../app/custom-css/1-helpers/variables" as var; +@use "../../app/custom-css/1-helpers/mixins" as mix; + +.step-content { + background-color: var.$primary; + h2 { + color: var.$secondary; + } + p, + li { + color: var.$altPrimary; + } +} diff --git a/packages/web/components/Alerts/SignUp.tsx b/packages/web/components/Alerts/SignUp.tsx new file mode 100644 index 00000000..a8776cb7 --- /dev/null +++ b/packages/web/components/Alerts/SignUp.tsx @@ -0,0 +1,118 @@ +"use client"; +import { useEffect, useRef, useState } from "react"; +import styles from "./alertsignup.module.scss"; + +import { TABLES } from "@/lib/supabase/db"; +import { supabase } from "@/lib/supabase/supabaseClient"; + +interface AlertSignUpProps { + onSignUpComplete: () => void; +} + +export default function AlertSignUp({ onSignUpComplete }: AlertSignUpProps) { + const [email, setEmail] = useState(""); + const [selectedTopics, setSelectedTopics] = useState([]); + const topics: string[] = [ + "Community Development", + "Environment", + "Budget", + "Budget/Audit/Board of Review", + "Surveillance", + "Palestine", + ]; + const [successMessage, setSuccessMessage] = useState(""); + const emailInputRef = useRef(null); + + useEffect(() => { + if (emailInputRef.current) { + emailInputRef.current.focus(); + } + }, []); + + const handleTopicChange = (topic: string) => { + if (selectedTopics.includes(topic)) { + setSelectedTopics(selectedTopics.filter((t) => t !== topic)); + } else { + setSelectedTopics([...selectedTopics, topic]); + } + }; + + const handleSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + setSuccessMessage(""); + await handleSubscription(email, selectedTopics); + }; + + const handleSubscription = async (email: string, topics: string[]) => { + try { + const { data, error } = await supabase + .from(TABLES.ALERTS) + .insert([{ email: email, topics: topics.join(", ") }]); + + if (error) { + console.error("Error inserting subscription", error.message); + setSuccessMessage(`Error: ${error.message}. Please try again.`); + } else { + console.log("Subscription added!", data); + setSuccessMessage( + "Thank you for subscribing! You will start receiving alerts soon." + ); + onSignUpComplete(); + } + } catch (err) { + console.error("Unexpected error", err); + setSuccessMessage("An unexpected error occurred. Please try again."); + } + }; + + const handleClose = () => { + onSignUpComplete(); + }; + + return ( +
+
+ + setEmail(e.target.value)} + placeholder="Enter your email" + required + /> + +
+ Select topics + {topics.map((topic, index) => ( +
+ handleTopicChange(topic)} + /> + +
+ ))} +
+ + + {successMessage && ( +
{successMessage}
+ )} + +
+
+ ); +} diff --git a/packages/web/components/Alerts/alertsignup.module.scss b/packages/web/components/Alerts/alertsignup.module.scss new file mode 100644 index 00000000..bea141a1 --- /dev/null +++ b/packages/web/components/Alerts/alertsignup.module.scss @@ -0,0 +1,94 @@ +@use "../../app/custom-css/1-helpers/variables" as var; + +.alert-sign-up { + background-color: var.$primary; + padding: 1rem; + text-align: center; + border-radius: 0.5rem; + width: 80%; + max-width: 500px; + margin: 2rem auto; + box-shadow: 0px 3px 6px #00000029; + + label, + legend { + color: var.$altPrimary; + margin-bottom: 1rem; + } + + input[type='email'] { + border-radius: 5rem; + padding: 1rem; + margin-bottom: 1rem; + border: none; + box-shadow: 0px 3px 6px #00000029; + width: calc(100% - 2rem); + } + + .topic-checkbox { + display: flex; + align-items: center; + margin-bottom: .5rem; + + & > label { + padding: 0.5rem 1rem; + background-color: transparent; + border-radius: 5rem; + cursor: pointer; + margin-right: 0.5rem; + + &:hover { + background-color: var.$secondary; + color: var.$altPrimary; + } + } + + input[type='checkbox'] { + display: none; + + &:checked + label { + background-color: var.$secondary; + color: var.$altPrimary; + } + } + } + + .submit-button, + .cancel-button { + background-color: var.$secondary; + color: var.$altPrimary; + border-radius: 5rem; + padding: 1rem 2rem; + border: none; + cursor: pointer; + width: calc(50% - 1rem); + margin-top: 1rem; + margin-right: 1rem; + + &:last-child { + margin-right: 0; + } + + &:hover { + background-color: darken(var.$secondary, 10%); + } + } + + .success-message { + color: green; + font-size: 1rem; + margin-top: 1rem; + width: 100%; + } +} + +@media (max-width: var.$tablet) { + .alert-sign-up { + width: 90%; + + .submit-button, + .cancel-button { + width: calc(50% - 1rem); + } + } +} diff --git a/packages/web/components/BetaCard.tsx b/packages/web/components/Card/BetaCard.tsx similarity index 91% rename from packages/web/components/BetaCard.tsx rename to packages/web/components/Card/BetaCard.tsx index 277d1b9e..e9312476 100644 --- a/packages/web/components/BetaCard.tsx +++ b/packages/web/components/Card/BetaCard.tsx @@ -8,7 +8,6 @@ import moment from "moment"; import { useEffect, useState } from "react"; import useClipboardApi from "use-clipboard-api"; import CardActions from "./CardActions"; -import CardResponse from "./CardResponse"; import Citation from "./Citation"; type SupabaseRealtimePayload = { @@ -111,20 +110,20 @@ const BetaCard = ({ card }: { card: ICard }) => { } }; + const combinedResponses = responses.map((r) => r.response).join(" "); + return (
{/* Card Header */}

{card.title}

-

+

{moment.utc(card.created_at!).local().fromNow()}

- {/* Card Responses */} - {responses.map((response, index) => ( - - ))} + {/* Combined Card Responses */} +

{combinedResponses}

{isYouTubeURL(thumbnail?.source_url) && ( @@ -142,7 +141,7 @@ const BetaCard = ({ card }: { card: ICard }) => { {/* Citations Section */}
@@ -235,7 +236,7 @@ const CardActions = ({ card }: { card: ICard }) => { ); return ( - <> +
{ onClose={() => setBiasModalOpen(false)} onSubmit={submitBiasFeedback} /> - +
); }; diff --git a/packages/web/components/CardLoading.tsx b/packages/web/components/Card/CardLoading.tsx similarity index 100% rename from packages/web/components/CardLoading.tsx rename to packages/web/components/Card/CardLoading.tsx diff --git a/packages/web/components/CardResponse.tsx b/packages/web/components/Card/CardResponse.tsx similarity index 100% rename from packages/web/components/CardResponse.tsx rename to packages/web/components/Card/CardResponse.tsx diff --git a/packages/web/components/Cards.tsx b/packages/web/components/Card/Cards.tsx similarity index 100% rename from packages/web/components/Cards.tsx rename to packages/web/components/Card/Cards.tsx diff --git a/packages/web/components/Citation.css b/packages/web/components/Card/Citation.css similarity index 97% rename from packages/web/components/Citation.css rename to packages/web/components/Card/Citation.css index e3e0b92e..4b1a68a0 100644 --- a/packages/web/components/Citation.css +++ b/packages/web/components/Card/Citation.css @@ -4,4 +4,4 @@ .response { margin-bottom: 20px; -} \ No newline at end of file +} diff --git a/packages/web/components/Citation.tsx b/packages/web/components/Card/Citation.tsx similarity index 96% rename from packages/web/components/Citation.tsx rename to packages/web/components/Card/Citation.tsx index 9cb4380c..bedacc9d 100644 --- a/packages/web/components/Citation.tsx +++ b/packages/web/components/Card/Citation.tsx @@ -40,7 +40,7 @@ const Citation = ({

#{index + 1}: {title}

-

{moment(publishedAt).fromNow()}

+

{moment(publishedAt).fromNow()}

{isUrlAvailable && ( diff --git a/packages/web/components/Card/card.module.scss b/packages/web/components/Card/card.module.scss new file mode 100644 index 00000000..7dcfcf92 --- /dev/null +++ b/packages/web/components/Card/card.module.scss @@ -0,0 +1,12 @@ +@use "../../app/custom-css/1-helpers/variables" as var; +@use "../../app/custom-css/1-helpers/mixins" as mix; + +.icons { + svg, + span { + color: var.$primary; + :hover { + color: var.$secondary; + } + } +} diff --git a/packages/web/components/Footer.tsx b/packages/web/components/Footer/Footer.tsx similarity index 96% rename from packages/web/components/Footer.tsx rename to packages/web/components/Footer/Footer.tsx index 11af810c..61fd6722 100644 --- a/packages/web/components/Footer.tsx +++ b/packages/web/components/Footer/Footer.tsx @@ -10,7 +10,7 @@ import Link from "next/link"; export default function Footer() { return ( -
+

Without diff --git a/packages/web/components/HomeLearnMore.tsx b/packages/web/components/Footer/HomeLearnMore.tsx similarity index 50% rename from packages/web/components/HomeLearnMore.tsx rename to packages/web/components/Footer/HomeLearnMore.tsx index 6b103c24..d9aae7f8 100644 --- a/packages/web/components/HomeLearnMore.tsx +++ b/packages/web/components/Footer/HomeLearnMore.tsx @@ -6,6 +6,7 @@ import { randItem } from "@/lib/utils"; import Link from "next/link"; import { useState } from "react"; import { useInterval } from "usehooks-ts"; +import styles from "./footer.module.scss"; export default function HomeLearnMore() { const [word, setWord] = useState(HOMEPAGE_WORDS[0]); @@ -18,16 +19,18 @@ export default function HomeLearnMore() { ); return ( -

-
-
-

- - Learn more - -

+
+
+
+
+

+ + Learn more + +

+
+
-
); } diff --git a/packages/web/components/Footer/footer.module.scss b/packages/web/components/Footer/footer.module.scss new file mode 100644 index 00000000..8c2a0ca7 --- /dev/null +++ b/packages/web/components/Footer/footer.module.scss @@ -0,0 +1,9 @@ +@use "../../app/custom-css/1-helpers/variables" as var; +@use "../../app/custom-css/1-helpers/mixins" as mix; + +.button { + h1 { + background-color: var.$secondary; + color: var.$altPrimary; + } +} diff --git a/packages/web/components/HomeBanner.tsx b/packages/web/components/HomeBanner.tsx deleted file mode 100644 index 2864ef56..00000000 --- a/packages/web/components/HomeBanner.tsx +++ /dev/null @@ -1,34 +0,0 @@ -"use client"; - -import { HOMEPAGE_WORDS } from "@/lib/copy"; -import { randItem } from "@/lib/utils"; -import { useState } from "react"; -import { useInterval } from "usehooks-ts"; -import NewQuery from "./NewQuery"; - -export default function HomeBanner() { - const [word, setWord] = useState(HOMEPAGE_WORDS[0]); - useInterval( - () => { - setWord(randItem(HOMEPAGE_WORDS)); - }, - - 3500 - ); - - return ( -
-
-
-

- What is New Orleans City Council doing about -

-

- {word}? -

- -
-
-
- ); -} diff --git a/packages/web/components/HomeBanner/HomeBanner.tsx b/packages/web/components/HomeBanner/HomeBanner.tsx new file mode 100644 index 00000000..af649cc0 --- /dev/null +++ b/packages/web/components/HomeBanner/HomeBanner.tsx @@ -0,0 +1,39 @@ +"use client"; + +import { HOMEPAGE_WORDS } from "@/lib/copy"; +import { randItem } from "@/lib/utils"; +import { useState } from "react"; +import { useInterval } from "usehooks-ts"; +import NewQuery from "./NewQuery"; +import styles from "./homebanner.module.scss"; + +export default function HomeBanner() { + const [word, setWord] = useState(HOMEPAGE_WORDS[0]); + useInterval( + () => { + setWord(randItem(HOMEPAGE_WORDS)); + }, + + 3500 + ); + + return ( +
+
+
+
+

+ What is New Orleans City Council doing about +

+

+ {word}? +

+
+ +
+
+
+
+
+ ); +} diff --git a/packages/web/components/NewQuery.tsx b/packages/web/components/HomeBanner/NewQuery.tsx similarity index 80% rename from packages/web/components/NewQuery.tsx rename to packages/web/components/HomeBanner/NewQuery.tsx index 66bead5e..8c839146 100644 --- a/packages/web/components/NewQuery.tsx +++ b/packages/web/components/HomeBanner/NewQuery.tsx @@ -3,11 +3,12 @@ import { APP_NAME } from "@/lib/copy"; import { ABOUT_BETA_PATH, API_NEW_CARD_PATH } from "@/lib/paths"; import { TABLES } from "@/lib/supabase/db"; import { supabase } from "@/lib/supabase/supabaseClient"; -import { faMagnifyingGlass, faUndo } from "@fortawesome/free-solid-svg-icons"; +import { faMagnifyingGlass } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import Link from "next/link"; import { useEffect, useState } from "react"; -import { useCardResults } from "./CardResultsProvider"; +import { useCardResults } from "../../app/feedback/CardResultsProvider"; +import styles from "./homebanner.module.scss"; type SupabaseRealtimePayload = { old: T; @@ -58,6 +59,15 @@ export default function NewQuery() { } }; + const scrollToQuery = () => { + setTimeout(() => { + const element = document.getElementById("loading"); + if (element) { + element.scrollIntoView({ behavior: "smooth", block: "center" }); + } + }, 1500); // Adjust the delay duration (in milliseconds) as needed + }; + const clearQuery = () => { setQuery(""); }; @@ -123,13 +133,13 @@ export default function NewQuery() { return; } - if (data && data.responses && data.citations) { + if (data && data.responses) { setCard(data); addMyCard(data); clearInterval(interval); setIsProcessing(false); } - }, 5000); + }, 1000); setPollingIntervalId(interval as unknown as number); } catch (error) { @@ -154,7 +164,7 @@ export default function NewQuery() {
- + X )}
- + {isProcessing ? ( +
+
+
+
+
+ ) : ( + + )}

diff --git a/packages/web/components/HomeBanner/homebanner.module.scss b/packages/web/components/HomeBanner/homebanner.module.scss new file mode 100644 index 00000000..15fe8b80 --- /dev/null +++ b/packages/web/components/HomeBanner/homebanner.module.scss @@ -0,0 +1,88 @@ +@use "../../app/custom-css/1-helpers/variables" as var; +@use "../../app/custom-css/1-helpers/mixins" as mix; + +.homebanner { + background-color: var.$primary; + padding-top: 1rem; + h1, + p { + color: var.$altPrimary; + } + h2 { + font-size: 2rem; + font-weight: 800; + @media (min-width: var.$tablet) { + font-size: 3rem; + } + } + span { + color: var.$altSecondary; + } + button { + background-color: var.$secondary; + color: var.$altPrimary; + border-radius: 5rem; + margin: 0 auto; + min-width: 2.5rem; + } +} + +.query { + form { + svg { + padding-bottom: 2px; + } + padding: 2rem 0; + display: flex; + flex-direction: column; + gap: 1rem; + } + input { + border-radius: 5rem; + padding-top: 1.5rem; + padding-bottom: 1.5rem; + } +} + +.x-icon { + padding: 0 1rem; +} + +.lds-facebook { + display: inline-block; + position: relative; + width: 80px; + height: 80px; + margin: 0 auto; +} +.lds-facebook div { + display: inline-block; + position: absolute; + left: 8px; + width: 16px; + background: var.$secondary; + animation: lds-facebook 1.2s cubic-bezier(0, 0.5, 0.5, 1) infinite; +} +.lds-facebook div:nth-child(1) { + left: 8px; + animation-delay: -0.24s; +} +.lds-facebook div:nth-child(2) { + left: 32px; + animation-delay: -0.12s; +} +.lds-facebook div:nth-child(3) { + left: 56px; + animation-delay: 0; +} +@keyframes lds-facebook { + 0% { + top: 8px; + height: 64px; + } + 50%, + 100% { + top: 24px; + height: 32px; + } +} diff --git a/packages/web/components/HomeResults.tsx b/packages/web/components/HomeResults/HomeResults.tsx similarity index 57% rename from packages/web/components/HomeResults.tsx rename to packages/web/components/HomeResults/HomeResults.tsx index ced511c2..1ed9baac 100644 --- a/packages/web/components/HomeResults.tsx +++ b/packages/web/components/HomeResults/HomeResults.tsx @@ -2,10 +2,10 @@ import { useEffect, useRef, useState } from "react"; import { BeatLoader } from "react-spinners"; -import CardLoading from "./CardLoading"; -import { useCardResults } from "./CardResultsProvider"; +import { useCardResults } from "../../app/feedback/CardResultsProvider"; +import CardLoading from "../Card/CardLoading"; import QueryResult from "./QueryResult"; - +import styles from "./homeresults.module.scss"; export default function HomeBanner() { const { cards, fetchMoreCards, hasMoreCards } = useCardResults(); const hasCards = cards.length > 0; @@ -45,33 +45,33 @@ export default function HomeBanner() { }); } }, [isInView, isLoading, fetchMoreCards, hasMoreCards]); - return ( -

-
-
-
- {hasCards && - cards.map((card) => )} - - {isLoading && ( -
- -
- )} +
+
+
+
+
+ {hasCards && + cards.map((card) => )} + {isLoading && ( +
+ +
+ )} - {!hasCards && !isLoading && ( -
- - - -
- )} + {!hasCards && !isLoading && ( +
+ + + +
+ )} +
+
-
); diff --git a/packages/web/components/QueryResult.tsx b/packages/web/components/HomeResults/QueryResult.tsx similarity index 51% rename from packages/web/components/QueryResult.tsx rename to packages/web/components/HomeResults/QueryResult.tsx index f3882e51..2bb5c492 100644 --- a/packages/web/components/QueryResult.tsx +++ b/packages/web/components/HomeResults/QueryResult.tsx @@ -2,16 +2,17 @@ import { ICard } from "@/lib/api"; import { CARD_SHOW_PATH } from "@/lib/paths"; +import { supabase } from "@/lib/supabase/supabaseClient"; import { getThumbnail, getYouTubeEmbedUrl, isYouTubeURL } from "@/lib/utils"; import { faSpinner } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import moment from "moment"; import Link from "next/link"; -import { useState } from "react"; -import { useInterval } from "usehooks-ts"; -import CardActions from "./CardActions"; +import { useEffect, useState } from "react"; +import CardActions from "../Card/CardActions"; +import styles from "./homeresults.module.scss"; -const MAX_CHARACTERS_PREVIEW = 300; +const MAX_CHARACTERS_PREVIEW = 20000; const LOADING_MESSAGES = [ "Processing your request...", @@ -40,9 +41,12 @@ const LOADING_MESSAGES = [ const WAIT_MS = 2500; export default function QueryResult({ card }: { card: ICard }) { - const { created_at: createdAt, citations, responses } = card; + const { created_at: createdAt, citations } = card; const [msgIndex, setMsgIndex] = useState(0); - const isLoading = !responses || responses.length <= 0; + const initialLoadingState = !card.responses || card.responses.length === 0; + const [isLoading, setIsLoading] = useState(initialLoadingState); + + const [responses, setResponses] = useState<{ response: string }[]>([]); const [prettyCreatedAt, setPrettyCreatedAt] = useState( !!createdAt && new Date(createdAt) < new Date() @@ -51,18 +55,51 @@ export default function QueryResult({ card }: { card: ICard }) { ); const thumbnail = getThumbnail(citations || []); - useInterval( - () => { - setMsgIndex((prevIndex) => (prevIndex + 1) % LOADING_MESSAGES.length); - }, - isLoading ? WAIT_MS : null - ); + useEffect(() => { + let intervalId: NodeJS.Timeout | null = null; + + if (isLoading) { + intervalId = setInterval(() => { + setMsgIndex((prevIndex) => (prevIndex + 1) % LOADING_MESSAGES.length); + }, WAIT_MS); + } + + const channel = (supabase.channel(`cards:id=eq.${card.id}`) as any) + .on( + "postgres_changes", + { event: "UPDATE", schema: "public" }, + (payload: { new: { id: string; responses: { response: string }[] } }) => { + console.log("Payload received:", payload); + if (payload.new.id === card.id) { + const newResponses = payload.new.responses || []; + console.log("New Responses:", newResponses); + + setResponses(newResponses); + + if (newResponses.length > 0) { + setIsLoading(false); + if (intervalId) { + clearInterval(intervalId); + } + } + } + } + ) + .subscribe(); - useInterval(() => { - setPrettyCreatedAt(moment(card.created_at).fromNow()); - }, 5_000); + return () => { + channel.unsubscribe(); + if (intervalId) { + clearInterval(intervalId); + } + }; + }, [card.id, isLoading]); const CardBody = () => { + const displayText = responses + .map((responseObj) => responseObj.response) + .join(" ") + .substring(0, MAX_CHARACTERS_PREVIEW); return (
@@ -71,15 +108,13 @@ export default function QueryResult({ card }: { card: ICard }) { {card.is_mine ? "You | " : null} - {prettyCreatedAt} + {prettyCreatedAt} - {!isLoading && !!responses ? ( + {!isLoading ? (

- {responses[0].response.substring(0, MAX_CHARACTERS_PREVIEW)} - {responses[0].response.length > MAX_CHARACTERS_PREVIEW - ? "..." - : null} + {displayText} + {displayText.length > MAX_CHARACTERS_PREVIEW ? "..." : null}

) : (

@@ -105,13 +140,15 @@ export default function QueryResult({ card }: { card: ICard }) { }; return ( -

- - +
+
+ + +
); } diff --git a/packages/web/components/HomeResults/homeresults.module.scss b/packages/web/components/HomeResults/homeresults.module.scss new file mode 100644 index 00000000..3ed3b73a --- /dev/null +++ b/packages/web/components/HomeResults/homeresults.module.scss @@ -0,0 +1,19 @@ +@use "../../app/custom-css/1-helpers/variables" as var; +@use "../../app/custom-css/1-helpers/mixins" as mix; + +.sawt-feed { + background-color: var.$primary; +} + +.sawt-card { + background-color: var.$altPrimary; +} + +.card { + h6, + span { + color: black; + font-size: medium; + padding: 5px 0; + } +} diff --git a/packages/web/components/NavBar/Navbar.tsx b/packages/web/components/NavBar/Navbar.tsx new file mode 100644 index 00000000..937e1ef5 --- /dev/null +++ b/packages/web/components/NavBar/Navbar.tsx @@ -0,0 +1,96 @@ +"use client"; +import { HOME_PATH } from "@/lib/paths"; +// Copied from: https://medium.com/@ryaddev/creating-a-responsive-navbar-with-react-and-tailwind-css-502cceaf9f53 +import { faBars, faClose } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import Image from "next/image"; +import Link from "next/link"; +import { useState } from "react"; +import SAWTLogo from "../../public/photos/Sawt.png"; +import styles from "./navbar.module.scss"; + +export const navLinks = [ + { + id: "about", + title: "About", + }, + { + id: "tips", + title: "How to use", + }, + { + id: "feedback", + title: "Feedback", + }, +]; + +const Navbar = () => { + const [active, setActive] = useState("Home"); + const [toggle, setToggle] = useState(false); + + return ( +
+
+
+
+ +
+
+
+
+ ); +}; + +export default Navbar; diff --git a/packages/web/components/NavBar/navbar.module.scss b/packages/web/components/NavBar/navbar.module.scss new file mode 100644 index 00000000..a1b5f00f --- /dev/null +++ b/packages/web/components/NavBar/navbar.module.scss @@ -0,0 +1,26 @@ +@use "../../app/custom-css/1-helpers/variables" as var; +@use "../../app/custom-css/1-helpers/mixins" as mix; + +.nav { + nav { + height: 8rem; + } + svg { + color: var.$altPrimary; + } +} + +.search-bar { + padding: 0.625rem; + border-radius: 3rem; +} + +.beta { + position: relative; + bottom: 6rem; + left: 3rem; + font-weight: 600; + &:hover { + color: none; + } +} diff --git a/packages/web/components/Navbar.tsx b/packages/web/components/Navbar.tsx deleted file mode 100644 index e5365718..00000000 --- a/packages/web/components/Navbar.tsx +++ /dev/null @@ -1,103 +0,0 @@ -"use client"; -import { HOME_PATH } from "@/lib/paths"; -// Copied from: https://medium.com/@ryaddev/creating-a-responsive-navbar-with-react-and-tailwind-css-502cceaf9f53 -import { faBars, faClose } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import Link from "next/link"; -import { useState } from "react"; -export const navLinks = [ - { - id: "about", - title: "About", - }, - { - id: "tips", - title: "How to use", - }, - { - id: "feedback", - title: "Feedback", - }, -]; - -const Navbar = () => { - const [active, setActive] = useState("Home"); - const [toggle, setToggle] = useState(false); - - return ( -
-
-
- -
-
-
- ); -}; - -export default Navbar; diff --git a/packages/web/components/ThreeCardLayout.css b/packages/web/components/ThreeCardLayout.css deleted file mode 100644 index 59ed0d0b..00000000 --- a/packages/web/components/ThreeCardLayout.css +++ /dev/null @@ -1,61 +0,0 @@ -/* ThreeCardLayout.css */ -.dropdown-container { - position: relative; - } - - .dropdown-header { - cursor: pointer; - padding: 8px; - border: 1px solid #ccc; - border-radius: 4px; - display: flex; - justify-content: space-between; - align-items: center; - } - - .dropdown-content { - position: absolute; - top: 100%; - left: 0; - background-color: #fff; - border: 1px solid #ccc; - border-top: none; - border-radius: 0 0 4px 4px; - padding: 8px; - z-index: 1; - overflow: scroll; - } - - /* Rotate chevron down icon when dropdown is open */ - .rotate-180 { - transform: rotate(180deg); - } - - -.dropdown-content { - position: absolute; - top: 100%; - left: 0; - background-color: #fff; - border: 1px solid #ccc; - border-top: none; - border-radius: 0 0 4px 4px; - padding: 8px; - z-index: 1; - width: 100%; - } - - - -/* Adjust styles for screens smaller than 600px */ -@media (max-width: 600px) { - .dropdown-header { - font-size: 14px; - } - - .dropdown-content { - padding: 10px; - } - } - - \ No newline at end of file diff --git a/packages/web/lib/supabase/db.ts b/packages/web/lib/supabase/db.ts index a7cd4888..fc1edf9a 100644 --- a/packages/web/lib/supabase/db.ts +++ b/packages/web/lib/supabase/db.ts @@ -3,4 +3,5 @@ export const TABLES = { CARDS: "cards", FEEDBACK_CARDS: "feedback_cards", USER_FEEDBACK: "user_feedback", + ALERTS: "subscriptions", }; diff --git a/packages/web/lib/utils.ts b/packages/web/lib/utils.ts index 54165472..32879a88 100644 --- a/packages/web/lib/utils.ts +++ b/packages/web/lib/utils.ts @@ -30,7 +30,11 @@ export function getYouTubeEmbedUrl( ): string | undefined { if (!url) return undefined; const videoId = url.split("v=")[1]?.split("&")[0]; - const t = url.split("t=")[1].split("s")[0]; + const tParts = url.split("t="); + let t = ""; + if (tParts.length > 1) { + t = tParts[1].split("s")[0]; + } if (!videoId) return undefined; return `https://www.youtube.com/embed/${videoId}?autoplay=0&start=${t}`; } diff --git a/packages/web/package-lock.json b/packages/web/package-lock.json deleted file mode 100644 index 6c0e093a..00000000 --- a/packages/web/package-lock.json +++ /dev/null @@ -1,8702 +0,0 @@ -{ - "name": "web", - "version": "0.1.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "web", - "version": "0.1.0", - "dependencies": { - "@fortawesome/fontawesome-svg-core": "^6.4.2", - "@fortawesome/free-brands-svg-icons": "^6.4.2", - "@fortawesome/free-solid-svg-icons": "^6.4.0", - "@fortawesome/react-fontawesome": "^0.2.0", - "@headlessui/react": "^1.7.16", - "@supabase/auth-helpers-nextjs": "^0.7.4", - "@supabase/supabase-js": "^2.32.0", - "@tailwindcss/forms": "^0.5.3", - "@types/node": "20.2.5", - "@types/react": "18.2.8", - "@types/react-dom": "18.2.4", - "@vercel/analytics": "^1.0.2", - "autoprefixer": "10.4.14", - "encoding": "^0.1.13", - "eslint": "8.42.0", - "eslint-config-next": "^13.4.4", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-tailwindcss": "^3.12.1", - "eslint-plugin-unused-imports": "^2.0.0", - "jspdf": "^2.5.1", - "moment": "^2.29.4", - "next": "13.4.4", - "postcss": "8.4.24", - "prettier": "^2.8.8", - "prettier-plugin-organize-imports": "^3.2.2", - "prettier-plugin-tailwindcss": "^0.3.0", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-infinite-scroll-component": "^6.1.0", - "react-spinners": "^0.13.8", - "tailwindcss": "3.3.2", - "typescript": "5.1.3", - "use-clipboard-api": "^0.3.4", - "usehooks-ts": "^2.9.1", - "uuid": "^9.0.0" - }, - "devDependencies": { - "@types/uuid": "^9.0.2" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@babel/runtime": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz", - "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.2", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", - "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", - "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==", - "hasInstallScript": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz", - "integrity": "sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.4.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/fontawesome-svg-core/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz", - "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==", - "hasInstallScript": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-brands-svg-icons": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.4.2.tgz", - "integrity": "sha512-LKOwJX0I7+mR/cvvf6qIiqcERbdnY+24zgpUSouySml+5w8B4BJOx8EhDR/FTKAu06W12fmUIcv6lzPSwYKGGg==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.4.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-brands-svg-icons/node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz", - "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==", - "hasInstallScript": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", - "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.4.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/react-fontawesome": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", - "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", - "dependencies": { - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "~1 || ~6", - "react": ">=16.3" - } - }, - "node_modules/@headlessui/react": { - "version": "1.7.17", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.17.tgz", - "integrity": "sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==", - "dependencies": { - "client-only": "^0.0.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^16 || ^17 || ^18", - "react-dom": "^16 || ^17 || ^18" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@next/env": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.4.tgz", - "integrity": "sha512-q/y7VZj/9YpgzDe64Zi6rY1xPizx80JjlU2BTevlajtaE3w1LqweH1gGgxou2N7hdFosXHjGrI4OUvtFXXhGLg==" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.4.tgz", - "integrity": "sha512-5jnh7q6I15efnjR/rR+/TGTc9hn53g3JTbEjAMjmeQiExKqEUgIXqrHI5zlTNlNyzCPkBB860/ctxXheZaF2Vw==", - "dependencies": { - "glob": "7.1.7" - } - }, - "node_modules/@next/eslint-plugin-next/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.4.tgz", - "integrity": "sha512-xfjgXvp4KalNUKZMHmsFxr1Ug+aGmmO6NWP0uoh4G3WFqP/mJ1xxfww0gMOeMeSq/Jyr5k7DvoZ2Pv+XOITTtw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.4.tgz", - "integrity": "sha512-ZY9Ti1hkIwJsxGus3nlubIkvYyB0gNOYxKrfsOrLEqD0I2iCX8D7w8v6QQZ2H+dDl6UT29oeEUdDUNGk4UEpfg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.4.tgz", - "integrity": "sha512-+KZnDeMShYkpkqAvGCEDeqYTRADJXc6SY1jWXz+Uo6qWQO/Jd9CoyhTJwRSxvQA16MoYzvILkGaDqirkRNctyA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.4.tgz", - "integrity": "sha512-evC1twrny2XDT4uOftoubZvW3EG0zs0ZxMwEtu/dDGVRO5n5pT48S8qqEIBGBUZYu/Xx4zzpOkIxx1vpWdE+9A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.4.tgz", - "integrity": "sha512-PX706XcCHr2FfkyhP2lpf+pX/tUvq6/ke7JYnnr0ykNdEMo+sb7cC/o91gnURh4sPYSiZJhsF2gbIqg9rciOHQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.4.tgz", - "integrity": "sha512-TKUUx3Ftd95JlHV6XagEnqpT204Y+IsEa3awaYIjayn0MOGjgKZMZibqarK3B1FsMSPaieJf2FEAcu9z0yT5aA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.4.tgz", - "integrity": "sha512-FP8AadgSq4+HPtim7WBkCMGbhr5vh9FePXiWx9+YOdjwdQocwoCK5ZVC3OW8oh3TWth6iJ0AXJ/yQ1q1cwSZ3A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.4.tgz", - "integrity": "sha512-3WekVmtuA2MCdcAOrgrI+PuFiFURtSyyrN1I3UPtS0ckR2HtLqyqmS334Eulf15g1/bdwMteePdK363X/Y9JMg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.4.tgz", - "integrity": "sha512-AHRITu/CrlQ+qzoqQtEMfaTu7GHaQ6bziQln/pVWpOYC1wU+Mq6VQQFlsDtMCnDztPZtppAXdvvbNS7pcfRzlw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgr/utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.1.tgz", - "integrity": "sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w==", - "dependencies": { - "cross-spawn": "^7.0.3", - "fast-glob": "^3.2.12", - "is-glob": "^4.0.3", - "open": "^9.1.0", - "picocolors": "^1.0.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@pkgr/utils/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.0.tgz", - "integrity": "sha512-IthPJsJR85GhOkp3Hvp8zFOPK5ynKn6STyHa/WZpioK7E1aYDiBzpqQPrngc14DszIUkIrdd3k9Iu0XSzlP/1w==" - }, - "node_modules/@supabase/auth-helpers-nextjs": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@supabase/auth-helpers-nextjs/-/auth-helpers-nextjs-0.7.4.tgz", - "integrity": "sha512-MyGCkB7LEDcGrKmesKGjyG54Jlbiss8VGTegrNde/ywXujQyRFnzycijoASDBc6i9SmE7eE1qWBsMr2URb07nw==", - "dependencies": { - "@supabase/auth-helpers-shared": "0.4.1", - "set-cookie-parser": "^2.6.0" - }, - "peerDependencies": { - "@supabase/supabase-js": "^2.19.0" - } - }, - "node_modules/@supabase/auth-helpers-shared": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@supabase/auth-helpers-shared/-/auth-helpers-shared-0.4.1.tgz", - "integrity": "sha512-IEDX9JzWkIjQiLUaP4Qy5YDiG0jFQatWfS+jw8cCQs6QfbNdEPd2Y3qonwGHnM90CZom9SvjuylBv2pFVAL7Lw==", - "dependencies": { - "jose": "^4.14.3" - }, - "peerDependencies": { - "@supabase/supabase-js": "^2.19.0" - } - }, - "node_modules/@supabase/functions-js": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.1.2.tgz", - "integrity": "sha512-QCR6pwJs9exCl37bmpMisUd6mf+0SUBJ6mUpiAjEkSJ/+xW8TCuO14bvkWHADd5hElJK9MxNlMQXxSA4DRz9nQ==", - "dependencies": { - "cross-fetch": "^3.1.5" - } - }, - "node_modules/@supabase/gotrue-js": { - "version": "2.47.0", - "resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-2.47.0.tgz", - "integrity": "sha512-3e34/vsKH/DoSZCpB85UZpFWSJ2p4GRUUlqgAgeTPagPlx4xS+Nc5v7g7ic7vp3gK0J5PsYVCn9Qu2JQUp4vXg==", - "dependencies": { - "cross-fetch": "^3.1.5" - } - }, - "node_modules/@supabase/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-rEHQaDVzxLZMCK3p+JW2nzEsK4AJpOQhetppaqAzrFum0Ub8wcnoM/8f1dWRZSulY5fRDP6rJaWT/8X3VleCzg==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/@supabase/postgrest-js": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.8.1.tgz", - "integrity": "sha512-tCBPb5vp0NTQRWRkx1Sjcais3WIp79BuFdenzp852UXxFNJ04RLoyE9IxqjWQQHzHF0ot1V7Uzf1nHDk7DsYdg==", - "dependencies": { - "@supabase/node-fetch": "^2.6.13" - } - }, - "node_modules/@supabase/realtime-js": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.7.4.tgz", - "integrity": "sha512-FzSzs1k9ruh/uds5AJ95Nc3beiMCCIhougExJ3O98CX1LMLAKUKFy5FivKLvcNhXnNfUEL0XUfGMb4UH2J7alg==", - "dependencies": { - "@types/phoenix": "^1.5.4", - "@types/websocket": "^1.0.3", - "websocket": "^1.0.34" - } - }, - "node_modules/@supabase/storage-js": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.5.1.tgz", - "integrity": "sha512-nkR0fQA9ScAtIKA3vNoPEqbZv1k5B5HVRYEvRWdlP6mUpFphM9TwPL2jZ/ztNGMTG5xT6SrHr+H7Ykz8qzbhjw==", - "dependencies": { - "cross-fetch": "^3.1.5" - } - }, - "node_modules/@supabase/supabase-js": { - "version": "2.33.1", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.33.1.tgz", - "integrity": "sha512-jA00rquPTppPOHpBB6KABW98lfg0gYXcuGqP3TB1iiduznRVsi3GGk2qBKXPDLMYSe0kRlQp5xCwWWthaJr8eA==", - "dependencies": { - "@supabase/functions-js": "^2.1.0", - "@supabase/gotrue-js": "^2.46.1", - "@supabase/postgrest-js": "^1.8.0", - "@supabase/realtime-js": "^2.7.4", - "@supabase/storage-js": "^2.5.1", - "cross-fetch": "^3.1.5" - } - }, - "node_modules/@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@swc/helpers/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" - }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz", - "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==", - "dependencies": { - "mini-svg-data-uri": "^1.2.3" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" - } - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" - }, - "node_modules/@types/node": { - "version": "20.2.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", - "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" - }, - "node_modules/@types/phoenix": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.0.tgz", - "integrity": "sha512-qwfpsHmFuhAS/dVd4uBIraMxRd56vwBUYQGZ6GpXnFuM2XMRFJbIyruFKKlW2daQliuYZwe0qfn/UjFCDKic5g==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "node_modules/@types/raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==", - "optional": true - }, - "node_modules/@types/react": { - "version": "18.2.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.8.tgz", - "integrity": "sha512-lTyWUNrd8ntVkqycEEplasWy2OxNlShj3zqS0LuB1ENUGis5HodmhM7DtCoUGbxj3VW/WsGA0DUhpG6XrM7gPA==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz", - "integrity": "sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" - }, - "node_modules/@types/uuid": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.2.tgz", - "integrity": "sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ==", - "dev": true - }, - "node_modules/@types/websocket": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.5.tgz", - "integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", - "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", - "dependencies": { - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", - "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", - "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", - "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", - "dependencies": { - "@typescript-eslint/types": "5.59.8", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vercel/analytics": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.2.tgz", - "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg==" - }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", - "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "optional": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", - "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001489", - "electron-to-chromium": "^1.4.411", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", - "bin": { - "btoa": "bin/btoa.js" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/bundle-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", - "dependencies": { - "run-applescript": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001494", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001494.tgz", - "integrity": "sha512-sY2B5Qyl46ZzfYDegrl8GBCzdawSLT4ThM9b9F+aDYUrAG2zCOyMbd2Tq34mS1g4ZKBfjRlzOohQMxx28x6wJg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/canvg": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.10.tgz", - "integrity": "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==", - "optional": true, - "dependencies": { - "@babel/runtime": "^7.12.5", - "@types/raf": "^3.4.0", - "core-js": "^3.8.3", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.7", - "rgbcolor": "^1.0.1", - "stackblur-canvas": "^2.0.0", - "svg-pathdata": "^6.0.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/core-js": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz", - "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==", - "hasInstallScript": true, - "optional": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/cross-fetch": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", - "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", - "dependencies": { - "node-fetch": "^2.6.11" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-line-break": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", - "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", - "optional": true, - "dependencies": { - "utrie": "^1.0.2" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-equal": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", - "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.0", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/default-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", - "dependencies": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "dependencies": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dompurify": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", - "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==", - "optional": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.419", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.419.tgz", - "integrity": "sha512-jdie3RiEgygvDTyS2sgjq71B36q2cDSBfPlwzUyuOrfYTNoYWyBxxjGJV/HAu3A2hB0Y+HesvCVkVAFoCKwCSw==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.14.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", - "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", - "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-next": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.4.tgz", - "integrity": "sha512-z/PMbm6L0iC/fwISULxe8IVy4DtNqZk2wQY711o35klenq70O6ns82A8yuMVCFjHC0DIyB2lyugesRtuk9u8dQ==", - "dependencies": { - "@next/eslint-plugin-next": "13.4.4", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "^4.5.0" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", - "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "get-tsconfig": "^4.5.0", - "globby": "^13.1.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "synckit": "^0.8.5" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", - "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-tailwindcss": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-tailwindcss/-/eslint-plugin-tailwindcss-3.12.1.tgz", - "integrity": "sha512-LyIRV0rx6prTpJZsSCXSNJ34Yry3Nj9OJwvzh1xTsiG6+UCnAPW1Bx41s7vZzUDKMlwFgpUN9Me+NK12T4DHYg==", - "dependencies": { - "fast-glob": "^3.2.5", - "postcss": "^8.4.4" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "tailwindcss": "^3.3.2" - } - }, - "node_modules/eslint-plugin-unused-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", - "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", - "dependencies": { - "eslint-rule-composer": "^0.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "eslint": "^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - } - } - }, - "node_modules/eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/execa/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fflate": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", - "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.6.0.tgz", - "integrity": "sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg==", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/html2canvas": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", - "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", - "optional": true, - "dependencies": { - "css-line-break": "^2.1.0", - "text-segmentation": "^1.0.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-wsl/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/jiti": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", - "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/jose": { - "version": "4.14.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", - "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jspdf": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz", - "integrity": "sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA==", - "dependencies": { - "@babel/runtime": "^7.14.0", - "atob": "^2.1.2", - "btoa": "^1.2.1", - "fflate": "^0.4.8" - }, - "optionalDependencies": { - "canvg": "^3.0.6", - "core-js": "^3.6.0", - "dompurify": "^2.2.0", - "html2canvas": "^1.0.0-rc.5" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" - }, - "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "dependencies": { - "language-subtag-registry": "~0.3.2" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "node_modules/next": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.4.tgz", - "integrity": "sha512-C5S0ysM0Ily9McL4Jb48nOQHT1BukOWI59uC3X/xCMlYIh9rJZCv7nzG92J6e1cOBqQbKovlpgvHWFmz4eKKEA==", - "dependencies": { - "@next/env": "13.4.4", - "@swc/helpers": "0.5.1", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "zod": "3.21.4" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=16.8.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.4", - "@next/swc-darwin-x64": "13.4.4", - "@next/swc-linux-arm64-gnu": "13.4.4", - "@next/swc-linux-arm64-musl": "13.4.4", - "@next/swc-linux-x64-gnu": "13.4.4", - "@next/swc-linux-x64-musl": "13.4.4", - "@next/swc-win32-arm64-msvc": "13.4.4", - "@next/swc-win32-ia32-msvc": "13.4.4", - "@next/swc-win32-x64-msvc": "13.4.4" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "fibers": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", - "dependencies": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "optional": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/prettier-plugin-organize-imports": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.2.tgz", - "integrity": "sha512-e97lE6odGSiHonHJMTYC0q0iLXQyw0u5z/PJpvP/3vRy6/Zi9kLBwFAbEGjDzIowpjQv8b+J04PDamoUSQbzGA==", - "peerDependencies": { - "@volar/vue-language-plugin-pug": "^1.0.4", - "@volar/vue-typescript": "^1.0.4", - "prettier": ">=2.0", - "typescript": ">=2.9" - }, - "peerDependenciesMeta": { - "@volar/vue-language-plugin-pug": { - "optional": true - }, - "@volar/vue-typescript": { - "optional": true - } - } - }, - "node_modules/prettier-plugin-tailwindcss": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.3.0.tgz", - "integrity": "sha512-009/Xqdy7UmkcTBpwlq7jsViDqXAYSOMLDrHAdTMlVZOrKfM2o9Ci7EMWTMZ7SkKBFTG04UM9F9iM2+4i6boDA==", - "engines": { - "node": ">=12.17.0" - }, - "peerDependencies": { - "@ianvs/prettier-plugin-sort-imports": "*", - "@prettier/plugin-pug": "*", - "@shopify/prettier-plugin-liquid": "*", - "@shufo/prettier-plugin-blade": "*", - "@trivago/prettier-plugin-sort-imports": "*", - "prettier": ">=2.2.0", - "prettier-plugin-astro": "*", - "prettier-plugin-css-order": "*", - "prettier-plugin-import-sort": "*", - "prettier-plugin-jsdoc": "*", - "prettier-plugin-marko": "*", - "prettier-plugin-organize-attributes": "*", - "prettier-plugin-organize-imports": "*", - "prettier-plugin-style-order": "*", - "prettier-plugin-svelte": "*", - "prettier-plugin-twig-melody": "*" - }, - "peerDependenciesMeta": { - "@ianvs/prettier-plugin-sort-imports": { - "optional": true - }, - "@prettier/plugin-pug": { - "optional": true - }, - "@shopify/prettier-plugin-liquid": { - "optional": true - }, - "@shufo/prettier-plugin-blade": { - "optional": true - }, - "@trivago/prettier-plugin-sort-imports": { - "optional": true - }, - "prettier-plugin-astro": { - "optional": true - }, - "prettier-plugin-css-order": { - "optional": true - }, - "prettier-plugin-import-sort": { - "optional": true - }, - "prettier-plugin-jsdoc": { - "optional": true - }, - "prettier-plugin-marko": { - "optional": true - }, - "prettier-plugin-organize-attributes": { - "optional": true - }, - "prettier-plugin-organize-imports": { - "optional": true - }, - "prettier-plugin-style-order": { - "optional": true - }, - "prettier-plugin-svelte": { - "optional": true - }, - "prettier-plugin-twig-melody": { - "optional": true - } - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "optional": true, - "dependencies": { - "performance-now": "^2.1.0" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-infinite-scroll-component": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-infinite-scroll-component/-/react-infinite-scroll-component-6.1.0.tgz", - "integrity": "sha512-SQu5nCqy8DxQWpnUVLx7V7b7LcA37aM7tvoWjTLZp1dk6EJibM5/4EJKzOnl07/BsM1Y40sKLuqjCwwH/xV0TQ==", - "dependencies": { - "throttle-debounce": "^2.1.0" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-spinners": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.13.8.tgz", - "integrity": "sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==", - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rgbcolor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", - "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==", - "optional": true, - "engines": { - "node": ">= 0.8.15" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-applescript/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", - "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackblur-canvas": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.6.0.tgz", - "integrity": "sha512-8S1aIA+UoF6erJYnglGPug6MaHYGo1Ot7h5fuXx4fUPvcvQfcdw2o/ppCse63+eZf8PPidSu4v1JnmEVtEDnpg==", - "optional": true, - "engines": { - "node": ">=0.1.14" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/sucrase": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", - "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-pathdata": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", - "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", - "optional": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/synckit": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", - "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", - "dependencies": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/synckit/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" - }, - "node_modules/tailwindcss": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", - "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/text-segmentation": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", - "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", - "optional": true, - "dependencies": { - "utrie": "^1.0.2" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/throttle-debounce": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz", - "integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/titleize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", - "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-clipboard-api": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/use-clipboard-api/-/use-clipboard-api-0.3.4.tgz", - "integrity": "sha512-LF9lREFNhCgL6X+kW7gd7xYKG5gQgnBeyp01a7+vNkzrFTYRVTKM4aYdAngGjDJvc4SYMc8uONmCwZNrb9lkGQ==", - "peerDependencies": { - "react": ">=16.0.0" - } - }, - "node_modules/usehooks-ts": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-2.9.1.tgz", - "integrity": "sha512-2FAuSIGHlY+apM9FVlj8/oNhd+1y+Uwv5QNkMQz1oSfdHk4PXo1qoCw9I5M7j0vpH8CSWFJwXbVPeYDjLCx9PA==", - "engines": { - "node": ">=16.15.0", - "npm": ">=8" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utrie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", - "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", - "optional": true, - "dependencies": { - "base64-arraybuffer": "^1.0.2" - } - }, - "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", - "dependencies": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/websocket/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/websocket/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", - "engines": { - "node": ">=0.10.32" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - }, - "dependencies": { - "@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" - }, - "@babel/runtime": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz", - "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==", - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==" - }, - "@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.2", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", - "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==" - }, - "@fortawesome/fontawesome-common-types": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", - "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==" - }, - "@fortawesome/fontawesome-svg-core": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz", - "integrity": "sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==", - "requires": { - "@fortawesome/fontawesome-common-types": "6.4.2" - }, - "dependencies": { - "@fortawesome/fontawesome-common-types": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz", - "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==" - } - } - }, - "@fortawesome/free-brands-svg-icons": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.4.2.tgz", - "integrity": "sha512-LKOwJX0I7+mR/cvvf6qIiqcERbdnY+24zgpUSouySml+5w8B4BJOx8EhDR/FTKAu06W12fmUIcv6lzPSwYKGGg==", - "requires": { - "@fortawesome/fontawesome-common-types": "6.4.2" - }, - "dependencies": { - "@fortawesome/fontawesome-common-types": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz", - "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==" - } - } - }, - "@fortawesome/free-solid-svg-icons": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", - "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", - "requires": { - "@fortawesome/fontawesome-common-types": "6.4.0" - } - }, - "@fortawesome/react-fontawesome": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", - "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", - "requires": { - "prop-types": "^15.8.1" - } - }, - "@headlessui/react": { - "version": "1.7.17", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.17.tgz", - "integrity": "sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow==", - "requires": { - "client-only": "^0.0.1" - } - }, - "@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - } - } - }, - "@next/env": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.4.tgz", - "integrity": "sha512-q/y7VZj/9YpgzDe64Zi6rY1xPizx80JjlU2BTevlajtaE3w1LqweH1gGgxou2N7hdFosXHjGrI4OUvtFXXhGLg==" - }, - "@next/eslint-plugin-next": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.4.tgz", - "integrity": "sha512-5jnh7q6I15efnjR/rR+/TGTc9hn53g3JTbEjAMjmeQiExKqEUgIXqrHI5zlTNlNyzCPkBB860/ctxXheZaF2Vw==", - "requires": { - "glob": "7.1.7" - }, - "dependencies": { - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "@next/swc-darwin-arm64": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.4.tgz", - "integrity": "sha512-xfjgXvp4KalNUKZMHmsFxr1Ug+aGmmO6NWP0uoh4G3WFqP/mJ1xxfww0gMOeMeSq/Jyr5k7DvoZ2Pv+XOITTtw==", - "optional": true - }, - "@next/swc-darwin-x64": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.4.tgz", - "integrity": "sha512-ZY9Ti1hkIwJsxGus3nlubIkvYyB0gNOYxKrfsOrLEqD0I2iCX8D7w8v6QQZ2H+dDl6UT29oeEUdDUNGk4UEpfg==", - "optional": true - }, - "@next/swc-linux-arm64-gnu": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.4.tgz", - "integrity": "sha512-+KZnDeMShYkpkqAvGCEDeqYTRADJXc6SY1jWXz+Uo6qWQO/Jd9CoyhTJwRSxvQA16MoYzvILkGaDqirkRNctyA==", - "optional": true - }, - "@next/swc-linux-arm64-musl": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.4.tgz", - "integrity": "sha512-evC1twrny2XDT4uOftoubZvW3EG0zs0ZxMwEtu/dDGVRO5n5pT48S8qqEIBGBUZYu/Xx4zzpOkIxx1vpWdE+9A==", - "optional": true - }, - "@next/swc-linux-x64-gnu": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.4.tgz", - "integrity": "sha512-PX706XcCHr2FfkyhP2lpf+pX/tUvq6/ke7JYnnr0ykNdEMo+sb7cC/o91gnURh4sPYSiZJhsF2gbIqg9rciOHQ==", - "optional": true - }, - "@next/swc-linux-x64-musl": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.4.tgz", - "integrity": "sha512-TKUUx3Ftd95JlHV6XagEnqpT204Y+IsEa3awaYIjayn0MOGjgKZMZibqarK3B1FsMSPaieJf2FEAcu9z0yT5aA==", - "optional": true - }, - "@next/swc-win32-arm64-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.4.tgz", - "integrity": "sha512-FP8AadgSq4+HPtim7WBkCMGbhr5vh9FePXiWx9+YOdjwdQocwoCK5ZVC3OW8oh3TWth6iJ0AXJ/yQ1q1cwSZ3A==", - "optional": true - }, - "@next/swc-win32-ia32-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.4.tgz", - "integrity": "sha512-3WekVmtuA2MCdcAOrgrI+PuFiFURtSyyrN1I3UPtS0ckR2HtLqyqmS334Eulf15g1/bdwMteePdK363X/Y9JMg==", - "optional": true - }, - "@next/swc-win32-x64-msvc": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.4.tgz", - "integrity": "sha512-AHRITu/CrlQ+qzoqQtEMfaTu7GHaQ6bziQln/pVWpOYC1wU+Mq6VQQFlsDtMCnDztPZtppAXdvvbNS7pcfRzlw==", - "optional": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@pkgr/utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.1.tgz", - "integrity": "sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w==", - "requires": { - "cross-spawn": "^7.0.3", - "fast-glob": "^3.2.12", - "is-glob": "^4.0.3", - "open": "^9.1.0", - "picocolors": "^1.0.0", - "tslib": "^2.5.0" - }, - "dependencies": { - "tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" - } - } - }, - "@rushstack/eslint-patch": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.0.tgz", - "integrity": "sha512-IthPJsJR85GhOkp3Hvp8zFOPK5ynKn6STyHa/WZpioK7E1aYDiBzpqQPrngc14DszIUkIrdd3k9Iu0XSzlP/1w==" - }, - "@supabase/auth-helpers-nextjs": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@supabase/auth-helpers-nextjs/-/auth-helpers-nextjs-0.7.4.tgz", - "integrity": "sha512-MyGCkB7LEDcGrKmesKGjyG54Jlbiss8VGTegrNde/ywXujQyRFnzycijoASDBc6i9SmE7eE1qWBsMr2URb07nw==", - "requires": { - "@supabase/auth-helpers-shared": "0.4.1", - "set-cookie-parser": "^2.6.0" - } - }, - "@supabase/auth-helpers-shared": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@supabase/auth-helpers-shared/-/auth-helpers-shared-0.4.1.tgz", - "integrity": "sha512-IEDX9JzWkIjQiLUaP4Qy5YDiG0jFQatWfS+jw8cCQs6QfbNdEPd2Y3qonwGHnM90CZom9SvjuylBv2pFVAL7Lw==", - "requires": { - "jose": "^4.14.3" - } - }, - "@supabase/functions-js": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.1.2.tgz", - "integrity": "sha512-QCR6pwJs9exCl37bmpMisUd6mf+0SUBJ6mUpiAjEkSJ/+xW8TCuO14bvkWHADd5hElJK9MxNlMQXxSA4DRz9nQ==", - "requires": { - "cross-fetch": "^3.1.5" - } - }, - "@supabase/gotrue-js": { - "version": "2.47.0", - "resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-2.47.0.tgz", - "integrity": "sha512-3e34/vsKH/DoSZCpB85UZpFWSJ2p4GRUUlqgAgeTPagPlx4xS+Nc5v7g7ic7vp3gK0J5PsYVCn9Qu2JQUp4vXg==", - "requires": { - "cross-fetch": "^3.1.5" - } - }, - "@supabase/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-rEHQaDVzxLZMCK3p+JW2nzEsK4AJpOQhetppaqAzrFum0Ub8wcnoM/8f1dWRZSulY5fRDP6rJaWT/8X3VleCzg==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "@supabase/postgrest-js": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.8.1.tgz", - "integrity": "sha512-tCBPb5vp0NTQRWRkx1Sjcais3WIp79BuFdenzp852UXxFNJ04RLoyE9IxqjWQQHzHF0ot1V7Uzf1nHDk7DsYdg==", - "requires": { - "@supabase/node-fetch": "^2.6.13" - } - }, - "@supabase/realtime-js": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.7.4.tgz", - "integrity": "sha512-FzSzs1k9ruh/uds5AJ95Nc3beiMCCIhougExJ3O98CX1LMLAKUKFy5FivKLvcNhXnNfUEL0XUfGMb4UH2J7alg==", - "requires": { - "@types/phoenix": "^1.5.4", - "@types/websocket": "^1.0.3", - "websocket": "^1.0.34" - } - }, - "@supabase/storage-js": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.5.1.tgz", - "integrity": "sha512-nkR0fQA9ScAtIKA3vNoPEqbZv1k5B5HVRYEvRWdlP6mUpFphM9TwPL2jZ/ztNGMTG5xT6SrHr+H7Ykz8qzbhjw==", - "requires": { - "cross-fetch": "^3.1.5" - } - }, - "@supabase/supabase-js": { - "version": "2.33.1", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.33.1.tgz", - "integrity": "sha512-jA00rquPTppPOHpBB6KABW98lfg0gYXcuGqP3TB1iiduznRVsi3GGk2qBKXPDLMYSe0kRlQp5xCwWWthaJr8eA==", - "requires": { - "@supabase/functions-js": "^2.1.0", - "@supabase/gotrue-js": "^2.46.1", - "@supabase/postgrest-js": "^1.8.0", - "@supabase/realtime-js": "^2.7.4", - "@supabase/storage-js": "^2.5.1", - "cross-fetch": "^3.1.5" - } - }, - "@swc/helpers": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", - "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", - "requires": { - "tslib": "^2.4.0" - }, - "dependencies": { - "tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" - } - } - }, - "@tailwindcss/forms": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz", - "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==", - "requires": { - "mini-svg-data-uri": "^1.2.3" - } - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" - }, - "@types/node": { - "version": "20.2.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", - "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" - }, - "@types/phoenix": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.0.tgz", - "integrity": "sha512-qwfpsHmFuhAS/dVd4uBIraMxRd56vwBUYQGZ6GpXnFuM2XMRFJbIyruFKKlW2daQliuYZwe0qfn/UjFCDKic5g==" - }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "@types/raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-taW5/WYqo36N7V39oYyHP9Ipfd5pNFvGTIQsNGj86xV88YQ7GnI30/yMfKDF7Zgin0m3e+ikX88FvImnK4RjGw==", - "optional": true - }, - "@types/react": { - "version": "18.2.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.8.tgz", - "integrity": "sha512-lTyWUNrd8ntVkqycEEplasWy2OxNlShj3zqS0LuB1ENUGis5HodmhM7DtCoUGbxj3VW/WsGA0DUhpG6XrM7gPA==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "18.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz", - "integrity": "sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==", - "requires": { - "@types/react": "*" - } - }, - "@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" - }, - "@types/uuid": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.2.tgz", - "integrity": "sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ==", - "dev": true - }, - "@types/websocket": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.5.tgz", - "integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==", - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/parser": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", - "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", - "requires": { - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", - "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", - "requires": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8" - } - }, - "@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==" - }, - "@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", - "requires": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", - "requires": { - "@typescript-eslint/types": "5.59.8", - "eslint-visitor-keys": "^3.3.0" - } - }, - "@vercel/analytics": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.0.2.tgz", - "integrity": "sha512-BZFxVrv24VbNNl5xMxqUojQIegEeXMI6rX3rg1uVLYUEXsuKNBSAEQf4BWEcjQDp/8aYJOj6m8V4PUA3x/cxgg==" - }, - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "requires": { - "deep-equal": "^2.0.5" - } - }, - "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - } - }, - "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, - "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - } - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", - "requires": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" - }, - "axe-core": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", - "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==" - }, - "axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", - "requires": { - "deep-equal": "^2.0.5" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "optional": true - }, - "big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "requires": { - "big-integer": "^1.6.44" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", - "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", - "requires": { - "caniuse-lite": "^1.0.30001489", - "electron-to-chromium": "^1.4.411", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" - } - }, - "btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==" - }, - "bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "bundle-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", - "requires": { - "run-applescript": "^5.0.0" - } - }, - "busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "requires": { - "streamsearch": "^1.1.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" - }, - "caniuse-lite": { - "version": "1.0.30001494", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001494.tgz", - "integrity": "sha512-sY2B5Qyl46ZzfYDegrl8GBCzdawSLT4ThM9b9F+aDYUrAG2zCOyMbd2Tq34mS1g4ZKBfjRlzOohQMxx28x6wJg==" - }, - "canvg": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.10.tgz", - "integrity": "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==", - "optional": true, - "requires": { - "@babel/runtime": "^7.12.5", - "@types/raf": "^3.4.0", - "core-js": "^3.8.3", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.7", - "rgbcolor": "^1.0.1", - "stackblur-canvas": "^2.0.0", - "svg-pathdata": "^6.0.3" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "core-js": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz", - "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==", - "optional": true - }, - "cross-fetch": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", - "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", - "requires": { - "node-fetch": "^2.6.11" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-line-break": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", - "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", - "optional": true, - "requires": { - "utrie": "^1.0.2" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "deep-equal": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", - "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", - "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.0", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "default-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", - "requires": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" - } - }, - "default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "requires": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - } - }, - "define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==" - }, - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { - "path-type": "^4.0.0" - } - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "requires": { - "esutils": "^2.0.2" - } - }, - "dompurify": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", - "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==", - "optional": true - }, - "electron-to-chromium": { - "version": "1.4.419", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.419.tgz", - "integrity": "sha512-jdie3RiEgygvDTyS2sgjq71B36q2cDSBfPlwzUyuOrfYTNoYWyBxxjGJV/HAu3A2hB0Y+HesvCVkVAFoCKwCSw==" - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "enhanced-resolve": { - "version": "5.14.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", - "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "requires": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - } - }, - "es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - } - }, - "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "requires": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "eslint": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", - "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - } - }, - "eslint-config-next": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.4.tgz", - "integrity": "sha512-z/PMbm6L0iC/fwISULxe8IVy4DtNqZk2wQY711o35klenq70O6ns82A8yuMVCFjHC0DIyB2lyugesRtuk9u8dQ==", - "requires": { - "@next/eslint-plugin-next": "13.4.4", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.42.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "^4.5.0" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-import-resolver-typescript": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", - "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", - "requires": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "get-tsconfig": "^4.5.0", - "globby": "^13.1.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "synckit": "^0.8.5" - }, - "dependencies": { - "globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" - } - } - }, - "eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "^2.0.2" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", - "requires": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "requires": {} - }, - "eslint-plugin-tailwindcss": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-tailwindcss/-/eslint-plugin-tailwindcss-3.12.1.tgz", - "integrity": "sha512-LyIRV0rx6prTpJZsSCXSNJ34Yry3Nj9OJwvzh1xTsiG6+UCnAPW1Bx41s7vZzUDKMlwFgpUN9Me+NK12T4DHYg==", - "requires": { - "fast-glob": "^3.2.5", - "postcss": "^8.4.4" - } - }, - "eslint-plugin-unused-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", - "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", - "requires": { - "eslint-rule-composer": "^0.3.0" - } - }, - "eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==" - }, - "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==" - }, - "espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "dependencies": { - "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==" - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "requires": { - "path-key": "^4.0.0" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" - } - } - }, - "ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "requires": { - "type": "^2.7.2" - }, - "dependencies": { - "type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "fflate": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", - "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - }, - "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "get-tsconfig": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.6.0.tgz", - "integrity": "sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg==", - "requires": { - "resolve-pkg-maps": "^1.0.0" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "requires": { - "type-fest": "^0.20.2" - } - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "requires": { - "define-properties": "^1.1.3" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "html2canvas": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", - "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", - "optional": true, - "requires": { - "css-line-break": "^2.1.0", - "text-segmentation": "^1.0.3" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" - }, - "is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "requires": { - "is-docker": "^3.0.0" - } - }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==" - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - }, - "dependencies": { - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" - } - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "jiti": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", - "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==" - }, - "jose": { - "version": "4.14.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", - "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - }, - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "requires": { - "minimist": "^1.2.0" - } - }, - "jspdf": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz", - "integrity": "sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA==", - "requires": { - "@babel/runtime": "^7.14.0", - "atob": "^2.1.2", - "btoa": "^1.2.1", - "canvg": "^3.0.6", - "core-js": "^3.6.0", - "dompurify": "^2.2.0", - "fflate": "^0.4.8", - "html2canvas": "^1.0.0-rc.5" - } - }, - "jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "requires": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - } - }, - "language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" - }, - "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "requires": { - "language-subtag-registry": "~0.3.2" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "next": { - "version": "13.4.4", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.4.tgz", - "integrity": "sha512-C5S0ysM0Ily9McL4Jb48nOQHT1BukOWI59uC3X/xCMlYIh9rJZCv7nzG92J6e1cOBqQbKovlpgvHWFmz4eKKEA==", - "requires": { - "@next/env": "13.4.4", - "@next/swc-darwin-arm64": "13.4.4", - "@next/swc-darwin-x64": "13.4.4", - "@next/swc-linux-arm64-gnu": "13.4.4", - "@next/swc-linux-arm64-musl": "13.4.4", - "@next/swc-linux-x64-gnu": "13.4.4", - "@next/swc-linux-x64-musl": "13.4.4", - "@next/swc-win32-arm64-msvc": "13.4.4", - "@next/swc-win32-ia32-msvc": "13.4.4", - "@next/swc-win32-x64-msvc": "13.4.4", - "@swc/helpers": "0.5.1", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.14", - "styled-jsx": "5.1.1", - "zod": "3.21.4" - }, - "dependencies": { - "postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - } - } - }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==" - }, - "node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", - "requires": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "optional": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" - }, - "postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "requires": { - "camelcase-css": "^2.0.1" - } - }, - "postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - } - }, - "postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "requires": { - "postcss-selector-parser": "^6.0.11" - } - }, - "postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==" - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "requires": { - "fast-diff": "^1.1.2" - } - }, - "prettier-plugin-organize-imports": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.2.tgz", - "integrity": "sha512-e97lE6odGSiHonHJMTYC0q0iLXQyw0u5z/PJpvP/3vRy6/Zi9kLBwFAbEGjDzIowpjQv8b+J04PDamoUSQbzGA==", - "requires": {} - }, - "prettier-plugin-tailwindcss": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.3.0.tgz", - "integrity": "sha512-009/Xqdy7UmkcTBpwlq7jsViDqXAYSOMLDrHAdTMlVZOrKfM2o9Ci7EMWTMZ7SkKBFTG04UM9F9iM2+4i6boDA==", - "requires": {} - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "optional": true, - "requires": { - "performance-now": "^2.1.0" - } - }, - "react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - } - }, - "react-infinite-scroll-component": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-infinite-scroll-component/-/react-infinite-scroll-component-6.1.0.tgz", - "integrity": "sha512-SQu5nCqy8DxQWpnUVLx7V7b7LcA37aM7tvoWjTLZp1dk6EJibM5/4EJKzOnl07/BsM1Y40sKLuqjCwwH/xV0TQ==", - "requires": { - "throttle-debounce": "^2.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "react-spinners": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.13.8.tgz", - "integrity": "sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==", - "requires": {} - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "requires": { - "pify": "^2.3.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { - "picomatch": "^2.2.1" - } - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - } - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - }, - "resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rgbcolor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", - "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==", - "optional": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", - "requires": { - "execa": "^5.0.0" - }, - "dependencies": { - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "set-cookie-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", - "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - }, - "stackblur-canvas": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.6.0.tgz", - "integrity": "sha512-8S1aIA+UoF6erJYnglGPug6MaHYGo1Ot7h5fuXx4fUPvcvQfcdw2o/ppCse63+eZf8PPidSu4v1JnmEVtEDnpg==", - "optional": true - }, - "stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "requires": { - "internal-slot": "^1.0.4" - } - }, - "streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" - }, - "string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - } - }, - "string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - }, - "styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "requires": { - "client-only": "0.0.1" - } - }, - "sucrase": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", - "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "svg-pathdata": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", - "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", - "optional": true - }, - "synckit": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", - "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", - "requires": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" - }, - "dependencies": { - "tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" - } - } - }, - "tailwindcss": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", - "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", - "requires": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" - }, - "text-segmentation": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", - "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", - "optional": true, - "requires": { - "utrie": "^1.0.2" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "throttle-debounce": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz", - "integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==" - }, - "titleize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "requires": { - "tslib": "^1.8.1" - } - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", - "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==" - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==" - }, - "update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "use-clipboard-api": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/use-clipboard-api/-/use-clipboard-api-0.3.4.tgz", - "integrity": "sha512-LF9lREFNhCgL6X+kW7gd7xYKG5gQgnBeyp01a7+vNkzrFTYRVTKM4aYdAngGjDJvc4SYMc8uONmCwZNrb9lkGQ==", - "requires": {} - }, - "usehooks-ts": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-2.9.1.tgz", - "integrity": "sha512-2FAuSIGHlY+apM9FVlj8/oNhd+1y+Uwv5QNkMQz1oSfdHk4PXo1qoCw9I5M7j0vpH8CSWFJwXbVPeYDjLCx9PA==", - "requires": {} - }, - "utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "utrie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", - "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", - "optional": true, - "requires": { - "base64-arraybuffer": "^1.0.2" - } - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", - "requires": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } - }, - "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==" - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - }, - "zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==" - } - } -} diff --git a/packages/web/package.json b/packages/web/package.json index 130af867..afb66ffc 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -39,6 +39,8 @@ "react-dom": "18.2.0", "react-infinite-scroll-component": "^6.1.0", "react-spinners": "^0.13.8", + "sass": "^1.69.5", + "scss": "^0.2.4", "tailwindcss": "3.3.2", "typescript": "5.1.3", "use-clipboard-api": "^0.3.4", diff --git a/packages/web/public/photos/Sawt.png b/packages/web/public/photos/Sawt.png new file mode 100644 index 00000000..41e52dc7 Binary files /dev/null and b/packages/web/public/photos/Sawt.png differ diff --git a/packages/web/tailwind.config.js b/packages/web/tailwind.config.js index 4944dee0..70b494df 100644 --- a/packages/web/tailwind.config.js +++ b/packages/web/tailwind.config.js @@ -7,10 +7,11 @@ module.exports = { theme: { extend: { colors: { - primary: "#16054D", // Dark blue - secondary: "#61B0E0", // Sky blue - blue: "#D6FFFD", // Light blue - purple: "#726CDA", + primary: "black", // black + secondary: "#e1e1da", // beige + blue: "#e1e1da", // beige + purple: "#1c1919", + orange: "#f35610", }, fontFamily: { body: ["Roboto", "sans-serif"], diff --git a/packages/web/yarn.lock b/packages/web/yarn.lock index d2dee2d1..ec64efdf 100644 --- a/packages/web/yarn.lock +++ b/packages/web/yarn.lock @@ -56,7 +56,7 @@ resolved "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz" integrity sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA== -"@fortawesome/fontawesome-svg-core@^6.4.2", "@fortawesome/fontawesome-svg-core@~1 || ~6": +"@fortawesome/fontawesome-svg-core@^6.4.2": version "6.4.2" resolved "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz" integrity sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg== @@ -129,16 +129,16 @@ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - "@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" @@ -161,9 +161,49 @@ "@next/swc-darwin-arm64@13.4.4": version "13.4.4" - resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.4.tgz" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.4.tgz#8c14083c2478e2a9a8d140cce5900f76b75667ff" integrity sha512-xfjgXvp4KalNUKZMHmsFxr1Ug+aGmmO6NWP0uoh4G3WFqP/mJ1xxfww0gMOeMeSq/Jyr5k7DvoZ2Pv+XOITTtw== +"@next/swc-darwin-x64@13.4.4": + version "13.4.4" + resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.4.tgz" + integrity sha512-ZY9Ti1hkIwJsxGus3nlubIkvYyB0gNOYxKrfsOrLEqD0I2iCX8D7w8v6QQZ2H+dDl6UT29oeEUdDUNGk4UEpfg== + +"@next/swc-linux-arm64-gnu@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.4.tgz#f2e071f38e8a6cdadf507cc5d28956f73360d064" + integrity sha512-+KZnDeMShYkpkqAvGCEDeqYTRADJXc6SY1jWXz+Uo6qWQO/Jd9CoyhTJwRSxvQA16MoYzvILkGaDqirkRNctyA== + +"@next/swc-linux-arm64-musl@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.4.tgz#23bf75c544e54562bc24ec1be036e4bd9cf89e2c" + integrity sha512-evC1twrny2XDT4uOftoubZvW3EG0zs0ZxMwEtu/dDGVRO5n5pT48S8qqEIBGBUZYu/Xx4zzpOkIxx1vpWdE+9A== + +"@next/swc-linux-x64-gnu@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.4.tgz#bd42590950a01957952206f89cf5622e7c9e4196" + integrity sha512-PX706XcCHr2FfkyhP2lpf+pX/tUvq6/ke7JYnnr0ykNdEMo+sb7cC/o91gnURh4sPYSiZJhsF2gbIqg9rciOHQ== + +"@next/swc-linux-x64-musl@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.4.tgz#907d81feb1abec3daec0ecb61e3f39b56e7aeafe" + integrity sha512-TKUUx3Ftd95JlHV6XagEnqpT204Y+IsEa3awaYIjayn0MOGjgKZMZibqarK3B1FsMSPaieJf2FEAcu9z0yT5aA== + +"@next/swc-win32-arm64-msvc@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.4.tgz#1d754d2bb10bdf9907c0acc83711438697c3b5fe" + integrity sha512-FP8AadgSq4+HPtim7WBkCMGbhr5vh9FePXiWx9+YOdjwdQocwoCK5ZVC3OW8oh3TWth6iJ0AXJ/yQ1q1cwSZ3A== + +"@next/swc-win32-ia32-msvc@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.4.tgz#77b2c7f7534b675d46e46301869e08d504d23956" + integrity sha512-3WekVmtuA2MCdcAOrgrI+PuFiFURtSyyrN1I3UPtS0ckR2HtLqyqmS334Eulf15g1/bdwMteePdK363X/Y9JMg== + +"@next/swc-win32-x64-msvc@13.4.4": + version "13.4.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.4.tgz#faab69239f8a9d0be7cd473e65f5a07735ef7b0e" + integrity sha512-AHRITu/CrlQ+qzoqQtEMfaTu7GHaQ6bziQln/pVWpOYC1wU+Mq6VQQFlsDtMCnDztPZtppAXdvvbNS7pcfRzlw== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -172,7 +212,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -261,7 +301,7 @@ dependencies: cross-fetch "^3.1.5" -"@supabase/supabase-js@^2.19.0", "@supabase/supabase-js@^2.32.0": +"@supabase/supabase-js@^2.32.0": version "2.33.1" resolved "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.33.1.tgz" integrity sha512-jA00rquPTppPOHpBB6KABW98lfg0gYXcuGqP3TB1iiduznRVsi3GGk2qBKXPDLMYSe0kRlQp5xCwWWthaJr8eA== @@ -399,7 +439,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.8.0: +acorn@^8.8.0: version "8.8.2" resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -592,7 +632,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.5, "browserslist@>= 4.21.0": +browserslist@^4.21.5: version "4.21.7" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz" integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== @@ -647,9 +687,9 @@ camelcase-css@^2.0.1: integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001489: - version "1.0.30001494" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001494.tgz" - integrity sha512-sY2B5Qyl46ZzfYDegrl8GBCzdawSLT4ThM9b9F+aDYUrAG2zCOyMbd2Tq34mS1g4ZKBfjRlzOohQMxx28x6wJg== + version "1.0.30001574" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001574.tgz" + integrity sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg== canvg@^3.0.6: version "3.0.10" @@ -673,7 +713,7 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chokidar@^3.5.3: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -688,7 +728,7 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" -client-only@^0.0.1, client-only@0.0.1: +client-only@0.0.1, client-only@^0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== @@ -753,7 +793,7 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== -d@^1.0.1, d@1: +d@1, d@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz" integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== @@ -893,7 +933,7 @@ emoji-regex@^9.2.2: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -encoding@^0.1.0, encoding@^0.1.13: +encoding@^0.1.13: version "0.1.13" resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -1069,7 +1109,7 @@ eslint-module-utils@^2.7.4: dependencies: debug "^3.2.7" -eslint-plugin-import@*, eslint-plugin-import@^2.26.0: +eslint-plugin-import@^2.26.0: version "2.27.5" resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== @@ -1178,7 +1218,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== -eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.23.0 || ^8.0.0", eslint@^8.0.0, eslint@>=7.28.0, eslint@8.42.0: +eslint@8.42.0: version "8.42.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz" integrity sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A== @@ -1443,7 +1483,7 @@ get-tsconfig@^4.5.0: dependencies: resolve-pkg-maps "^1.0.0" -glob-parent@^5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -1457,25 +1497,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@7.1.6: version "7.1.6" resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" @@ -1500,6 +1521,18 @@ glob@7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + globals@^13.19.0: version "13.20.0" resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" @@ -1625,6 +1658,11 @@ ignore@^5.2.0: resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +immutable@^4.0.0: + version "4.3.4" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz" + integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== + import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" @@ -2039,16 +2077,16 @@ moment@^2.29.4: resolved "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz" integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== -ms@^2.1.1, ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@2.1.2, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + mz@^2.7.0: version "2.7.0" resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" @@ -2210,6 +2248,11 @@ object.values@^1.1.6: define-properties "^1.1.4" es-abstract "^1.20.4" +ometa@0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/ometa/-/ometa-0.2.2.tgz" + integrity sha512-LZuoK/yjU3FvrxPjUXUlZ1bavCfBPqauA7fsNdwi+AVhRdyk2IzgP3JRnevvjzQ6fKHdUw8YISshf53FmpHrng== + once@^1.3.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" @@ -2373,15 +2416,6 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.4, postcss@>=8.0.9, postcss@8.4.24: - version "8.4.24" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz" - integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - postcss@8.4.14: version "8.4.14" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz" @@ -2391,6 +2425,15 @@ postcss@8.4.14: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@8.4.24, postcss@^8.4.23, postcss@^8.4.4: + version "8.4.24" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz" + integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" @@ -2403,7 +2446,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier-plugin-organize-imports@*, prettier-plugin-organize-imports@^3.2.2: +prettier-plugin-organize-imports@^3.2.2: version "3.2.2" resolved "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.2.tgz" integrity sha512-e97lE6odGSiHonHJMTYC0q0iLXQyw0u5z/PJpvP/3vRy6/Zi9kLBwFAbEGjDzIowpjQv8b+J04PDamoUSQbzGA== @@ -2413,7 +2456,7 @@ prettier-plugin-tailwindcss@^0.3.0: resolved "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.3.0.tgz" integrity sha512-009/Xqdy7UmkcTBpwlq7jsViDqXAYSOMLDrHAdTMlVZOrKfM2o9Ci7EMWTMZ7SkKBFTG04UM9F9iM2+4i6boDA== -prettier@^2.8.8, prettier@>=2.0, prettier@>=2.0.0, prettier@>=2.2.0: +prettier@^2.8.8: version "2.8.8" resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== @@ -2444,7 +2487,7 @@ raf@^3.4.1: dependencies: performance-now "^2.1.0" -"react-dom@^16 || ^17 || ^18", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", react-dom@^18.2.0, react-dom@18.2.0: +react-dom@18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== @@ -2469,7 +2512,7 @@ react-spinners@^0.13.8: resolved "https://registry.npmjs.org/react-spinners/-/react-spinners-0.13.8.tgz" integrity sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA== -"react@^16 || ^17 || ^18", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", react@^18.2.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.0.0, react@>=16.3, react@18.2.0: +react@18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== @@ -2577,6 +2620,15 @@ safe-regex-test@^1.0.0: resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sass@^1.69.5: + version "1.69.5" + resolved "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz" + integrity sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + scheduler@^0.23.0: version "0.23.0" resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" @@ -2584,6 +2636,13 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" +scss@^0.2.4: + version "0.2.4" + resolved "https://registry.npmjs.org/scss/-/scss-0.2.4.tgz" + integrity sha512-4u8V87F+Q/upVhUmhPnB4C1R11xojkRkWjExL2v0CX2EXTg18VrKd+9JWoeyCp2VEMdSpJsyAvVU+rVjogh51A== + dependencies: + ometa "0.2.2" + semver@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" @@ -2637,7 +2696,7 @@ slash@^4.0.0: resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== -source-map-js@^1.0.2: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -2772,7 +2831,7 @@ synckit@^0.8.5: "@pkgr/utils" "^2.3.1" tslib "^2.5.0" -tailwindcss@^3.3.2, "tailwindcss@>=3.0.0 || >= 3.0.0-alpha.1", tailwindcss@3.3.2: +tailwindcss@3.3.2: version "3.3.2" resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz" integrity sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w== @@ -2874,12 +2933,7 @@ tslib@^1.8.1: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.4.0: - version "2.5.3" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz" - integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== - -tslib@^2.5.0: +tslib@^2.4.0, tslib@^2.5.0: version "2.5.3" resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz" integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== @@ -2929,7 +2983,7 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -"typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=2.9, typescript@>=3.3.1, typescript@5.1.3: +typescript@5.1.3: version "5.1.3" resolved "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz" integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== diff --git a/packages/whisper/long_transcription.ipynb b/packages/whisper/archive/long_transcription.ipynb similarity index 100% rename from packages/whisper/long_transcription.ipynb rename to packages/whisper/archive/long_transcription.ipynb diff --git a/packages/whisper/archive/src-diarization.py b/packages/whisper/archive/src-diarization.py new file mode 100644 index 00000000..d29b9485 --- /dev/null +++ b/packages/whisper/archive/src-diarization.py @@ -0,0 +1,389 @@ +import os +import yaml +import argparse +import face_recognition +import cv2 +import pandas as pd +from pydub import AudioSegment +from pytube import YouTube + +from transformers import pipeline +from pyannote.audio import Pipeline +import torch +from moviepy.editor import VideoFileClip + + +def load_config(config_file): + try: + with open(config_file, "r") as stream: + config = yaml.safe_load(stream) + return config + except FileNotFoundError: + print(f"Config file '{config_file}' not found.") + return None + except yaml.YAMLError as e: + print(f"Error parsing config file: {e}") + return None + + +def load_face_labels(csv_file): + df = pd.read_csv(csv_file) + + df.loc[:, "label"] = df.label.str.lower() + df.loc[:, "filepath"] = df.filepath.str.lower() + base_path = os.path.join(os.getcwd(), "training_data") # Base path for images + adjusted_filepaths = [os.path.join(base_path, path) for path in df["filepath"]] + return dict(zip(adjusted_filepaths, df["label"])) + + +def preprocess_audio_for_diarization(file_path): + audio = AudioSegment.from_file(file_path) + audio = audio.set_channels(1).set_frame_rate(16000) + preprocessed_path = file_path.replace(".mp3", "_preprocessed.wav") + audio.export(preprocessed_path, format="wav") + return preprocessed_path + + +def perform_diarization(file_path, access_token): + diarization_pipeline = Pipeline.from_pretrained( + "pyannote/speaker-diarization", use_auth_token=access_token + ) + diarization = diarization_pipeline(file_path) + return diarization + + +def split_audio(file_path, start_time_ms, end_time_ms, segment_length_ms, output_dir): + audio = AudioSegment.from_file(file_path) + audio_segment = audio[start_time_ms:end_time_ms] + segments = [] + + for i in range(0, len(audio_segment), segment_length_ms): + segment = audio_segment[i : i + segment_length_ms] + segment_name = f"segment_{i // segment_length_ms}.mp3" + segment_file = os.path.join(output_dir, segment_name) + segment.export(segment_file, format="mp3") + segments.append(segment_file) + + return segments + + +def process_segment_with_whisper_and_diarization( + segment_path, diarization_results, pipe, model_batch_size +): + transcript = pipe( + segment_path, batch_size=model_batch_size, return_timestamps=True + )["chunks"] + print(f"TRANSCRIPT: {transcript}") + + diarized_transcript = [] + for chunk in transcript: + start, end = chunk["timestamp"] + speaker_label = get_speaker_label(diarization_results, start, end) + diarized_transcript.append( + { + "start": start, + "end": end, + "speaker": speaker_label, + "text": chunk["text"], + } + ) + return diarized_transcript + + +def get_speaker_label(diarization_results, start, end): + # Handle None values for start and end + if start is None or end is None: + return None + + overlap = {} + for turn, _, speaker in diarization_results.itertracks(yield_label=True): + if turn.end < start or turn.start > end: + continue + overlap[speaker] = ( + overlap.get(speaker, 0) + min(end, turn.end) - max(start, turn.start) + ) + if overlap: + return max(overlap, key=overlap.get) + return None + + +def download_youtube_audio(url, save_path): + try: + yt = YouTube(url) + video = yt.streams.filter(only_audio=True).first() + out_file = video.download(output_path=save_path) + base, ext = os.path.splitext(out_file) + new_file = base + ".mp3" + os.rename(out_file, new_file) + return new_file + except Exception as e: + print(f"Error downloading audio: {e}") + return None + + +def encode_faces(face_labels): + face_encodings = {} + for filepath, label in face_labels.items(): + image = face_recognition.load_image_file(filepath) + encodings = face_recognition.face_encodings(image) + if not encodings: + print(f"No face detected in image: {filepath}, skipping...") + continue + face_encodings[label] = encodings[0] + return face_encodings + + +def extract_frames(video_path, timestamps_ms): + cap = cv2.VideoCapture(video_path) + frames = {} + + for timestamp_ms in timestamps_ms: + cap.set(cv2.CAP_PROP_POS_MSEC, timestamp_ms) + ret, frame = cap.read() + if ret: + frames[timestamp_ms] = frame + cap.release() + return frames + + +def recognize_faces(frames, face_encodings): + recognized_faces = {} + for timestamp, frame in frames.items(): + face_locations = face_recognition.face_locations(frame, model="cnn") + face_encs = face_recognition.face_encodings(frame, face_locations) + for face_enc in face_encs: + matches = face_recognition.compare_faces( + list(face_encodings.values()), face_enc + ) + if True in matches: + first_match_index = matches.index(True) + name = list(face_encodings.keys())[first_match_index] + recognized_faces[timestamp] = name + print(f"Timestamp (ms): {timestamp}, Recognized face: {name}") + return recognized_faces + + +def map_faces_to_speakers(diarized_transcript, recognized_faces, tolerance_ms=1000): + speaker_mapping = {} + labelname_to_speaker_mapping = {} + + print("Received Recognized Faces (ms):", recognized_faces) + + for segment_tuple in diarized_transcript: + segment, speaker = segment_tuple + segment_start_ms = segment.start * 1000 + segment_end_ms = segment.end * 1000 + segment_speakers = [] + + print( + f"\nProcessing Segment: [{segment_start_ms} - {segment_end_ms}], Speaker Label: {speaker}" + ) + + for face_time_ms, name in recognized_faces.items(): + print(f" Checking Face Time: {face_time_ms}, Name: {name}") + + if ( + (segment_start_ms - tolerance_ms) + <= face_time_ms + <= (segment_end_ms + tolerance_ms) + ): + segment_speakers.append(name) + print( + f" Matching Face Detected - Time (ms): {face_time_ms}, Name: {name}" + ) + + recognized_speaker = ( + max(set(segment_speakers), key=segment_speakers.count) + if segment_speakers + else None + ) + identified_speaker = recognized_speaker if recognized_speaker else speaker + + speaker_mapping[(segment_start_ms, segment_end_ms)] = identified_speaker + + if recognized_speaker: + labelname_to_speaker_mapping[speaker] = recognized_speaker + + print( + f" Finalized Mapping for Segment: {segment_start_ms} - {segment_end_ms}, Speaker: {identified_speaker}" + ) + + return speaker_mapping, labelname_to_speaker_mapping + + +def export_diarized_transcript_with_names( + diarized_transcript, labelname_to_speaker_mapping, save_loc +): + with open(save_loc, "w") as file: + for segment in diarized_transcript: + print(f"DIARIZED SEGMENT IN EXPORT FUNC: {segment}") + start, end, original_speaker_label, text = ( + segment["start"], + segment["end"], + segment["speaker"], + segment["text"], + ) + + updated_speaker_label = labelname_to_speaker_mapping.get( + original_speaker_label, original_speaker_label + ) + + file.write(f"{start}-{end} {updated_speaker_label}: {text}\n") + + +def extract_audio_from_mp4(video_file_path, output_audio_path): + """ + Extracts the audio from an MP4 file and saves it as an MP3 file. + """ + with VideoFileClip(video_file_path) as video: + audio = video.audio + audio.write_audiofile(output_audio_path, codec="mp3") + return output_audio_path + + +def get_video_duration(video_path): + with VideoFileClip(video_path) as video: + return video.duration * 1000 + + +def main(): + parser = argparse.ArgumentParser( + description="Read configuration from transcribe_config YAML file" + ) + parser.add_argument("config_file", help="Path to YAML config file") + + args = parser.parse_args() + config_file = args.config_file + config = load_config(config_file) + + if config: + model_size = config["model"]["size"] + model_device = "cuda" if torch.cuda.is_available() else "mps" + model_chunk_length = int(config["model"]["chunk_length"]) + model_batch_size = int(config["model"]["batch_size"]) + + video_path = "input/Regular Council Mtg 1-4-2024.mp4" + audio_output_path = "output_audio/test_audio.mp3" + if not os.path.exists(audio_output_path): + audio_path = extract_audio_from_mp4(video_path, audio_output_path) + else: + print(f"Audio file already exists at {audio_output_path}") + audio_path = audio_output_path + + config["audio"]["path"] = audio_path + + save_loc = config["transcript"]["save_loc"] + + print("Model Size:", model_size) + print("Model Device:", model_device) + print("Chunk Length:", model_chunk_length) + print("Batch Size", model_batch_size) + print("Audio Path:", audio_path) + print("---------------") + + model_names = { + "tiny": "openai/whisper-tiny.en", + "base": "openai/whisper-base.en", + "small": "openai/whisper-small.en", + "medium": "openai/whisper-medium.en", + "large": "openai/whisper-large", + "large-v2": "openai/whisper-large-v2", + } + + model = model_names.get(model_size, "openai/whisper-tiny") + + pipe = pipeline( + "automatic-speech-recognition", + model=model, + chunk_length_s=model_chunk_length, + device=model_device, + ) + + total_duration_ms = get_video_duration(video_path) + last_15_minutes_ms = 15 * 60 * 1000 + + start_time_ms = max(total_duration_ms - last_15_minutes_ms, 0) + end_time_ms = total_duration_ms + + segment_length_ms = 60000 + + segments = split_audio( + audio_path, start_time_ms, end_time_ms, segment_length_ms, "output_audio" + ) + + access_token = "" + + full_diarized_transcript = [] + combined_diarization_data = [] + if segments: + segment = segments[0] + print(f"Processing segment: {segment}") + + preprocessed_segment_path = preprocess_audio_for_diarization(segment) + diarization = perform_diarization(preprocessed_segment_path, access_token) + + for turn, _, speaker in diarization.itertracks(yield_label=True): + combined_diarization_data.append((turn, speaker)) + + segment_transcript = process_segment_with_whisper_and_diarization( + segment, diarization, pipe, model_batch_size + ) + full_diarized_transcript.extend(segment_transcript) + os.remove(segment) + + # Load face labels from CSV and prepare fr + face_labels = load_face_labels("training_data/training_data.csv") + face_encodings = encode_faces(face_labels) + video_path = "input/Regular Council Mtg 1-4-2024.mp4" + + offset_ms = start_time_ms + + # Adjust timestamps for frame extraction + adjusted_timestamps = [] + for segment in full_diarized_transcript: + if segment["end"] is None or segment["speaker"] is None: + continue + + print("Start ms", segment) + start_ms = int(segment["start"] * 1000) + offset_ms + adjusted_timestamps.append(start_ms) + print(f"Adjusted timestamps {adjusted_timestamps}") + + # Extract and save frames + frames = extract_frames(video_path, adjusted_timestamps) + for timestamp in adjusted_timestamps: + print("TIMESTAMP FOR FRAME: {timestamp}") + if timestamp in frames: + frame = frames[timestamp] + filename = os.path.join("output_frames", f"frame_{timestamp}.jpg") + cv2.imwrite(filename, frame) + + recognized_faces = recognize_faces(frames, face_encodings) + print("Recognized Faces Original", recognized_faces) + + recognized_faces_adjusted = { + timestamp - offset_ms: name + for timestamp, name in recognized_faces.items() + } + print("Adjusted Recognized Faces:", recognized_faces_adjusted) + + print("Combined Diarization Data:", combined_diarization_data) + + speaker_mapping, labelname_to_speaker_mapping = map_faces_to_speakers( + combined_diarization_data, recognized_faces_adjusted, tolerance_ms=1 + ) + + print("Speaker Mapping:", speaker_mapping) + + export_diarized_transcript_with_names( + full_diarized_transcript, labelname_to_speaker_mapping, save_loc + ) + + print( + "Transcription and Diarization with Speaker Names Complete. Saved to", + save_loc, + ) + + +if __name__ == "__main__": + main() diff --git a/packages/whisper/transcribe.py b/packages/whisper/archive/transcribe.py similarity index 65% rename from packages/whisper/transcribe.py rename to packages/whisper/archive/transcribe.py index d7216197..c62e6bbf 100644 --- a/packages/whisper/transcribe.py +++ b/packages/whisper/archive/transcribe.py @@ -8,7 +8,7 @@ def load_config(config_file): try: - with open(config_file, 'r') as stream: + with open(config_file, "r") as stream: config = yaml.safe_load(stream) return config except FileNotFoundError: @@ -20,13 +20,15 @@ def load_config(config_file): def main(): - parser = argparse.ArgumentParser(description = "Read configuration from transcribe_config YAML file") - parser.add_argument("config_file", help = "Path to YAML config file") - + parser = argparse.ArgumentParser( + description="Read configuration from transcribe_config YAML file" + ) + parser.add_argument("config_file", help="Path to YAML config file") + args = parser.parse_args() config_file = args.config_file config = load_config(config_file) - + if config: model_size = config["model"]["size"] model_device = config["model"]["device"] @@ -34,42 +36,46 @@ def main(): model_batch_size = int(config["model"]["batch_size"]) audio_path = config["audio"]["path"] save_loc = config["transcript"]["save_loc"] - + print("Model Size:", model_size) print("Model Device:", model_device) print("Chunk Length:", model_chunk_length) print("Batch Size", model_batch_size) print("Audio Path:", audio_path) print("---------------") - - - model_names = {"tiny":"openai/whisper-tiny.en", - "base":"openai/whisper-base.en", - "small":"openai/whisper-small.en", - "medium":"openai/whisper-medium.en", - "large":"openai/whisper-large", - "large_v2":"openai/whisper-large-v2"} - + + model_names = { + "tiny": "openai/whisper-tiny.en", + "base": "openai/whisper-base.en", + "small": "openai/whisper-small.en", + "medium": "openai/whisper-medium.en", + "large": "openai/whisper-large", + "large_v2": "openai/whisper-large-v2", + } + model = model_names[model_size] - + pipe = pipeline( "automatic-speech-recognition", - model = model, - chunk_length_s = model_chunk_length, - device = model_device + model=model, + chunk_length_s=model_chunk_length, + device=model_device, ) start_time = time.time() - - transcript = pipe(audio_path, batch_size = model_batch_size, return_timestamps = True)["chunks"] - + + transcript = pipe(audio_path, batch_size=model_batch_size, return_timestamps=True)[ + "chunks" + ] + end_time = time.time() total_time = end_time - start_time print("Generation Complete. Time to Generate:", str(total_time)) print("Saving Transcript to", save_loc) - with open(save_loc, 'w') as f: + with open(save_loc, "w") as f: for chunk in transcript: f.write("%s\n" % chunk) print("Save Complete") + if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/packages/whisper/transcribe_config.yml b/packages/whisper/archive/transcribe_config.yml similarity index 100% rename from packages/whisper/transcribe_config.yml rename to packages/whisper/archive/transcribe_config.yml diff --git a/packages/whisper/config.yml b/packages/whisper/config.yml new file mode 100644 index 00000000..90fc3a41 --- /dev/null +++ b/packages/whisper/config.yml @@ -0,0 +1,12 @@ +model: + size: "base" + device: "mps" # or your specific GPU device + chunk_length: "60" + batch_size: 4 +audio: + path: "output_audio/City Council Meeting 142024.mp3" + offset_ms: 0 # Adjust the offset based on your requirements +transcript: + save_loc: "output_transcript/test-transcript-chunk-60-base.txt" +diarization: + path: "diarization" # Adjust the path to your diarization data diff --git a/packages/whisper/src-preprocess.py b/packages/whisper/src-preprocess.py new file mode 100644 index 00000000..abe9147b --- /dev/null +++ b/packages/whisper/src-preprocess.py @@ -0,0 +1,316 @@ +import os +import yaml +import argparse +import face_recognition +import pandas as pd +from pydub import AudioSegment +from pytube import YouTube +from transformers import pipeline +import torch +from moviepy.editor import VideoFileClip + +from pydub import AudioSegment + +import numpy as np +import librosa +import soundfile as sf + + +from pydub import AudioSegment +from pydub.effects import normalize, compress_dynamic_range +from pydub import silence +from scipy.signal import butter, lfilter + + +def load_config(config_file): + try: + with open(config_file, "r") as stream: + config = yaml.safe_load(stream) + return config + except FileNotFoundError: + print(f"Config file '{config_file}' not found.") + return None + except yaml.YAMLError as e: + print(f"Error parsing config file: {e}") + return None + + +def process_segment_with_whisper(segment_path, pipe, model_batch_size): + transcript = pipe( + segment_path, batch_size=model_batch_size, return_timestamps=True + )["chunks"] + print(f"TRANSCRIPT: {transcript}") + + processed_transcript = [] + for chunk in transcript: + start, end = chunk["timestamp"] + processed_transcript.append( + { + "start": start, + "end": end, + "text": chunk["text"], + } + ) + return processed_transcript + + +def download_youtube_audio(url, save_path): + try: + yt = YouTube(url) + video = yt.streams.filter(only_audio=True).first() + out_file = video.download(output_path=save_path) + base, ext = os.path.splitext(out_file) + new_file = base + ".mp3" + os.rename(out_file, new_file) + return new_file + except Exception as e: + print(f"Error downloading audio: {e}") + return None + + +def recognize_faces(frames, face_encodings): + recognized_faces = {} + for timestamp, frame in frames.items(): + face_locations = face_recognition.face_locations(frame, model="cnn") + face_encs = face_recognition.face_encodings(frame, face_locations) + for face_enc in face_encs: + matches = face_recognition.compare_faces( + list(face_encodings.values()), face_enc + ) + if True in matches: + first_match_index = matches.index(True) + name = list(face_encodings.keys())[first_match_index] + recognized_faces[timestamp] = name + print(f"Timestamp (ms): {timestamp}, Recognized face: {name}") + return recognized_faces + + +def export_transcript(transcript, save_loc): + with open(save_loc, "w") as file: + for segment in transcript: + print(f"TRANSCRIPT SEGMENT IN EXPORT FUNC: {segment}") + start, end, text = ( + segment["start"], + segment["end"], + segment["text"], + ) + + file.write(f"{start}-{end}: {text}\n") + + +def get_video_duration(video_path): + with VideoFileClip(video_path) as video: + return video.duration * 1000 + + +def split_audio(file_path, start_time_ms, end_time_ms, segment_length_ms, output_dir): + audio = AudioSegment.from_file(file_path) + audio_segment = audio[start_time_ms:end_time_ms] + segments = [] + + for i in range(0, len(audio_segment), segment_length_ms): + segment = audio_segment[i : i + segment_length_ms] + segment_name = f"segment_{i // segment_length_ms}.mp3" + segment_file = os.path.join(output_dir, segment_name) + segment.export(segment_file, format="mp3") + segments.append(segment_file) + + return segments + + +def preprocess_and_extract_audio( + video_path, output_audio_path, target_sample_rate=16000 +): + with VideoFileClip(video_path) as video: + audio = video.audio + temp_audio_path = "temp_audio.wav" + audio.write_audiofile( + temp_audio_path, codec="pcm_s16le" + ) + + y, sr = librosa.load(temp_audio_path, sr=target_sample_rate) + + sf.write(output_audio_path, y, target_sample_rate) + + os.remove(temp_audio_path) + + +def apply_dynamic_range_compression(audio_path): + audio = AudioSegment.from_file(audio_path) + compressed_audio = compress_dynamic_range(audio) + normalized_audio = normalize(compressed_audio) + compressed_audio_path = "compressed_" + audio_path + normalized_audio.export(compressed_audio_path, format="mp3") + return compressed_audio_path + + +def remove_silence(audio_path, silence_thresh=-40, min_silence_len=1000): + audio = AudioSegment.from_file(audio_path) + non_silent_chunks = silence.split_on_silence( + audio, + min_silence_len=min_silence_len, + silence_thresh=silence_thresh, + keep_silence=500, + ) + + processed_audio = AudioSegment.empty() + for chunk in non_silent_chunks: + processed_audio += chunk + + processed_audio_path = "processed_" + os.path.basename(audio_path) + processed_audio.export(processed_audio_path, format="mp3") + return processed_audio_path + + +def butter_bandpass(lowcut, highcut, fs, order=5): + nyq = 0.5 * fs + low = lowcut / nyq + high = highcut / nyq + b, a = butter(order, [low, high], btype="band") + return b, a + + +def butter_bandpass_filter(data, lowcut, highcut, fs, order=5): + b, a = butter_bandpass(lowcut, highcut, fs, order=order) + y = lfilter(b, a, data) + return y + + +def bandpass_filter(audio_path, low=300, high=3400, sr=16000): + y, sr = librosa.load(audio_path, sr=sr) + + y_filtered = butter_bandpass_filter(y, low, high, sr) + + filtered_audio_path = "filtered_" + os.path.basename(audio_path) + sf.write(filtered_audio_path, y_filtered, sr) + + return filtered_audio_path + + +def change_speed(audio_path, speed=1.0): + audio = AudioSegment.from_file(audio_path) + playback_speed_audio = audio.speedup(playback_speed=speed) + speed_changed_audio_path = "speed_changed_" + audio_path + playback_speed_audio.export(speed_changed_audio_path, format="mp3") + return speed_changed_audio_path + + +def audio_preprocessing_pipeline(audio_segment_path): + compressed_audio_path = apply_dynamic_range_compression(audio_segment_path) + + no_silence_audio_path = remove_silence(compressed_audio_path) + + filtered_audio_path = bandpass_filter(no_silence_audio_path) + + return filtered_audio_path + + +def process_segment_with_whisper(segment_path, pipe, model_batch_size): + transcript = pipe( + segment_path, batch_size=model_batch_size, return_timestamps=True + )["chunks"] + print(f"TRANSCRIPT: {transcript}") + + processed_transcript = [] + for chunk in transcript: + start, end = chunk["timestamp"] + processed_transcript.append( + { + "start": start, + "end": end, + "text": chunk["text"], + } + ) + return processed_transcript + + +def extract_audio_from_mp4(video_file_path, output_audio_path): + """ + Extracts the audio from an MP4 file and saves it as an MP3 file. + """ + with VideoFileClip(video_file_path) as video: + audio = video.audio + audio.write_audiofile(output_audio_path, codec="mp3") + return output_audio_path + + +def main(): + parser = argparse.ArgumentParser( + description="Read configuration from transcribe_config YAML file" + ) + parser.add_argument("config_file", help="Path to YAML config file") + + args = parser.parse_args() + config_file = args.config_file + config = load_config(config_file) + + if config: + model_size = config["model"]["size"] + model_device = "cuda" if torch.cuda.is_available() else "mps" + model_chunk_length = int(config["model"]["chunk_length"]) + model_batch_size = int(config["model"]["batch_size"]) + + video_path = "input/Regular Council Mtg 1-4-2024.mp4" + audio_output_path = "output_audio/test_audio.mp3" + if not os.path.exists(audio_output_path): + audio_path = extract_audio_from_mp4(video_path, audio_output_path) + else: + print(f"Audio file already exists at {audio_output_path}") + audio_path = audio_output_path + + config["audio"]["path"] = audio_path + + save_loc = config["transcript"]["save_loc"] + + print("Model Size:", model_size) + print("Model Device:", model_device) + print("Chunk Length:", model_chunk_length) + print("Batch Size", model_batch_size) + print("Audio Path:", audio_path) + print("---------------") + + model_names = { + "tiny": "openai/whisper-tiny.en", + "base": "openai/whisper-base.en", + "small": "openai/whisper-small.en", + "medium": "openai/whisper-medium.en", + "large": "openai/whisper-large", + "large-v2": "openai/whisper-large-v2", + "large-v3": "openai/whisper-large-v3", + } + + model = model_names.get(model_size, "openai/whisper-large") + + pipe = pipeline( + "automatic-speech-recognition", + model=model, + chunk_length_s=model_chunk_length, + device=model_device, + ) + + total_duration_ms = get_video_duration(video_path) + last_15_minutes_ms = 15 * 60 * 1000 + start_time_ms = max(total_duration_ms - last_15_minutes_ms, 0) + end_time_ms = total_duration_ms + + audio = AudioSegment.from_file(audio_path) + last_15_min_audio = audio[start_time_ms:end_time_ms] + last_15_min_audio_path = os.path.join("output_audio", "last_15_min.mp3") + last_15_min_audio.export(last_15_min_audio_path, format="mp3") + + preprocessed_audio_path = audio_preprocessing_pipeline( + last_15_min_audio_path + ) + + print(f"Processing audio: {preprocessed_audio_path}") + full_transcript = process_segment_with_whisper( + preprocessed_audio_path, pipe, model_batch_size + ) + + export_transcript(full_transcript, save_loc) + + print("Transcription Complete. Saved to", save_loc) + + +if __name__ == "__main__": + main() diff --git a/packages/whisper/src.py b/packages/whisper/src.py new file mode 100644 index 00000000..ed720ec9 --- /dev/null +++ b/packages/whisper/src.py @@ -0,0 +1,194 @@ +import os +import yaml +import argparse +import face_recognition +import pandas as pd +from pydub import AudioSegment +from pytube import YouTube +from transformers import pipeline +import torch +from moviepy.editor import VideoFileClip + + +def load_config(config_file): + try: + with open(config_file, "r") as stream: + config = yaml.safe_load(stream) + return config + except FileNotFoundError: + print(f"Config file '{config_file}' not found.") + return None + except yaml.YAMLError as e: + print(f"Error parsing config file: {e}") + return None + + +def process_segment_with_whisper(segment_path, pipe, model_batch_size): + transcript = pipe( + segment_path, batch_size=model_batch_size, return_timestamps=True + )["chunks"] + print(f"TRANSCRIPT: {transcript}") + + processed_transcript = [] + for chunk in transcript: + start, end = chunk["timestamp"] + processed_transcript.append( + { + "start": start, + "end": end, + "text": chunk["text"], + } + ) + return processed_transcript + + +def download_youtube_audio(url, save_path): + try: + yt = YouTube(url) + video = yt.streams.filter(only_audio=True).first() + out_file = video.download(output_path=save_path) + base, ext = os.path.splitext(out_file) + new_file = base + ".mp3" + os.rename(out_file, new_file) + return new_file + except Exception as e: + print(f"Error downloading audio: {e}") + return None + + +def recognize_faces(frames, face_encodings): + recognized_faces = {} + for timestamp, frame in frames.items(): + face_locations = face_recognition.face_locations(frame, model="cnn") + face_encs = face_recognition.face_encodings(frame, face_locations) + for face_enc in face_encs: + matches = face_recognition.compare_faces( + list(face_encodings.values()), face_enc + ) + if True in matches: + first_match_index = matches.index(True) + name = list(face_encodings.keys())[first_match_index] + recognized_faces[timestamp] = name + print(f"Timestamp (ms): {timestamp}, Recognized face: {name}") + return recognized_faces + + +def export_transcript(transcript, save_loc): + with open(save_loc, "w") as file: + for segment in transcript: + print(f"TRANSCRIPT SEGMENT IN EXPORT FUNC: {segment}") + start, end, text = ( + segment["start"], + segment["end"], + segment["text"], + ) + + file.write(f"{start}-{end}: {text}\n") + + +def extract_audio_from_mp4(video_file_path, output_audio_path): + """ + Extracts the audio from an MP4 file and saves it as an MP3 file. + """ + with VideoFileClip(video_file_path) as video: + audio = video.audio + audio.write_audiofile(output_audio_path, codec="mp3") + return output_audio_path + + +def get_video_duration(video_path): + with VideoFileClip(video_path) as video: + return video.duration * 1000 + + +def split_audio(file_path, start_time_ms, end_time_ms, segment_length_ms, output_dir): + audio = AudioSegment.from_file(file_path) + audio_segment = audio[start_time_ms:end_time_ms] + segments = [] + + for i in range(0, len(audio_segment), segment_length_ms): + segment = audio_segment[i : i + segment_length_ms] + segment_name = f"segment_{i // segment_length_ms}.mp3" + segment_file = os.path.join(output_dir, segment_name) + segment.export(segment_file, format="mp3") + segments.append(segment_file) + + return segments + + +def main(): + parser = argparse.ArgumentParser( + description="Read configuration from transcribe_config YAML file" + ) + parser.add_argument("config_file", help="Path to YAML config file") + + args = parser.parse_args() + config_file = args.config_file + config = load_config(config_file) + + if config: + model_size = config["model"]["size"] + model_device = "cuda" if torch.cuda.is_available() else "mps" + model_chunk_length = int(config["model"]["chunk_length"]) + model_batch_size = int(config["model"]["batch_size"]) + + video_path = "input/Regular Council Mtg 1-4-2024.mp4" + audio_output_path = "output_audio/test_audio.mp3" + if not os.path.exists(audio_output_path): + audio_path = extract_audio_from_mp4(video_path, audio_output_path) + else: + print(f"Audio file already exists at {audio_output_path}") + audio_path = audio_output_path + + config["audio"]["path"] = audio_path + + save_loc = config["transcript"]["save_loc"] + + print("Model Size:", model_size) + print("Model Device:", model_device) + print("Chunk Length:", model_chunk_length) + print("Batch Size", model_batch_size) + print("Audio Path:", audio_path) + print("---------------") + + model_names = { + "tiny": "openai/whisper-tiny.en", + "base": "openai/whisper-base.en", + "small": "openai/whisper-small.en", + "medium": "openai/whisper-medium.en", + "large": "openai/whisper-large", + "large-v2": "openai/whisper-large-v2", + "large-v3": "openai/whisper-large-v3", + } + + model = model_names.get(model_size, "openai/whisper-base") + + pipe = pipeline( + "automatic-speech-recognition", + model=model, + chunk_length_s=model_chunk_length, + device=model_device, + ) + + total_duration_ms = get_video_duration(video_path) + last_15_minutes_ms = 15 * 60 * 1000 + start_time_ms = max(total_duration_ms - last_15_minutes_ms, 0) + end_time_ms = total_duration_ms + + audio = AudioSegment.from_file(audio_path) + last_15_min_audio = audio[start_time_ms:end_time_ms] + last_15_min_audio_path = os.path.join("output_audio", "last_15_min.mp3") + last_15_min_audio.export(last_15_min_audio_path, format="mp3") + + print(f"Processing audio: {last_15_min_audio_path}") + full_transcript = process_segment_with_whisper( + last_15_min_audio_path, pipe, model_batch_size + ) + + export_transcript(full_transcript, save_loc) + + print("Transcription Complete. Saved to", save_loc) + + +if __name__ == "__main__": + main() diff --git a/packages/whisper/training_data/input/giarrusso_1.png b/packages/whisper/training_data/input/giarrusso_1.png new file mode 100644 index 00000000..d6b65475 Binary files /dev/null and b/packages/whisper/training_data/input/giarrusso_1.png differ diff --git a/packages/whisper/training_data/input/giarrusso_10.png b/packages/whisper/training_data/input/giarrusso_10.png new file mode 100644 index 00000000..28b6e451 Binary files /dev/null and b/packages/whisper/training_data/input/giarrusso_10.png differ diff --git a/packages/whisper/training_data/input/giarrusso_2.png b/packages/whisper/training_data/input/giarrusso_2.png new file mode 100644 index 00000000..af2dd2c4 Binary files /dev/null and b/packages/whisper/training_data/input/giarrusso_2.png differ diff --git a/packages/whisper/training_data/input/giarrusso_3.png b/packages/whisper/training_data/input/giarrusso_3.png new file mode 100644 index 00000000..22a526d0 Binary files /dev/null and b/packages/whisper/training_data/input/giarrusso_3.png differ diff --git a/packages/whisper/training_data/input/giarrusso_4.png b/packages/whisper/training_data/input/giarrusso_4.png new file mode 100644 index 00000000..7f0bcd25 Binary files /dev/null and b/packages/whisper/training_data/input/giarrusso_4.png differ diff --git a/packages/whisper/training_data/input/giarrusso_5.png b/packages/whisper/training_data/input/giarrusso_5.png new file mode 100644 index 00000000..031d150a Binary files /dev/null and b/packages/whisper/training_data/input/giarrusso_5.png differ diff --git a/packages/whisper/training_data/input/giarrusso_6.png b/packages/whisper/training_data/input/giarrusso_6.png new file mode 100644 index 00000000..222cd8e5 Binary files /dev/null and b/packages/whisper/training_data/input/giarrusso_6.png differ diff --git a/packages/whisper/training_data/input/giarrusso_7.png b/packages/whisper/training_data/input/giarrusso_7.png new file mode 100644 index 00000000..f2c403f1 Binary files /dev/null and b/packages/whisper/training_data/input/giarrusso_7.png differ diff --git a/packages/whisper/training_data/input/giarrusso_8.png b/packages/whisper/training_data/input/giarrusso_8.png new file mode 100644 index 00000000..d7f1767c Binary files /dev/null and b/packages/whisper/training_data/input/giarrusso_8.png differ diff --git a/packages/whisper/training_data/input/giarrusso_9.png b/packages/whisper/training_data/input/giarrusso_9.png new file mode 100644 index 00000000..33145012 Binary files /dev/null and b/packages/whisper/training_data/input/giarrusso_9.png differ diff --git a/packages/whisper/training_data/input/green_1.png b/packages/whisper/training_data/input/green_1.png new file mode 100644 index 00000000..5c8e96fe Binary files /dev/null and b/packages/whisper/training_data/input/green_1.png differ diff --git a/packages/whisper/training_data/input/green_10.png b/packages/whisper/training_data/input/green_10.png new file mode 100644 index 00000000..dc4c8313 Binary files /dev/null and b/packages/whisper/training_data/input/green_10.png differ diff --git a/packages/whisper/training_data/input/green_2.png b/packages/whisper/training_data/input/green_2.png new file mode 100644 index 00000000..3bf18789 Binary files /dev/null and b/packages/whisper/training_data/input/green_2.png differ diff --git a/packages/whisper/training_data/input/green_3.png b/packages/whisper/training_data/input/green_3.png new file mode 100644 index 00000000..1b0c7f98 Binary files /dev/null and b/packages/whisper/training_data/input/green_3.png differ diff --git a/packages/whisper/training_data/input/green_4.png b/packages/whisper/training_data/input/green_4.png new file mode 100644 index 00000000..ab7e2abe Binary files /dev/null and b/packages/whisper/training_data/input/green_4.png differ diff --git a/packages/whisper/training_data/input/green_5.png b/packages/whisper/training_data/input/green_5.png new file mode 100644 index 00000000..2c04385d Binary files /dev/null and b/packages/whisper/training_data/input/green_5.png differ diff --git a/packages/whisper/training_data/input/green_6.png b/packages/whisper/training_data/input/green_6.png new file mode 100644 index 00000000..36ceb5f9 Binary files /dev/null and b/packages/whisper/training_data/input/green_6.png differ diff --git a/packages/whisper/training_data/input/green_7.png b/packages/whisper/training_data/input/green_7.png new file mode 100644 index 00000000..78ec7d38 Binary files /dev/null and b/packages/whisper/training_data/input/green_7.png differ diff --git a/packages/whisper/training_data/input/green_8.png b/packages/whisper/training_data/input/green_8.png new file mode 100644 index 00000000..092ea8ad Binary files /dev/null and b/packages/whisper/training_data/input/green_8.png differ diff --git a/packages/whisper/training_data/input/green_9.png b/packages/whisper/training_data/input/green_9.png new file mode 100644 index 00000000..2c52bbe4 Binary files /dev/null and b/packages/whisper/training_data/input/green_9.png differ diff --git a/packages/whisper/training_data/input/harris_1.png b/packages/whisper/training_data/input/harris_1.png new file mode 100644 index 00000000..2e47c348 Binary files /dev/null and b/packages/whisper/training_data/input/harris_1.png differ diff --git a/packages/whisper/training_data/input/harris_10.png b/packages/whisper/training_data/input/harris_10.png new file mode 100644 index 00000000..f328d500 Binary files /dev/null and b/packages/whisper/training_data/input/harris_10.png differ diff --git a/packages/whisper/training_data/input/harris_2.png b/packages/whisper/training_data/input/harris_2.png new file mode 100644 index 00000000..527731df Binary files /dev/null and b/packages/whisper/training_data/input/harris_2.png differ diff --git a/packages/whisper/training_data/input/harris_3.png b/packages/whisper/training_data/input/harris_3.png new file mode 100644 index 00000000..fd94c922 Binary files /dev/null and b/packages/whisper/training_data/input/harris_3.png differ diff --git a/packages/whisper/training_data/input/harris_4.png b/packages/whisper/training_data/input/harris_4.png new file mode 100644 index 00000000..7cdae03d Binary files /dev/null and b/packages/whisper/training_data/input/harris_4.png differ diff --git a/packages/whisper/training_data/input/harris_5.png b/packages/whisper/training_data/input/harris_5.png new file mode 100644 index 00000000..5d6be08c Binary files /dev/null and b/packages/whisper/training_data/input/harris_5.png differ diff --git a/packages/whisper/training_data/input/harris_6.png b/packages/whisper/training_data/input/harris_6.png new file mode 100644 index 00000000..94578fc9 Binary files /dev/null and b/packages/whisper/training_data/input/harris_6.png differ diff --git a/packages/whisper/training_data/input/harris_7.png b/packages/whisper/training_data/input/harris_7.png new file mode 100644 index 00000000..f2a4005a Binary files /dev/null and b/packages/whisper/training_data/input/harris_7.png differ diff --git a/packages/whisper/training_data/input/harris_8.png b/packages/whisper/training_data/input/harris_8.png new file mode 100644 index 00000000..ec5555fb Binary files /dev/null and b/packages/whisper/training_data/input/harris_8.png differ diff --git a/packages/whisper/training_data/input/harris_9.png b/packages/whisper/training_data/input/harris_9.png new file mode 100644 index 00000000..f2cdf3e4 Binary files /dev/null and b/packages/whisper/training_data/input/harris_9.png differ diff --git a/packages/whisper/training_data/input/king_1.png b/packages/whisper/training_data/input/king_1.png new file mode 100644 index 00000000..9cc613ff Binary files /dev/null and b/packages/whisper/training_data/input/king_1.png differ diff --git a/packages/whisper/training_data/input/king_10.png b/packages/whisper/training_data/input/king_10.png new file mode 100644 index 00000000..f78480b1 Binary files /dev/null and b/packages/whisper/training_data/input/king_10.png differ diff --git a/packages/whisper/training_data/input/king_2.png b/packages/whisper/training_data/input/king_2.png new file mode 100644 index 00000000..0df9a3e8 Binary files /dev/null and b/packages/whisper/training_data/input/king_2.png differ diff --git a/packages/whisper/training_data/input/king_3.png b/packages/whisper/training_data/input/king_3.png new file mode 100644 index 00000000..b60931f8 Binary files /dev/null and b/packages/whisper/training_data/input/king_3.png differ diff --git a/packages/whisper/training_data/input/king_4.png b/packages/whisper/training_data/input/king_4.png new file mode 100644 index 00000000..e2055870 Binary files /dev/null and b/packages/whisper/training_data/input/king_4.png differ diff --git a/packages/whisper/training_data/input/king_5.png b/packages/whisper/training_data/input/king_5.png new file mode 100644 index 00000000..061f55a1 Binary files /dev/null and b/packages/whisper/training_data/input/king_5.png differ diff --git a/packages/whisper/training_data/input/king_6.png b/packages/whisper/training_data/input/king_6.png new file mode 100644 index 00000000..de81f790 Binary files /dev/null and b/packages/whisper/training_data/input/king_6.png differ diff --git a/packages/whisper/training_data/input/king_7.png b/packages/whisper/training_data/input/king_7.png new file mode 100644 index 00000000..9cf9a8cc Binary files /dev/null and b/packages/whisper/training_data/input/king_7.png differ diff --git a/packages/whisper/training_data/input/king_8.png b/packages/whisper/training_data/input/king_8.png new file mode 100644 index 00000000..bdf1f200 Binary files /dev/null and b/packages/whisper/training_data/input/king_8.png differ diff --git a/packages/whisper/training_data/input/king_9.png b/packages/whisper/training_data/input/king_9.png new file mode 100644 index 00000000..84154080 Binary files /dev/null and b/packages/whisper/training_data/input/king_9.png differ diff --git a/packages/whisper/training_data/input/moreno_1.png b/packages/whisper/training_data/input/moreno_1.png new file mode 100644 index 00000000..6a78cf0a Binary files /dev/null and b/packages/whisper/training_data/input/moreno_1.png differ diff --git a/packages/whisper/training_data/input/moreno_10.png b/packages/whisper/training_data/input/moreno_10.png new file mode 100644 index 00000000..12842d8a Binary files /dev/null and b/packages/whisper/training_data/input/moreno_10.png differ diff --git a/packages/whisper/training_data/input/moreno_2.png b/packages/whisper/training_data/input/moreno_2.png new file mode 100644 index 00000000..b6def330 Binary files /dev/null and b/packages/whisper/training_data/input/moreno_2.png differ diff --git a/packages/whisper/training_data/input/moreno_3.png b/packages/whisper/training_data/input/moreno_3.png new file mode 100644 index 00000000..da80553a Binary files /dev/null and b/packages/whisper/training_data/input/moreno_3.png differ diff --git a/packages/whisper/training_data/input/moreno_4.png b/packages/whisper/training_data/input/moreno_4.png new file mode 100644 index 00000000..a6cb6dbc Binary files /dev/null and b/packages/whisper/training_data/input/moreno_4.png differ diff --git a/packages/whisper/training_data/input/moreno_5.png b/packages/whisper/training_data/input/moreno_5.png new file mode 100644 index 00000000..778d5702 Binary files /dev/null and b/packages/whisper/training_data/input/moreno_5.png differ diff --git a/packages/whisper/training_data/input/moreno_6.png b/packages/whisper/training_data/input/moreno_6.png new file mode 100644 index 00000000..39b29d09 Binary files /dev/null and b/packages/whisper/training_data/input/moreno_6.png differ diff --git a/packages/whisper/training_data/input/moreno_7.png b/packages/whisper/training_data/input/moreno_7.png new file mode 100644 index 00000000..aff844b4 Binary files /dev/null and b/packages/whisper/training_data/input/moreno_7.png differ diff --git a/packages/whisper/training_data/input/moreno_8.png b/packages/whisper/training_data/input/moreno_8.png new file mode 100644 index 00000000..7c2688dc Binary files /dev/null and b/packages/whisper/training_data/input/moreno_8.png differ diff --git a/packages/whisper/training_data/input/moreno_9.png b/packages/whisper/training_data/input/moreno_9.png new file mode 100644 index 00000000..ae396035 Binary files /dev/null and b/packages/whisper/training_data/input/moreno_9.png differ diff --git a/packages/whisper/training_data/input/morrell_1.png b/packages/whisper/training_data/input/morrell_1.png new file mode 100644 index 00000000..957b5e94 Binary files /dev/null and b/packages/whisper/training_data/input/morrell_1.png differ diff --git a/packages/whisper/training_data/input/morrell_10.png b/packages/whisper/training_data/input/morrell_10.png new file mode 100644 index 00000000..79f7995b Binary files /dev/null and b/packages/whisper/training_data/input/morrell_10.png differ diff --git a/packages/whisper/training_data/input/morrell_2.png b/packages/whisper/training_data/input/morrell_2.png new file mode 100644 index 00000000..d571fc42 Binary files /dev/null and b/packages/whisper/training_data/input/morrell_2.png differ diff --git a/packages/whisper/training_data/input/morrell_3.png b/packages/whisper/training_data/input/morrell_3.png new file mode 100644 index 00000000..f462f37f Binary files /dev/null and b/packages/whisper/training_data/input/morrell_3.png differ diff --git a/packages/whisper/training_data/input/morrell_4.png b/packages/whisper/training_data/input/morrell_4.png new file mode 100644 index 00000000..b5a28073 Binary files /dev/null and b/packages/whisper/training_data/input/morrell_4.png differ diff --git a/packages/whisper/training_data/input/morrell_5.png b/packages/whisper/training_data/input/morrell_5.png new file mode 100644 index 00000000..59f21764 Binary files /dev/null and b/packages/whisper/training_data/input/morrell_5.png differ diff --git a/packages/whisper/training_data/input/morrell_6.png b/packages/whisper/training_data/input/morrell_6.png new file mode 100644 index 00000000..48eb6c62 Binary files /dev/null and b/packages/whisper/training_data/input/morrell_6.png differ diff --git a/packages/whisper/training_data/input/morrell_7.png b/packages/whisper/training_data/input/morrell_7.png new file mode 100644 index 00000000..efeace38 Binary files /dev/null and b/packages/whisper/training_data/input/morrell_7.png differ diff --git a/packages/whisper/training_data/input/morrell_8.png b/packages/whisper/training_data/input/morrell_8.png new file mode 100644 index 00000000..b61138fb Binary files /dev/null and b/packages/whisper/training_data/input/morrell_8.png differ diff --git a/packages/whisper/training_data/input/morrell_9.png b/packages/whisper/training_data/input/morrell_9.png new file mode 100644 index 00000000..90acbd69 Binary files /dev/null and b/packages/whisper/training_data/input/morrell_9.png differ diff --git a/packages/whisper/training_data/input/thomas_1.png b/packages/whisper/training_data/input/thomas_1.png new file mode 100644 index 00000000..6c6f36b7 Binary files /dev/null and b/packages/whisper/training_data/input/thomas_1.png differ diff --git a/packages/whisper/training_data/input/thomas_10.png b/packages/whisper/training_data/input/thomas_10.png new file mode 100644 index 00000000..82bd4b2e Binary files /dev/null and b/packages/whisper/training_data/input/thomas_10.png differ diff --git a/packages/whisper/training_data/input/thomas_2.png b/packages/whisper/training_data/input/thomas_2.png new file mode 100644 index 00000000..021ed599 Binary files /dev/null and b/packages/whisper/training_data/input/thomas_2.png differ diff --git a/packages/whisper/training_data/input/thomas_3.png b/packages/whisper/training_data/input/thomas_3.png new file mode 100644 index 00000000..1cf67cfa Binary files /dev/null and b/packages/whisper/training_data/input/thomas_3.png differ diff --git a/packages/whisper/training_data/input/thomas_4.png b/packages/whisper/training_data/input/thomas_4.png new file mode 100644 index 00000000..c2c21749 Binary files /dev/null and b/packages/whisper/training_data/input/thomas_4.png differ diff --git a/packages/whisper/training_data/input/thomas_5.png b/packages/whisper/training_data/input/thomas_5.png new file mode 100644 index 00000000..a9c1af88 Binary files /dev/null and b/packages/whisper/training_data/input/thomas_5.png differ diff --git a/packages/whisper/training_data/input/thomas_6.png b/packages/whisper/training_data/input/thomas_6.png new file mode 100644 index 00000000..a228affd Binary files /dev/null and b/packages/whisper/training_data/input/thomas_6.png differ diff --git a/packages/whisper/training_data/input/thomas_7.png b/packages/whisper/training_data/input/thomas_7.png new file mode 100644 index 00000000..822cecc6 Binary files /dev/null and b/packages/whisper/training_data/input/thomas_7.png differ diff --git a/packages/whisper/training_data/input/thomas_8.png b/packages/whisper/training_data/input/thomas_8.png new file mode 100644 index 00000000..0d91c74e Binary files /dev/null and b/packages/whisper/training_data/input/thomas_8.png differ diff --git a/packages/whisper/training_data/input/thomas_9.png b/packages/whisper/training_data/input/thomas_9.png new file mode 100644 index 00000000..ee977d8f Binary files /dev/null and b/packages/whisper/training_data/input/thomas_9.png differ diff --git a/packages/wrangle/first-reading/data/input/Regular City Council Minutes 11-16-2023.pdf b/packages/wrangle/first-reading/data/input/Regular City Council Minutes 11-16-2023.pdf new file mode 100644 index 00000000..40066a19 Binary files /dev/null and b/packages/wrangle/first-reading/data/input/Regular City Council Minutes 11-16-2023.pdf differ diff --git a/packages/wrangle/first-reading/src/src.py b/packages/wrangle/first-reading/src/src.py new file mode 100644 index 00000000..95e44cb8 --- /dev/null +++ b/packages/wrangle/first-reading/src/src.py @@ -0,0 +1,232 @@ +from langchain.chat_models import ChatOpenAI +from langchain.text_splitter import RecursiveCharacterTextSplitter +from langchain.document_loaders import JSONLoader +import json +import os +from langchain.chains import LLMChain +from langchain.prompts import PromptTemplate +import re +from pdfminer.high_level import extract_text + + +def save_ocr_to_json( + pdf_path, ocr_json_path, publish_date, text_output_path="test.txt" +): + """Extracts text from the last 10 pages of a PDF and saves the result in a JSON format with page numbers, and also saves these pages as a text file.""" + full_text = extract_text_from_pdf(pdf_path) + + pages = full_text.split("\f")[:-1] + + last_10_pages = pages[-10:] if len(pages) >= 10 else pages + + messages = [] + combined_text = "" + for page_num, page_text in enumerate( + last_10_pages, start=len(pages) - len(last_10_pages) + 1 + ): + record = {"page_content": page_text, "metadata": {"page_number": page_num}} + messages.append(record) + combined_text += page_text + "\n\n" + + with open(ocr_json_path, "w") as file: + json.dump({"messages": messages, "publish_date": publish_date}, file, indent=4) + + with open(text_output_path, "w", encoding="utf-8") as text_file: + text_file.write(combined_text) + + +def extract_text_from_pdf(pdf_path): + """Extracts text from a PDF file""" + return extract_text(pdf_path) + + +def load_and_split(json_path, chunk_size=2000, chunk_overlap=1000): + """Loads OCR text from JSON and splits it into chunks that approximately span 2 pages""" + loader = JSONLoader( + file_path=json_path, + jq_schema=".messages[]", + content_key="page_content", + ) + + data = loader.load() + text_splitter = RecursiveCharacterTextSplitter( + chunk_size=chunk_size, chunk_overlap=chunk_overlap + ) + texts = text_splitter.split_documents(data) + return texts + + +def extract_date_from_filename(filename): + """Extracts the publish date from the PDF filename using regex""" + match = re.search(r"\d{1,2}-\d{1,2}-\d{4}", filename) + return match.group(0) if match else None + + +def summarize_text(chunks, publish_date, title): + """Summarizes the chunks of text""" + chat = ChatOpenAI( + model="gpt-3.5-turbo-1106", + api_key="", + ) + + combined_text_content = " ".join(chunk.page_content for chunk in chunks[:10]) + + ord_num_prompt = PromptTemplate( + input_variables=["text_content"], + template=""" + ### System Instructions: + - Find this section: 'ORDINANCES ON FIRST READING'. Immediately preceding this heading will be a two-digit number, followed by a period (e.g., '35.', '40.', '50.', etc.). + - Your primary task is to identify and extract the two-digit ordinance number, which precedes the 'ORDINANCES ON FIRST READING' heading. + + Ordinances on First Reading Identifier: + + ### Documents for the system to inspect: + {text_content} + """, + ) + + ord_num_chain = LLMChain(llm=chat, prompt=ord_num_prompt) + ord_num = ord_num_chain.run(text_content=combined_text_content, temperature=1) + print(ord_num) + + summaries = [] + for chunk in chunks: + text_content = chunk.page_content + + prompt = PromptTemplate( + input_variables=["text_content", "ord_num"], + template=""" + System Instructions: + + Analyze the document text provided to locate ordinances specifically from the 'ORDINANCES ON FIRST READING' section, which begins with the number found here '{ord_num}'. Disregard the string of text before the number. Focus on ordinances prefixed with '{ord_num}' followed by a letter (e.g., '{ord_num}a', '{ord_num}b', '{ord_num}c', etc.). + + For each identified ordinance, extract and compile the following details: + + - The ordinance prefix (e.g., '{ord_num}a'). + - The full ordinance number and identifier, such as '51a. CAL. NO. 34,462 BY COUNCILMEMBER HARRIS'. + - A comprehensive summary of the ordinance's content and purpose. + - The names of council members who introduced the ordinance. + - The general topic or keywords of the ordinance (limit to 3 topics). + - The original ordinance on first reading number from here {ord_num} + + Format each ordinance's information as a JSON object, including the keys: "Full Ordinance Number", "First Reading Ordinance Number", "Summary", "Introduced By", "Topic/Tag/Keywords", "Original Ordinance on First Reading Number". + + Begin the analysis with the following document text: + {text_content} + """, + ) + + chain = LLMChain(llm=chat, prompt=prompt) + summary = chain.run(text_content=text_content, ord_num=ord_num, temperature=1) + print(summary) + summaries.append( + {"page_content": summary, "publish_date": publish_date, "title": title} + ) + + return summaries + + +def save_summaries_to_json(summaries, output_dir, pdf_filename): + """Saves the summaries to a JSON file, with all summaries under the key 'messages'""" + output_file = os.path.join(output_dir, f"{os.path.splitext(pdf_filename)[0]}.json") + with open(output_file, "w") as file: + json.dump({"messages": summaries}, file, indent=4) + + +def concatenate_jsons(input_dir, output_file): + all_messages = [] + + for file_name in os.listdir(input_dir): + if file_name.endswith(".json"): + file_path = os.path.join(input_dir, file_name) + + with open(file_path, "r") as file: + data = json.load(file) + messages = data.get("messages", []) + + all_messages.extend(messages) + with open(output_file, "w") as file: + json.dump({"messages": all_messages}, file, indent=4) + + +def split_ordinance_summaries(messages): + """ + Splits ordinance summaries in 'messages' into individual dictionary objects. + Each 'page_content' in 'messages' is expected to contain multiple JSON-like objects. + """ + ordinance_dicts = [] + + for message in messages: + page_content = message["page_content"] + json_regex = r"\{\n\s+\"Full Ordinance Number\":.*?\n\}" + + json_matches = re.findall(json_regex, page_content, re.DOTALL) + + for json_match in json_matches: + try: + ordinance_dict = json.loads(json_match) + ordinance_dict["publish_date"] = message["publish_date"] + ordinance_dicts.append(ordinance_dict) + except json.JSONDecodeError: + print(f"Error decoding JSON: {json_match}") + + return ordinance_dicts + + +def deduplicate_ordinances(ordinances): + """ + Deduplicates the list of ordinances based on the full ordinance number. + Keeps the ordinance with the longest summary if duplicates are found. + """ + deduped_ordinances = {} + for ordinance in ordinances: + full_ordinance_number = ordinance.get("Full Ordinance Number", "") + + existing_ordinance = deduped_ordinances.get(full_ordinance_number) + if existing_ordinance: + if len(ordinance.get("Summary", "")) > len( + existing_ordinance.get("Summary", "") + ): + deduped_ordinances[full_ordinance_number] = ordinance + else: + deduped_ordinances[full_ordinance_number] = ordinance + + return list(deduped_ordinances.values()) + + +if __name__ == "__main__": + documents_directory = "../data/input" + output_json_dir = "../data/output" + + os.makedirs(output_json_dir, exist_ok=True) # + + for pdf_filename in os.listdir(documents_directory): + if pdf_filename.endswith(".pdf"): + output_json_path = os.path.join( + output_json_dir, f"{os.path.splitext(pdf_filename)[0]}.json" + ) + title = os.path.splitext(pdf_filename)[0] + + if os.path.exists(output_json_path): + print(f"Skipping {pdf_filename}, output already exists.") + continue + + pdf_path = os.path.join(documents_directory, pdf_filename) + publish_date = extract_date_from_filename(pdf_filename) + ocr_json_path = "../data/output/ocr_text.json" + + save_ocr_to_json(pdf_path, ocr_json_path, publish_date) + chunks = load_and_split(ocr_json_path) + summaries = summarize_text(chunks, publish_date, title) + individual_ordinances = split_ordinance_summaries(summaries) + deduplicated_ordinances = deduplicate_ordinances(individual_ordinances) + + save_summaries_to_json( + deduplicated_ordinances, output_json_dir, pdf_filename + ) + os.remove(ocr_json_path) + + input_directory = "../data/output" + output_json_path = "../data/output/First Reading.json" + concatenate_jsons(input_directory, output_json_path) + print(f"Summaries saved in directory: {output_json_dir}") diff --git a/packages/wrangle/news/__main__.py b/packages/wrangle/news/__main__.py index 3b2c74ae..752b4aa3 100644 --- a/packages/wrangle/news/__main__.py +++ b/packages/wrangle/news/__main__.py @@ -27,15 +27,15 @@ def process_url(url): def main(): url_list = [ - # "https://www.nola.com/news/environment/new-orleans-prepares-for-three-months-of-salt-intrusion/article_03452ac2-5d64-11ee-ba66-2fb982d2b7c1.html", + "https://www.nola.com/news/environment/new-orleans-prepares-for-three-months-of-salt-intrusion/article_03452ac2-5d64-11ee-ba66-2fb982d2b7c1.html", # "https://lailluminator.com/2023/06/03/theyre-guzzlers-new-orleans-ignores-clean-fleet-law-during-50-million-vehicle-buying-spree/", # "https://www.fox8live.com/video/2023/03/15/city-council-questions-911-call-center-director-tyrell-morris-over-life-threatening-failures/", - # "https://www.nola.com/news/politics/swb-needs-major-changes-to-avoid-more-failures-bgr-says/article_1d13e9c8-f50b-11ed-9c45-67da1c67c50c.html", - # "https://www.nola.com/gambit/news/the_latest/no-excuses-frustrated-council-members-press-richard-s-disposal-over-garbage-failures/article_e62546c4-8df8-11ed-bab6-2b43058e872b.html", + "https://www.nola.com/news/politics/swb-needs-major-changes-to-avoid-more-failures-bgr-says/article_1d13e9c8-f50b-11ed-9c45-67da1c67c50c.html", + "https://www.nola.com/gambit/news/the_latest/no-excuses-frustrated-council-members-press-richard-s-disposal-over-garbage-failures/article_e62546c4-8df8-11ed-bab6-2b43058e872b.html", # "https://www.wdsu.com/article/new-orleans-council-members-consent-decree-mayor-concerns/43556031", - # "https://fightbacknews.org/articles/city-new-orleans-attempts-exit-consent-decree-protesters-demand-community-control-police", + "https://fightbacknews.org/articles/city-new-orleans-attempts-exit-consent-decree-protesters-demand-community-control-police", # "https://www.wwno.org/news/2023-07-13/meeting-on-controversial-new-orleans-jail-project-draws-passionate-comments-and-a-heated-exchange", - # "https://www.wwltv.com/article/news/local/orleans/new-orleans-affordable-housing-city-council-32-million/289-7516fd45-2562-4414-94eb-2c46e810515c", + "https://www.wwltv.com/article/news/local/orleans/new-orleans-affordable-housing-city-council-32-million/289-7516fd45-2562-4414-94eb-2c46e810515c", # "https://www.nola.com/news/politics/new-orleans-swb-floats-rolling-forward-tax-rate/article_a6ce3f46-6474-11ee-b72f-b7a906a8f9ef.html", # "https://www.wwno.org/news/2023-04-04/advocates-to-city-council-spend-covid-aid-surplus-dollars-on-housing-and-youth-development", # "https://www.nola.com/news/politics/how-should-new-orleans-spend-millions-of-one-time-funds-new-debate-begins/article_ef36af06-d320-11ed-b9fe-978f03c2909b.html", @@ -55,6 +55,17 @@ def main(): "https://www.nola.com/louisiana_inspired/meeting-people-where-they-are-how-a-new-orleans-group-is-addressing-youth-crime/article_13c74dca-a70d-11ed-9d8f-9b9d4dc1239f.html", "https://lailluminator.com/2023/11/02/entergy-bills/", "https://www.nola.com/news/politics/at-lincoln-beach-volunteer-caretakers-plead-for-help-from-new-orleans-city-hall/article_2cd4c6e4-2b98-11ed-b0b7-1b46c1cb095d.html", + "https://www.axios.com/local/new-orleans/2024/01/30/city-council-oks-3-grid-hardening-projects", + "https://www.nola.com/news/new-orleans-rebuffs-1-billion-entergy-plan-for-power-grid/article_d5c12ab6-bf8c-11ee-a6ec-436e8185310c.html", + "https://wgno.com/news/louisiana/orleans-parish/new-orleans-city-council-to-discuss-100m-electric-grid-improvements/", + "https://www.axios.com/local/new-orleans/2024/01/30/entergy-grid-hardening-upgrade-new-orleans", + "https://www.wdsu.com/article/new-orleans-city-council-freezes-law-department-funds-since-2022-the-city-has-filed-728-lawsuits/45500352", + "https://www.bizneworleans.com/n-o-city-council-approves-package-of-anti-corruption-laws/", + "https://www.nola.com/news/politics/new-orleans-adopts-new-laws-aimed-at-city-hall-fraud/article_35d9c140-b639-11ee-9136-6fd9b9b3318b.html", + "https://www.nola.com/news/new-orleans-city-council-to-consider-contracting-reforms/article_6690ada6-affb-11ee-8669-6bb8980845ad.html", + "https://www.newsbreak.com/new-orleans-la/3259421210353-a-recent-vote-by-the-new-orleans-city-council-may-have-broken-state-law-in-21-6m-shell-tax-break-development", + "https://www.nola.com/news/politics/new-orleans-city-council-approves-2024-budget/article_3712e23a-9073-11ee-9d18-d761e9f2f5e7.html", + "https://wgno.com/news/louisiana/orleans-parish/new-orleans-city-council-approves-1-5b-2024-executive-budget/", ]