diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 1fd510e768854e1706973fb72a16f8ae31620962..aa74483c2afacf95b8456cdc02a71fb524b090a4 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,8 +1,8 @@ -FROM php:7.2-fpm +FROM php:7.3-fpm COPY --from=composer /usr/bin/composer /usr/bin/composer -RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - +RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - RUN apt-get update && \ apt-get install -y nodejs diff --git a/.gitignore b/.gitignore index 1baa8fe3b49280b199e1fe04075ecf16cc598672..d66b6f23af44369f8416332c6d90567e2e2a2654 100644 --- a/.gitignore +++ b/.gitignore @@ -138,7 +138,6 @@ node_modules # public folder public/* !public/media -!public/media/~person !public/.htaccess !public/favicon.ico !public/index.php @@ -147,10 +146,14 @@ public/* # public media folder public/media/* !public/media/index.html +!public/media/podcasts +!public/media/persons -# public person folder -public/media/~person/* -!public/media/~person/index.html +public/media/podcasts/* +!public/media/podcasts/index.html + +public/media/persons/* +!public/media/persons/index.html # Generated files app/Language/en/PersonsTaxonomy.php diff --git a/.prettierrc.json b/.prettierrc.json index 194ebab74c13af1b59a98d079dfc5b14d5cc7302..a766ac8d82cba6f73992777964c99340f430baab 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -4,7 +4,7 @@ { "files": "*.php", "options": { - "phpVersion": "7.2", + "phpVersion": "7.3", "singleQuote": true } }, diff --git a/.rsync-filter b/.rsync-filter index 606c8a9106df37b3e6caa7f88a52db6d4acf094e..f466ad22e9f8a757bcd138fa62faa24dd740b92b 100644 --- a/.rsync-filter +++ b/.rsync-filter @@ -7,7 +7,7 @@ + writable/*** + .env.example + DEPENDENCIES.md -+ LICENSE ++ LICENSE.md + README.md + INSTALL.md - ** diff --git a/.stylelintrc.json b/.stylelintrc.json index 97675e6da91d82becad1d985073dfc037efc6075..2cd0132cf2ce2071bd90bfce47ecaccbab0c9597 100644 --- a/.stylelintrc.json +++ b/.stylelintrc.json @@ -9,7 +9,8 @@ "apply", "responsive", "variants", - "screen" + "screen", + "layer" ] } ], diff --git a/.svgo.icons.js b/.svgo.icons.js new file mode 100644 index 0000000000000000000000000000000000000000..05d15897135e476c59647f0b51acca707f7fef1a --- /dev/null +++ b/.svgo.icons.js @@ -0,0 +1,17 @@ +module.exports = { + plugins: [ + "removeXMLNS", + "removeDimensions", + "sortAttrs", + { + name: "addAttributesToSVGElement", + params: { + attributes: [ + { fill: "currentColor" }, + { width: "1em" }, + { height: "1em" }, + ], + }, + }, + ], +}; diff --git a/.svgo.icons.yml b/.svgo.icons.yml deleted file mode 100644 index 32c60fea5c849db542f32ac0db7290daed4859d4..0000000000000000000000000000000000000000 --- a/.svgo.icons.yml +++ /dev/null @@ -1,9 +0,0 @@ -plugins: - - removeXMLNS: true - - removeDimensions: true - - addAttributesToSVGElement: - attributes: - - fill: currentColor - - width: "1em" - - height: "1em" - - sortAttrs: true diff --git a/.svgo.js b/.svgo.js new file mode 100644 index 0000000000000000000000000000000000000000..c6a27c953b52ebcac31a233fb372f820bea049e2 --- /dev/null +++ b/.svgo.js @@ -0,0 +1,12 @@ +module.exports = { + plugins: [ + { + name: "removeViewBox", + active: false, + }, + "removeXMLNS", + "removeDimensions", + "sortAttrs", + "prefixIds", + ], +}; diff --git a/.svgo.yml b/.svgo.yml deleted file mode 100644 index b4177b4f84655059f1a2cb4bdc7ad77a3b840c1a..0000000000000000000000000000000000000000 --- a/.svgo.yml +++ /dev/null @@ -1,5 +0,0 @@ -plugins: - - removeXMLNS: true - - removeDimensions: true - - sortAttrs: true - - prefixIds: true diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md index f987fd2785b74bfdb7ab61ffdd16b740acb5b565..325e823b2f8796770d0f630e052f084705c14aa2 100644 --- a/DEPENDENCIES.md +++ b/DEPENDENCIES.md @@ -4,7 +4,7 @@ Castopod uses the following components: PHP Dependencies: -- [Code Igniter 4](https://codeigniter.com) +- [CodeIgniter 4](https://codeigniter.com) ([MIT License](https://codeigniter.com/user_guide/license.html)) - [WhichBrowser/Parser-PHP](https://github.com/WhichBrowser/Parser-PHP) ([MIT License](https://github.com/WhichBrowser/Parser-PHP/blob/master/LICENSE)) @@ -24,6 +24,14 @@ PHP Dependencies: ([MIT License](https://github.com/podlibre/user-agents-php/blob/main/LICENSE)) - [podlibre/ipcat](https://github.com/podlibre/ipcat) ([GNU General Public License v3.0](https://github.com/podlibre/ipcat/blob/master/LICENSE)) +- [podlibre/podcast-namespace](https://code.podlibre.org/podlibre/podcastnamespace) + ([MIT License](https://code.podlibre.org/podlibre/podcastnamespace/-/blob/master/LICENSE)) +- [phpseclib](https://phpseclib.com/) + ([MIT License](https://github.com/phpseclib/phpseclib/blob/master/LICENSE)) +- [codeigniter4-uuid](https://github.com/michalsn/codeigniter4-uuid) + ([MIT License](https://github.com/michalsn/codeigniter4-uuid/blob/develop/LICENSE)) +- [essence](https://github.com/essence/essence) + ([The FreeBSD License](https://github.com/essence/essence/blob/master/LICENSE.txt)) Javascript dependencies: @@ -39,9 +47,15 @@ Javascript dependencies: ([MIT License](https://github.com/jshjohnson/Choices/blob/master/LICENSE)) - [flatpickr](https://flatpickr.js.org/) ([MIT License](https://github.com/flatpickr/flatpickr/blob/master/LICENSE.md)) +- [popperjs](https://popper.js.org/) + ([MIT License](https://github.com/popperjs/popper-core/blob/master/LICENSE.md)) Other: +- [Kumbh Sans](https://fonts.google.com/specimen/Kumbh+Sans) + ([Open Font License](https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL)) +- [Montserrat](https://fonts.google.com/specimen/Montserrat) + ([Open Font License](https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL)) - [RemixIcon](https://remixicon.com/) ([Apache License 2.0](https://github.com/Remix-Design/RemixIcon/blob/master/License)) - [OPAWG/User agent list](https://github.com/opawg/user-agents) diff --git a/Dockerfile b/Dockerfile index a2123509c1c7fa36cc4d8734c60fb7cbe6a3d9a0..01ab228ea6aaa6d0eb928399805ae63886c2c957 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM php:7.2-fpm +FROM php:7.3-fpm COPY . /castopod WORKDIR /castopod @@ -25,3 +25,9 @@ RUN echo "file_uploads = On\n" \ "post_max_size = 120M\n" \ "max_execution_time = 300\n" \ > /usr/local/etc/php/conf.d/uploads.ini + +# install cron +RUN apt-get update && \ + apt-get install -y cron + +RUN crontab /castopod/crontab diff --git a/INSTALL.md b/INSTALL.md index 71ad0e629f14096248bb9758e2ccbad9e60be5ea..efc5f995926a43846df617ef04964ae64f39bbc0 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,13 +1,16 @@ -# How to install Castopod +# How to install Castopod <!-- omit in toc --> Castopod was thought to be easy to install. Whether using dedicated or shared hosting, you can install it on most PHP-MySQL compatible web servers. +## Table of contents <!-- omit in toc --> + - [Install instructions](#install-instructions) - [(optional) Manual configuration](#optional-manual-configuration) - [Web Server Requirements](#web-server-requirements) - - [PHP v7.2 or higher](#php-v72-or-higher) + - [PHP v7.3 or higher](#php-v73-or-higher) - [MySQL compatible database](#mysql-compatible-database) + - [Privileges](#privileges) - [(Optional) Other recommendations](#optional-other-recommendations) - [Security concerns](#security-concerns) @@ -19,9 +22,16 @@ hosting, you can install it on most PHP-MySQL compatible web servers. 1. Download and unzip the Castopod package onto the web server if you haven’t already. - âš ï¸ Set the web server document root to the `public/` sub-folder. -2. Run the Castopod install script by going to the install wizard page +2. âš ï¸ For broadcasting social activities to the fediverse, add a cron task on + your web server to run every minute (replace the paths accordingly): + + ```php + * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-activities + ``` + +3. Run the Castopod install script by going to the install wizard page (`https://your_domain_name.com/cp-install`) in your favorite web browser. -3. Follow the instructions on your screen. +4. Follow the instructions on your screen. All done, start podcasting! @@ -36,13 +46,12 @@ Before uploading Castopod files to your web server: ## Web Server Requirements -### PHP v7.2 or higher +### PHP v7.3 or higher -PHP version 7.2 or higher is required, with the following extensions installed: +PHP version 7.3 or higher is required, with the following extensions installed: - [intl](http://php.net/manual/en/intl.requirements.php) -- [libcurl](http://php.net/manual/en/curl.requirements.php) if you plan to use - the HTTP\CURLRequest library +- [libcurl](http://php.net/manual/en/curl.requirements.php) - [mbstring](http://php.net/manual/en/mbstring.installation.php) Additionally, make sure that the following extensions are enabled in your PHP: diff --git a/LICENSE b/LICENSE deleted file mode 100644 index d0829d8297ed39d609362506108bec4d6cc90b47..0000000000000000000000000000000000000000 --- a/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - Castopod - Copyright (C) 2020 Podlibre - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -<http://www.gnu.org/licenses/>. diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000000000000000000000000000000000000..9b0be861e052add772b3beceebaa86421a51e253 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,598 @@ +# GNU Affero General Public License + +_Version 3, 19 November 2007_ _Copyright © 2007 Free Software Foundation, Inc. +<<http://fsf.org/>>_ + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +## Preamble + +The GNU Affero General Public License is a free, copyleft license for software +and other kinds of works, specifically designed to ensure cooperation with the +community in the case of network server software. + +The licenses for most software and other practical works are designed to take +away your freedom to share and change the works. By contrast, our General Public +Licenses are intended to guarantee your freedom to share and change all versions +of a program--to make sure it remains free software for all its users. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for them if you wish), that you +receive source code or can get it if you want it, that you can change the +software or use pieces of it in new free programs, and that you know you can do +these things. + +Developers that use our General Public Licenses protect your rights with two +steps: **(1)** assert copyright on the software, and **(2)** offer you this +License which gives you legal permission to copy, distribute and/or modify the +software. + +A secondary benefit of defending all users' freedom is that improvements made in +alternate versions of the program, if they receive widespread use, become +available for other developers to incorporate. Many developers of free software +are heartened and encouraged by the resulting cooperation. However, in the case +of software used on network servers, this result may fail to come about. The GNU +General Public License permits making a modified version and letting the public +access it on a server without ever releasing its source code to the public. + +The GNU Affero General Public License is designed specifically to ensure that, +in such cases, the modified source code becomes available to the community. It +requires the operator of a network server to provide the source code of the +modified version running there to the users of that server. Therefore, public +use of a modified version, on a publicly accessible server, gives the public +access to the source code of the modified version. + +An older license, called the Affero General Public License and published by +Affero, was designed to accomplish similar goals. This is a different license, +not a version of the Affero GPL, but Affero has released a new version of the +Affero GPL which permits relicensing under this license. + +The precise terms and conditions for copying, distribution and modification +follow. + +## TERMS AND CONDITIONS + +### 0. Definitions + +“This License†refers to version 3 of the GNU Affero General Public License. + +“Copyright†also means copyright-like laws that apply to other kinds of works, +such as semiconductor masks. + +“The Program†refers to any copyrightable work licensed under this License. Each +licensee is addressed as “youâ€. “Licensees†and “recipients†may be individuals +or organizations. + +To “modify†a work means to copy from or adapt all or part of the work in a +fashion requiring copyright permission, other than the making of an exact copy. +The resulting work is called a “modified version†of the earlier work or a work +“based on†the earlier work. + +A “covered work†means either the unmodified Program or a work based on the +Program. + +To “propagate†a work means to do anything with it that, without permission, +would make you directly or secondarily liable for infringement under applicable +copyright law, except executing it on a computer or modifying a private copy. +Propagation includes copying, distribution (with or without modification), +making available to the public, and in some countries other activities as well. + +To “convey†a work means any kind of propagation that enables other parties to +make or receive copies. Mere interaction with a user through a computer network, +with no transfer of a copy, is not conveying. + +An interactive user interface displays “Appropriate Legal Notices†to the extent +that it includes a convenient and prominently visible feature that **(1)** +displays an appropriate copyright notice, and **(2)** tells the user that there +is no warranty for the work (except to the extent that warranties are provided), +that licensees may convey the work under this License, and how to view a copy of +this License. If the interface presents a list of user commands or options, such +as a menu, a prominent item in the list meets this criterion. + +### 1. Source Code + +The “source code†for a work means the preferred form of the work for making +modifications to it. “Object code†means any non-source form of a work. + +A “Standard Interface†means an interface that either is an official standard +defined by a recognized standards body, or, in the case of interfaces specified +for a particular programming language, one that is widely used among developers +working in that language. + +The “System Libraries†of an executable work include anything, other than the +work as a whole, that **(a)** is included in the normal form of packaging a +Major Component, but which is not part of that Major Component, and **(b)** +serves only to enable use of the work with that Major Component, or to implement +a Standard Interface for which an implementation is available to the public in +source code form. A “Major Componentâ€, in this context, means a major essential +component (kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to produce the +work, or an object code interpreter used to run it. + +The “Corresponding Source†for a work in object code form means all the source +code needed to generate, install, and (for an executable work) run the object +code and to modify the work, including scripts to control those activities. +However, it does not include the work's System Libraries, or general-purpose +tools or generally available free programs which are used unmodified in +performing those activities but which are not part of the work. For example, +Corresponding Source includes interface definition files associated with source +files for the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, such as by +intimate data communication or control flow between those subprograms and other +parts of the work. + +The Corresponding Source need not include anything that users can regenerate +automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. + +### 2. Basic Permissions + +All rights granted under this License are granted for the term of copyright on +the Program, and are irrevocable provided the stated conditions are met. This +License explicitly affirms your unlimited permission to run the unmodified +Program. The output from running a covered work is covered by this License only +if the output, given its content, constitutes a covered work. This License +acknowledges your rights of fair use or other equivalent, as provided by +copyright law. + +You may make, run and propagate covered works that you do not convey, without +conditions so long as your license otherwise remains in force. You may convey +covered works to others for the sole purpose of having them make modifications +exclusively for you, or provide you with facilities for running those works, +provided that you comply with the terms of this License in conveying all +material for which you do not control copyright. Those thus making or running +the covered works for you must do so exclusively on your behalf, under your +direction and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the conditions +stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + +### 3. Protecting Users' Legal Rights From Anti-Circumvention Law + +No covered work shall be deemed part of an effective technological measure under +any applicable law fulfilling obligations under article 11 of the WIPO copyright +treaty adopted on 20 December 1996, or similar laws prohibiting or restricting +circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention is +effected by exercising rights under this License with respect to the covered +work, and you disclaim any intention to limit operation or modification of the +work as a means of enforcing, against the work's users, your or third parties' +legal rights to forbid circumvention of technological measures. + +### 4. Conveying Verbatim Copies + +You may convey verbatim copies of the Program's source code as you receive it, +in any medium, provided that you conspicuously and appropriately publish on each +copy an appropriate copyright notice; keep intact all notices stating that this +License and any non-permissive terms added in accord with section 7 apply to the +code; keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may +offer support or warranty protection for a fee. + +### 5. Conveying Modified Source Versions + +You may convey a work based on the Program, or the modifications to produce it +from the Program, in the form of source code under the terms of section 4, +provided that you also meet all of these conditions: + +- **a)** The work must carry prominent notices stating that you modified it, and + giving a relevant date. +- **b)** The work must carry prominent notices stating that it is released under + this License and any conditions added under section 7. This requirement + modifies the requirement in section 4 to “keep intact all noticesâ€. +- **c)** You must license the entire work, as a whole, under this License to + anyone who comes into possession of a copy. This License will therefore apply, + along with any applicable section 7 additional terms, to the whole of the + work, and all its parts, regardless of how they are packaged. This License + gives no permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. +- **d)** If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive interfaces + that do not display Appropriate Legal Notices, your work need not make them do + so. + +A compilation of a covered work with other separate and independent works, which +are not by their nature extensions of the covered work, and which are not +combined with it such as to form a larger program, in or on a volume of a +storage or distribution medium, is called an “aggregate†if the compilation and +its resulting copyright are not used to limit the access or legal rights of the +compilation's users beyond what the individual works permit. Inclusion of a +covered work in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +### 6. Conveying Non-Source Forms + +You may convey a covered work in object code form under the terms of sections 4 +and 5, provided that you also convey the machine-readable Corresponding Source +under the terms of this License, in one of these ways: + +- **a)** Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the Corresponding + Source fixed on a durable physical medium customarily used for software + interchange. +- **b)** Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a written offer, + valid for at least three years and valid for as long as you offer spare parts + or customer support for that product model, to give anyone who possesses the + object code either **(1)** a copy of the Corresponding Source for all the + software in the product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no more than + your reasonable cost of physically performing this conveying of source, or + **(2)** access to copy the Corresponding Source from a network server at no + charge. +- **c)** Convey individual copies of the object code with a copy of the written + offer to provide the Corresponding Source. This alternative is allowed only + occasionally and noncommercially, and only if you received the object code + with such an offer, in accord with subsection 6b. +- **d)** Convey the object code by offering access from a designated place + (gratis or for a charge), and offer equivalent access to the Corresponding + Source in the same way through the same place at no further charge. You need + not require recipients to copy the Corresponding Source along with the object + code. If the place to copy the object code is a network server, the + Corresponding Source may be on a different server (operated by you or a third + party) that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the Corresponding + Source, you remain obligated to ensure that it is available for as long as + needed to satisfy these requirements. +- **e)** Convey the object code using peer-to-peer transmission, provided you + inform other peers where the object code and Corresponding Source of the work + are being offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from the +Corresponding Source as a System Library, need not be included in conveying the +object code work. + +A “User Product†is either **(1)** a “consumer productâ€, which means any +tangible personal property which is normally used for personal, family, or +household purposes, or **(2)** anything designed or sold for incorporation into +a dwelling. In determining whether a product is a consumer product, doubtful +cases shall be resolved in favor of coverage. For a particular product received +by a particular user, “normally used†refers to a typical or common use of that +class of product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected to use, +the product. A product is a consumer product regardless of whether the product +has substantial commercial, industrial or non-consumer uses, unless such uses +represent the only significant mode of use of the product. + +“Installation Information†for a User Product means any methods, procedures, +authorization keys, or other information required to install and execute +modified versions of a covered work in that User Product from a modified version +of its Corresponding Source. The information must suffice to ensure that the +continued functioning of the modified object code is in no case prevented or +interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as part of a +transaction in which the right of possession and use of the User Product is +transferred to the recipient in perpetuity or for a fixed term (regardless of +how the transaction is characterized), the Corresponding Source conveyed under +this section must be accompanied by the Installation Information. But this +requirement does not apply if neither you nor any third party retains the +ability to install modified object code on the User Product (for example, the +work has been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates for a +work that has been modified or installed by the recipient, or for the User +Product in which it has been modified or installed. Access to a network may be +denied when the modification itself materially and adversely affects the +operation of the network or violates the rules and protocols for communication +across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord +with this section must be in a format that is publicly documented (and with an +implementation available to the public in source code form), and must require no +special password or key for unpacking, reading or copying. + +### 7. Additional Terms + +“Additional permissions†are terms that supplement the terms of this License by +making exceptions from one or more of its conditions. Additional permissions +that are applicable to the entire Program shall be treated as though they were +included in this License, to the extent that they are valid under applicable +law. If additional permissions apply only to part of the Program, that part may +be used separately under those permissions, but the entire Program remains +governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any +additional permissions from that copy, or from any part of it. (Additional +permissions may be written to require their own removal in certain cases when +you modify the work.) You may place additional permissions on material, added by +you to a covered work, for which you have or can give appropriate copyright +permission. + +Notwithstanding any other provision of this License, for material you add to a +covered work, you may (if authorized by the copyright holders of that material) +supplement the terms of this License with terms: + +- **a)** Disclaiming warranty or limiting liability differently from the terms + of sections 15 and 16 of this License; or +- **b)** Requiring preservation of specified reasonable legal notices or author + attributions in that material or in the Appropriate Legal Notices displayed by + works containing it; or +- **c)** Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in reasonable ways + as different from the original version; or +- **d)** Limiting the use for publicity purposes of names of licensors or + authors of the material; or +- **e)** Declining to grant rights under trademark law for use of some trade + names, trademarks, or service marks; or +- **f)** Requiring indemnification of licensors and authors of that material by + anyone who conveys the material (or modified versions of it) with contractual + assumptions of liability to the recipient, for any liability that these + contractual assumptions directly impose on those licensors and authors. + +All other non-permissive additional terms are considered “further restrictions†+within the meaning of section 10. If the Program as you received it, or any part +of it, contains a notice stating that it is governed by this License along with +a term that is a further restriction, you may remove that term. If a license +document contains a further restriction but permits relicensing or conveying +under this License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does not survive +such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, +in the relevant source files, a statement of the additional terms that apply to +those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a +separately written license, or stated as exceptions; the above requirements +apply either way. + +### 8. Termination + +You may not propagate or modify a covered work except as expressly provided +under this License. Any attempt otherwise to propagate or modify it is void, and +will automatically terminate your rights under this License (including any +patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a +particular copyright holder is reinstated **(a)** provisionally, unless and +until the copyright holder explicitly and finally terminates your license, and +**(b)** permanently, if the copyright holder fails to notify you of the +violation by some reasonable means prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated +permanently if the copyright holder notifies you of the violation by some +reasonable means, this is the first time you have received notice of violation +of this License (for any work) from that copyright holder, and you cure the +violation prior to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of +parties who have received copies or rights from you under this License. If your +rights have been terminated and not permanently reinstated, you do not qualify +to receive new licenses for the same material under section 10. + +### 9. Acceptance Not Required for Having Copies + +You are not required to accept this License in order to receive or run a copy of +the Program. Ancillary propagation of a covered work occurring solely as a +consequence of using peer-to-peer transmission to receive a copy likewise does +not require acceptance. However, nothing other than this License grants you +permission to propagate or modify any covered work. These actions infringe +copyright if you do not accept this License. Therefore, by modifying or +propagating a covered work, you indicate your acceptance of this License to do +so. + +### 10. Automatic Licensing of Downstream Recipients + +Each time you convey a covered work, the recipient automatically receives a +license from the original licensors, to run, modify and propagate that work, +subject to this License. You are not responsible for enforcing compliance by +third parties with this License. + +An “entity transaction†is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered work results +from an entity transaction, each party to that transaction who receives a copy +of the work also receives whatever licenses to the work the party's predecessor +in interest had or could give under the previous paragraph, plus a right to +possession of the Corresponding Source of the work from the predecessor in +interest, if the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights +granted or affirmed under this License. For example, you may not impose a +license fee, royalty, or other charge for exercise of rights granted under this +License, and you may not initiate litigation (including a cross-claim or +counterclaim in a lawsuit) alleging that any patent claim is infringed by +making, using, selling, offering for sale, or importing the Program or any +portion of it. + +### 11. Patents + +A “contributor†is a copyright holder who authorizes use under this License of +the Program or a work on which the Program is based. The work thus licensed is +called the contributor's “contributor versionâ€. + +A contributor's “essential patent claims†are all patent claims owned or +controlled by the contributor, whether already acquired or hereafter acquired, +that would be infringed by some manner, permitted by this License, of making, +using, or selling its contributor version, but do not include claims that would +be infringed only as a consequence of further modification of the contributor +version. For purposes of this definition, “control†includes the right to grant +patent sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent +license under the contributor's essential patent claims, to make, use, sell, +offer for sale, import and otherwise run, modify and propagate the contents of +its contributor version. + +In the following three paragraphs, a “patent license†is any express agreement +or commitment, however denominated, not to enforce a patent (such as an express +permission to practice a patent or covenant not to sue for patent infringement). +To “grant†such a patent license to a party means to make such an agreement or +commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the +Corresponding Source of the work is not available for anyone to copy, free of +charge and under the terms of this License, through a publicly available network +server or other readily accessible means, then you must either **(1)** cause the +Corresponding Source to be so available, or **(2)** arrange to deprive yourself +of the benefit of the patent license for this particular work, or **(3)** +arrange, in a manner consistent with the requirements of this License, to extend +the patent license to downstream recipients. “Knowingly relying†means you have +actual knowledge that, but for the patent license, your conveying the covered +work in a country, or your recipient's use of the covered work in a country, +would infringe one or more identifiable patents in that country that you have +reason to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you +convey, or propagate by procuring conveyance of, a covered work, and grant a +patent license to some of the parties receiving the covered work authorizing +them to use, propagate, modify or convey a specific copy of the covered work, +then the patent license you grant is automatically extended to all recipients of +the covered work and works based on it. + +A patent license is “discriminatory†if it does not include within the scope of +its coverage, prohibits the exercise of, or is conditioned on the non-exercise +of one or more of the rights that are specifically granted under this License. +You may not convey a covered work if you are a party to an arrangement with a +third party that is in the business of distributing software, under which you +make payment to the third party based on the extent of your activity of +conveying the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory patent +license **(a)** in connection with copies of the covered work conveyed by you +(or copies made from those copies), or **(b)** primarily for and in connection +with specific products or compilations that contain the covered work, unless you +entered into that arrangement, or that patent license was granted, prior to 28 +March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied +license or other defenses to infringement that may otherwise be available to you +under applicable patent law. + +### 12. No Surrender of Others' Freedom + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not excuse +you from the conditions of this License. If you cannot convey a covered work so +as to satisfy simultaneously your obligations under this License and any other +pertinent obligations, then as a consequence you may not convey it at all. For +example, if you agree to terms that obligate you to collect a royalty for +further conveying from those to whom you convey the Program, the only way you +could satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + +### 13. Remote Network Interaction; Use with the GNU General Public License + +Notwithstanding any other provision of this License, if you modify the Program, +your modified version must prominently offer all users interacting with it +remotely through a computer network (if your version supports such interaction) +an opportunity to receive the Corresponding Source of your version by providing +access to the Corresponding Source from a network server at no charge, through +some standard or customary means of facilitating copying of software. This +Corresponding Source shall include the Corresponding Source for any work covered +by version 3 of the GNU General Public License that is incorporated pursuant to +the following paragraph. + +Notwithstanding any other provision of this License, you have permission to link +or combine any covered work with a work licensed under version 3 of the GNU +General Public License into a single combined work, and to convey the resulting +work. The terms of this License will continue to apply to the part which is the +covered work, but the work with which it is combined will remain governed by +version 3 of the GNU General Public License. + +### 14. Revised Versions of this License + +The Free Software Foundation may publish revised and/or new versions of the GNU +Affero General Public License from time to time. Such new versions will be +similar in spirit to the present version, but may differ in detail to address +new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies +that a certain numbered version of the GNU Affero General Public License “or any +later version†applies to it, you have the option of following the terms and +conditions either of that numbered version or of any later version published by +the Free Software Foundation. If the Program does not specify a version number +of the GNU Affero General Public License, you may choose any version ever +published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the +GNU Affero General Public License can be used, that proxy's public statement of +acceptance of a version permanently authorizes you to choose that version for +the Program. + +Later license versions may give you additional or different permissions. +However, no additional obligations are imposed on any author or copyright holder +as a result of your choosing to follow a later version. + +### 15. Disclaimer of Warranty + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER +PARTIES PROVIDE THE PROGRAM “AS IS†WITHOUT WARRANTY OF ANY KIND, EITHER +EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE +QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +### 16. Limitation of Liability + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY +COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS +PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, +INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE +THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED +INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE +PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY +HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +### 17. Interpretation of Sections 15 and 16 + +If the disclaimer of warranty and limitation of liability provided above cannot +be given local legal effect according to their terms, reviewing courts shall +apply local law that most closely approximates an absolute waiver of all civil +liability in connection with the Program, unless a warranty or assumption of +liability accompanies a copy of the Program in return for a fee. + +_END OF TERMS AND CONDITIONS_ + +## How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use +to the public, the best way to achieve this is to make it free software which +everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach +them to the start of each source file to most effectively state the exclusion of +warranty; and each file should have at least the “copyright†line and a pointer +to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer network, +you should also make sure that it provides a way for users to get its source. +For example, if your program is a web application, its interface could display a +“Source†link that leads users to an archive of the code. There are many ways +you could offer source, and different solutions will be better for different +programs; see section 13 for the specific requirements. + +You should also get your employer (if you work as a programmer) or school, if +any, to sign a “copyright disclaimer†for the program, if necessary. For more +information on this, and how to apply and follow the GNU AGPL, see +<<http://www.gnu.org/licenses/>>. diff --git a/README.md b/README.md index 1ca335e1f5d1469dd07c33332a1b1fe8066b68f2..4449f42207ab8ec25f4a017f1cc8678ebfadd4f4 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,12 @@ Castopod is an open-source podcast hosting solution for everyone.\ Whether you are a beginner, an amateur or a professional, you will get everything you need:\ -Create, upload, publish, and get comprehensive audience measurement that respects your -listeners privacy. +Create, upload, publish, and get comprehensive audience measurement that +respects your listeners privacy. Castopod is a free and open-source solution (AGPL v3).\ -Whether you choose to install it on your own server or have it hosted by a -professional, all your data and analytics belong to you and you only. +Whether you choose to install it on your own server or have it hosted by a professional, +all your data and analytics belong to you and you only.  @@ -18,7 +18,9 @@ Castopod can be hosted on any PHP/MySQL server:\ Unzip it and you are ready to broadcast. To install Castopod on your server: -- Download [Castopod latest Package (zip or tar.gz)](https://code.podlibre.org/podlibre/castopod/-/releases), + +- Download + [Castopod latest Package (zip or tar.gz)](https://code.podlibre.org/podlibre/castopod/-/releases), - Follow the procedure “[How to install Castopod](./INSTALL.md)â€. ## Documentation diff --git a/app/Config/ActivityPub.php b/app/Config/ActivityPub.php new file mode 100644 index 0000000000000000000000000000000000000000..7f2ea61c18a08af3e0b3f1b950f7df86ff609824 --- /dev/null +++ b/app/Config/ActivityPub.php @@ -0,0 +1,14 @@ +<?php namespace Config; + +use ActivityPub\Config\ActivityPub as ActivityPubBase; + +class ActivityPub extends ActivityPubBase +{ + /** + * -------------------------------------------------------------------- + * ActivityPub Objects + * -------------------------------------------------------------------- + */ + public $actorObject = 'App\Libraries\PodcastActor'; + public $noteObject = 'App\Libraries\NoteObject'; +} diff --git a/app/Config/App.php b/app/Config/App.php index ffad1a4188ba1afdd926dde049976e014a9bc723..5e9e88b8499671adf7457a820705aed72fbb511e 100644 --- a/app/Config/App.php +++ b/app/Config/App.php @@ -6,309 +6,487 @@ use CodeIgniter\Config\BaseConfig; class App extends BaseConfig { - /* - |-------------------------------------------------------------------------- - | Base Site URL - |-------------------------------------------------------------------------- - | - | URL to your CodeIgniter root. Typically this will be your base URL, - | WITH a trailing slash: - | - | http://example.com/ - | - | If this is not set then CodeIgniter will try guess the protocol, domain - | and path to your installation. However, you should always configure this - | explicitly and never rely on auto-guessing, especially in production - | environments. - | - */ - public $baseURL = 'http://127.0.0.1:8080/'; - - /* - |-------------------------------------------------------------------------- - | Media Base URL - |-------------------------------------------------------------------------- - | - | URL to your media root. Typically this will be your base URL, - | WITH a trailing slash: - | - | http://cdn.example.com/ - | - */ + /** + * -------------------------------------------------------------------------- + * Base Site URL + * -------------------------------------------------------------------------- + * + * URL to your CodeIgniter root. Typically this will be your base URL, + * WITH a trailing slash: + * + * http://example.com/ + * + * If this is not set then CodeIgniter will try guess the protocol, domain + * and path to your installation. However, you should always configure this + * explicitly and never rely on auto-guessing, especially in production + * environments. + * + * @var string + */ + public $baseURL = 'http://localhost:8080/'; + + /** + * -------------------------------------------------------------------------- + * Media Base URL + * -------------------------------------------------------------------------- + * + * URL to your media root. Typically this will be your base URL, + * WITH a trailing slash: + * + * http://cdn.example.com/ + */ public $mediaBaseURL = 'http://127.0.0.2:8080/'; - /* - |-------------------------------------------------------------------------- - | Index File - |-------------------------------------------------------------------------- - | - | Typically this will be your index.php file, unless you've renamed it to - | something else. If you are using mod_rewrite to remove the page set this - | variable so that it is blank. - | - */ + /** + * -------------------------------------------------------------------------- + * Index File + * -------------------------------------------------------------------------- + * + * Typically this will be your index.php file, unless you've renamed it to + * something else. If you are using mod_rewrite to remove the page set this + * variable so that it is blank. + * + * @var string + */ public $indexPage = ''; - /* - |-------------------------------------------------------------------------- - | URI PROTOCOL - |-------------------------------------------------------------------------- - | - | This item determines which getServer global should be used to retrieve the - | URI string. The default setting of 'REQUEST_URI' works for most servers. - | If your links do not seem to work, try one of the other delicious flavors: - | - | 'REQUEST_URI' Uses $_SERVER['REQUEST_URI'] - | 'QUERY_STRING' Uses $_SERVER['QUERY_STRING'] - | 'PATH_INFO' Uses $_SERVER['PATH_INFO'] - | - | WARNING: If you set this to 'PATH_INFO', URIs will always be URL-decoded! - */ + /** + * -------------------------------------------------------------------------- + * URI PROTOCOL + * -------------------------------------------------------------------------- + * + * This item determines which getServer global should be used to retrieve the + * URI string. The default setting of 'REQUEST_URI' works for most servers. + * If your links do not seem to work, try one of the other delicious flavors: + * + * 'REQUEST_URI' Uses $_SERVER['REQUEST_URI'] + * 'QUERY_STRING' Uses $_SERVER['QUERY_STRING'] + * 'PATH_INFO' Uses $_SERVER['PATH_INFO'] + * + * WARNING: If you set this to 'PATH_INFO', URIs will always be URL-decoded! + * + * @var string + */ public $uriProtocol = 'REQUEST_URI'; - /* - |-------------------------------------------------------------------------- - | Default Locale - |-------------------------------------------------------------------------- - | - | The Locale roughly represents the language and location that your visitor - | is viewing the site from. It affects the language strings and other - | strings (like currency markers, numbers, etc), that your program - | should run under for this request. - | - */ + /** + * -------------------------------------------------------------------------- + * Default Locale + * -------------------------------------------------------------------------- + * + * The Locale roughly represents the language and location that your visitor + * is viewing the site from. It affects the language strings and other + * strings (like currency markers, numbers, etc), that your program + * should run under for this request. + * + * @var string + */ public $defaultLocale = 'en'; - /* - |-------------------------------------------------------------------------- - | Negotiate Locale - |-------------------------------------------------------------------------- - | - | If true, the current Request object will automatically determine the - | language to use based on the value of the Accept-Language header. - | - | If false, no automatic detection will be performed. - | - */ + /** + * -------------------------------------------------------------------------- + * Negotiate Locale + * -------------------------------------------------------------------------- + * + * If true, the current Request object will automatically determine the + * language to use based on the value of the Accept-Language header. + * + * If false, no automatic detection will be performed. + * + * @var boolean + */ public $negotiateLocale = true; - /* - |-------------------------------------------------------------------------- - | Supported Locales - |-------------------------------------------------------------------------- - | - | If $negotiateLocale is true, this array lists the locales supported - | by the application in descending order of priority. If no match is - | found, the first locale will be used. - | - */ + /** + * -------------------------------------------------------------------------- + * Supported Locales + * -------------------------------------------------------------------------- + * + * If $negotiateLocale is true, this array lists the locales supported + * by the application in descending order of priority. If no match is + * found, the first locale will be used. + * + * @var string[] + */ public $supportedLocales = ['en', 'fr']; - /* - |-------------------------------------------------------------------------- - | Application Timezone - |-------------------------------------------------------------------------- - | - | The default timezone that will be used in your application to display - | dates with the date helper, and can be retrieved through app_timezone() - | - */ + /** + * -------------------------------------------------------------------------- + * Application Timezone + * -------------------------------------------------------------------------- + * + * The default timezone that will be used in your application to display + * dates with the date helper, and can be retrieved through app_timezone() + * + * @var string + */ public $appTimezone = 'UTC'; - /* - |-------------------------------------------------------------------------- - | Default Character Set - |-------------------------------------------------------------------------- - | - | This determines which character set is used by default in various methods - | that require a character set to be provided. - | - | See http://php.net/htmlspecialchars for a list of supported charsets. - | - */ + /** + * -------------------------------------------------------------------------- + * Default Character Set + * -------------------------------------------------------------------------- + * + * This determines which character set is used by default in various methods + * that require a character set to be provided. + * + * @see http://php.net/htmlspecialchars for a list of supported charsets. + * + * @var string + */ public $charset = 'UTF-8'; - /* - |-------------------------------------------------------------------------- - | URI PROTOCOL - |-------------------------------------------------------------------------- - | - | If true, this will force every request made to this application to be - | made via a secure connection (HTTPS). If the incoming request is not - | secure, the user will be redirected to a secure version of the page - | and the HTTP Strict Transport Security header will be set. - */ + /** + * -------------------------------------------------------------------------- + * URI PROTOCOL + * -------------------------------------------------------------------------- + * + * If true, this will force every request made to this application to be + * made via a secure connection (HTTPS). If the incoming request is not + * secure, the user will be redirected to a secure version of the page + * and the HTTP Strict Transport Security header will be set. + * + * @var boolean + */ public $forceGlobalSecureRequests = false; - /* - |-------------------------------------------------------------------------- - | Session Variables - |-------------------------------------------------------------------------- - | - | 'sessionDriver' - | - | The storage driver to use: files, database, redis, memcached - | - CodeIgniter\Session\Handlers\FileHandler - | - CodeIgniter\Session\Handlers\DatabaseHandler - | - CodeIgniter\Session\Handlers\MemcachedHandler - | - CodeIgniter\Session\Handlers\RedisHandler - | - | 'sessionCookieName' - | - | The session cookie name, must contain only [0-9a-z_-] characters - | - | 'sessionExpiration' - | - | The number of SECONDS you want the session to last. - | Setting to 0 (zero) means expire when the browser is closed. - | - | 'sessionSavePath' - | - | The location to save sessions to, driver dependent. - | - | For the 'files' driver, it's a path to a writable directory. - | WARNING: Only absolute paths are supported! - | - | For the 'database' driver, it's a table name. - | Please read up the manual for the format with other session drivers. - | - | IMPORTANT: You are REQUIRED to set a valid save path! - | - | 'sessionMatchIP' - | - | Whether to match the user's IP address when reading the session data. - | - | WARNING: If you're using the database driver, don't forget to update - | your session table's PRIMARY KEY when changing this setting. - | - | 'sessionTimeToUpdate' - | - | How many seconds between CI regenerating the session ID. - | - | 'sessionRegenerateDestroy' - | - | Whether to destroy session data associated with the old session ID - | when auto-regenerating the session ID. When set to FALSE, the data - | will be later deleted by the garbage collector. - | - | Other session cookie settings are shared with the rest of the application, - | except for 'cookie_prefix' and 'cookie_httponly', which are ignored here. - | - */ + /** + * -------------------------------------------------------------------------- + * Session Driver + * -------------------------------------------------------------------------- + * + * The session storage driver to use: + * - `CodeIgniter\Session\Handlers\FileHandler` + * - `CodeIgniter\Session\Handlers\DatabaseHandler` + * - `CodeIgniter\Session\Handlers\MemcachedHandler` + * - `CodeIgniter\Session\Handlers\RedisHandler` + * + * @var string + */ public $sessionDriver = 'CodeIgniter\Session\Handlers\FileHandler'; + + /** + * -------------------------------------------------------------------------- + * Session Cookie Name + * -------------------------------------------------------------------------- + * + * The session cookie name, must contain only [0-9a-z_-] characters + * + * @var string + */ public $sessionCookieName = 'ci_session'; + + /** + * -------------------------------------------------------------------------- + * Session Expiration + * -------------------------------------------------------------------------- + * + * The number of SECONDS you want the session to last. + * Setting to 0 (zero) means expire when the browser is closed. + * + * @var integer + */ public $sessionExpiration = 7200; + + /** + * -------------------------------------------------------------------------- + * Session Save Path + * -------------------------------------------------------------------------- + * + * The location to save sessions to and is driver dependent. + * + * For the 'files' driver, it's a path to a writable directory. + * WARNING: Only absolute paths are supported! + * + * For the 'database' driver, it's a table name. + * Please read up the manual for the format with other session drivers. + * + * IMPORTANT: You are REQUIRED to set a valid save path! + * + * @var string + */ public $sessionSavePath = WRITEPATH . 'session'; + + /** + * -------------------------------------------------------------------------- + * Session Match IP + * -------------------------------------------------------------------------- + * + * Whether to match the user's IP address when reading the session data. + * + * WARNING: If you're using the database driver, don't forget to update + * your session table's PRIMARY KEY when changing this setting. + * + * @var boolean + */ public $sessionMatchIP = false; + + /** + * -------------------------------------------------------------------------- + * Session Time to Update + * -------------------------------------------------------------------------- + * + * How many seconds between CI regenerating the session ID. + * + * @var integer + */ public $sessionTimeToUpdate = 300; + + /** + * -------------------------------------------------------------------------- + * Session Regenerate Destroy + * -------------------------------------------------------------------------- + * + * Whether to destroy session data associated with the old session ID + * when auto-regenerating the session ID. When set to FALSE, the data + * will be later deleted by the garbage collector. + * + * @var boolean + */ public $sessionRegenerateDestroy = false; - /* - |-------------------------------------------------------------------------- - | Cookie Related Variables - |-------------------------------------------------------------------------- - | - | 'cookiePrefix' = Set a cookie name prefix if you need to avoid collisions - | 'cookieDomain' = Set to .your-domain.com for site-wide cookies - | 'cookiePath' = Typically will be a forward slash - | 'cookieSecure' = Cookie will only be set if a secure HTTPS connection exists. - | 'cookieHTTPOnly' = Cookie will only be accessible via HTTP(S) (no javascript) - | - | Note: These settings (with the exception of 'cookie_prefix' and - | 'cookie_httponly') will also affect sessions. - | - */ + /** + * -------------------------------------------------------------------------- + * Cookie Prefix + * -------------------------------------------------------------------------- + * + * Set a cookie name prefix if you need to avoid collisions. + * + * @var string + */ public $cookiePrefix = ''; + + /** + * -------------------------------------------------------------------------- + * Cookie Domain + * -------------------------------------------------------------------------- + * + * Set to `.your-domain.com` for site-wide cookies. + * + * @var string + */ public $cookieDomain = ''; + + /** + * -------------------------------------------------------------------------- + * Cookie Path + * -------------------------------------------------------------------------- + * + * Typically will be a forward slash. + * + * @var string + */ public $cookiePath = '/'; + + /** + * -------------------------------------------------------------------------- + * Cookie Secure + * -------------------------------------------------------------------------- + * + * Cookie will only be set if a secure HTTPS connection exists. + * + * @var boolean + */ public $cookieSecure = false; + + /** + * -------------------------------------------------------------------------- + * Cookie HTTP Only + * -------------------------------------------------------------------------- + * + * Cookie will only be accessible via HTTP(S) (no JavaScript). + * + * @var boolean + */ public $cookieHTTPOnly = false; - /* - |-------------------------------------------------------------------------- - | Reverse Proxy IPs - |-------------------------------------------------------------------------- - | - | If your server is behind a reverse proxy, you must whitelist the proxy - | IP addresses from which CodeIgniter should trust headers such as - | HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP in order to properly identify - | the visitor's IP address. - | - | You can use both an array or a comma-separated list of proxy addresses, - | as well as specifying whole subnets. Here are a few examples: - | - | Comma-separated: '10.0.1.200,192.168.5.0/24' - | Array: array('10.0.1.200', '192.168.5.0/24') - */ + /** + * -------------------------------------------------------------------------- + * Cookie SameSite + * -------------------------------------------------------------------------- + * + * Configure cookie SameSite setting. Allowed values are: + * - None + * - Lax + * - Strict + * - '' + * + * Defaults to `Lax` for compatibility with modern browsers. Setting `''` + * (empty string) means no SameSite attribute will be set on cookies. If + * set to `None`, `$cookieSecure` must also be set. + * + * @var string 'Lax'|'None'|'Strict' + */ + public $cookieSameSite = 'Lax'; + + /** + * -------------------------------------------------------------------------- + * Reverse Proxy IPs + * -------------------------------------------------------------------------- + * + * If your server is behind a reverse proxy, you must whitelist the proxy + * IP addresses from which CodeIgniter should trust headers such as + * HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP in order to properly identify + * the visitor's IP address. + * + * You can use both an array or a comma-separated list of proxy addresses, + * as well as specifying whole subnets. Here are a few examples: + * + * Comma-separated: '10.0.1.200,192.168.5.0/24' + * Array: ['10.0.1.200', '192.168.5.0/24'] + * + * @var string|string[] + */ public $proxyIPs = ''; - /* - |-------------------------------------------------------------------------- - | Cross Site Request Forgery - |-------------------------------------------------------------------------- - | Enables a CSRF cookie token to be set. When set to TRUE, token will be - | checked on a submitted form. If you are accepting user data, it is strongly - | recommended CSRF protection be enabled. - | - | CSRFTokenName = The token name - | CSRFHeaderName = The header name - | CSRFCookieName = The cookie name - | CSRFExpire = The number in seconds the token should expire. - | CSRFRegenerate = Regenerate token on every submission - | CSRFRedirect = Redirect to previous page with error on failure - */ + /** + * -------------------------------------------------------------------------- + * CSRF Token Name + * -------------------------------------------------------------------------- + * + * The token name. + * + * @deprecated Use `Config\Security` $tokenName property instead of using this property. + * + * @var string + */ public $CSRFTokenName = 'csrf_test_name'; + + /** + * -------------------------------------------------------------------------- + * CSRF Header Name + * -------------------------------------------------------------------------- + * + * The header name. + * + * @deprecated Use `Config\Security` $headerName property instead of using this property. + * + * @var string + */ public $CSRFHeaderName = 'X-CSRF-TOKEN'; + + /** + * -------------------------------------------------------------------------- + * CSRF Cookie Name + * -------------------------------------------------------------------------- + * + * The cookie name. + * + * @deprecated Use `Config\Security` $cookieName property instead of using this property. + * + * @var string + */ public $CSRFCookieName = 'csrf_cookie_name'; + + /** + * -------------------------------------------------------------------------- + * CSRF Expire + * -------------------------------------------------------------------------- + * + * The number in seconds the token should expire. + * + * @deprecated Use `Config\Security` $expire property instead of using this property. + * + * @var integer + */ public $CSRFExpire = 7200; + + /** + * -------------------------------------------------------------------------- + * CSRF Regenerate + * -------------------------------------------------------------------------- + * + * Regenerate token on every submission? + * + * @deprecated Use `Config\Security` $regenerate property instead of using this property. + * + * @var boolean + */ public $CSRFRegenerate = true; + + /** + * -------------------------------------------------------------------------- + * CSRF Redirect + * -------------------------------------------------------------------------- + * + * Redirect to previous page with error on failure? + * + * @deprecated Use `Config\Security` $redirect property instead of using this property. + * + * @var boolean + */ public $CSRFRedirect = true; - /* - |-------------------------------------------------------------------------- - | Content Security Policy - |-------------------------------------------------------------------------- - | Enables the Response's Content Secure Policy to restrict the sources that - | can be used for images, scripts, CSS files, audio, video, etc. If enabled, - | the Response object will populate default values for the policy from the - | ContentSecurityPolicy.php file. Controllers can always add to those - | restrictions at run time. - | - | For a better understanding of CSP, see these documents: - | - http://www.html5rocks.com/en/tutorials/security/content-security-policy/ - | - http://www.w3.org/TR/CSP/ - */ + /** + * -------------------------------------------------------------------------- + * CSRF SameSite + * -------------------------------------------------------------------------- + * + * Setting for CSRF SameSite cookie token. Allowed values are: + * - None + * - Lax + * - Strict + * - '' + * + * Defaults to `Lax` as recommended in this link: + * + * @see https://portswigger.net/web-security/csrf/samesite-cookies + * + * @deprecated Use `Config\Security` $samesite property instead of using this property. + * + * @var string + */ + public $CSRFSameSite = 'Lax'; + + /** + * -------------------------------------------------------------------------- + * Content Security Policy + * -------------------------------------------------------------------------- + * + * Enables the Response's Content Secure Policy to restrict the sources that + * can be used for images, scripts, CSS files, audio, video, etc. If enabled, + * the Response object will populate default values for the policy from the + * `ContentSecurityPolicy.php` file. Controllers can always add to those + * restrictions at run time. + * + * For a better understanding of CSP, see these documents: + * + * @see http://www.html5rocks.com/en/tutorials/security/content-security-policy/ + * @see http://www.w3.org/TR/CSP/ + * + * @var boolean + */ public $CSPEnabled = false; - /* - |-------------------------------------------------------------------------- - | Media root folder - |-------------------------------------------------------------------------- - | Defines the root folder for media files storage - */ + /** + * -------------------------------------------------------------------------- + * Media root folder + * -------------------------------------------------------------------------- + * Defines the root folder for media files storage + */ public $mediaRoot = 'media'; - /* - |-------------------------------------------------------------------------- - | Admin gateway - |-------------------------------------------------------------------------- - | Defines a base route for all admin pages - */ + /** + * -------------------------------------------------------------------------- + * Admin gateway + * -------------------------------------------------------------------------- + * Defines a base route for all admin pages + */ public $adminGateway = 'cp-admin'; - /* - |-------------------------------------------------------------------------- - | Auth gateway - |-------------------------------------------------------------------------- - | Defines a base route for all authentication related pages - */ + /** + * -------------------------------------------------------------------------- + * Auth gateway + * -------------------------------------------------------------------------- + * Defines a base route for all authentication related pages + */ public $authGateway = 'cp-auth'; - /* - |-------------------------------------------------------------------------- - | Install gateway - |-------------------------------------------------------------------------- - | Defines a base route for instance installation - */ + /** + * -------------------------------------------------------------------------- + * Install gateway + * -------------------------------------------------------------------------- + * Defines a base route for instance installation + */ public $installGateway = 'cp-install'; } diff --git a/app/Config/Autoload.php b/app/Config/Autoload.php index fe07d52e6be4db455e7e7ca63f3e8c8fb44df8ec..de861bdb00b5aa7e948f850ade5368d319373427 100644 --- a/app/Config/Autoload.php +++ b/app/Config/Autoload.php @@ -2,90 +2,66 @@ namespace Config; -require_once SYSTEMPATH . 'Config/AutoloadConfig.php'; +use CodeIgniter\Config\AutoloadConfig; /** * ------------------------------------------------------------------- * AUTO-LOADER * ------------------------------------------------------------------- + * * This file defines the namespaces and class maps so the Autoloader * can find the files as needed. + * + * NOTE: If you use an identical key in $psr4 or $classmap, then + * the values in this file will overwrite the framework's values. */ -class Autoload extends \CodeIgniter\Config\AutoloadConfig +class Autoload extends AutoloadConfig { + /** + * ------------------------------------------------------------------- + * Namespaces + * ------------------------------------------------------------------- + * This maps the locations of any namespaces in your application to + * their location on the file system. These are used by the autoloader + * to locate files the first time they have been instantiated. + * + * The '/app' and '/system' directories are already mapped for you. + * you may change the name of the 'App' namespace if you wish, + * but this should be done prior to creating any namespaced classes, + * else you will need to modify all of those classes for this to work. + * + * Prototype: + * + * $psr4 = [ + * 'CodeIgniter' => SYSTEMPATH, + * 'App' => APPPATH + * ]; + * + * @var array<string, string> + */ public $psr4 = [ - 'App' => APPPATH, + APP_NAMESPACE => APPPATH, // For custom app namespace + 'Config' => APPPATH . 'Config', + 'ActivityPub' => APPPATH . 'Libraries/ActivityPub', ]; - public $classmap = []; - - //-------------------------------------------------------------------- - /** - * Collects the application-specific autoload settings and merges - * them with the framework's required settings. + * ------------------------------------------------------------------- + * Class Map + * ------------------------------------------------------------------- + * The class map provides a map of class names and their exact + * location on the drive. Classes loaded in this manner will have + * slightly faster performance because they will not have to be + * searched for within one or more directories as they would if they + * were being autoloaded through a namespace. * - * NOTE: If you use an identical key in $psr4 or $classmap, then - * the values in this file will overwrite the framework's values. + * Prototype: + * + * $classmap = [ + * 'MyClass' => '/path/to/class/file.php' + * ]; + * + * @var array<string, string> */ - public function __construct() - { - parent::__construct(); - - /** - * ------------------------------------------------------------------- - * Namespaces - * ------------------------------------------------------------------- - * This maps the locations of any namespaces in your application - * to their location on the file system. These are used by the - * Autoloader to locate files the first time they have been instantiated. - * - * The '/app' and '/system' directories are already mapped for - * you. You may change the name of the 'App' namespace if you wish, - * but this should be done prior to creating any namespaced classes, - * else you will need to modify all of those classes for this to work. - * - * DO NOT change the name of the CodeIgniter namespace or your application - * WILL break. * - * Prototype: - * - * $Config['psr4'] = [ - * 'CodeIgniter' => SYSPATH - * `]; - */ - $psr4 = [ - 'App' => APPPATH, // To ensure filters, etc still found, - APP_NAMESPACE => APPPATH, // For custom namespace - 'Config' => APPPATH . 'Config', - ]; - - /** - * ------------------------------------------------------------------- - * Class Map - * ------------------------------------------------------------------- - * The class map provides a map of class names and their exact - * location on the drive. Classes loaded in this manner will have - * slightly faster performance because they will not have to be - * searched for within one or more directories as they would if they - * were being autoloaded through a namespace. - * - * Prototype: - * - * $Config['classmap'] = [ - * 'MyClass' => '/path/to/class/file.php' - * ]; - */ - $classmap = []; - - //-------------------------------------------------------------------- - // Do Not Edit Below This Line - //-------------------------------------------------------------------- - - $this->psr4 = array_merge($this->psr4, $psr4); - $this->classmap = array_merge($this->classmap, $classmap); - - unset($psr4, $classmap); - } - - //-------------------------------------------------------------------- + public $classmap = []; } diff --git a/app/Config/Boot/development.php b/app/Config/Boot/development.php index 59c9732a82cae58b05dfaaa373fbe945513e7d6d..036960ed114076cf3d8ff5535670f2efed047f94 100644 --- a/app/Config/Boot/development.php +++ b/app/Config/Boot/development.php @@ -1,33 +1,32 @@ <?php -/* - |-------------------------------------------------------------------------- - | ERROR DISPLAY - |-------------------------------------------------------------------------- - | In development, we want to show as many errors as possible to help - | make sure they don't make it to production. And save us hours of - | painful debugging. +/** + * -------------------------------------------------------------------------- + * ERROR DISPLAY + * -------------------------------------------------------------------------- + * In development, we want to show as many errors as possible to help + * make sure they don't make it to production. And save us hours of + * painful debugging. */ error_reporting(-1); ini_set('display_errors', '1'); -/* - |-------------------------------------------------------------------------- - | DEBUG BACKTRACES - |-------------------------------------------------------------------------- - | If true, this constant will tell the error screens to display debug - | backtraces along with the other error information. If you would - | prefer to not see this, set this value to false. +/** + * -------------------------------------------------------------------------- + * DEBUG BACKTRACES + * -------------------------------------------------------------------------- + * If true, this constant will tell the error screens to display debug + * backtraces along with the other error information. If you would + * prefer to not see this, set this value to false. */ defined('SHOW_DEBUG_BACKTRACE') || define('SHOW_DEBUG_BACKTRACE', true); -/* - |-------------------------------------------------------------------------- - | DEBUG MODE - |-------------------------------------------------------------------------- - | Debug mode is an experimental flag that can allow changes throughout - | the system. This will control whether Kint is loaded, and a few other - | items. It can always be used within your own application too. +/** + * -------------------------------------------------------------------------- + * DEBUG MODE + * -------------------------------------------------------------------------- + * Debug mode is an experimental flag that can allow changes throughout + * the system. This will control whether Kint is loaded, and a few other + * items. It can always be used within your own application too. */ - -defined('CI_DEBUG') || define('CI_DEBUG', 1); +defined('CI_DEBUG') || define('CI_DEBUG', true); diff --git a/app/Config/Boot/production.php b/app/Config/Boot/production.php index c852b03e073e319c7b00393bf4c7e214b6680398..60c8888e42f77b8e509d4fb66792545fc568cfa3 100644 --- a/app/Config/Boot/production.php +++ b/app/Config/Boot/production.php @@ -1,11 +1,11 @@ <?php -/* - |-------------------------------------------------------------------------- - | ERROR DISPLAY - |-------------------------------------------------------------------------- - | Don't show ANY in production environments. Instead, let the system catch - | it and display a generic error message. +/** + * -------------------------------------------------------------------------- + * ERROR DISPLAY + * -------------------------------------------------------------------------- + * Don't show ANY in production environments. Instead, let the system catch + * it and display a generic error message. */ ini_set('display_errors', '0'); error_reporting( @@ -14,16 +14,15 @@ error_reporting( ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & - ~E_USER_DEPRECATED + ~E_USER_DEPRECATED, ); -/* - |-------------------------------------------------------------------------- - | DEBUG MODE - |-------------------------------------------------------------------------- - | Debug mode is an experimental flag that can allow changes throughout - | the system. It's not widely used currently, and may not survive - | release of the framework. +/** + * -------------------------------------------------------------------------- + * DEBUG MODE + * -------------------------------------------------------------------------- + * Debug mode is an experimental flag that can allow changes throughout + * the system. It's not widely used currently, and may not survive + * release of the framework. */ - -defined('CI_DEBUG') || define('CI_DEBUG', 0); +defined('CI_DEBUG') || define('CI_DEBUG', false); diff --git a/app/Config/Boot/testing.php b/app/Config/Boot/testing.php index e6c94d71720905b84d60bf453cd87142e06d251a..a5e9b5e1c61d04f5fdc59ac11500887a64d60b29 100644 --- a/app/Config/Boot/testing.php +++ b/app/Config/Boot/testing.php @@ -1,33 +1,32 @@ <?php -/* - |-------------------------------------------------------------------------- - | ERROR DISPLAY - |-------------------------------------------------------------------------- - | In development, we want to show as many errors as possible to help - | make sure they don't make it to production. And save us hours of - | painful debugging. +/** + * -------------------------------------------------------------------------- + * ERROR DISPLAY + * -------------------------------------------------------------------------- + * In development, we want to show as many errors as possible to help + * make sure they don't make it to production. And save us hours of + * painful debugging. */ error_reporting(-1); ini_set('display_errors', '1'); -/* - |-------------------------------------------------------------------------- - | DEBUG BACKTRACES - |-------------------------------------------------------------------------- - | If true, this constant will tell the error screens to display debug - | backtraces along with the other error information. If you would - | prefer to not see this, set this value to false. +/** + * -------------------------------------------------------------------------- + * DEBUG BACKTRACES + * -------------------------------------------------------------------------- + * If true, this constant will tell the error screens to display debug + * backtraces along with the other error information. If you would + * prefer to not see this, set this value to false. */ defined('SHOW_DEBUG_BACKTRACE') || define('SHOW_DEBUG_BACKTRACE', true); -/* - |-------------------------------------------------------------------------- - | DEBUG MODE - |-------------------------------------------------------------------------- - | Debug mode is an experimental flag that can allow changes throughout - | the system. It's not widely used currently, and may not survive - | release of the framework. +/** + * -------------------------------------------------------------------------- + * DEBUG MODE + * -------------------------------------------------------------------------- + * Debug mode is an experimental flag that can allow changes throughout + * the system. It's not widely used currently, and may not survive + * release of the framework. */ - -defined('CI_DEBUG') || define('CI_DEBUG', 1); +defined('CI_DEBUG') || define('CI_DEBUG', true); diff --git a/app/Config/Cache.php b/app/Config/Cache.php index 8aeec9642b833e18dfa11baba3fd7e0b463db1b8..c26c1cc46043ed676958cc21b41a29159b764bda 100644 --- a/app/Config/Cache.php +++ b/app/Config/Cache.php @@ -2,83 +2,111 @@ namespace Config; +use CodeIgniter\Cache\Handlers\DummyHandler; +use CodeIgniter\Cache\Handlers\FileHandler; +use CodeIgniter\Cache\Handlers\MemcachedHandler; +use CodeIgniter\Cache\Handlers\PredisHandler; +use CodeIgniter\Cache\Handlers\RedisHandler; +use CodeIgniter\Cache\Handlers\WincacheHandler; use CodeIgniter\Config\BaseConfig; class Cache extends BaseConfig { - /* - |-------------------------------------------------------------------------- - | Primary Handler - |-------------------------------------------------------------------------- - | - | The name of the preferred handler that should be used. If for some reason - | it is not available, the $backupHandler will be used in its place. - | - */ + /** + * -------------------------------------------------------------------------- + * Primary Handler + * -------------------------------------------------------------------------- + * + * The name of the preferred handler that should be used. If for some reason + * it is not available, the $backupHandler will be used in its place. + * + * @var string + */ public $handler = 'file'; - /* - |-------------------------------------------------------------------------- - | Backup Handler - |-------------------------------------------------------------------------- - | - | The name of the handler that will be used in case the first one is - | unreachable. Often, 'file' is used here since the filesystem is - | always available, though that's not always practical for the app. - | - */ + /** + * -------------------------------------------------------------------------- + * Backup Handler + * -------------------------------------------------------------------------- + * + * The name of the handler that will be used in case the first one is + * unreachable. Often, 'file' is used here since the filesystem is + * always available, though that's not always practical for the app. + * + * @var string + */ public $backupHandler = 'dummy'; - /* - |-------------------------------------------------------------------------- - | Cache Directory Path - |-------------------------------------------------------------------------- - | - | The path to where cache files should be stored, if using a file-based - | system. - | - */ + /** + * -------------------------------------------------------------------------- + * Cache Directory Path + * -------------------------------------------------------------------------- + * + * The path to where cache files should be stored, if using a file-based + * system. + * + * @var string + * + * @deprecated Use the driver-specific variant under $file + */ public $storePath = WRITEPATH . 'cache/'; - /* - |-------------------------------------------------------------------------- - | Cache Include Query String - |-------------------------------------------------------------------------- - | - | Whether to take the URL query string into consideration when generating - | output cache files. Valid options are: - | - | false = Disabled - | true = Enabled, take all query parameters into account. - | Please be aware that this may result in numerous cache - | files generated for the same page over and over again. - | array('q') = Enabled, but only take into account the specified list - | of query parameters. - | - */ + /** + * -------------------------------------------------------------------------- + * Cache Include Query String + * -------------------------------------------------------------------------- + * + * Whether to take the URL query string into consideration when generating + * output cache files. Valid options are: + * + * false = Disabled + * true = Enabled, take all query parameters into account. + * Please be aware that this may result in numerous cache + * files generated for the same page over and over again. + * array('q') = Enabled, but only take into account the specified list + * of query parameters. + * + * @var boolean|string[] + */ public $cacheQueryString = false; - /* - |-------------------------------------------------------------------------- - | Key Prefix - |-------------------------------------------------------------------------- - | - | This string is added to all cache item names to help avoid collisions - | if you run multiple applications with the same cache engine. - | - */ + /** + * -------------------------------------------------------------------------- + * Key Prefix + * -------------------------------------------------------------------------- + * + * This string is added to all cache item names to help avoid collisions + * if you run multiple applications with the same cache engine. + * + * @var string + */ public $prefix = ''; - /* - | ------------------------------------------------------------------------- - | Memcached settings - | ------------------------------------------------------------------------- - | Your Memcached servers can be specified below, if you are using - | the Memcached drivers. - | - | See: https://codeigniter.com/user_guide/libraries/caching.html#memcached - | - */ + /** + * -------------------------------------------------------------------------- + * File settings + * -------------------------------------------------------------------------- + * Your file storage preferences can be specified below, if you are using + * the File driver. + * + * @var array<string, string|int|null> + */ + public $file = [ + 'storePath' => WRITEPATH . 'cache/', + 'mode' => 0640, + ]; + + /** + * ------------------------------------------------------------------------- + * Memcached settings + * ------------------------------------------------------------------------- + * Your Memcached servers can be specified below, if you are using + * the Memcached drivers. + * + * @see https://codeigniter.com/user_guide/libraries/caching.html#memcached + * + * @var array<string, string|int|boolean> + */ public $memcached = [ 'host' => '127.0.0.1', 'port' => 11211, @@ -86,14 +114,15 @@ class Cache extends BaseConfig 'raw' => false, ]; - /* - | ------------------------------------------------------------------------- - | Redis settings - | ------------------------------------------------------------------------- - | Your Redis server can be specified below, if you are using - | the Redis or Predis drivers. - | - */ + /** + * ------------------------------------------------------------------------- + * Redis settings + * ------------------------------------------------------------------------- + * Your Redis server can be specified below, if you are using + * the Redis or Predis drivers. + * + * @var array<string, string|int|null> + */ public $redis = [ 'host' => '127.0.0.1', 'password' => null, @@ -102,21 +131,22 @@ class Cache extends BaseConfig 'database' => 0, ]; - /* - |-------------------------------------------------------------------------- - | Available Cache Handlers - |-------------------------------------------------------------------------- - | - | This is an array of cache engine alias' and class names. Only engines - | that are listed here are allowed to be used. - | - */ + /** + * -------------------------------------------------------------------------- + * Available Cache Handlers + * -------------------------------------------------------------------------- + * + * This is an array of cache engine alias' and class names. Only engines + * that are listed here are allowed to be used. + * + * @var array<string, string> + */ public $validHandlers = [ - 'dummy' => \CodeIgniter\Cache\Handlers\DummyHandler::class, - 'file' => \CodeIgniter\Cache\Handlers\FileHandler::class, - 'memcached' => \CodeIgniter\Cache\Handlers\MemcachedHandler::class, - 'predis' => \CodeIgniter\Cache\Handlers\PredisHandler::class, - 'redis' => \CodeIgniter\Cache\Handlers\RedisHandler::class, - 'wincache' => \CodeIgniter\Cache\Handlers\WincacheHandler::class, + 'dummy' => DummyHandler::class, + 'file' => FileHandler::class, + 'memcached' => MemcachedHandler::class, + 'predis' => PredisHandler::class, + 'redis' => RedisHandler::class, + 'wincache' => WincacheHandler::class, ]; } diff --git a/app/Config/Constants.php b/app/Config/Constants.php index 75f006924542bd56557b95a5e2564408da4ed49f..80c4d755c59fb86c63a47f521aa58f08ce5b339c 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -1,46 +1,50 @@ <?php -//-------------------------------------------------------------------------- -// Castopod Version -//-------------------------------------------------------------------------- -// The Castopod version number to display. -// -// NOTE: this constant is updated upon release with Continuous Integration. -// +/* + | -------------------------------------------------------------------- + | Castopod Version + | -------------------------------------------------------------------- + | + | The Castopod version number to display. + | + | NOTE: this constant is updated upon release with Continuous Integration. + */ defined('CP_VERSION') || define('CP_VERSION', '1.0.0-alpha.41'); -//-------------------------------------------------------------------- -// App Namespace -//-------------------------------------------------------------------- -// This defines the default Namespace that is used throughout -// CodeIgniter to refer to the Application directory. Change -// this constant to change the namespace that all application -// classes should use. -// -// NOTE: changing this will require manually modifying the -// existing namespaces of App\* namespaced-classes. -// +/* + | -------------------------------------------------------------------- + | App Namespace + | -------------------------------------------------------------------- + | + | This defines the default Namespace that is used throughout + | CodeIgniter to refer to the Application directory. Change + | this constant to change the namespace that all application + | classes should use. + | + | NOTE: changing this will require manually modifying the + | existing namespaces of App\* namespaced-classes. + */ defined('APP_NAMESPACE') || define('APP_NAMESPACE', 'App'); /* -|-------------------------------------------------------------------------- -| Composer Path -|-------------------------------------------------------------------------- -| -| The path that Composer's autoload file is expected to live. By default, -| the vendor folder is in the Root directory, but you can customize that here. -*/ + | -------------------------------------------------------------------------- + | Composer Path + | -------------------------------------------------------------------------- + | + | The path that Composer's autoload file is expected to live. By default, + | the vendor folder is in the Root directory, but you can customize that here. + */ defined('COMPOSER_PATH') || define('COMPOSER_PATH', ROOTPATH . 'vendor/autoload.php'); /* -|-------------------------------------------------------------------------- -| Timing Constants -|-------------------------------------------------------------------------- -| -| Provide simple ways to work with the myriad of PHP functions that -| require information to be in seconds. -*/ + |-------------------------------------------------------------------------- + | Timing Constants + |-------------------------------------------------------------------------- + | + | Provide simple ways to work with the myriad of PHP functions that + | require information to be in seconds. + */ defined('SECOND') || define('SECOND', 1); defined('MINUTE') || define('MINUTE', 60); defined('HOUR') || define('HOUR', 3600); @@ -51,30 +55,30 @@ defined('YEAR') || define('YEAR', 31536000); defined('DECADE') || define('DECADE', 315360000); /* -|-------------------------------------------------------------------------- -| Exit Status Codes -|-------------------------------------------------------------------------- -| -| Used to indicate the conditions under which the script is exit()ing. -| While there is no universal standard for error codes, there are some -| broad conventions. Three such conventions are mentioned below, for -| those who wish to make use of them. The CodeIgniter defaults were -| chosen for the least overlap with these conventions, while still -| leaving room for others to be defined in future versions and user -| applications. -| -| The three main conventions used for determining exit status codes -| are as follows: -| -| Standard C/C++ Library (stdlibc): -| http://www.gnu.org/software/libc/manual/html_node/Exit-Status.html -| (This link also contains other GNU-specific conventions) -| BSD sysexits.h: -| http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=sysexits -| Bash scripting: -| http://tldp.org/LDP/abs/html/exitcodes.html -| -*/ + | -------------------------------------------------------------------------- + | Exit Status Codes + | -------------------------------------------------------------------------- + | + | Used to indicate the conditions under which the script is exit()ing. + | While there is no universal standard for error codes, there are some + | broad conventions. Three such conventions are mentioned below, for + | those who wish to make use of them. The CodeIgniter defaults were + | chosen for the least overlap with these conventions, while still + | leaving room for others to be defined in future versions and user + | applications. + | + | The three main conventions used for determining exit status codes + | are as follows: + | + | Standard C/C++ Library (stdlibc): + | http://www.gnu.org/software/libc/manual/html_node/Exit-Status.html + | (This link also contains other GNU-specific conventions) + | BSD sysexits.h: + | http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=sysexits + | Bash scripting: + | http://tldp.org/LDP/abs/html/exitcodes.html + | + */ defined('EXIT_SUCCESS') || define('EXIT_SUCCESS', 0); // no errors defined('EXIT_ERROR') || define('EXIT_ERROR', 1); // generic error defined('EXIT_CONFIG') || define('EXIT_CONFIG', 3); // configuration error diff --git a/app/Config/ContentSecurityPolicy.php b/app/Config/ContentSecurityPolicy.php index 2ff4a68a5b2297fa92b6bdba471be0642f134d04..7caa5422706c15022c266b9aa9655e0f18eb9834 100644 --- a/app/Config/ContentSecurityPolicy.php +++ b/app/Config/ContentSecurityPolicy.php @@ -5,45 +5,155 @@ namespace Config; use CodeIgniter\Config\BaseConfig; /** - * Class ContentSecurityPolicyConfig - * * Stores the default settings for the ContentSecurityPolicy, if you * choose to use it. The values here will be read in and set as defaults * for the site. If needed, they can be overridden on a page-by-page basis. * * Suggested reference for explanations: - * https://www.html5rocks.com/en/tutorials/security/content-security-policy/ * - * @package Config + * @see https://www.html5rocks.com/en/tutorials/security/content-security-policy/ */ class ContentSecurityPolicy extends BaseConfig { - // broadbrush CSP management + //------------------------------------------------------------------------- + // Broadbrush CSP management + //------------------------------------------------------------------------- + + /** + * Default CSP report context + * + * @var boolean + */ + public $reportOnly = false; - public $reportOnly = false; // default CSP report context - public $reportURI = null; // URL to send violation reports to - public $upgradeInsecureRequests = false; // toggle for forcing https + /** + * Specifies a URL where a browser will send reports + * when a content security policy is violated. + * + * @var string|null + */ + public $reportURI = null; - // sources allowed; string or array of strings + /** + * Instructs user agents to rewrite URL schemes, changing + * HTTP to HTTPS. This directive is for websites with + * large numbers of old URLs that need to be rewritten. + * + * @var boolean + */ + public $upgradeInsecureRequests = false; + + //------------------------------------------------------------------------- + // Sources allowed // Note: once you set a policy to 'none', it cannot be further restricted + //------------------------------------------------------------------------- + + /** + * Will default to self if not overridden + * + * @var string|string[]|null + */ + public $defaultSrc = null; - public $defaultSrc = null; // will default to self if not over-ridden + /** + * Lists allowed scripts' URLs. + * + * @var string|string[] + */ public $scriptSrc = 'self'; + + /** + * Lists allowed stylesheets' URLs. + * + * @var string|string[] + */ public $styleSrc = 'self'; + + /** + * Defines the origins from which images can be loaded. + * + * @var string|string[] + */ public $imageSrc = 'self'; - public $baseURI = null; // will default to self if not over-ridden + + /** + * Restricts the URLs that can appear in a page's `<base>` element. + * + * Will default to self if not overridden + * + * @var string|string[]|null + */ + public $baseURI = null; + + /** + * Lists the URLs for workers and embedded frame contents + * + * @var string|string[] + */ public $childSrc = 'self'; + + /** + * Limits the origins that you can connect to (via XHR, + * WebSockets, and EventSource). + * + * @var string|string[] + */ public $connectSrc = 'self'; + + /** + * Specifies the origins that can serve web fonts. + * + * @var string|string[] + */ public $fontSrc = null; + + /** + * Lists valid endpoints for submission from `<form>` tags. + * + * @var string|string[] + */ public $formAction = 'self'; + + /** + * Specifies the sources that can embed the current page. + * This directive applies to `<frame>`, `<iframe>`, `<embed>`, + * and `<applet>` tags. This directive can't be used in + * `<meta>` tags and applies only to non-HTML resources. + * + * @var string|string[]|null + */ public $frameAncestors = null; + + /** + * Restricts the origins allowed to deliver video and audio. + * + * @var string|string[]|null + */ public $mediaSrc = null; + + /** + * Allows control over Flash and other plugins. + * + * @var string|string[] + */ public $objectSrc = 'self'; + + /** + * @var string|string[]|null + */ public $manifestSrc = null; - // mime types allowed; string or array of strings + /** + * Limits the kinds of plugins a page may invoke. + * + * @var string|string[]|null + */ public $pluginTypes = null; - // list of actions allowed; string or array of strings + /** + * List of actions allowed. + * + * @var string|string[]|null + */ public $sandbox = null; } diff --git a/app/Config/Database.php b/app/Config/Database.php index 408536759225ddd0da59152c6425e433fbbb2906..f655132c2960f0ecc835cfc5653ce4182d67bd4e 100644 --- a/app/Config/Database.php +++ b/app/Config/Database.php @@ -2,13 +2,12 @@ namespace Config; +use CodeIgniter\Database\Config; + /** * Database Configuration - * - * @package Config */ - -class Database extends \CodeIgniter\Database\Config +class Database extends Config { /** * The directory that holds the Migrations @@ -16,7 +15,7 @@ class Database extends \CodeIgniter\Database\Config * * @var string */ - public $filesPath = APPPATH . 'Database/'; + public $filesPath = APPPATH . 'Database' . DIRECTORY_SEPARATOR; /** * Lets you choose which connection group to @@ -41,10 +40,8 @@ class Database extends \CodeIgniter\Database\Config 'DBPrefix' => 'cp_', 'pConnect' => false, 'DBDebug' => ENVIRONMENT !== 'production', - 'cacheOn' => false, - 'cacheDir' => '', - 'charset' => 'utf8', - 'DBCollat' => 'utf8_general_ci', + 'charset' => 'utf8mb4', + 'DBCollat' => 'utf8mb4_unicode_ci', 'swapPre' => '', 'encrypt' => false, 'compress' => false, @@ -69,8 +66,6 @@ class Database extends \CodeIgniter\Database\Config 'DBPrefix' => 'db_', // Needed to ensure we're working correctly with prefixes live. DO NOT REMOVE FOR CI DEVS 'pConnect' => false, 'DBDebug' => ENVIRONMENT !== 'production', - 'cacheOn' => false, - 'cacheDir' => '', 'charset' => 'utf8', 'DBCollat' => 'utf8_general_ci', 'swapPre' => '', @@ -92,21 +87,6 @@ class Database extends \CodeIgniter\Database\Config // we don't overwrite live data on accident. if (ENVIRONMENT === 'testing') { $this->defaultGroup = 'tests'; - - // Under Travis-CI, we can set an ENV var named 'DB_GROUP' - // so that we can test against multiple databases. - if ($group = getenv('DB')) { - if (is_file(TESTPATH . 'travis/Database.php')) { - require TESTPATH . 'travis/Database.php'; - - if ( - !empty($dbconfig) && - array_key_exists($group, $dbconfig) - ) { - $this->tests = $dbconfig[$group]; - } - } - } } } diff --git a/app/Config/DocTypes.php b/app/Config/DocTypes.php index 7ce591b59f628271497979fc195f9b0e2ef0f980..d29036f089bbd6fee20b0fd142cd835f8b3ca54f 100644 --- a/app/Config/DocTypes.php +++ b/app/Config/DocTypes.php @@ -2,14 +2,13 @@ namespace Config; -/** - * DocTypes - * - * @package Config - */ - class DocTypes { + /** + * List of valid document types. + * + * @var array<string, string> + */ public $list = [ 'xhtml11' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">', diff --git a/app/Config/Encryption.php b/app/Config/Encryption.php index 7beac59d9c34f508eaf2e2ef68da1fec6fc5020c..51f8d01a593f92393fad6d86d3777be2c40f2d35 100644 --- a/app/Config/Encryption.php +++ b/app/Config/Encryption.php @@ -12,25 +12,56 @@ use CodeIgniter\Config\BaseConfig; */ class Encryption extends BaseConfig { - /* - |-------------------------------------------------------------------------- - | Encryption Key Starter - |-------------------------------------------------------------------------- - | - | If you use the Encryption class you must set an encryption key (seed). - | You need to ensure it is long enough for the cipher and mode you plan to use. - | See the user guide for more info. + /** + * -------------------------------------------------------------------------- + * Encryption Key Starter + * -------------------------------------------------------------------------- + * + * If you use the Encryption class you must set an encryption key (seed). + * You need to ensure it is long enough for the cipher and mode you plan to use. + * See the user guide for more info. + * + * @var string */ - public $key = ''; - /* - |-------------------------------------------------------------------------- - | Encryption driver to use - |-------------------------------------------------------------------------- - | - | One of the supported drivers, eg 'OpenSSL' or 'Sodium'. - | The default driver, if you don't specify one, is 'OpenSSL'. + /** + * -------------------------------------------------------------------------- + * Encryption Driver to Use + * -------------------------------------------------------------------------- + * + * One of the supported encryption drivers. + * + * Available drivers: + * - OpenSSL + * - Sodium + * + * @var string */ public $driver = 'OpenSSL'; + + /** + * -------------------------------------------------------------------------- + * SodiumHandler's Padding Length in Bytes + * -------------------------------------------------------------------------- + * + * This is the number of bytes that will be padded to the plaintext message + * before it is encrypted. This value should be greater than zero. + * + * See the user guide for more information on padding. + * + * @var integer + */ + public $blockSize = 16; + + /** + * -------------------------------------------------------------------------- + * Encryption digest + * -------------------------------------------------------------------------- + * + * HMAC digest to use, e.g. 'SHA512' or 'SHA256'. Default value is 'SHA512'. + * + * @var string + */ + public $digest = 'SHA512'; } diff --git a/app/Config/Events.php b/app/Config/Events.php index ce8331e9f07305bca47e8aae3096afe0a5b59cf0..bfc80658ecb069c89f607dd65919cba9a4ca21ab 100644 --- a/app/Config/Events.php +++ b/app/Config/Events.php @@ -3,6 +3,7 @@ namespace Config; use CodeIgniter\Events\Events; +use CodeIgniter\Exceptions\FrameworkException; /* * -------------------------------------------------------------------- @@ -23,11 +24,15 @@ use CodeIgniter\Events\Events; Events::on('pre_system', function () { if (ENVIRONMENT !== 'testing') { - while (\ob_get_level() > 0) { - \ob_end_flush(); + if (ini_get('zlib.output_compression')) { + throw FrameworkException::forEnabledZlibOutputCompression(); } - \ob_start(function ($buffer) { + while (ob_get_level() > 0) { + ob_end_flush(); + } + + ob_start(function ($buffer) { return $buffer; }); } @@ -38,11 +43,98 @@ Events::on('pre_system', function () { * -------------------------------------------------------------------- * If you delete, they will no longer be collected. */ - if (ENVIRONMENT !== 'production') { + if (CI_DEBUG) { Events::on( 'DBQuery', - 'CodeIgniter\Debug\Toolbar\Collectors\Database::collect' + 'CodeIgniter\Debug\Toolbar\Collectors\Database::collect', ); Services::toolbar()->respond(); } }); + +Events::on('login', function ($user) { + helper('auth'); + + // set interact_as_actor_id value + $userPodcasts = $user->podcasts; + if ($userPodcasts = $user->podcasts) { + set_interact_as_actor($userPodcasts[0]->id); + } +}); + +Events::on('logout', function ($user) { + helper('auth'); + + // remove user's interact_as_actor session + remove_interact_as_actor($user->id); +}); + +/* + * -------------------------------------------------------------------- + * ActivityPub events + * -------------------------------------------------------------------- + * Update episode metadata counts + */ +Events::on('on_note_add', function ($note) { + if ($note->episode_id) { + model('EpisodeModel') + ->where('id', $note->episode_id) + ->increment('notes_total'); + } +}); + +Events::on('on_note_remove', function ($note) { + if ($note->episode_id) { + model('EpisodeModel') + ->where('id', $note->episode_id) + ->decrement('notes_total', 1 + $note->reblogs_count); + + model('EpisodeModel') + ->where('id', $note->episode_id) + ->decrement('reblogs_total', $note->reblogs_count); + + model('EpisodeModel') + ->where('id', $note->episode_id) + ->decrement('favourites_total', $note->favourites_count); + } +}); + +Events::on('on_note_reblog', function ($actor, $note) { + if ($episodeId = $note->episode_id) { + model('EpisodeModel') + ->where('id', $episodeId) + ->increment('reblogs_total'); + + model('EpisodeModel') + ->where('id', $episodeId) + ->increment('notes_total'); + } +}); + +Events::on('on_note_undo_reblog', function ($reblogNote) { + if ($episodeId = $reblogNote->reblog_of_note->episode_id) { + model('EpisodeModel') + ->where('id', $episodeId) + ->decrement('reblogs_total'); + + model('EpisodeModel') + ->where('id', $episodeId) + ->decrement('notes_total'); + } +}); + +Events::on('on_note_favourite', function ($actor, $note) { + if ($note->episode_id) { + model('EpisodeModel') + ->where('id', $note->episode_id) + ->increment('favourites_total'); + } +}); + +Events::on('on_note_undo_favourite', function ($actor, $note) { + if ($note->episode_id) { + model('EpisodeModel') + ->where('id', $note->episode_id) + ->decrement('favourites_total'); + } +}); diff --git a/app/Config/Exceptions.php b/app/Config/Exceptions.php index 90f43581ad9fbeb6219f57590c9d914a4db1005c..b3bef25c53f6f53628aa2e30d9e3cc81e15dfd3e 100644 --- a/app/Config/Exceptions.php +++ b/app/Config/Exceptions.php @@ -2,42 +2,47 @@ namespace Config; +use CodeIgniter\Config\BaseConfig; + /** * Setup how the exception handler works. - * - * @package Config */ - -class Exceptions +class Exceptions extends BaseConfig { - /* - |-------------------------------------------------------------------------- - | LOG EXCEPTIONS? - |-------------------------------------------------------------------------- - | If true, then exceptions will be logged - | through Services::Log. - | - | Default: true + /** + * -------------------------------------------------------------------------- + * LOG EXCEPTIONS? + * -------------------------------------------------------------------------- + * If true, then exceptions will be logged + * through Services::Log. + * + * Default: true + * + * @var boolean */ public $log = true; - /* - |-------------------------------------------------------------------------- - | DO NOT LOG STATUS CODES - |-------------------------------------------------------------------------- - | Any status codes here will NOT be logged if logging is turned on. - | By default, only 404 (Page Not Found) exceptions are ignored. + /** + * -------------------------------------------------------------------------- + * DO NOT LOG STATUS CODES + * -------------------------------------------------------------------------- + * Any status codes here will NOT be logged if logging is turned on. + * By default, only 404 (Page Not Found) exceptions are ignored. + * + * @var array */ public $ignoreCodes = [404]; - /* - |-------------------------------------------------------------------------- - | Error Views Path - |-------------------------------------------------------------------------- - | This is the path to the directory that contains the 'cli' and 'html' - | directories that hold the views used to generate errors. - | - | Default: APPPATH.'Views/errors' - */ + /** + * -------------------------------------------------------------------------- + * Error Views Path + * -------------------------------------------------------------------------- + * This is the path to the directory that contains the 'cli' and 'html' + * directories that hold the views used to generate errors. + * + * Default: APPPATH.'Views/errors' + * + * @var string + */ public $errorViewPath = APPPATH . 'Views/errors'; } diff --git a/app/Config/Filters.php b/app/Config/Filters.php index bb46e71695270c008ad95ad53aadee014f5415d5..45a9ac6153714d8d3fd73a948efe2102b010cf89 100644 --- a/app/Config/Filters.php +++ b/app/Config/Filters.php @@ -3,40 +3,65 @@ namespace Config; use CodeIgniter\Config\BaseConfig; +use CodeIgniter\Filters\CSRF; +use CodeIgniter\Filters\DebugToolbar; +use CodeIgniter\Filters\Honeypot; class Filters extends BaseConfig { - // Makes reading things below nicer, - // and simpler to change out script that's used. + /** + * Configures aliases for Filter classes to + * make reading things nicer and simpler. + * + * @var array + */ public $aliases = [ - 'csrf' => \CodeIgniter\Filters\CSRF::class, - 'toolbar' => \CodeIgniter\Filters\DebugToolbar::class, - 'honeypot' => \CodeIgniter\Filters\Honeypot::class, + 'csrf' => CSRF::class, + 'toolbar' => DebugToolbar::class, + 'honeypot' => Honeypot::class, 'login' => \Myth\Auth\Filters\LoginFilter::class, 'role' => \Myth\Auth\Filters\RoleFilter::class, - 'permission' => \App\Filters\Permission::class, + 'permission' => \App\Filters\PermissionFilter::class, + 'activity-pub' => \ActivityPub\Filters\ActivityPubFilter::class, ]; - // Always applied before every request + /** + * List of filter aliases that are always + * applied before and after every request. + * + * @var array + */ public $globals = [ 'before' => [ - //'honeypot' + // 'honeypot', // 'csrf', ], 'after' => [ 'toolbar', - //'honeypot' + // 'honeypot', ], ]; - // Works on all of a particular HTTP method - // (GET, POST, etc) as BEFORE filters only - // like: 'post' => ['CSRF', 'throttle'], + /** + * List of filter aliases that works on a + * particular HTTP method (GET, POST, etc.). + * + * Example: + * 'post' => ['csrf', 'throttle'] + * + * @var array + */ public $methods = []; - // List filter aliases and any before/after uri patterns - // that they should run on, like: - // 'isLoggedIn' => ['before' => ['account/*', 'profiles/*']], + /** + * List of filter aliases that should run on any + * before or after URI patterns. + * + * Example: + * 'isLoggedIn' => ['before' => ['account/*', 'profiles/*']] + * + * @var array + */ public $filters = []; public function __construct() diff --git a/app/Config/ForeignCharacters.php b/app/Config/ForeignCharacters.php index acb06ddbf58d21219b00a6a9b1e40303008c9e90..174ddb16a8724189974c8c658a436dea5b2aad3e 100644 --- a/app/Config/ForeignCharacters.php +++ b/app/Config/ForeignCharacters.php @@ -2,6 +2,8 @@ namespace Config; -class ForeignCharacters extends \CodeIgniter\Config\ForeignCharacters +use CodeIgniter\Config\ForeignCharacters as BaseForeignCharacters; + +class ForeignCharacters extends BaseForeignCharacters { } diff --git a/app/Config/Format.php b/app/Config/Format.php index e732d07f6125e66f2956c8db30bdbf07b5afdb3d..e772f6ad007396664f06d4075e806dd07dd160b6 100644 --- a/app/Config/Format.php +++ b/app/Config/Format.php @@ -3,43 +3,62 @@ namespace Config; use CodeIgniter\Config\BaseConfig; +use CodeIgniter\Format\FormatterInterface; class Format extends BaseConfig { - /* - |-------------------------------------------------------------------------- - | Available Response Formats - |-------------------------------------------------------------------------- - | - | When you perform content negotiation with the request, these are the - | available formats that your application supports. This is currently - | only used with the API\ResponseTrait. A valid Formatter must exist - | for the specified format. - | - | These formats are only checked when the data passed to the respond() - | method is an array. - | - */ + /** + * -------------------------------------------------------------------------- + * Available Response Formats + * -------------------------------------------------------------------------- + * + * When you perform content negotiation with the request, these are the + * available formats that your application supports. This is currently + * only used with the API\ResponseTrait. A valid Formatter must exist + * for the specified format. + * + * These formats are only checked when the data passed to the respond() + * method is an array. + * + * @var string[] + */ public $supportedResponseFormats = [ 'application/json', 'application/xml', // machine-readable XML 'text/xml', // human-readable XML ]; - /* - |-------------------------------------------------------------------------- - | Formatters - |-------------------------------------------------------------------------- - | - | Lists the class to use to format responses with of a particular type. - | For each mime type, list the class that should be used. Formatters - | can be retrieved through the getFormatter() method. - | - */ + /** + * -------------------------------------------------------------------------- + * Formatters + * -------------------------------------------------------------------------- + * + * Lists the class to use to format responses with of a particular type. + * For each mime type, list the class that should be used. Formatters + * can be retrieved through the getFormatter() method. + * + * @var array<string, string> + */ public $formatters = [ - 'application/json' => \CodeIgniter\Format\JSONFormatter::class, - 'application/xml' => \CodeIgniter\Format\XMLFormatter::class, - 'text/xml' => \CodeIgniter\Format\XMLFormatter::class, + 'application/json' => 'CodeIgniter\Format\JSONFormatter', + 'application/xml' => 'CodeIgniter\Format\XMLFormatter', + 'text/xml' => 'CodeIgniter\Format\XMLFormatter', + ]; + + /** + * -------------------------------------------------------------------------- + * Formatters Options + * -------------------------------------------------------------------------- + * + * Additional Options to adjust default formatters behaviour. + * For each mime type, list the additional options that should be used. + * + * @var array<string, int> + */ + public $formatterOptions = [ + 'application/json' => JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES, + 'application/xml' => 0, + 'text/xml' => 0, ]; //-------------------------------------------------------------------- @@ -49,26 +68,12 @@ class Format extends BaseConfig * * @param string $mime * - * @return \CodeIgniter\Format\FormatterInterface + * @return FormatterInterface + * + * @deprecated This is an alias of `\CodeIgniter\Format\Format::getFormatter`. Use that instead. */ public function getFormatter(string $mime) { - if (!array_key_exists($mime, $this->formatters)) { - throw new \InvalidArgumentException( - 'No Formatter defined for mime type: ' . $mime - ); - } - - $class = $this->formatters[$mime]; - - if (!class_exists($class)) { - throw new \BadMethodCallException( - $class . ' is not a valid Formatter.' - ); - } - - return new $class(); + return Services::format()->getFormatter($mime); } - - //-------------------------------------------------------------------- } diff --git a/app/Config/Generators.php b/app/Config/Generators.php new file mode 100644 index 0000000000000000000000000000000000000000..1f32e4bbb2d131048bea82eccd05688fc0518dd5 --- /dev/null +++ b/app/Config/Generators.php @@ -0,0 +1,44 @@ +<?php + +namespace Config; + +use CodeIgniter\Config\BaseConfig; + +class Generators extends BaseConfig +{ + /** + * -------------------------------------------------------------------------- + * Generator Commands' Views + * -------------------------------------------------------------------------- + * + * This array defines the mapping of generator commands to the view files + * they are using. If you need to customize them for your own, copy these + * view files in your own folder and indicate the location here. + * + * You will notice that the views have special placeholders enclosed in + * curly braces `{...}`. These placeholders are used internally by the + * generator commands in processing replacements, thus you are warned + * not to delete them or modify the names. If you will do so, you may + * end up disrupting the scaffolding process and throw errors. + * + * YOU HAVE BEEN WARNED! + * + * @var array<string, string> + */ + public $views = [ + 'make:command' => + 'CodeIgniter\Commands\Generators\Views\command.tpl.php', + 'make:controller' => + 'CodeIgniter\Commands\Generators\Views\controller.tpl.php', + 'make:entity' => 'CodeIgniter\Commands\Generators\Views\entity.tpl.php', + 'make:filter' => 'CodeIgniter\Commands\Generators\Views\filter.tpl.php', + 'make:migration' => + 'CodeIgniter\Commands\Generators\Views\migration.tpl.php', + 'make:model' => 'CodeIgniter\Commands\Generators\Views\model.tpl.php', + 'make:seeder' => 'CodeIgniter\Commands\Generators\Views\seeder.tpl.php', + 'make:validation' => + 'CodeIgniter\Commands\Generators\Views\validation.tpl.php', + 'session:migration' => + 'CodeIgniter\Commands\Generators\Views\migration.tpl.php', + ]; +} diff --git a/app/Config/Honeypot.php b/app/Config/Honeypot.php index fe99eb2b166602c6ba35556edad342e0a279bb99..84f2a8540053cfe4efe039e2d57c5d83d744d8a2 100644 --- a/app/Config/Honeypot.php +++ b/app/Config/Honeypot.php @@ -12,6 +12,7 @@ class Honeypot extends BaseConfig * @var boolean */ public $hidden = true; + /** * Honeypot Label Content * @@ -32,4 +33,11 @@ class Honeypot extends BaseConfig * @var string */ public $template = '<label>{label}</label><input type="text" name="{name}" value=""/>'; + + /** + * Honeypot container + * + * @var string + */ + public $container = '<div style="display:none">{template}</div>'; } diff --git a/app/Config/Images.php b/app/Config/Images.php index bcbaa83a6540261a93970b99898a574821fee360..db5ef1851941de47d3b79cb27571e2baf1ba5fb2 100644 --- a/app/Config/Images.php +++ b/app/Config/Images.php @@ -3,6 +3,8 @@ namespace Config; use CodeIgniter\Config\BaseConfig; +use CodeIgniter\Images\Handlers\GDHandler; +use CodeIgniter\Images\Handlers\ImageMagickHandler; class Images extends BaseConfig { @@ -24,20 +26,20 @@ class Images extends BaseConfig /** * The available handler classes. * - * @var array + * @var array<string, string> */ public $handlers = [ - 'gd' => \CodeIgniter\Images\Handlers\GDHandler::class, - 'imagick' => \CodeIgniter\Images\Handlers\ImageMagickHandler::class, + 'gd' => GDHandler::class, + 'imagick' => ImageMagickHandler::class, ]; - /** - * -------------------------------------------------------------------------- - * Uploaded images resizing sizes (in px) - * -------------------------------------------------------------------------- - * The sizes listed below determine the resizing of images when uploaded. - * All uploaded images are of 1:1 ratio (width and height are the same). - */ + /* + |-------------------------------------------------------------------------- + | Uploaded images resizing sizes (in px) + |-------------------------------------------------------------------------- + | The sizes listed below determine the resizing of images when uploaded. + | All uploaded images are of 1:1 ratio (width and height are the same). + */ /** * @var integer @@ -68,12 +70,12 @@ class Images extends BaseConfig */ public $id3Size = 500; - /** - * -------------------------------------------------------------------------- - * Uploaded images naming extensions - * -------------------------------------------------------------------------- - * The properties listed below set the name extensions for the resized images - */ + /* + |-------------------------------------------------------------------------- + | Uploaded images naming extensions + |-------------------------------------------------------------------------- + | The properties listed below set the name extensions for the resized images + */ /** * @var string diff --git a/app/Config/Kint.php b/app/Config/Kint.php index df20e85751e3f7a4bafa457498ac644a1cd30345..0a4301c9c7c84b783a71097408339dd30e361ba7 100644 --- a/app/Config/Kint.php +++ b/app/Config/Kint.php @@ -5,26 +5,23 @@ namespace Config; use CodeIgniter\Config\BaseConfig; use Kint\Renderer\Renderer; +/** + * -------------------------------------------------------------------------- + * Kint + * -------------------------------------------------------------------------- + * + * We use Kint's `RichRenderer` and `CLIRenderer`. This area contains options + * that you can set to customize how Kint works for you. + * + * @see https://kint-php.github.io/kint/ for details on these settings. + */ class Kint extends BaseConfig { /* - |-------------------------------------------------------------------------- - | Kint - |-------------------------------------------------------------------------- - | - | We use Kint's RichRenderer and CLIRenderer. This area contains options - | that you can set to customize how Kint works for you. - | - | For details on these settings, see Kint's docs: - | https://kint-php.github.io/kint/ - | - */ - - /* - |-------------------------------------------------------------------------- - | Global Settings - |-------------------------------------------------------------------------- - */ + |-------------------------------------------------------------------------- + | Global Settings + |-------------------------------------------------------------------------- + */ public $plugins = null; @@ -35,10 +32,10 @@ class Kint extends BaseConfig public $expanded = false; /* - |-------------------------------------------------------------------------- - | RichRenderer Settings - |-------------------------------------------------------------------------- - */ + |-------------------------------------------------------------------------- + | RichRenderer Settings + |-------------------------------------------------------------------------- + */ public $richTheme = 'aante-light.css'; public $richFolder = false; @@ -50,10 +47,10 @@ class Kint extends BaseConfig public $richTabPlugins = null; /* - |-------------------------------------------------------------------------- - | CLI Settings - |-------------------------------------------------------------------------- - */ + |-------------------------------------------------------------------------- + | CLI Settings + |-------------------------------------------------------------------------- + */ public $cliColors = true; public $cliForceUTF8 = false; diff --git a/app/Config/Logger.php b/app/Config/Logger.php index b6c5ca4b410f5671e4b99d80493ad2803ad90ab0..a1d60a1d0be0631bbf7cd07f824f151acc86caab 100644 --- a/app/Config/Logger.php +++ b/app/Config/Logger.php @@ -6,76 +6,82 @@ use CodeIgniter\Config\BaseConfig; class Logger extends BaseConfig { - /* - |-------------------------------------------------------------------------- - | Error Logging Threshold - |-------------------------------------------------------------------------- - | - | You can enable error logging by setting a threshold over zero. The - | threshold determines what gets logged. Any values below or equal to the - | threshold will be logged. Threshold options are: - | - | 0 = Disables logging, Error logging TURNED OFF - | 1 = Emergency Messages - System is unusable - | 2 = Alert Messages - Action Must Be Taken Immediately - | 3 = Critical Messages - Application component unavailable, unexpected exception. - | 4 = Runtime Errors - Don't need immediate action, but should be monitored. - | 5 = Warnings - Exceptional occurrences that are not errors. - | 6 = Notices - Normal but significant events. - | 7 = Info - Interesting events, like user logging in, etc. - | 8 = Debug - Detailed debug information. - | 9 = All Messages - | - | You can also pass an array with threshold levels to show individual error types - | - | array(1, 2, 3, 8) = Emergency, Alert, Critical, and Debug messages - | - | For a live site you'll usually enable Critical or higher (3) to be logged otherwise - | your log files will fill up very fast. - | - */ - public $threshold = 3; + /** + * -------------------------------------------------------------------------- + * Error Logging Threshold + * -------------------------------------------------------------------------- + * + * You can enable error logging by setting a threshold over zero. The + * threshold determines what gets logged. Any values below or equal to the + * threshold will be logged. + * + * Threshold options are: + * + * - 0 = Disables logging, Error logging TURNED OFF + * - 1 = Emergency Messages - System is unusable + * - 2 = Alert Messages - Action Must Be Taken Immediately + * - 3 = Critical Messages - Application component unavailable, unexpected exception. + * - 4 = Runtime Errors - Don't need immediate action, but should be monitored. + * - 5 = Warnings - Exceptional occurrences that are not errors. + * - 6 = Notices - Normal but significant events. + * - 7 = Info - Interesting events, like user logging in, etc. + * - 8 = Debug - Detailed debug information. + * - 9 = All Messages + * + * You can also pass an array with threshold levels to show individual error types + * + * array(1, 2, 3, 8) = Emergency, Alert, Critical, and Debug messages + * + * For a live site you'll usually enable Critical or higher (3) to be logged otherwise + * your log files will fill up very fast. + * + * @var integer|array + */ + public $threshold = 4; - /* - |-------------------------------------------------------------------------- - | Date Format for Logs - |-------------------------------------------------------------------------- - | - | Each item that is logged has an associated date. You can use PHP date - | codes to set your own date formatting - | - */ + /** + * -------------------------------------------------------------------------- + * Date Format for Logs + * -------------------------------------------------------------------------- + * + * Each item that is logged has an associated date. You can use PHP date + * codes to set your own date formatting + * + * @var string + */ public $dateFormat = 'Y-m-d H:i:s'; - /* - |-------------------------------------------------------------------------- - | Log Handlers - |-------------------------------------------------------------------------- - | - | The logging system supports multiple actions to be taken when something - | is logged. This is done by allowing for multiple Handlers, special classes - | designed to write the log to their chosen destinations, whether that is - | a file on the getServer, a cloud-based service, or even taking actions such - | as emailing the dev team. - | - | Each handler is defined by the class name used for that handler, and it - | MUST implement the CodeIgniter\Log\Handlers\HandlerInterface interface. - | - | The value of each key is an array of configuration items that are sent - | to the constructor of each handler. The only required configuration item - | is the 'handles' element, which must be an array of integer log levels. - | This is most easily handled by using the constants defined in the - | Psr\Log\LogLevel class. - | - | Handlers are executed in the order defined in this array, starting with - | the handler on top and continuing down. - | - */ + /** + * -------------------------------------------------------------------------- + * Log Handlers + * -------------------------------------------------------------------------- + * + * The logging system supports multiple actions to be taken when something + * is logged. This is done by allowing for multiple Handlers, special classes + * designed to write the log to their chosen destinations, whether that is + * a file on the getServer, a cloud-based service, or even taking actions such + * as emailing the dev team. + * + * Each handler is defined by the class name used for that handler, and it + * MUST implement the `CodeIgniter\Log\Handlers\HandlerInterface` interface. + * + * The value of each key is an array of configuration items that are sent + * to the constructor of each handler. The only required configuration item + * is the 'handles' element, which must be an array of integer log levels. + * This is most easily handled by using the constants defined in the + * `Psr\Log\LogLevel` class. + * + * Handlers are executed in the order defined in this array, starting with + * the handler on top and continuing down. + * + * @var array + */ public $handlers = [ - //-------------------------------------------------------------------- - // File Handler - //-------------------------------------------------------------------- - + /* + * -------------------------------------------------------------------- + * File Handler + * -------------------------------------------------------------------- + */ 'CodeIgniter\Log\Handlers\FileHandler' => [ /* * The log levels that this handler will handle. diff --git a/app/Config/Migrations.php b/app/Config/Migrations.php index 36b9900b1024a354e1868dbae267deafe0e39c1d..2913c4ca8560b1aa4c4deb1afbbc3ab8bc5cc49c 100644 --- a/app/Config/Migrations.php +++ b/app/Config/Migrations.php @@ -6,46 +6,50 @@ use CodeIgniter\Config\BaseConfig; class Migrations extends BaseConfig { - /* - |-------------------------------------------------------------------------- - | Enable/Disable Migrations - |-------------------------------------------------------------------------- - | - | Migrations are enabled by default for security reasons. - | You should enable migrations whenever you intend to do a schema migration - | and disable it back when you're done. - | - */ + /** + * -------------------------------------------------------------------------- + * Enable/Disable Migrations + * -------------------------------------------------------------------------- + * + * Migrations are enabled by default. + * + * You should enable migrations whenever you intend to do a schema migration + * and disable it back when you're done. + * + * @var boolean + */ public $enabled = true; - /* - |-------------------------------------------------------------------------- - | Migrations table - |-------------------------------------------------------------------------- - | - | This is the name of the table that will store the current migrations state. - | When migrations runs it will store in a database table which migration - | level the system is at. It then compares the migration level in this - | table to the $config['migration_version'] if they are not the same it - | will migrate up. This must be set. - | - */ + /** + * -------------------------------------------------------------------------- + * Migrations Table + * -------------------------------------------------------------------------- + * + * This is the name of the table that will store the current migrations state. + * When migrations runs it will store in a database table which migration + * level the system is at. It then compares the migration level in this + * table to the $config['migration_version'] if they are not the same it + * will migrate up. This must be set. + * + * @var string + */ public $table = 'migrations'; - /* - |-------------------------------------------------------------------------- - | Timestamp Format - |-------------------------------------------------------------------------- - | - | This is the format that will be used when creating new migrations - | using the cli command: - | > php spark migrate:create - | - | Typical formats: - | YmdHis_ - | Y-m-d-His_ - | Y_m_d_His_ - | - */ + /** + * -------------------------------------------------------------------------- + * Timestamp Format + * -------------------------------------------------------------------------- + * + * This is the format that will be used when creating new migrations + * using the CLI command: + * > php spark migrate:create + * + * Typical formats: + * - YmdHis_ + * - Y-m-d-His_ + * - Y_m_d_His_ + * + * @var string + */ public $timestampFormat = 'Y-m-d-His_'; } diff --git a/app/Config/Mimes.php b/app/Config/Mimes.php index da0cd335eece0b7b2198a0b7cf78a6caab8f90a2..574db6d8296b0e477e591f2afeb95dadbfb48667 100644 --- a/app/Config/Mimes.php +++ b/app/Config/Mimes.php @@ -2,19 +2,21 @@ namespace Config; -/* -| ------------------------------------------------------------------- -| MIME TYPES -| ------------------------------------------------------------------- -| This file contains an array of mime types. It is used by the -| Upload class to help identify allowed file types. -| -| When more than one variation for an extension exist (like jpg, jpeg, etc) -| the most common one should be first in the array to aid the guess* -| methods. The same applies when more than one mime-type exists for a -| single extension. -| -*/ +/** + * Mimes + * + * This file contains an array of mime types. It is used by the + * Upload class to help identify allowed file types. + * + * When more than one variation for an extension exist (like jpg, jpeg, etc) + * the most common one should be first in the array to aid the guess* + * methods. The same applies when more than one mime-type exists for a + * single extension. + * + * When working with mime types, please make sure you have the ´fileinfo´ + * extension enabled to reliably detect the media types. + */ + class Mimes { /** @@ -34,7 +36,6 @@ class Mimes 'text/csv', 'text/x-comma-separated-values', 'text/comma-separated-values', - 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', @@ -64,7 +65,6 @@ class Mimes 'application/pdf', 'application/force-download', 'application/x-download', - 'binary/octet-stream', ], 'ai' => ['application/pdf', 'application/postscript'], 'eps' => 'application/postscript', @@ -134,6 +134,7 @@ class Mimes 'multipart/x-zip', ], 'rar' => [ + 'application/vnd.rar', 'application/x-rar', 'application/rar', 'application/x-rar-compressed', @@ -305,15 +306,18 @@ class Mimes 'application/x-jar', 'application/x-compressed', ], - 'svg' => ['image/svg+xml', 'application/xml', 'text/xml'], + 'svg' => ['image/svg+xml', 'image/svg', 'application/xml', 'text/xml'], 'vcf' => 'text/x-vcard', 'srt' => ['text/srt', 'text/plain', 'application/octet-stream'], 'vtt' => ['text/vtt', 'text/plain'], 'ico' => ['image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon'], + 'stl' => [ + 'application/sla', + 'application/vnd.ms-pki.stl', + 'application/x-navistyle', + ], ]; - //-------------------------------------------------------------------- - /** * Attempts to determine the best mime type for the given file extension. * @@ -334,41 +338,47 @@ class Mimes : static::$mimes[$extension]; } - //-------------------------------------------------------------------- - /** * Attempts to determine the best file extension for a given mime type. * - * @param string $type - * @param string $proposed_extension - default extension (in case there is more than one with the same mime type) + * @param string $type + * @param string|null $proposedExtension - default extension (in case there is more than one with the same mime type) * * @return string|null The extension determined, or null if unable to match. */ public static function guessExtensionFromType( string $type, - ?string $proposed_extension = null + string $proposedExtension = null ) { $type = trim(strtolower($type), '. '); - $proposed_extension = trim(strtolower($proposed_extension)); + $proposedExtension = trim(strtolower($proposedExtension)); - if ( - !is_null($proposed_extension) && - array_key_exists($proposed_extension, static::$mimes) && - in_array( - $type, - is_string(static::$mimes[$proposed_extension]) - ? [static::$mimes[$proposed_extension]] - : static::$mimes[$proposed_extension] - ) - ) { - return $proposed_extension; + if ($proposedExtension !== '') { + if ( + array_key_exists($proposedExtension, static::$mimes) && + in_array( + $type, + is_string(static::$mimes[$proposedExtension]) + ? [static::$mimes[$proposedExtension]] + : static::$mimes[$proposedExtension], + true, + ) + ) { + // The detected mime type matches with the proposed extension. + return $proposedExtension; + } + + // An extension was proposed, but the media type does not match the mime type list. + return null; } + // Reverse check the mime type list if no extension was proposed. + // This search is order sensitive! foreach (static::$mimes as $ext => $types) { if ( (is_string($types) && $types === $type) || - (is_array($types) && in_array($type, $types)) + (is_array($types) && in_array($type, $types, true)) ) { return $ext; } @@ -376,6 +386,4 @@ class Mimes return null; } - - //-------------------------------------------------------------------- } diff --git a/app/Config/Modules.php b/app/Config/Modules.php index 8e4c1273f08bfceac2cb734fb09148267d2d2e3d..c87ce571585efbb466f796b8e84bb38dc08b4a6a 100644 --- a/app/Config/Modules.php +++ b/app/Config/Modules.php @@ -2,62 +2,46 @@ namespace Config; -// Cannot extend BaseConfig or looping resources occurs. -class Modules +use CodeIgniter\Modules\Modules as BaseModules; + +class Modules extends BaseModules { - /* - |-------------------------------------------------------------------------- - | Auto-Discovery Enabled? - |-------------------------------------------------------------------------- - | - | If true, then auto-discovery will happen across all elements listed in - | $activeExplorers below. If false, no auto-discovery will happen at all, - | giving a slight performance boost. + /** + * -------------------------------------------------------------------------- + * Enable Auto-Discovery? + * -------------------------------------------------------------------------- + * + * If true, then auto-discovery will happen across all elements listed in + * $activeExplorers below. If false, no auto-discovery will happen at all, + * giving a slight performance boost. + * + * @var boolean */ public $enabled = true; - /* - |-------------------------------------------------------------------------- - | Auto-Discovery Within Composer Packages Enabled? - |-------------------------------------------------------------------------- - | - | If true, then auto-discovery will happen across all namespaces loaded - | by Composer, as well as the namespaces configured locally. + /** + * -------------------------------------------------------------------------- + * Enable Auto-Discovery Within Composer Packages? + * -------------------------------------------------------------------------- + * + * If true, then auto-discovery will happen across all namespaces loaded + * by Composer, as well as the namespaces configured locally. + * + * @var boolean */ public $discoverInComposer = true; - /* - |-------------------------------------------------------------------------- - | Auto-discover Rules - |-------------------------------------------------------------------------- - | - | Lists the aliases of all discovery classes that will be active - | and used during the current application request. If it is not - | listed here, only the base application elements will be used. - */ - public $activeExplorers = ['events', 'registrars', 'routes', 'services']; - /** - * Should the application auto-discover the requested resources. + * -------------------------------------------------------------------------- + * Auto-Discovery Rules + * -------------------------------------------------------------------------- * - * Valid values are: - * - events - * - registrars - * - routes - * - services + * Aliases list of all discovery classes that will be active and used during + * the current application request. * - * @param string $alias + * If it is not listed, only the base application elements will be used. * - * @return boolean + * @var string[] */ - public function shouldDiscover(string $alias) - { - if (!$this->enabled) { - return false; - } - - $alias = strtolower($alias); - - return in_array($alias, $this->activeExplorers); - } + public $aliases = ['events', 'filters', 'registrars', 'routes', 'services']; } diff --git a/app/Config/Pager.php b/app/Config/Pager.php index 699ab90782c04d5fa3bb59e5dc0b0e610f3bf495..8f38d983d371657a3c967bd0c15908cc18f0eccc 100644 --- a/app/Config/Pager.php +++ b/app/Config/Pager.php @@ -6,32 +6,34 @@ use CodeIgniter\Config\BaseConfig; class Pager extends BaseConfig { - /* - |-------------------------------------------------------------------------- - | Templates - |-------------------------------------------------------------------------- - | - | Pagination links are rendered out using views to configure their - | appearance. This array contains aliases and the view names to - | use when rendering the links. - | - | Within each view, the Pager object will be available as $pager, - | and the desired group as $pagerGroup; - | - */ + /** + * -------------------------------------------------------------------------- + * Templates + * -------------------------------------------------------------------------- + * + * Pagination links are rendered out using views to configure their + * appearance. This array contains aliases and the view names to + * use when rendering the links. + * + * Within each view, the Pager object will be available as $pager, + * and the desired group as $pagerGroup; + * + * @var array<string, string> + */ public $templates = [ 'default_full' => 'App\Views\pager\default_full', 'default_simple' => 'CodeIgniter\Pager\Views\default_simple', 'default_head' => 'CodeIgniter\Pager\Views\default_head', ]; - /* - |-------------------------------------------------------------------------- - | Items Per Page - |-------------------------------------------------------------------------- - | - | The default number of results shown in a single page. - | - */ + /** + * -------------------------------------------------------------------------- + * Items Per Page + * -------------------------------------------------------------------------- + * + * The default number of results shown in a single page. + * + * @var integer + */ public $perPage = 20; } diff --git a/app/Config/Paths.php b/app/Config/Paths.php index 79c3408fa548021d0a24292f35e441e6d4776aa6..38eb3057f819d602a608bdda2cfaf5d28bee79ed 100644 --- a/app/Config/Paths.php +++ b/app/Config/Paths.php @@ -3,9 +3,12 @@ namespace Config; /** + * Paths + * * Holds the paths that are used by the system to * locate the main directories, app, system, etc. - * Modifying these allows you to re-structure your application, + * + * Modifying these allows you to restructure your application, * share a system folder between multiple applications, and more. * * All paths are relative to the project's root folder. @@ -13,34 +16,35 @@ namespace Config; class Paths { - /* - *--------------------------------------------------------------- + /** + * --------------------------------------------------------------- * SYSTEM FOLDER NAME - *--------------------------------------------------------------- + * --------------------------------------------------------------- * - * This variable must contain the name of your "system" folder. - * Include the path if the folder is not in the same directory - * as this file. + * This must contain the name of your "system" folder. Include + * the path if the folder is not in the same directory as this file. + * + * @var string */ public $systemDirectory = __DIR__ . '/../../vendor/codeigniter4/codeigniter4/system'; - - /* - *--------------------------------------------------------------- + /** + * --------------------------------------------------------------- * APPLICATION FOLDER NAME - *--------------------------------------------------------------- + * --------------------------------------------------------------- * * If you want this front controller to use a different "app" * folder than the default one you can set its name here. The folder * can also be renamed or relocated anywhere on your getServer. If - * you do, use a full getServer path. For more info please see the user guide: - * http://codeigniter.com/user_guide/general/managing_apps.html + * you do, use a full getServer path. * - * NO TRAILING SLASH! + * @see http://codeigniter.com/user_guide/general/managing_apps.html + * + * @var string */ public $appDirectory = __DIR__ . '/..'; - /* + /** * --------------------------------------------------------------- * WRITABLE DIRECTORY NAME * --------------------------------------------------------------- @@ -50,23 +54,23 @@ class Paths * need write permission to a single place that can be tucked away * for maximum security, keeping it out of the app and/or * system directories. + * + * @var string */ public $writableDirectory = __DIR__ . '/../../writable'; - /* + /** * --------------------------------------------------------------- * TESTS DIRECTORY NAME * --------------------------------------------------------------- * * This variable must contain the name of your "tests" directory. - * The writable directory allows you to group all directories that - * need write permission to a single place that can be tucked away - * for maximum security, keeping it out of the app and/or - * system directories. + * + * @var string */ public $testsDirectory = __DIR__ . '/../../tests'; - /* + /** * --------------------------------------------------------------- * VIEW DIRECTORY NAME * --------------------------------------------------------------- @@ -75,6 +79,8 @@ class Paths * contains the view files used by your application. By * default this is in `app/Views`. This value * is used when no value is provided to `Services::renderer()`. + * + * @var string */ public $viewDirectory = __DIR__ . '/../Views'; } diff --git a/app/Config/Routes.php b/app/Config/Routes.php index bd50617eb8ebed69feee710784ca06b9870e3cf4..2d986c40264e20466c314dda57e71816915a1c35 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -29,10 +29,19 @@ $routes->setAutoRoute(false); * -------------------------------------------------------------------- */ -$routes->addPlaceholder('podcastName', '[a-zA-Z0-9\_]{1,191}'); +$routes->addPlaceholder('podcastName', '[a-zA-Z0-9\_]{1,32}'); $routes->addPlaceholder('slug', '[a-zA-Z0-9\-]{1,191}'); $routes->addPlaceholder('base64', '[A-Za-z0-9\.\_]+\-{0,2}'); $routes->addPlaceholder('platformType', '\bpodcasting|\bsocial|\bfunding'); +$routes->addPlaceholder('noteAction', '\bfavourite|\breblog|\breply'); +$routes->addPlaceholder( + 'embeddablePlayerTheme', + '\blight|\bdark|\blight-transparent|\bdark-transparent', +); +$routes->addPlaceholder( + 'uuid', + '[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-4[0-9A-Fa-f]{3}-[89ABab][0-9A-Fa-f]{3}-[0-9A-Fa-f]{12}', +); /** * -------------------------------------------------------------------- @@ -62,7 +71,7 @@ $routes->group(config('App')->installGateway, function ($routes) { }); // Route for podcast audio file analytics (/audio/pack(podcast_id,episode_id,bytes_threshold,filesize,duration,date)/podcast_folder/filename.mp3) -$routes->add('audio/(:base64)/(:any)', 'Analytics::hit/$1/$2', [ +$routes->get('audio/(:base64)/(:any)', 'Analytics::hit/$1/$2', [ 'as' => 'analytics_hit', ]); @@ -150,7 +159,7 @@ $routes->group( $routes->post('edit', 'Podcast::attemptEdit/$1', [ 'filter' => 'permission:podcast-edit', ]); - $routes->add('delete', 'Podcast::delete/$1', [ + $routes->get('delete', 'Podcast::delete/$1', [ 'as' => 'podcast-delete', 'filter' => 'permission:podcasts-delete', ]); @@ -170,7 +179,7 @@ $routes->group( [ 'as' => 'podcast-person-remove', 'filter' => 'permission:podcast-edit', - ] + ], ); }); @@ -185,7 +194,7 @@ $routes->group( [ 'as' => 'podcast-analytics-webpages', 'filter' => 'permission:podcasts-view,podcast-view', - ] + ], ); $routes->get( 'locations', @@ -193,7 +202,7 @@ $routes->group( [ 'as' => 'podcast-analytics-locations', 'filter' => 'permission:podcasts-view,podcast-view', - ] + ], ); $routes->get( 'unique-listeners', @@ -201,7 +210,7 @@ $routes->group( [ 'as' => 'podcast-analytics-unique-listeners', 'filter' => 'permission:podcasts-view,podcast-view', - ] + ], ); $routes->get( 'listening-time', @@ -209,7 +218,7 @@ $routes->group( [ 'as' => 'podcast-analytics-listening-time', 'filter' => 'permission:podcasts-view,podcast-view', - ] + ], ); $routes->get( 'time-periods', @@ -217,7 +226,7 @@ $routes->group( [ 'as' => 'podcast-analytics-time-periods', 'filter' => 'permission:podcasts-view,podcast-view', - ] + ], ); $routes->get( 'players', @@ -225,7 +234,7 @@ $routes->group( [ 'as' => 'podcast-analytics-players', 'filter' => 'permission:podcasts-view,podcast-view', - ] + ], ); }); @@ -235,7 +244,7 @@ $routes->group( [ 'as' => 'analytics-full-data', 'filter' => 'permission:podcasts-view,podcast-view', - ] + ], ); $routes->get( 'analytics-data/(:segment)/(:segment)', @@ -243,7 +252,7 @@ $routes->group( [ 'as' => 'analytics-data', 'filter' => 'permission:podcasts-view,podcast-view', - ] + ], ); $routes->get( 'analytics-data/(:segment)/(:segment)/(:num)', @@ -251,7 +260,7 @@ $routes->group( [ 'as' => 'analytics-filtered-data', 'filter' => 'permission:podcasts-view,podcast-view', - ] + ], ); // Podcast episodes @@ -283,7 +292,50 @@ $routes->group( $routes->post('edit', 'Episode::attemptEdit/$1/$2', [ 'filter' => 'permission:podcast_episodes-edit', ]); - $routes->add('delete', 'Episode::delete/$1/$2', [ + $routes->get('publish', 'Episode::publish/$1/$2', [ + 'as' => 'episode-publish', + 'filter' => + 'permission:podcast-manage_publications', + ]); + $routes->post( + 'publish', + 'Episode::attemptPublish/$1/$2', + [ + 'filter' => + 'permission:podcast-manage_publications', + ], + ); + $routes->get( + 'publish-edit', + 'Episode::publishEdit/$1/$2', + [ + 'as' => 'episode-publish_edit', + 'filter' => + 'permission:podcast-manage_publications', + ], + ); + $routes->post( + 'publish-edit', + 'Episode::attemptPublishEdit/$1/$2', + [ + 'filter' => + 'permission:podcast-manage_publications', + ], + ); + $routes->get('unpublish', 'Episode::unpublish/$1/$2', [ + 'as' => 'episode-unpublish', + 'filter' => + 'permission:podcast-manage_publications', + ]); + $routes->post( + 'unpublish', + 'Episode::attemptUnpublish/$1/$2', + [ + 'filter' => + 'permission:podcast-manage_publications', + ], + ); + $routes->get('delete', 'Episode::delete/$1/$2', [ 'as' => 'episode-delete', 'filter' => 'permission:podcast_episodes-delete', ]); @@ -293,7 +345,7 @@ $routes->group( [ 'as' => 'transcript-delete', 'filter' => 'permission:podcast_episodes-edit', - ] + ], ); $routes->get( 'chapters-delete', @@ -301,7 +353,7 @@ $routes->group( [ 'as' => 'chapters-delete', 'filter' => 'permission:podcast_episodes-edit', - ] + ], ); $routes->get( 'soundbites', @@ -309,22 +361,22 @@ $routes->group( [ 'as' => 'soundbites-edit', 'filter' => 'permission:podcast_episodes-edit', - ] + ], ); $routes->post( 'soundbites', 'Episode::soundbitesAttemptEdit/$1/$2', [ 'filter' => 'permission:podcast_episodes-edit', - ] + ], ); - $routes->add( + $routes->get( 'soundbites/(:num)/delete', 'Episode::soundbiteDelete/$1/$2/$3', [ 'as' => 'soundbite-delete', 'filter' => 'permission:podcast_episodes-edit', - ] + ], ); $routes->get( 'embeddable-player', @@ -332,7 +384,7 @@ $routes->group( [ 'as' => 'embeddable-player-add', 'filter' => 'permission:podcast_episodes-edit', - ] + ], ); $routes->group('persons', function ($routes) { @@ -346,7 +398,7 @@ $routes->group( [ 'filter' => 'permission:podcast_episodes-edit', - ] + ], ); $routes->get( '(:num)/remove', @@ -355,7 +407,7 @@ $routes->group( 'as' => 'episode-person-remove', 'filter' => 'permission:podcast_episodes-edit', - ] + ], ); }); }); @@ -394,9 +446,9 @@ $routes->group( [ 'filter' => 'permission:podcast-manage_contributors', - ] + ], ); - $routes->add('remove', 'Contributor::remove/$1/$2', [ + $routes->get('remove', 'Contributor::remove/$1/$2', [ 'as' => 'contributor-remove', 'filter' => 'permission:podcast-manage_contributors', @@ -411,7 +463,7 @@ $routes->group( [ 'as' => 'platforms-podcasting', 'filter' => 'permission:podcast-manage_platforms', - ] + ], ); $routes->get( 'social', @@ -419,7 +471,7 @@ $routes->group( [ 'as' => 'platforms-social', 'filter' => 'permission:podcast-manage_platforms', - ] + ], ); $routes->get( 'funding', @@ -427,7 +479,7 @@ $routes->group( [ 'as' => 'platforms-funding', 'filter' => 'permission:podcast-manage_platforms', - ] + ], ); $routes->post( 'save/(:platformType)', @@ -435,20 +487,35 @@ $routes->group( [ 'as' => 'platforms-save', 'filter' => 'permission:podcast-manage_platforms', - ] + ], ); - $routes->add( + $routes->get( '(:slug)/podcast-platform-remove', 'PodcastPlatform::removePodcastPlatform/$1/$2', [ 'as' => 'podcast-platform-remove', 'filter' => 'permission:podcast-manage_platforms', - ] + ], ); }); }); }); + // Instance wide Fediverse config + $routes->group('fediverse', function ($routes) { + $routes->get('/', 'Fediverse::dashboard', [ + 'as' => 'fediverse-dashboard', + ]); + $routes->get('blocked-actors', 'Fediverse::blockedActors', [ + 'as' => 'fediverse-blocked-actors', + 'filter' => 'permission:fediverse-block_actors', + ]); + $routes->get('blocked-domains', 'Fediverse::blockedDomains', [ + 'as' => 'fediverse-blocked-domains', + 'filter' => 'permission:fediverse-block_domains', + ]); + }); + // Pages $routes->group('pages', function ($routes) { $routes->get('/', 'Page::list', ['as' => 'page-list']); @@ -470,7 +537,7 @@ $routes->group( 'filter' => 'permission:pages-manage', ]); - $routes->add('delete', 'Page::delete/$1', [ + $routes->get('delete', 'Page::delete/$1', [ 'as' => 'page-delete', 'filter' => 'permission:pages-manage', ]); @@ -504,19 +571,19 @@ $routes->group( $routes->post('edit', 'User::attemptEdit/$1', [ 'filter' => 'permission:users-manage_authorizations', ]); - $routes->add('ban', 'User::ban/$1', [ + $routes->get('ban', 'User::ban/$1', [ 'as' => 'user-ban', 'filter' => 'permission:users-manage_bans', ]); - $routes->add('unban', 'User::unBan/$1', [ + $routes->get('unban', 'User::unBan/$1', [ 'as' => 'user-unban', 'filter' => 'permission:users-manage_bans', ]); - $routes->add('force-pass-reset', 'User::forcePassReset/$1', [ + $routes->get('force-pass-reset', 'User::forcePassReset/$1', [ 'as' => 'user-force_pass_reset', 'filter' => 'permission:users-force_pass_reset', ]); - $routes->add('delete', 'User::delete/$1', [ + $routes->get('delete', 'User::delete/$1', [ 'as' => 'user-delete', 'filter' => 'permission:users-delete', ]); @@ -533,7 +600,7 @@ $routes->group( ]); $routes->post('change-password', 'MyAccount::attemptChange/$1'); }); - } + }, ); /** @@ -570,35 +637,142 @@ $routes->group(config('App')->authGateway, function ($routes) { $routes->post('reset-password', 'Auth::attemptReset'); }); -// Public routes +// Podcast's Public routes $routes->group('@(:podcastName)', function ($routes) { - $routes->get('/', 'Podcast/$1', ['as' => 'podcast']); - $routes->group('(:slug)', function ($routes) { + $routes->get('/', 'Podcast::activity/$1', [ + 'as' => 'podcast-activity', + ]); + // override default ActivityPub Library's actor route + $routes->get('/', 'Podcast::activity/$1', [ + 'as' => 'actor', + 'alternate-content' => [ + 'application/activity+json' => [ + 'namespace' => 'ActivityPub\Controllers', + 'controller-method' => 'ActorController/$1', + ], + 'application/ld+json; profile="https://www.w3.org/ns/activitystreams' => [ + 'namespace' => 'ActivityPub\Controllers', + 'controller-method' => 'ActorController/$1', + ], + ], + ]); + $routes->get('episodes', 'Podcast::episodes/$1', [ + 'as' => 'podcast-episodes', + ]); + $routes->group('episodes/(:slug)', function ($routes) { $routes->get('/', 'Episode/$1/$2', [ 'as' => 'episode', ]); + $routes->get('oembed.json', 'Episode::oembedJSON/$1/$2', [ + 'as' => 'episode-oembed-json', + ]); + $routes->get('oembed.xml', 'Episode::oembedXML/$1/$2', [ + 'as' => 'episode-oembed-xml', + ]); $routes->group('embeddable-player', function ($routes) { $routes->get('/', 'Episode::embeddablePlayer/$1/$2', [ 'as' => 'embeddable-player', ]); - $routes->get('(:slug)', 'Episode::embeddablePlayer/$1/$2/$3', [ - 'as' => 'embeddable-player-theme', - ]); + $routes->get( + '(:embeddablePlayerTheme)', + 'Episode::embeddablePlayer/$1/$2/$3', + [ + 'as' => 'embeddable-player-theme', + ], + ); }); }); + $routes->head('feed.xml', 'Feed/$1', ['as' => 'podcast_feed']); $routes->get('feed.xml', 'Feed/$1', ['as' => 'podcast_feed']); }); + +// Other pages $routes->get('/credits', 'Page::credits', ['as' => 'credits']); $routes->get('/(:slug)', 'Page/$1', ['as' => 'page']); +// interacting as an actor +$routes->post('interact-as-actor', 'Auth::attemptInteractAsActor', [ + 'as' => 'interact-as-actor', +]); + /** + * Overwriting ActivityPub routes file + */ +$routes->group('@(:podcastName)', function ($routes) { + $routes->post('notes/new', 'Note::attemptCreate/$1', [ + 'as' => 'note-attempt-create', + 'filter' => 'permission:podcast-manage_publications', + ]); + // Note + $routes->group('notes/(:uuid)', function ($routes) { + $routes->get('/', 'Note/$1/$2', [ + 'as' => 'note', + 'alternate-content' => [ + 'application/activity+json' => [ + 'namespace' => 'ActivityPub\Controllers', + 'controller-method' => 'NoteController/$2', + ], + 'application/ld+json; profile="https://www.w3.org/ns/activitystreams' => [ + 'namespace' => 'ActivityPub\Controllers', + 'controller-method' => 'NoteController/$2', + ], + ], + ]); + $routes->get('replies', 'Note/$1/$2', [ + 'as' => 'note-replies', + 'alternate-content' => [ + 'application/activity+json' => [ + 'namespace' => 'ActivityPub\Controllers', + 'controller-method' => 'NoteController::replies/$2', + ], + 'application/ld+json; profile="https://www.w3.org/ns/activitystreams' => [ + 'namespace' => 'ActivityPub\Controllers', + 'controller-method' => 'NoteController::replies/$2', + ], + ], + ]); + + // Actions + $routes->post('action', 'Note::attemptAction/$1/$2', [ + 'as' => 'note-attempt-action', + 'filter' => 'permission:podcast-interact_as', + ]); + + $routes->post('block-actor', 'Note::attemptBlockActor/$1/$2', [ + 'as' => 'note-attempt-block-actor', + 'filter' => 'permission:fediverse-block_actors', + ]); + $routes->post('block-domain', 'Note::attemptBlockDomain/$1/$2', [ + 'as' => 'note-attempt-block-domain', + 'filter' => 'permission:fediverse-block_domains', + ]); + $routes->post('delete', 'Note::attemptDelete/$1/$2', [ + 'as' => 'note-attempt-delete', + 'filter' => 'permission:podcast-manage_publications', + ]); + + $routes->get('remote/(:noteAction)', 'Note::remoteAction/$1/$2/$3', [ + 'as' => 'note-remote-action', + ]); + }); + + $routes->get('follow', 'Actor::follow/$1', [ + 'as' => 'follow', + ]); + $routes->get('outbox', 'Actor::outbox/$1', [ + 'as' => 'outbox', + 'filter' => 'activity-pub:verify-activitystream', + ]); +}); + +/* * -------------------------------------------------------------------- * Additional Routing * -------------------------------------------------------------------- * * There will often be times that you need additional routing and you - * need to it be able to override any defaults in this file. Environment + * need it to be able to override any defaults in this file. Environment * based routes is one such time. require() additional route files here * to make that happen. * diff --git a/app/Config/Security.php b/app/Config/Security.php new file mode 100644 index 0000000000000000000000000000000000000000..ba00bd08689f91f7532b525d705733019c137507 --- /dev/null +++ b/app/Config/Security.php @@ -0,0 +1,92 @@ +<?php + +namespace Config; + +use CodeIgniter\Config\BaseConfig; + +class Security extends BaseConfig +{ + /** + * -------------------------------------------------------------------------- + * CSRF Token Name + * -------------------------------------------------------------------------- + * + * Token name for Cross Site Request Forgery protection cookie. + * + * @var string + */ + public $tokenName = 'csrf_test_name'; + + /** + * -------------------------------------------------------------------------- + * CSRF Header Name + * -------------------------------------------------------------------------- + * + * Token name for Cross Site Request Forgery protection cookie. + * + * @var string + */ + public $headerName = 'X-CSRF-TOKEN'; + + /** + * -------------------------------------------------------------------------- + * CSRF Cookie Name + * -------------------------------------------------------------------------- + * + * Cookie name for Cross Site Request Forgery protection cookie. + * + * @var string + */ + public $cookieName = 'csrf_cookie_name'; + + /** + * -------------------------------------------------------------------------- + * CSRF Expires + * -------------------------------------------------------------------------- + * + * Expiration time for Cross Site Request Forgery protection cookie. + * + * Defaults to two hours (in seconds). + * + * @var integer + */ + public $expires = 7200; + + /** + * -------------------------------------------------------------------------- + * CSRF Regenerate + * -------------------------------------------------------------------------- + * + * Regenerate CSRF Token on every request. + * + * @var boolean + */ + public $regenerate = true; + + /** + * -------------------------------------------------------------------------- + * CSRF Redirect + * -------------------------------------------------------------------------- + * + * Redirect to previous page with error on failure. + * + * @var boolean + */ + public $redirect = true; + + /** + * -------------------------------------------------------------------------- + * CSRF SameSite + * -------------------------------------------------------------------------- + * + * Setting for CSRF SameSite cookie token. + * + * Allowed values are: None - Lax - Strict - ''. + * + * Defaults to `Lax` as recommended in this link: + * @see https://portswigger.net/web-security/csrf/samesite-cookies + * + * @var string 'Lax'|'None'|'Strict' + */ + public $samesite = 'Lax'; +} diff --git a/app/Config/Services.php b/app/Config/Services.php index 27d601fae5d0d6ae1398dad31cf9b242946679f4..d6c711bdd580639b5a71ad48ec2870791a7421ba 100644 --- a/app/Config/Services.php +++ b/app/Config/Services.php @@ -2,17 +2,20 @@ namespace Config; -use CodeIgniter\Config\Services as CoreServices; +use CodeIgniter\Config\BaseService; use CodeIgniter\Model; use App\Authorization\FlatAuthorization; use App\Authorization\PermissionModel; use App\Authorization\GroupModel; use App\Libraries\Breadcrumb; +use App\Libraries\Negotiate; +use App\Libraries\Router; use App\Models\UserModel; +use CodeIgniter\HTTP\Request; +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\Router\RouteCollectionInterface; use Myth\Auth\Models\LoginModel; -require_once SYSTEMPATH . 'Config/Services.php'; - /** * Services Configuration file. * @@ -26,8 +29,56 @@ require_once SYSTEMPATH . 'Config/Services.php'; * method format you should use for your service methods. For more examples, * see the core Services file at system/Config/Services.php. */ -class Services extends CoreServices +class Services extends BaseService { + /** + * The Router class uses a RouteCollection's array of routes, and determines + * the correct Controller and Method to execute. + * + * @param RouteCollectionInterface|null $routes + * @param Request|null $request + * @param boolean $getShared + * + * @return Router + */ + public static function router( + RouteCollectionInterface $routes = null, + Request $request = null, + bool $getShared = true + ) { + if ($getShared) { + return static::getSharedInstance('router', $routes, $request); + } + + $routes = $routes ?? static::routes(); + $request = $request ?? static::request(); + + return new Router($routes, $request); + } + + /** + * The Negotiate class provides the content negotiation features for + * working the request to determine correct language, encoding, charset, + * and more. + * + * @param RequestInterface|null $request + * @param boolean $getShared + * + * @return Negotiate + */ + public static function negotiator( + RequestInterface $request = null, + bool $getShared = true + ) { + if ($getShared) { + return static::getSharedInstance('negotiator', $request); + } + + $request = $request ?? static::request(); + + return new Negotiate($request); + } + public static function authentication( string $lib = 'local', Model $userModel = null, @@ -39,7 +90,7 @@ class Services extends CoreServices 'authentication', $lib, $userModel, - $loginModel + $loginModel, ); } @@ -72,7 +123,7 @@ class Services extends CoreServices 'authorization', $groupModel, $permissionModel, - $userModel + $userModel, ); } diff --git a/app/Config/Toolbar.php b/app/Config/Toolbar.php index d2b40825505d394c99d16dde27200ea526c01742..5d7596d92f367876d474c833986d388989d4f617 100644 --- a/app/Config/Toolbar.php +++ b/app/Config/Toolbar.php @@ -3,69 +3,85 @@ namespace Config; use CodeIgniter\Config\BaseConfig; +use CodeIgniter\Debug\Toolbar\Collectors\Database; +use CodeIgniter\Debug\Toolbar\Collectors\Events; +use CodeIgniter\Debug\Toolbar\Collectors\Files; +use CodeIgniter\Debug\Toolbar\Collectors\Logs; +use CodeIgniter\Debug\Toolbar\Collectors\Routes; +use CodeIgniter\Debug\Toolbar\Collectors\Timers; +use CodeIgniter\Debug\Toolbar\Collectors\Views; +/** + * -------------------------------------------------------------------------- + * Debug Toolbar + * -------------------------------------------------------------------------- + * + * The Debug Toolbar provides a way to see information about the performance + * and state of your application during that page display. By default it will + * NOT be displayed under production environments, and will only display if + * `CI_DEBUG` is true, since if it's not, there's not much to display anyway. + */ class Toolbar extends BaseConfig { - /* - |-------------------------------------------------------------------------- - | Debug Toolbar - |-------------------------------------------------------------------------- - | The Debug Toolbar provides a way to see information about the performance - | and state of your application during that page display. By default it will - | NOT be displayed under production environments, and will only display if - | CI_DEBUG is true, since if it's not, there's not much to display anyway. - | - | toolbarMaxHistory = Number of history files, 0 for none or -1 for unlimited - | - */ + /** + * -------------------------------------------------------------------------- + * Toolbar Collectors + * -------------------------------------------------------------------------- + * + * List of toolbar collectors that will be called when Debug Toolbar + * fires up and collects data from. + * + * @var string[] + */ public $collectors = [ - \CodeIgniter\Debug\Toolbar\Collectors\Timers::class, - \CodeIgniter\Debug\Toolbar\Collectors\Database::class, - \CodeIgniter\Debug\Toolbar\Collectors\Logs::class, - \CodeIgniter\Debug\Toolbar\Collectors\Views::class, - \CodeIgniter\Debug\Toolbar\Collectors\Cache::class, - \CodeIgniter\Debug\Toolbar\Collectors\Files::class, - \CodeIgniter\Debug\Toolbar\Collectors\Routes::class, - \CodeIgniter\Debug\Toolbar\Collectors\Events::class, - \Myth\Auth\Collectors\Auth::class, + Timers::class, + Database::class, + Logs::class, + Views::class, + // Cache::class, + Files::class, + Routes::class, + Events::class, ]; - /* - |-------------------------------------------------------------------------- - | Max History - |-------------------------------------------------------------------------- - | The Toolbar allows you to view recent requests that have been made to - | the application while the toolbar is active. This allows you to quickly - | view and compare multiple requests. - | - | $maxHistory sets a limit on the number of past requests that are stored, - | helping to conserve file space used to store them. You can set it to - | 0 (zero) to not have any history stored, or -1 for unlimited history. - | - */ + /** + * -------------------------------------------------------------------------- + * Max History + * -------------------------------------------------------------------------- + * + * `$maxHistory` sets a limit on the number of past requests that are stored, + * helping to conserve file space used to store them. You can set it to + * 0 (zero) to not have any history stored, or -1 for unlimited history. + * + * @var integer + */ public $maxHistory = 20; - /* - |-------------------------------------------------------------------------- - | Toolbar Views Path - |-------------------------------------------------------------------------- - | The full path to the the views that are used by the toolbar. - | MUST have a trailing slash. - | - */ + /** + * -------------------------------------------------------------------------- + * Toolbar Views Path + * -------------------------------------------------------------------------- + * + * The full path to the the views that are used by the toolbar. + * This MUST have a trailing slash. + * + * @var string + */ public $viewsPath = SYSTEMPATH . 'Debug/Toolbar/Views/'; - /* - |-------------------------------------------------------------------------- - | Max Queries - |-------------------------------------------------------------------------- - | If the Database Collector is enabled, it will log every query that the - | the system generates so they can be displayed on the toolbar's timeline - | and in the query log. This can lead to memory issues in some instances - | with hundreds of queries. - | - | $maxQueries defines the maximum amount of queries that will be stored. - | - */ + /** + * -------------------------------------------------------------------------- + * Max Queries + * -------------------------------------------------------------------------- + * + * If the Database Collector is enabled, it will log every query that the + * the system generates so they can be displayed on the toolbar's timeline + * and in the query log. This can lead to memory issues in some instances + * with hundreds of queries. + * + * `$maxQueries` defines the maximum amount of queries that will be stored. + * + * @var integer + */ public $maxQueries = 100; } diff --git a/app/Config/UserAgents.php b/app/Config/UserAgents.php index fab20be24edd42893ed74532c09b78f162e56328..18ad6c41faab091d642c71691cf72c3b6692653b 100644 --- a/app/Config/UserAgents.php +++ b/app/Config/UserAgents.php @@ -1,20 +1,27 @@ <?php - namespace Config; use CodeIgniter\Config\BaseConfig; +/** + * ------------------------------------------------------------------- + * User Agents + * ------------------------------------------------------------------- + * + * This file contains four arrays of user agent data. It is used by the + * User Agent Class to help identify browser, platform, robot, and + * mobile device data. The array keys are used to identify the device + * and the array values are used to set the actual name of the item. + */ class UserAgents extends BaseConfig { - /* - | ------------------------------------------------------------------- - | USER AGENT TYPES - | ------------------------------------------------------------------- - | This file contains four arrays of user agent data. It is used by the - | User Agent Class to help identify browser, platform, robot, and - | mobile device data. The array keys are used to identify the device - | and the array values are used to set the actual name of the item. - */ + /** + * ------------------------------------------------------------------- + * OS Platforms + * ------------------------------------------------------------------- + * + * @var array<string, string> + */ public $platforms = [ 'windows nt 10.0' => 'Windows 10', 'windows nt 6.3' => 'Windows 8.1', @@ -60,12 +67,21 @@ class UserAgents extends BaseConfig 'symbian' => 'Symbian OS', ]; - // The order of this array should NOT be changed. Many browsers return - // multiple browser types so we want to identify the sub-type first. + /** + * ------------------------------------------------------------------- + * Browsers + * ------------------------------------------------------------------- + * + * The order of this array should NOT be changed. Many browsers return + * multiple browser types so we want to identify the subtype first. + * + * @var array<string, string> + */ public $browsers = [ 'OPR' => 'Opera', 'Flock' => 'Flock', 'Edge' => 'Spartan', + 'Edg' => 'Edge', 'Chrome' => 'Chrome', // Opera 10+ always reports Opera/9.80 and appends Version/<real version> to the user agent string 'Opera.*?Version' => 'Opera', @@ -95,6 +111,13 @@ class UserAgents extends BaseConfig 'Vivaldi' => 'Vivaldi', ]; + /** + * ------------------------------------------------------------------- + * Mobiles + * ------------------------------------------------------------------- + * + * @var array<string, string> + */ public $mobiles = [ // legacy array, old values commented out 'mobileexplorer' => 'Mobile Explorer', @@ -195,7 +218,15 @@ class UserAgents extends BaseConfig 'cellphone' => 'Generic Mobile', ]; - // There are hundreds of bots but these are the most common. + /** + * ------------------------------------------------------------------- + * Robots + * ------------------------------------------------------------------- + * + * There are hundred of bots but these are the most common. + * + * @var array<string, string> + */ public $robots = [ 'googlebot' => 'Googlebot', 'msnbot' => 'MSNBot', diff --git a/app/Config/Validation.php b/app/Config/Validation.php index 8ebd77c4850582e05ca25b2917c84f2c6740d21b..0db23ed2395c51ca704e24bddfc05a07b5467a6b 100644 --- a/app/Config/Validation.php +++ b/app/Config/Validation.php @@ -2,6 +2,14 @@ namespace Config; +use App\Validation\FileRules as AppFileRules; +use App\Validation\Rules as AppRules; +use CodeIgniter\Validation\CreditCardRules; +use CodeIgniter\Validation\FileRules; +use CodeIgniter\Validation\FormatRules; +use CodeIgniter\Validation\Rules; +use Myth\Auth\Authentication\Passwords\ValidationRules as PasswordRules; + class Validation { //-------------------------------------------------------------------- @@ -12,22 +20,23 @@ class Validation * Stores the classes that contain the * rules that are available. * - * @var array + * @var string[] */ public $ruleSets = [ - \CodeIgniter\Validation\Rules::class, - \CodeIgniter\Validation\FormatRules::class, - \CodeIgniter\Validation\CreditCardRules::class, - \App\Validation\Rules::class, - \App\Validation\FileRules::class, - \Myth\Auth\Authentication\Passwords\ValidationRules::class, + Rules::class, + FormatRules::class, + FileRules::class, + CreditCardRules::class, + AppRules::class, + AppFileRules::class, + PasswordRules::class, ]; /** * Specifies the views that are used to display the * errors. * - * @var array + * @var array<string, string> */ public $templates = [ 'list' => 'CodeIgniter\Validation\Views\list', diff --git a/app/Config/View.php b/app/Config/View.php index ceec2776ae0be43d0a7502e5c99a0851d5be87a5..7697cfc92707c9da539ed9bcb9aad60ffb293d09 100644 --- a/app/Config/View.php +++ b/app/Config/View.php @@ -2,7 +2,9 @@ namespace Config; -class View extends \CodeIgniter\Config\View +use CodeIgniter\Config\View as BaseView; + +class View extends BaseView { /** * When false, the view method will clear the data between each @@ -11,6 +13,8 @@ class View extends \CodeIgniter\Config\View * to each view. You might prefer to have the data stick around between * calls so that it is available to all views. If that is the case, * set $saveData to true. + * + * @var boolean */ public $saveData = true; @@ -24,6 +28,8 @@ class View extends \CodeIgniter\Config\View * Examples: * { title|esc(js) } * { created_on|date(Y-m-d)|esc(attr) } + * + * @var array */ public $filters = []; @@ -31,6 +37,8 @@ class View extends \CodeIgniter\Config\View * Parser Plugins provide a way to extend the functionality provided * by the core Parser by creating aliases that will be replaced with * any callable. Can be single or tag pair. + * + * @var array */ public $plugins = []; } diff --git a/app/Controllers/Actor.php b/app/Controllers/Actor.php new file mode 100644 index 0000000000000000000000000000000000000000..6c91eda9c9d7af36b1a97a50f88f512cfa632959 --- /dev/null +++ b/app/Controllers/Actor.php @@ -0,0 +1,22 @@ +<?php + +/** + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace App\Controllers; + +class Actor extends \ActivityPub\Controllers\ActorController +{ + public function follow() + { + helper(['form', 'components', 'svg']); + $data = [ + 'actor' => $this->actor, + ]; + + return view('podcast/follow', $data); + } +} diff --git a/app/Controllers/Admin/BaseController.php b/app/Controllers/Admin/BaseController.php index 6bc9ff8567855c4d327ea072f761d9ffe4a0d86c..a349ac6f5c041301c1b1d2a960988b8af5698783 100644 --- a/app/Controllers/Admin/BaseController.php +++ b/app/Controllers/Admin/BaseController.php @@ -2,6 +2,11 @@ namespace App\Controllers\Admin; +use CodeIgniter\Controller; +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\HTTP\ResponseInterface; +use Psr\Log\LoggerInterface; + /** * Class BaseController * @@ -11,12 +16,8 @@ namespace App\Controllers\Admin; * class Home extends BaseController * * For security be sure to declare any new methods as protected or private. - * - * @package CodeIgniter */ -use CodeIgniter\Controller; - class BaseController extends Controller { /** @@ -30,11 +31,15 @@ class BaseController extends Controller /** * Constructor. + * + * @param RequestInterface $request + * @param ResponseInterface $response + * @param LoggerInterface $logger */ public function initController( - \CodeIgniter\HTTP\RequestInterface $request, - \CodeIgniter\HTTP\ResponseInterface $response, - \Psr\Log\LoggerInterface $logger + RequestInterface $request, + ResponseInterface $response, + LoggerInterface $logger ) { // Do Not Edit This Line parent::initController($request, $response, $logger); @@ -42,7 +47,6 @@ class BaseController extends Controller //-------------------------------------------------------------------- // Preload any models, libraries, etc, here. //-------------------------------------------------------------------- - // E.g.: - // $this->session = \Config\Services::session(); + // E.g.: $this->session = \Config\Services::session(); } } diff --git a/app/Controllers/Admin/Episode.php b/app/Controllers/Admin/Episode.php index 0ab9a8e55b12d8d6cca47372c7948f03fcf9a510..a2742d48f5a1b03c6e76048a6159f02788c94d38 100644 --- a/app/Controllers/Admin/Episode.php +++ b/app/Controllers/Admin/Episode.php @@ -8,7 +8,9 @@ namespace App\Controllers\Admin; +use App\Entities\Note; use App\Models\EpisodeModel; +use App\Models\NoteModel; use App\Models\PodcastModel; use App\Models\SoundbiteModel; use CodeIgniter\I18n\Time; @@ -32,7 +34,11 @@ class Episode extends BaseController public function _remap($method, ...$params) { - $this->podcast = (new PodcastModel())->getPodcastById($params[0]); + if ( + !($this->podcast = (new PodcastModel())->getPodcastById($params[0])) + ) { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } if (count($params) > 1) { if ( @@ -107,7 +113,6 @@ class Episode extends BaseController 'is_image[image]|ext_in[image,jpg,png]|min_dims[image,1400,1400]|is_image_squared[image]', 'transcript' => 'ext_in[transcript,txt,html,srt,json]', 'chapters' => 'ext_in[chapters,json]', - 'publication_date' => 'valid_date[Y-m-d H:i]|permit_empty', ]; if (!$this->validate($rules)) { @@ -117,7 +122,6 @@ class Episode extends BaseController ->with('errors', $this->validator->getErrors()); } - $publicationDate = $this->request->getPost('publication_date'); $newEpisode = new \App\Entities\Episode([ 'podcast_id' => $this->podcast->id, 'title' => $this->request->getPost('title'), @@ -142,15 +146,9 @@ class Episode extends BaseController 'type' => $this->request->getPost('type'), 'is_blocked' => $this->request->getPost('block') == 'yes', 'custom_rss_string' => $this->request->getPost('custom_rss'), - 'created_by' => user(), - 'updated_by' => user(), - 'published_at' => $publicationDate - ? Time::createFromFormat( - 'Y-m-d H:i', - $publicationDate, - $this->request->getPost('client_timezone') - )->setTimezone('UTC') - : null, + 'created_by' => user()->id, + 'updated_by' => user()->id, + 'published_at' => null, ]); $episodeModel = new EpisodeModel(); @@ -167,7 +165,7 @@ class Episode extends BaseController if ($this->podcast->hasChanged('episode_description_footer_markdown')) { $this->podcast->episode_description_footer_markdown = $this->request->getPost( - 'description_footer' + 'description_footer', ); if (!$podcastModel->update($this->podcast->id, $this->podcast)) { @@ -209,7 +207,6 @@ class Episode extends BaseController 'is_image[image]|ext_in[image,jpg,png]|min_dims[image,1400,1400]|is_image_squared[image]', 'transcript' => 'ext_in[transcript,txt,html,srt,json]', 'chapters' => 'ext_in[chapters,json]', - 'publication_date' => 'valid_date[Y-m-d H:i]|permit_empty', ]; if (!$this->validate($rules)) { @@ -222,7 +219,7 @@ class Episode extends BaseController $this->episode->title = $this->request->getPost('title'); $this->episode->slug = $this->request->getPost('slug'); $this->episode->description_markdown = $this->request->getPost( - 'description' + 'description', ); $this->episode->location = $this->request->getPost('location_name'); $this->episode->parental_advisory = @@ -238,19 +235,10 @@ class Episode extends BaseController $this->episode->type = $this->request->getPost('type'); $this->episode->is_blocked = $this->request->getPost('block') == 'yes'; $this->episode->custom_rss_string = $this->request->getPost( - 'custom_rss' + 'custom_rss', ); - $publicationDate = $this->request->getPost('publication_date'); - $this->episode->published_at = $publicationDate - ? Time::createFromFormat( - 'Y-m-d H:i', - $publicationDate, - $this->request->getPost('client_timezone') - )->setTimezone('UTC') - : null; - - $this->episode->updated_by = user(); + $this->episode->updated_by = user()->id; $enclosure = $this->request->getFile('enclosure'); if ($enclosure->isValid()) { @@ -280,7 +268,7 @@ class Episode extends BaseController // update podcast's episode_description_footer_markdown if changed $this->podcast->episode_description_footer_markdown = $this->request->getPost( - 'description_footer' + 'description_footer', ); if ($this->podcast->hasChanged('episode_description_footer_markdown')) { @@ -333,6 +321,271 @@ class Episode extends BaseController return redirect()->back(); } + public function publish() + { + if ($this->episode->publication_status === 'not_published') { + helper(['form']); + + $data = [ + 'podcast' => $this->podcast, + 'episode' => $this->episode, + ]; + + replace_breadcrumb_params([ + 0 => $this->podcast->title, + 1 => $this->episode->title, + ]); + return view('admin/episode/publish', $data); + } else { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + } + + public function attemptPublish() + { + $rules = [ + 'publication_method' => 'required', + 'scheduled_publication_date' => + 'valid_date[Y-m-d H:i]|permit_empty', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + $db = \Config\Database::connect(); + $db->transStart(); + + $newNote = new Note([ + 'actor_id' => $this->podcast->actor_id, + 'episode_id' => $this->episode->id, + 'message' => $this->request->getPost('message'), + 'created_by' => user_id(), + ]); + + $publishMethod = $this->request->getPost('publication_method'); + if ($publishMethod === 'schedule') { + $scheduledPublicationDate = $this->request->getPost( + 'scheduled_publication_date', + ); + if ($scheduledPublicationDate) { + $scheduledDateUTC = Time::createFromFormat( + 'Y-m-d H:i', + $scheduledPublicationDate, + $this->request->getPost('client_timezone'), + )->setTimezone('UTC'); + $this->episode->published_at = $scheduledDateUTC; + $newNote->published_at = $scheduledDateUTC; + } else { + $db->transRollback(); + return redirect() + ->back() + ->withInput() + ->with('error', 'Schedule date must be set!'); + } + } else { + $dateNow = Time::now(); + $this->episode->published_at = $dateNow; + $newNote->published_at = $dateNow; + } + + $noteModel = new NoteModel(); + if (!$noteModel->addNote($newNote)) { + $db->transRollback(); + return redirect() + ->back() + ->withInput() + ->with('errors', $noteModel->errors()); + } + + $episodeModel = new EpisodeModel(); + if (!$episodeModel->update($this->episode->id, $this->episode)) { + $db->transRollback(); + return redirect() + ->back() + ->withInput() + ->with('errors', $episodeModel->errors()); + } + + $db->transComplete(); + + return redirect()->route('episode-view', [ + $this->podcast->id, + $this->episode->id, + ]); + } + + public function publishEdit() + { + if ($this->episode->publication_status === 'scheduled') { + helper(['form']); + + $data = [ + 'podcast' => $this->podcast, + 'episode' => $this->episode, + 'note' => (new NoteModel()) + ->where([ + 'actor_id' => $this->podcast->actor_id, + 'episode_id' => $this->episode->id, + ]) + ->first(), + ]; + + replace_breadcrumb_params([ + 0 => $this->podcast->title, + 1 => $this->episode->title, + ]); + return view('admin/episode/publish_edit', $data); + } else { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + } + + public function attemptPublishEdit() + { + $rules = [ + 'note_id' => 'required', + 'publication_method' => 'required', + 'scheduled_publication_date' => + 'valid_date[Y-m-d H:i]|permit_empty', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + $db = \Config\Database::connect(); + $db->transStart(); + + $note = (new NoteModel())->getNoteById( + $this->request->getPost('note_id'), + ); + $note->message = $this->request->getPost('message'); + + $publishMethod = $this->request->getPost('publication_method'); + if ($publishMethod === 'schedule') { + $scheduledPublicationDate = $this->request->getPost( + 'scheduled_publication_date', + ); + if ($scheduledPublicationDate) { + $scheduledDateUTC = Time::createFromFormat( + 'Y-m-d H:i', + $scheduledPublicationDate, + $this->request->getPost('client_timezone'), + )->setTimezone('UTC'); + $this->episode->published_at = $scheduledDateUTC; + $note->published_at = $scheduledDateUTC; + } else { + $db->transRollback(); + return redirect() + ->back() + ->withInput() + ->with('error', 'Schedule date must be set!'); + } + } else { + $dateNow = Time::now(); + $this->episode->published_at = $dateNow; + $note->published_at = $dateNow; + } + + $noteModel = new NoteModel(); + if (!$noteModel->editNote($note)) { + $db->transRollback(); + return redirect() + ->back() + ->withInput() + ->with('errors', $noteModel->errors()); + } + + $episodeModel = new EpisodeModel(); + if (!$episodeModel->update($this->episode->id, $this->episode)) { + $db->transRollback(); + return redirect() + ->back() + ->withInput() + ->with('errors', $episodeModel->errors()); + } + + $db->transComplete(); + + return redirect()->route('episode-view', [ + $this->podcast->id, + $this->episode->id, + ]); + } + + public function unpublish() + { + if ($this->episode->publication_status === 'published') { + helper(['form']); + + $data = [ + 'podcast' => $this->podcast, + 'episode' => $this->episode, + ]; + + replace_breadcrumb_params([ + 0 => $this->podcast->title, + 1 => $this->episode->title, + ]); + return view('admin/episode/unpublish', $data); + } else { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + } + + public function attemptUnpublish() + { + $rules = [ + 'understand' => 'required', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + $db = \Config\Database::connect(); + + $db->transStart(); + + $allNotesLinkedToEpisode = (new NoteModel()) + ->where([ + 'episode_id' => $this->episode->id, + ]) + ->findAll(); + foreach ($allNotesLinkedToEpisode as $note) { + (new NoteModel())->removeNote($note); + } + + // set episode published_at to null to unpublish + $this->episode->published_at = null; + + $episodeModel = new EpisodeModel(); + if (!$episodeModel->update($this->episode->id, $this->episode)) { + $db->transRollback(); + return redirect() + ->back() + ->withInput() + ->with('errors', $episodeModel->errors()); + } + + $db->transComplete(); + + return redirect()->route('episode-view', [ + $this->podcast->id, + $this->episode->id, + ]); + } + public function delete() { (new EpisodeModel())->delete($this->episode->id); @@ -416,7 +669,7 @@ class Episode extends BaseController (new SoundbiteModel())->deleteSoundbite( $this->podcast->id, $this->episode->id, - $soundbiteId + $soundbiteId, ); return redirect()->route('soundbites-edit', [ diff --git a/app/Controllers/Admin/Fediverse.php b/app/Controllers/Admin/Fediverse.php new file mode 100644 index 0000000000000000000000000000000000000000..184a52ff2699e21526dbd2b33d5fa24cd1157cb6 --- /dev/null +++ b/app/Controllers/Admin/Fediverse.php @@ -0,0 +1,41 @@ +<?php + +/** + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace App\Controllers\Admin; + +use ActivityPub\Models\BlockedDomainModel; + +class Fediverse extends BaseController +{ + public function dashboard() + { + return view('admin/fediverse/dashboard'); + } + + public function blockedActors() + { + helper(['form']); + + $blockedActors = model('ActorModel')->getBlockedActors(); + + return view('admin/fediverse/blocked_actors', [ + 'blockedActors' => $blockedActors, + ]); + } + + public function blockedDomains() + { + helper(['form']); + + $blockedDomains = model('BlockedDomainModel')->getBlockedDomains(); + + return view('admin/fediverse/blocked_domains', [ + 'blockedDomains' => $blockedDomains, + ]); + } +} diff --git a/app/Controllers/Admin/Person.php b/app/Controllers/Admin/Person.php index f78631ff5e11bd84601aca0d8ee8747ff744e9e3..f3dea00e4be44f1ca7e86a4521d35087f719b436 100644 --- a/app/Controllers/Admin/Person.php +++ b/app/Controllers/Admin/Person.php @@ -125,7 +125,7 @@ class Person extends BaseController $this->person->image = $image; } - $this->updated_by = user(); + $this->updated_by = user()->id; $personModel = new PersonModel(); if (!$personModel->update($this->person->id, $this->person)) { diff --git a/app/Controllers/Admin/Podcast.php b/app/Controllers/Admin/Podcast.php index 22a5b79e9c3adba9662a2d0eb1ebe7dec191b647..fcd7550006a8bad61c3932974c2b4c63b8e71798 100644 --- a/app/Controllers/Admin/Podcast.php +++ b/app/Controllers/Admin/Podcast.php @@ -26,7 +26,7 @@ class Podcast extends BaseController if (count($params) > 0) { if ( !($this->podcast = (new PodcastModel())->getPodcastById( - $params[0] + $params[0], )) ) { throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); @@ -124,7 +124,7 @@ class Podcast extends BaseController 'languageOptions' => $languageOptions, 'categoryOptions' => $categoryOptions, 'browserLang' => get_browser_language( - $this->request->getServer('HTTP_ACCEPT_LANGUAGE') + $this->request->getServer('HTTP_ACCEPT_LANGUAGE'), ), ]; @@ -170,8 +170,8 @@ class Podcast extends BaseController 'is_blocked' => $this->request->getPost('block') === 'yes', 'is_completed' => $this->request->getPost('complete') === 'yes', 'is_locked' => $this->request->getPost('lock') === 'yes', - 'created_by' => user(), - 'updated_by' => user(), + 'created_by' => user()->id, + 'updated_by' => user()->id, ]); $podcastModel = new PodcastModel(); @@ -193,15 +193,19 @@ class Podcast extends BaseController $podcastModel->addPodcastContributor( user()->id, $newPodcastId, - $podcastAdminGroup->id + $podcastAdminGroup->id, ); // set Podcast categories (new CategoryModel())->setPodcastCategories( $newPodcastId, - $this->request->getPost('other_categories') + $this->request->getPost('other_categories'), ); + // set interact as the newly created podcast actor + $createdPodcast = (new PodcastModel())->getPodcastById($newPodcastId); + set_interact_as_actor($createdPodcast->actor_id); + $db->transComplete(); return redirect()->route('podcast-view', [$newPodcastId]); @@ -239,9 +243,8 @@ class Podcast extends BaseController } $this->podcast->title = $this->request->getPost('title'); - $this->podcast->name = $this->request->getPost('name'); $this->podcast->description_markdown = $this->request->getPost( - 'description' + 'description', ); $image = $this->request->getFile('image'); @@ -261,10 +264,10 @@ class Podcast extends BaseController $this->podcast->copyright = $this->request->getPost('copyright'); $this->podcast->location = $this->request->getPost('location_name'); $this->podcast->payment_pointer = $this->request->getPost( - 'payment_pointer' + 'payment_pointer', ); $this->podcast->custom_rss_string = $this->request->getPost( - 'custom_rss' + 'custom_rss', ); $this->podcast->partner_id = $this->request->getPost('partner_id'); $this->podcast->partner_link_url = $this->request->getPost( @@ -277,7 +280,7 @@ class Podcast extends BaseController $this->podcast->is_completed = $this->request->getPost('complete') === 'yes'; $this->podcast->is_locked = $this->request->getPost('lock') === 'yes'; - $this->updated_by = user(); + $this->updated_by = user()->id; $db = \Config\Database::connect(); $db->transStart(); @@ -294,7 +297,7 @@ class Podcast extends BaseController // set Podcast categories (new CategoryModel())->setPodcastCategories( $this->podcast->id, - $this->request->getPost('other_categories') + $this->request->getPost('other_categories'), ); $db->transComplete(); diff --git a/app/Controllers/Admin/PodcastImport.php b/app/Controllers/Admin/PodcastImport.php index cfea7a4397f8fa09308e50f326d17a3393310a80..daad6c42347e9b41fc4b36bf28631d376505b22c 100644 --- a/app/Controllers/Admin/PodcastImport.php +++ b/app/Controllers/Admin/PodcastImport.php @@ -31,7 +31,7 @@ class PodcastImport extends BaseController if (count($params) > 0) { if ( !($this->podcast = (new PodcastModel())->getPodcastById( - $params[0] + $params[0], )) ) { throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); @@ -52,7 +52,7 @@ class PodcastImport extends BaseController 'languageOptions' => $languageOptions, 'categoryOptions' => $categoryOptions, 'browserLang' => get_browser_language( - $this->request->getServer('HTTP_ACCEPT_LANGUAGE') + $this->request->getServer('HTTP_ACCEPT_LANGUAGE'), ), ]; @@ -78,7 +78,7 @@ class PodcastImport extends BaseController try { ini_set('user_agent', 'Castopod/' . CP_VERSION); $feed = simplexml_load_file( - $this->request->getPost('imported_feed_url') + $this->request->getPost('imported_feed_url'), ); } catch (\ErrorException $ex) { return redirect() @@ -94,13 +94,13 @@ class PodcastImport extends BaseController ]); } $nsItunes = $feed->channel[0]->children( - 'http://www.itunes.com/dtds/podcast-1.0.dtd' + 'http://www.itunes.com/dtds/podcast-1.0.dtd', ); $nsPodcast = $feed->channel[0]->children( - 'https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md' + 'https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md', ); $nsContent = $feed->channel[0]->children( - 'http://purl.org/rss/1.0/modules/content/' + 'http://purl.org/rss/1.0/modules/content/', ); if ((string) $nsPodcast->locked === 'yes') { @@ -112,28 +112,30 @@ class PodcastImport extends BaseController $converter = new HtmlConverter(); - $channelDescriptionHtml = $feed->channel[0]->description; + $channelDescriptionHtml = (string) $feed->channel[0]->description; try { $podcast = new \App\Entities\Podcast([ 'name' => $this->request->getPost('name'), 'imported_feed_url' => $this->request->getPost( - 'imported_feed_url' + 'imported_feed_url', ), 'new_feed_url' => base_url( - route_to('podcast_feed', $this->request->getPost('name')) + route_to('podcast_feed', $this->request->getPost('name')), ), - 'title' => $feed->channel[0]->title, + 'title' => (string) $feed->channel[0]->title, 'description_markdown' => $converter->convert( - $channelDescriptionHtml + $channelDescriptionHtml, ), 'description_html' => $channelDescriptionHtml, 'image' => $nsItunes->image && !empty($nsItunes->image->attributes()) - ? download_file($nsItunes->image->attributes()) + ? download_file((string) $nsItunes->image->attributes()) : ($feed->channel[0]->image && !empty($feed->channel[0]->image->url) - ? download_file($feed->channel[0]->image->url) + ? download_file( + (string) $feed->channel[0]->image->url, + ) : null), 'language_code' => $this->request->getPost('language'), 'category_id' => $this->request->getPost('category'), @@ -144,11 +146,11 @@ class PodcastImport extends BaseController : (in_array($nsItunes->explicit, ['no', 'false']) ? 'clean' : null)), - 'owner_name' => $nsItunes->owner->name, - 'owner_email' => $nsItunes->owner->email, - 'publisher' => $nsItunes->author, + 'owner_name' => (string) $nsItunes->owner->name, + 'owner_email' => (string) $nsItunes->owner->email, + 'publisher' => (string) $nsItunes->author, 'type' => empty($nsItunes->type) ? 'episodic' : $nsItunes->type, - 'copyright' => $feed->channel[0]->copyright, + 'copyright' => (string) $feed->channel[0]->copyright, 'is_blocked' => empty($nsItunes->block) ? false : $nsItunes->block === 'yes', @@ -157,19 +159,19 @@ class PodcastImport extends BaseController : $nsItunes->complete === 'yes', 'location_name' => !$nsPodcast->location ? null - : $nsPodcast->location, + : (string) $nsPodcast->location, 'location_geo' => !$nsPodcast->location || empty($nsPodcast->location->attributes()['geo']) ? null - : $nsPodcast->location->attributes()['geo'], + : (string) $nsPodcast->location->attributes()['geo'], 'location_osmid' => !$nsPodcast->location || empty($nsPodcast->location->attributes()['osm']) ? null - : $nsPodcast->location->attributes()['osm'], - 'created_by' => user(), - 'updated_by' => user(), + : (string) $nsPodcast->location->attributes()['osm'], + 'created_by' => user()->id, + 'updated_by' => user()->id, ]); } catch (\ErrorException $ex) { return redirect() @@ -204,7 +206,7 @@ class PodcastImport extends BaseController $podcastModel->addPodcastContributor( user()->id, $newPodcastId, - $podcastAdminGroup->id + $podcastAdminGroup->id, ); $podcastsPlatformsData = []; @@ -218,34 +220,21 @@ class PodcastImport extends BaseController foreach ($platformType['elements'] as $platform) { $platformLabel = $platform->attributes()['platform']; $platformSlug = slugify($platformLabel); - if (!$platformModel->getPlatform($platformSlug)) { - if ( - !$platformModel->createPlatform( - $platformSlug, - $platformType['name'], - $platformLabel, - '' - ) - ) { - return redirect() - ->back() - ->withInput() - ->with('errors', $platformModel->errors()); - } + if ($platformModel->getPlatform($platformSlug)) { + array_push($podcastsPlatformsData, [ + 'platform_slug' => $platformSlug, + 'podcast_id' => $newPodcastId, + 'link_url' => $platform->attributes()['url'], + 'link_content' => $platform->attributes()['id'], + 'is_visible' => false, + ]); } - array_push($podcastsPlatformsData, [ - 'platform_slug' => $platformSlug, - 'podcast_id' => $newPodcastId, - 'link_url' => $platform->attributes()['url'], - 'link_content' => $platform->attributes()['id'], - 'is_visible' => false, - ]); } } if (count($podcastsPlatformsData) > 1) { $platformModel->createPodcastPlatforms( $newPodcastId, - $podcastsPlatformsData + $podcastsPlatformsData, ); } @@ -259,7 +248,7 @@ class PodcastImport extends BaseController !($newPersonId = $personModel->createPerson( $podcastPerson, $podcastPerson->attributes()['href'], - $podcastPerson->attributes()['img'] + $podcastPerson->attributes()['img'], )) ) { return redirect() @@ -312,19 +301,19 @@ class PodcastImport extends BaseController $item = $feed->channel[0]->item[$numberItems - $itemNumber]; $nsItunes = $item->children( - 'http://www.itunes.com/dtds/podcast-1.0.dtd' + 'http://www.itunes.com/dtds/podcast-1.0.dtd', ); $nsPodcast = $item->children( - 'https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md' + 'https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md', ); $nsContent = $item->children( - 'http://purl.org/rss/1.0/modules/content/' + 'http://purl.org/rss/1.0/modules/content/', ); $slug = slugify( $this->request->getPost('slug_field') === 'title' ? $item->title - : basename($item->link) + : basename($item->link), ); if (in_array($slug, $slugs)) { $slugNumber = 2; @@ -358,13 +347,15 @@ class PodcastImport extends BaseController 'slug' => $slug, 'enclosure' => download_file($item->enclosure->attributes()), 'description_markdown' => $converter->convert( - $itemDescriptionHtml + $itemDescriptionHtml, ), 'description_html' => $itemDescriptionHtml, 'image' => !$nsItunes->image || empty($nsItunes->image->attributes()) ? null - : download_file($nsItunes->image->attributes()), + : download_file( + (string) $nsItunes->image->attributes(), + ), 'parental_advisory' => empty($nsItunes->explicit) ? null : (in_array($nsItunes->explicit, ['yes', 'true']) @@ -404,8 +395,8 @@ class PodcastImport extends BaseController empty($nsPodcast->location->attributes()['osm']) ? null : $nsPodcast->location->attributes()['osm'], - 'created_by' => user(), - 'updated_by' => user(), + 'created_by' => user()->id, + 'updated_by' => user()->id, 'published_at' => strtotime($item->pubDate), ]); @@ -429,7 +420,7 @@ class PodcastImport extends BaseController !($newPersonId = $personModel->createPerson( $episodePerson, $episodePerson->attributes()['href'], - $episodePerson->attributes()['img'] + $episodePerson->attributes()['img'], )) ) { return redirect() @@ -458,8 +449,8 @@ class PodcastImport extends BaseController 'person_group' => $personGroup['slug'], 'person_role' => $personRole['slug'], ]); - $episodePersonModel = new EpisodePersonModel(); + $episodePersonModel = new EpisodePersonModel(); if (!$episodePersonModel->insert($newEpisodePerson)) { return redirect() ->back() @@ -469,6 +460,10 @@ class PodcastImport extends BaseController } } + // set interact as the newly imported podcast actor + $importedPodcast = (new PodcastModel())->getPodcastById($newPodcastId); + set_interact_as_actor($importedPodcast->actor_id); + $db->transComplete(); return redirect()->route('podcast-view', [$newPodcastId]); diff --git a/app/Controllers/Auth.php b/app/Controllers/Auth.php index 1a36daf16f209672c3a87a31db91a7283592f50b..6dc477542d24a9faf2eb0b34a88ff67fb91b8d57 100644 --- a/app/Controllers/Auth.php +++ b/app/Controllers/Auth.php @@ -55,7 +55,7 @@ class Auth extends \Myth\Auth\Controllers\AuthController $allowedPostFields = array_merge( ['password'], $this->config->validFields, - $this->config->personalFields + $this->config->personalFields, ); $user = new User($this->request->getPost($allowedPostFields)); @@ -85,7 +85,7 @@ class Auth extends \Myth\Auth\Controllers\AuthController ->withInput() ->with( 'error', - $activator->error() ?? lang('Auth.unknownError') + $activator->error() ?? lang('Auth.unknownError'), ); } @@ -122,7 +122,7 @@ class Auth extends \Myth\Auth\Controllers\AuthController $this->request->getPost('email'), $this->request->getPost('token'), $this->request->getIPAddress(), - (string) $this->request->getUserAgent() + (string) $this->request->getUserAgent(), ); $rules = [ @@ -172,4 +172,24 @@ class Auth extends \Myth\Auth\Controllers\AuthController ->route('login') ->with('message', lang('Auth.resetSuccess')); } + + public function attemptInteractAsActor() + { + $rules = [ + 'actor_id' => 'required|numeric', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', service('validation')->getErrors()); + } + + helper('auth'); + + set_interact_as_actor($this->request->getPost('actor_id')); + + return redirect()->back(); + } } diff --git a/app/Controllers/BaseController.php b/app/Controllers/BaseController.php index ab249c803d71019e70a9cdcd43e52164f4aa3dac..126b71009de4f164437f45e62a8820ae6769f5da 100644 --- a/app/Controllers/BaseController.php +++ b/app/Controllers/BaseController.php @@ -1,5 +1,12 @@ <?php +namespace App\Controllers; + +use CodeIgniter\Controller; +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\HTTP\ResponseInterface; +use Psr\Log\LoggerInterface; + /** * Class BaseController * @@ -9,14 +16,7 @@ * class Home extends BaseController * * For security be sure to declare any new methods as protected or private. - * - * @package CodeIgniter */ - -namespace App\Controllers; - -use CodeIgniter\Controller; - class BaseController extends Controller { /** @@ -26,15 +26,19 @@ class BaseController extends Controller * * @var array */ - protected $helpers = ['analytics', 'svg', 'components', 'misc']; + protected $helpers = ['auth', 'analytics', 'svg', 'components', 'misc']; /** * Constructor. + * + * @param RequestInterface $request + * @param ResponseInterface $response + * @param LoggerInterface $logger */ public function initController( - \CodeIgniter\HTTP\RequestInterface $request, - \CodeIgniter\HTTP\ResponseInterface $response, - \Psr\Log\LoggerInterface $logger + RequestInterface $request, + ResponseInterface $response, + LoggerInterface $logger ) { // Do Not Edit This Line parent::initController($request, $response, $logger); @@ -42,8 +46,7 @@ class BaseController extends Controller //-------------------------------------------------------------------- // Preload any models, libraries, etc, here. //-------------------------------------------------------------------- - // E.g.: - // $this->session = \Config\Services::session(); + // E.g.: $this->session = \Config\Services::session(); set_user_session_deny_list_ip(); set_user_session_browser(); diff --git a/app/Controllers/Episode.php b/app/Controllers/Episode.php index a4a8ce21026888c3aef9df705b2f3282d4ea3203..31eee58fa06942a01e0c0f5ec3b09cddf47fc7a8 100644 --- a/app/Controllers/Episode.php +++ b/app/Controllers/Episode.php @@ -10,6 +10,7 @@ namespace App\Controllers; use App\Models\EpisodeModel; use App\Models\PodcastModel; +use SimpleXMLElement; class Episode extends BaseController { @@ -31,7 +32,7 @@ class Episode extends BaseController count($params) > 1 && !($this->episode = (new EpisodeModel())->getEpisodeBySlug( $this->podcast->id, - $params[1] + $params[1], )) ) { throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); @@ -43,44 +44,49 @@ class Episode extends BaseController public function index() { - self::triggerWebpageHit($this->episode->podcast_id); + $episodeModel = new EpisodeModel(); + + self::triggerWebpageHit($this->podcast->id); $locale = service('request')->getLocale(); $cacheName = "page_podcast{$this->episode->podcast_id}_episode{$this->episode->id}_{$locale}"; if (!($cachedView = cache($cacheName))) { - $episodeModel = new EpisodeModel(); - $previousNextEpisodes = $episodeModel->getPreviousNextEpisodes( - $this->episode, - $this->podcast->type - ); - - helper(['persons']); - $persons = []; - construct_episode_person_array( - $this->episode->episode_persons, - $persons - ); + helper('persons'); + $episodePersons = []; + construct_person_array($this->episode->persons, $episodePersons); + $podcastPersons = []; + construct_person_array($this->podcast->persons, $podcastPersons); $data = [ - 'previousEpisode' => $previousNextEpisodes['previous'], - 'nextEpisode' => $previousNextEpisodes['next'], 'podcast' => $this->podcast, 'episode' => $this->episode, - 'persons' => $persons, + 'episodePersons' => $episodePersons, + 'persons' => $podcastPersons, ]; $secondsToNextUnpublishedEpisode = $episodeModel->getSecondsToNextUnpublishedEpisode( - $this->podcast->id + $this->podcast->id, ); - // The page cache is set to a decade so it is deleted manually upon podcast update - return view('episode', $data, [ - 'cache' => $secondsToNextUnpublishedEpisode - ? $secondsToNextUnpublishedEpisode - : DECADE, - 'cache_name' => $cacheName, - ]); + if (can_user_interact()) { + helper('form'); + // The page cache is set to a decade so it is deleted manually upon podcast update + return view('podcast/episode_authenticated', $data, [ + 'cache' => $secondsToNextUnpublishedEpisode + ? $secondsToNextUnpublishedEpisode + : DECADE, + 'cache_name' => $cacheName . '_authenticated', + ]); + } else { + // The page cache is set to a decade so it is deleted manually upon podcast update + return view('podcast/episode', $data, [ + 'cache' => $secondsToNextUnpublishedEpisode + ? $secondsToNextUnpublishedEpisode + : DECADE, + 'cache_name' => $cacheName, + ]); + } } return $cachedView; @@ -97,7 +103,7 @@ class Episode extends BaseController if (isset($_SERVER['HTTP_REFERER'])) { $session->set( 'embeddable_player_domain', - parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) + parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST), ); } @@ -108,26 +114,15 @@ class Episode extends BaseController if (!($cachedView = cache($cacheName))) { $episodeModel = new EpisodeModel(); $theme = EpisodeModel::$themes[$theme]; - helper(['persons']); - $persons = []; - construct_episode_person_array( - $this->episode->episode_persons, - $persons - ); - constructs_podcast_person_array( - $this->podcast->podcast_persons, - $persons - ); $data = [ 'podcast' => $this->podcast, 'episode' => $this->episode, - 'persons' => $persons, 'theme' => $theme, ]; $secondsToNextUnpublishedEpisode = $episodeModel->getSecondsToNextUnpublishedEpisode( - $this->podcast->id + $this->podcast->id, ); // The page cache is set to a decade so it is deleted manually upon podcast update @@ -141,4 +136,56 @@ class Episode extends BaseController return $cachedView; } + + public function oembedJSON() + { + return $this->response->setJSON([ + 'type' => 'rich', + 'version' => '1.0', + 'title' => $this->episode->title, + 'provider_name' => $this->podcast->title, + 'provider_url' => $this->podcast->link, + 'author_name' => $this->podcast->title, + 'author_url' => $this->podcast->link, + 'html' => + '<iframe src="' . + $this->episode->embeddable_player . + '" width="100%" height="200" frameborder="0" scrolling="no"></iframe>', + 'width' => 600, + 'height' => 200, + 'thumbnail_url' => $this->episode->image->large_url, + 'thumbnail_width' => config('Images')->largeSize, + 'thumbnail_height' => config('Images')->largeSize, + ]); + } + + public function oembedXML() + { + $oembed = new SimpleXMLElement( + "<?xml version='1.0' encoding='utf-8' standalone='yes'?><oembed></oembed>", + ); + + $oembed->addChild('type', 'rich'); + $oembed->addChild('version', '1.0'); + $oembed->addChild('title', $this->episode->title); + $oembed->addChild('provider_name', $this->podcast->title); + $oembed->addChild('provider_url', $this->podcast->link); + $oembed->addChild('author_name', $this->podcast->title); + $oembed->addChild('author_url', $this->podcast->link); + $oembed->addChild('thumbnail', $this->episode->image->large_url); + $oembed->addChild('thumbnail_width', config('Images')->largeSize); + $oembed->addChild('thumbnail_height', config('Images')->largeSize); + $oembed->addChild( + 'html', + htmlentities( + '<iframe src="' . + $this->episode->embeddable_player . + '" width="100%" height="200" frameborder="0" scrolling="no"></iframe>', + ), + ); + $oembed->addChild('width', 600); + $oembed->addChild('height', 200); + + return $this->response->setXML($oembed); + } } diff --git a/app/Controllers/Home.php b/app/Controllers/Home.php index 7f8aad52b698bb933f8d2068f16ac644c1ce0406..ef8b0bb00e3193349c2e69d47227c35efc9a792c 100644 --- a/app/Controllers/Home.php +++ b/app/Controllers/Home.php @@ -20,7 +20,9 @@ class Home extends BaseController // check if there's only one podcast to redirect user to it if (count($allPodcasts) == 1) { - return redirect()->route('podcast', [$allPodcasts[0]->name]); + return redirect()->route('podcast-activity', [ + $allPodcasts[0]->name, + ]); } // default behavior: list all podcasts on home page diff --git a/app/Controllers/Install.php b/app/Controllers/Install.php index 1d53f7247ff02a761c86ecd36ecd7451dc0dfe2e..d612b9194cd4a4c077986f88f5ee272ca6f854b7 100644 --- a/app/Controllers/Install.php +++ b/app/Controllers/Install.php @@ -257,6 +257,7 @@ class Install extends Controller $migrations = \Config\Services::migrations(); !$migrations->setNamespace('Myth\Auth')->latest(); + !$migrations->setNamespace('ActivityPub')->latest(); !$migrations->setNamespace(APP_NAMESPACE)->latest(); } diff --git a/app/Controllers/Note.php b/app/Controllers/Note.php new file mode 100644 index 0000000000000000000000000000000000000000..c685a690e0c9b90e4ec06123f88d5e6990e3ae89 --- /dev/null +++ b/app/Controllers/Note.php @@ -0,0 +1,212 @@ +<?php + +/** + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace App\Controllers; + +use App\Models\EpisodeModel; +use App\Models\PodcastModel; +use CodeIgniter\HTTP\URI; +use CodeIgniter\I18n\Time; + +class Note extends \ActivityPub\Controllers\NoteController +{ + /** + * @var \App\Entities\Podcast + */ + protected $podcast; + + protected $helpers = ['auth', 'activitypub', 'svg', 'components', 'misc']; + + public function _remap($method, ...$params) + { + if ( + !($this->podcast = (new PodcastModel())->getPodcastByName( + $params[0], + )) + ) { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + + $this->actor = $this->podcast->actor; + + if (count($params) > 1) { + if (!($this->note = model('NoteModel')->getNoteById($params[1]))) { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + } + unset($params[0]); + unset($params[1]); + + return $this->$method(...$params); + } + + public function index() + { + helper('persons'); + $persons = []; + construct_person_array($this->podcast->persons, $persons); + + $data = [ + 'podcast' => $this->podcast, + 'actor' => $this->actor, + 'note' => $this->note, + 'persons' => $persons, + ]; + + // if user is logged in then send to the authenticated activity view + if (can_user_interact()) { + helper('form'); + return view('podcast/note_authenticated', $data); + } else { + return view('podcast/note', $data); + } + } + + public function attemptCreate() + { + $rules = [ + 'message' => 'required|max_length[500]', + 'episode_url' => 'valid_url|permit_empty', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + $message = $this->request->getPost('message'); + + $newNote = new \App\Entities\Note([ + 'actor_id' => interact_as_actor_id(), + 'published_at' => Time::now(), + 'created_by' => user_id(), + ]); + + // get episode if episodeUrl has been set + $episodeUri = $this->request->getPost('episode_url'); + if ( + $episodeUri && + ($params = extract_params_from_episode_uri(new URI($episodeUri))) + ) { + if ( + $episode = (new EpisodeModel())->getEpisodeBySlug( + $params['podcastName'], + $params['episodeSlug'], + ) + ) { + $newNote->episode_id = $episode->id; + } + } + + $newNote->message = $message; + + if ( + !model('NoteModel')->addNote( + $newNote, + $newNote->episode_id ? false : true, + true, + ) + ) { + return redirect() + ->back() + ->withInput() + ->with('errors', model('NoteModel')->errors()); + } + + // Note has been successfully created + return redirect()->back(); + } + + public function attemptReply() + { + $rules = [ + 'message' => 'required|max_length[500]', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + $newNote = new \ActivityPub\Entities\Note([ + 'actor_id' => interact_as_actor_id(), + 'in_reply_to_id' => $this->note->id, + 'message' => $this->request->getPost('message'), + 'published_at' => Time::now(), + 'created_by' => user_id(), + ]); + + if (!model('NoteModel')->addReply($newNote)) { + return redirect() + ->back() + ->withInput() + ->with('errors', model('NoteModel')->errors()); + } + + // Reply note without preview card has been successfully created + return redirect()->back(); + } + + public function attemptFavourite() + { + model('FavouriteModel')->toggleFavourite( + interact_as_actor(), + $this->note, + ); + + return redirect()->back(); + } + + public function attemptReblog() + { + model('NoteModel')->toggleReblog(interact_as_actor(), $this->note); + + return redirect()->back(); + } + + public function attemptAction() + { + $rules = [ + 'action' => 'required|in_list[favourite,reblog,reply]', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + switch ($this->request->getPost('action')) { + case 'favourite': + return $this->attemptFavourite(); + case 'reblog': + return $this->attemptReblog(); + case 'reply': + return $this->attemptReply(); + } + } + + public function remoteAction($action) + { + $data = [ + 'podcast' => $this->podcast, + 'actor' => $this->actor, + 'note' => $this->note, + 'action' => $action, + ]; + + helper('form'); + + return view('podcast/note_remote_action', $data); + } +} diff --git a/app/Controllers/Page.php b/app/Controllers/Page.php index 74735dee6ad3272bdbd809dcabb58e3c8ec423eb..46d28d22da6ee711c28debf3790278ca78279821 100644 --- a/app/Controllers/Page.php +++ b/app/Controllers/Page.php @@ -85,14 +85,23 @@ class Page extends BaseController 'role_label' => $credit->role_label, 'is_in' => [ [ - 'link' => $credit->episode + 'link' => $credit->episode_id ? $credit->episode->link : $credit->podcast->link, - 'title' => $credit->episode + 'title' => $credit->episode_id ? (count($allPodcasts) > 1 ? "{$credit->podcast->title} â–¸ " : '') . - "(S{$credit->episode->season_number}E{$credit->episode->number}) {$credit->episode->title}" + $credit->episode + ->title . + episode_numbering( + $credit->episode + ->number, + $credit->episode + ->season_number, + 'text-xs ml-2', + true, + ) : $credit->podcast->title, ], ], @@ -114,14 +123,21 @@ class Page extends BaseController 'role_label' => $credit->role_label, 'is_in' => [ [ - 'link' => $credit->episode + 'link' => $credit->episode_id ? $credit->episode->link : $credit->podcast->link, - 'title' => $credit->episode + 'title' => $credit->episode_id ? (count($allPodcasts) > 1 ? "{$credit->podcast->title} â–¸ " : '') . - "(S{$credit->episode->season_number}E{$credit->episode->number}) {$credit->episode->title}" + $credit->episode->title . + episode_numbering( + $credit->episode->number, + $credit->episode + ->season_number, + 'text-xs ml-2', + true, + ) : $credit->podcast->title, ], ], @@ -143,7 +159,13 @@ class Page extends BaseController ? (count($allPodcasts) > 1 ? "{$credit->podcast->title} â–¸ " : '') . - "(S{$credit->episode->season_number}E{$credit->episode->number}) {$credit->episode->title}" + $credit->episode->title . + episode_numbering( + $credit->episode->number, + $credit->episode->season_number, + 'text-xs ml-2', + true, + ) : $credit->podcast->title, ], ], @@ -159,7 +181,13 @@ class Page extends BaseController ? (count($allPodcasts) > 1 ? "{$credit->podcast->title} â–¸ " : '') . - "(S{$credit->episode->season_number}E{$credit->episode->number}) {$credit->episode->title}" + $credit->episode->title . + episode_numbering( + $credit->episode->number, + $credit->episode->season_number, + 'text-xs ml-2', + true, + ) : $credit->podcast->title, ]; } diff --git a/app/Controllers/Podcast.php b/app/Controllers/Podcast.php index d7a80a6ee3730d2079b3e2c7d1b79e2719b75010..56a23e361813029b9da7c42ac3b0e97ed75b1559 100644 --- a/app/Controllers/Podcast.php +++ b/app/Controllers/Podcast.php @@ -10,6 +10,7 @@ namespace App\Controllers; use App\Models\EpisodeModel; use App\Models\PodcastModel; +use App\Models\NoteModel; class Podcast extends BaseController { @@ -23,17 +24,41 @@ class Podcast extends BaseController if (count($params) > 0) { if ( !($this->podcast = (new PodcastModel())->getPodcastByName( - $params[0] + $params[0], )) ) { throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); } + unset($params[0]); } - return $this->$method(); + return $this->$method(...$params); } - public function index() + public function activity() + { + helper('persons'); + $persons = []; + construct_person_array($this->podcast->persons, $persons); + + $data = [ + 'podcast' => $this->podcast, + 'notes' => (new NoteModel())->getActorNotes( + $this->podcast->actor_id, + ), + 'persons' => $persons, + ]; + + // if user is logged in then send to the authenticated activity view + if (can_user_interact()) { + helper('form'); + return view('podcast/activity_authenticated', $data); + } else { + return view('podcast/activity', $data); + } + } + + public function episodes() { self::triggerWebpageHit($this->podcast->id); @@ -42,7 +67,7 @@ class Podcast extends BaseController if (!$yearQuery and !$seasonQuery) { $defaultQuery = (new EpisodeModel())->getDefaultQuery( - $this->podcast->id + $this->podcast->id, ); if ($defaultQuery['type'] == 'season') { $seasonQuery = $defaultQuery['data']['season_number']; @@ -59,7 +84,7 @@ class Podcast extends BaseController $yearQuery, $seasonQuery ? 'season' . $seasonQuery : null, service('request')->getLocale(), - ]) + ]), ); if (!($found = cache($cacheName))) { @@ -73,14 +98,19 @@ class Podcast extends BaseController foreach ($years as $year) { $isActive = $yearQuery == $year['year']; if ($isActive) { - $activeQuery = ['type' => 'year', 'value' => $year['year']]; + $activeQuery = [ + 'type' => 'year', + 'value' => $year['year'], + 'label' => $year['year'], + 'number_of_episodes' => $year['number_of_episodes'], + ]; } array_push($episodesNavigation, [ 'label' => $year['year'], 'number_of_episodes' => $year['number_of_episodes'], 'route' => - route_to('podcast', $this->podcast->name) . + route_to('podcast-episodes', $this->podcast->name) . '?year=' . $year['year'], 'is_active' => $isActive, @@ -93,6 +123,10 @@ class Podcast extends BaseController $activeQuery = [ 'type' => 'season', 'value' => $season['season_number'], + 'label' => lang('Podcast.season', [ + 'seasonNumber' => $season['season_number'], + ]), + 'number_of_episodes' => $season['number_of_episodes'], ]; } @@ -102,19 +136,16 @@ class Podcast extends BaseController ]), 'number_of_episodes' => $season['number_of_episodes'], 'route' => - route_to('podcast', $this->podcast->name) . + route_to('podcast-episodes', $this->podcast->name) . '?season=' . $season['season_number'], 'is_active' => $isActive, ]); } - helper(['persons']); + helper('persons'); $persons = []; - constructs_podcast_person_array( - $this->podcast->podcast_persons, - $persons - ); + construct_person_array($this->podcast->persons, $persons); $data = [ 'podcast' => $this->podcast, @@ -124,21 +155,31 @@ class Podcast extends BaseController $this->podcast->id, $this->podcast->type, $yearQuery, - $seasonQuery + $seasonQuery, ), - 'personArray' => $persons, + 'persons' => $persons, ]; $secondsToNextUnpublishedEpisode = $episodeModel->getSecondsToNextUnpublishedEpisode( - $this->podcast->id + $this->podcast->id, ); - return view('podcast', $data, [ - 'cache' => $secondsToNextUnpublishedEpisode - ? $secondsToNextUnpublishedEpisode - : DECADE, - 'cache_name' => $cacheName, - ]); + // if user is logged in then send to the authenticated episodes view + if (can_user_interact()) { + return view('podcast/episodes_authenticated', $data, [ + 'cache' => $secondsToNextUnpublishedEpisode + ? $secondsToNextUnpublishedEpisode + : DECADE, + 'cache_name' => $cacheName . '_authenticated', + ]); + } else { + return view('podcast/episodes', $data, [ + 'cache' => $secondsToNextUnpublishedEpisode + ? $secondsToNextUnpublishedEpisode + : DECADE, + 'cache_name' => $cacheName, + ]); + } } return $found; diff --git a/app/Database/Migrations/2020-05-29-152000_add_categories.php b/app/Database/Migrations/2020-05-29-152000_add_categories.php index 2fa255a3a523fb5a8d49f13fd20c0abb78cd7ad0..900f5b246ec4a95133e4be6a82ed12ac9a4f3df3 100644 --- a/app/Database/Migrations/2020-05-29-152000_add_categories.php +++ b/app/Database/Migrations/2020-05-29-152000_add_categories.php @@ -39,7 +39,7 @@ class AddCategories extends Migration 'constraint' => 32, ], ]); - $this->forge->addKey('id', true); + $this->forge->addPrimaryKey('id'); $this->forge->addUniqueKey('code'); $this->forge->addForeignKey('parent_id', 'categories', 'id'); $this->forge->createTable('categories'); diff --git a/app/Database/Migrations/2020-05-30-101000_add_languages.php b/app/Database/Migrations/2020-05-30-101000_add_languages.php index cc58df49f85dcdef4679c0eb989ab8303b3eb590..65689906810e383c3bbded881d12e16ee7f147c5 100644 --- a/app/Database/Migrations/2020-05-30-101000_add_languages.php +++ b/app/Database/Migrations/2020-05-30-101000_add_languages.php @@ -28,7 +28,7 @@ class AddLanguages extends Migration 'constraint' => 128, ], ]); - $this->forge->addKey('code', true); + $this->forge->addPrimaryKey('code'); $this->forge->createTable('languages'); } diff --git a/app/Database/Migrations/2020-05-30-101500_add_podcasts.php b/app/Database/Migrations/2020-05-30-101500_add_podcasts.php index 2351f51a3ea5da8dbceb4d05e1f507e4e99a9c65..0eddb82f0528b0db5613e8a6640db0aae9a95105 100644 --- a/app/Database/Migrations/2020-05-30-101500_add_podcasts.php +++ b/app/Database/Migrations/2020-05-30-101500_add_podcasts.php @@ -23,14 +23,17 @@ class AddPodcasts extends Migration 'unsigned' => true, 'auto_increment' => true, ], - 'title' => [ - 'type' => 'VARCHAR', - 'constraint' => 128, + 'actor_id' => [ + 'type' => 'INT', + 'unsigned' => true, ], 'name' => [ 'type' => 'VARCHAR', 'constraint' => 32, - 'unique' => true, + ], + 'title' => [ + 'type' => 'VARCHAR', + 'constraint' => 128, ], 'description_markdown' => [ 'type' => 'TEXT', @@ -42,6 +45,12 @@ class AddPodcasts extends Migration 'type' => 'VARCHAR', 'constraint' => 255, ], + // constraint is 13 because the longest safe mimetype for images is image/svg+xml, + // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#image_types + 'image_mimetype' => [ + 'type' => 'VARCHAR', + 'constraint' => 13, + ], 'language_code' => [ 'type' => 'VARCHAR', 'constraint' => 2, @@ -140,6 +149,7 @@ class AddPodcasts extends Migration ], 'custom_rss' => [ 'type' => 'JSON', + 'null' => true, ], 'partner_id' => [ 'type' => 'VARCHAR', @@ -176,7 +186,15 @@ class AddPodcasts extends Migration ], ]); - $this->forge->addKey('id', true); + $this->forge->addPrimaryKey('id'); + $this->forge->addUniqueKey('name'); + $this->forge->addForeignKey( + 'actor_id', + 'activitypub_actors', + 'id', + false, + 'CASCADE', + ); $this->forge->addForeignKey('category_id', 'categories', 'id'); $this->forge->addForeignKey('language_code', 'languages', 'code'); $this->forge->addForeignKey('created_by', 'users', 'id'); diff --git a/app/Database/Migrations/2020-06-05-170000_add_episodes.php b/app/Database/Migrations/2020-06-05-170000_add_episodes.php index 72f7f1994d7e24105d412e0335c57216414a7687..775e64c12d777a1a81f284193e36608fc18ab11c 100644 --- a/app/Database/Migrations/2020-06-05-170000_add_episodes.php +++ b/app/Database/Migrations/2020-06-05-170000_add_episodes.php @@ -73,6 +73,13 @@ class AddEpisodes extends Migration 'constraint' => 255, 'null' => true, ], + // constraint is 13 because the longest safe mimetype for images is image/svg+xml, + // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#image_types + 'image_mimetype' => [ + 'type' => 'VARCHAR', + 'constraint' => 13, + 'null' => true, + ], 'transcript_uri' => [ 'type' => 'VARCHAR', 'constraint' => 255, @@ -128,6 +135,21 @@ class AddEpisodes extends Migration 'type' => 'JSON', 'null' => true, ], + 'favourites_total' => [ + 'type' => 'INT', + 'unsigned' => true, + 'default' => 0, + ], + 'reblogs_total' => [ + 'type' => 'INT', + 'unsigned' => true, + 'default' => 0, + ], + 'notes_total' => [ + 'type' => 'INT', + 'unsigned' => true, + 'default' => 0, + ], 'created_by' => [ 'type' => 'INT', 'unsigned' => true, @@ -151,9 +173,15 @@ class AddEpisodes extends Migration 'null' => true, ], ]); - $this->forge->addKey('id', true); + $this->forge->addPrimaryKey('id'); $this->forge->addUniqueKey(['podcast_id', 'slug']); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); + $this->forge->addForeignKey( + 'podcast_id', + 'podcasts', + 'id', + false, + 'CASCADE', + ); $this->forge->addForeignKey('created_by', 'users', 'id'); $this->forge->addForeignKey('updated_by', 'users', 'id'); $this->forge->createTable('episodes'); diff --git a/app/Database/Migrations/2020-06-05-180000_add_soundbites.php b/app/Database/Migrations/2020-06-05-180000_add_soundbites.php index 57af8f31769ebf0511dd34a48c9b964780848182..1f1aec53736716063939b02384cb9811d440ec24 100644 --- a/app/Database/Migrations/2020-06-05-180000_add_soundbites.php +++ b/app/Database/Migrations/2020-06-05-180000_add_soundbites.php @@ -63,8 +63,20 @@ class AddSoundbites extends Migration ]); $this->forge->addKey('id', true); $this->forge->addUniqueKey(['episode_id', 'start_time', 'duration']); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); - $this->forge->addForeignKey('episode_id', 'episodes', 'id'); + $this->forge->addForeignKey( + 'podcast_id', + 'podcasts', + 'id', + false, + 'CASCADE', + ); + $this->forge->addForeignKey( + 'episode_id', + 'episodes', + 'id', + false, + 'CASCADE', + ); $this->forge->addForeignKey('created_by', 'users', 'id'); $this->forge->addForeignKey('updated_by', 'users', 'id'); $this->forge->createTable('soundbites'); diff --git a/app/Database/Migrations/2020-06-05-190000_add_platforms.php b/app/Database/Migrations/2020-06-05-190000_add_platforms.php index b79e7939da65ec5b81f367dd6c6aadb26937b4c5..fb82e824893bb445dbe76523732d382965dfa0fa 100644 --- a/app/Database/Migrations/2020-06-05-190000_add_platforms.php +++ b/app/Database/Migrations/2020-06-05-190000_add_platforms.php @@ -45,7 +45,7 @@ class AddPlatforms extends Migration $this->forge->addField( '`updated_at` timestamp NOT NULL DEFAULT NOW() ON UPDATE NOW()' ); - $this->forge->addKey('slug', true); + $this->forge->addPrimaryKey('slug'); $this->forge->createTable('platforms'); } diff --git a/app/Database/Migrations/2020-06-08-120000_add_analytics_podcasts.php b/app/Database/Migrations/2020-06-08-120000_add_analytics_podcasts.php index 96b1419fcbc0ee4671244f71b64e3c500505aad4..35821439f199cb62ad1f283bd8f4c35e64e3657a 100644 --- a/app/Database/Migrations/2020-06-08-120000_add_analytics_podcasts.php +++ b/app/Database/Migrations/2020-06-08-120000_add_analytics_podcasts.php @@ -3,6 +3,7 @@ /** * Class AddAnalyticsPodcasts * Creates analytics_podcasts table in database + * * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ @@ -45,12 +46,11 @@ class AddAnalyticsPodcasts extends Migration ]); $this->forge->addPrimaryKey(['podcast_id', 'date']); $this->forge->addField( - '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()', ); $this->forge->addField( - '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()', ); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); $this->forge->createTable('analytics_podcasts'); } diff --git a/app/Database/Migrations/2020-06-08-130000_add_analytics_podcasts_by_episode.php b/app/Database/Migrations/2020-06-08-130000_add_analytics_podcasts_by_episode.php index 546e918127e5b9c7443bb5baa96b48939fe3b593..39dba61062b7574e2953d1f503a984ab2c6d7e31 100644 --- a/app/Database/Migrations/2020-06-08-130000_add_analytics_podcasts_by_episode.php +++ b/app/Database/Migrations/2020-06-08-130000_add_analytics_podcasts_by_episode.php @@ -3,6 +3,7 @@ /** * Class AddAnalyticsPodcastsByEpisode * Creates analytics_episodes_by_episode table in database + * * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ @@ -41,13 +42,11 @@ class AddAnalyticsPodcastsByEpisode extends Migration ]); $this->forge->addPrimaryKey(['podcast_id', 'date', 'episode_id']); $this->forge->addField( - '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()', ); $this->forge->addField( - '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()', ); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); - $this->forge->addForeignKey('episode_id', 'episodes', 'id'); $this->forge->createTable('analytics_podcasts_by_episode'); } diff --git a/app/Database/Migrations/2020-06-08-130000_add_analytics_podcasts_by_hour.php b/app/Database/Migrations/2020-06-08-130000_add_analytics_podcasts_by_hour.php index 828e3066197ded84da00bef02c6fb4eb061427fa..ae2d85e3c05739a896ffdb1e8169ff67f653256c 100644 --- a/app/Database/Migrations/2020-06-08-130000_add_analytics_podcasts_by_hour.php +++ b/app/Database/Migrations/2020-06-08-130000_add_analytics_podcasts_by_hour.php @@ -3,6 +3,7 @@ /** * Class AddAnalyticsPodcastsByHour * Creates analytics_podcasts_by_hour table in database + * * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ @@ -36,12 +37,11 @@ class AddAnalyticsPodcastsByHour extends Migration ]); $this->forge->addPrimaryKey(['podcast_id', 'date', 'hour']); $this->forge->addField( - '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()', ); $this->forge->addField( - '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()', ); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); $this->forge->createTable('analytics_podcasts_by_hour'); } diff --git a/app/Database/Migrations/2020-06-08-140000_add_analytics_podcasts_by_player.php b/app/Database/Migrations/2020-06-08-140000_add_analytics_podcasts_by_player.php index a05d73526d54e6f81fb9a686eed3cf643e0755e1..a1ab3174c3b64659cf5d598189d37ed46d75d5c8 100644 --- a/app/Database/Migrations/2020-06-08-140000_add_analytics_podcasts_by_player.php +++ b/app/Database/Migrations/2020-06-08-140000_add_analytics_podcasts_by_player.php @@ -3,6 +3,7 @@ /** * Class AddAnalyticsPodcastsByPlayer * Creates analytics_podcasts_by_player table in database + * * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ @@ -61,12 +62,11 @@ class AddAnalyticsPodcastsByPlayer extends Migration 'is_bot', ]); $this->forge->addField( - '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()', ); $this->forge->addField( - '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()', ); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); $this->forge->createTable('analytics_podcasts_by_player'); } diff --git a/app/Database/Migrations/2020-06-08-150000_add_analytics_podcasts_by_country.php b/app/Database/Migrations/2020-06-08-150000_add_analytics_podcasts_by_country.php index 4fae6c03b661118761f51ff47cc44caec3e336db..ce728e96719b6de3b9ffc1101de71d872025a6c5 100644 --- a/app/Database/Migrations/2020-06-08-150000_add_analytics_podcasts_by_country.php +++ b/app/Database/Migrations/2020-06-08-150000_add_analytics_podcasts_by_country.php @@ -3,6 +3,7 @@ /** * Class AddAnalyticsPodcastsByCountry * Creates analytics_podcasts_by_country table in database + * * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ @@ -37,12 +38,11 @@ class AddAnalyticsPodcastsByCountry extends Migration ]); $this->forge->addPrimaryKey(['podcast_id', 'date', 'country_code']); $this->forge->addField( - '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()', ); $this->forge->addField( - '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()', ); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); $this->forge->createTable('analytics_podcasts_by_country'); } diff --git a/app/Database/Migrations/2020-06-08-160000_add_analytics_podcasts_by_region.php b/app/Database/Migrations/2020-06-08-160000_add_analytics_podcasts_by_region.php index 3b7d48160df6aca88ebd026cc73501440316e957..009894fdf09afa42dd6aef4a662028bc9d9f028c 100644 --- a/app/Database/Migrations/2020-06-08-160000_add_analytics_podcasts_by_region.php +++ b/app/Database/Migrations/2020-06-08-160000_add_analytics_podcasts_by_region.php @@ -3,6 +3,7 @@ /** * Class AddAnalyticsPodcastsByRegion * Creates analytics_podcasts_by_region table in database + * * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ @@ -55,12 +56,11 @@ class AddAnalyticsPodcastsByRegion extends Migration 'region_code', ]); $this->forge->addField( - '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()', ); $this->forge->addField( - '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()', ); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); $this->forge->createTable('analytics_podcasts_by_region'); } diff --git a/app/Database/Migrations/2020-06-08-160000_add_podcasts_platforms.php b/app/Database/Migrations/2020-06-08-160000_add_podcasts_platforms.php index 4b2a9f9efd48e1808fd3a3df097527b957222576..68df0a8130efa6938593c0df7a775f28d8f60305 100644 --- a/app/Database/Migrations/2020-06-08-160000_add_podcasts_platforms.php +++ b/app/Database/Migrations/2020-06-08-160000_add_podcasts_platforms.php @@ -48,8 +48,6 @@ class AddPodcastsPlatforms extends Migration ]); $this->forge->addPrimaryKey(['podcast_id', 'platform_slug']); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); - $this->forge->addForeignKey('platform_slug', 'platforms', 'slug'); $this->forge->createTable('podcasts_platforms'); } diff --git a/app/Database/Migrations/2020-06-08-170000_add_analytics_website_by_browser.php b/app/Database/Migrations/2020-06-08-170000_add_analytics_website_by_browser.php index cc2e7467c08a2d21ac19598f57ea7ccbdaa5bd4c..891a76e7298a14cb8b62ea89ae28c8b809c61010 100644 --- a/app/Database/Migrations/2020-06-08-170000_add_analytics_website_by_browser.php +++ b/app/Database/Migrations/2020-06-08-170000_add_analytics_website_by_browser.php @@ -3,6 +3,7 @@ /** * Class AddAnalyticsWebsiteByBrowser * Creates analytics_website_by_browser table in database + * * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ @@ -37,12 +38,11 @@ class AddAnalyticsWebsiteByBrowser extends Migration $this->forge->addPrimaryKey(['podcast_id', 'date', 'browser']); $this->forge->addField( - '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()', ); $this->forge->addField( - '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()', ); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); $this->forge->createTable('analytics_website_by_browser'); } diff --git a/app/Database/Migrations/2020-06-08-180000_add_analytics_website_by_referer.php b/app/Database/Migrations/2020-06-08-180000_add_analytics_website_by_referer.php index ca761a5634642d04a2f68dc67713d8d330c94423..0fa2fa707c0bc22a8e29bd4777cc22df1bb1e7ae 100644 --- a/app/Database/Migrations/2020-06-08-180000_add_analytics_website_by_referer.php +++ b/app/Database/Migrations/2020-06-08-180000_add_analytics_website_by_referer.php @@ -3,6 +3,7 @@ /** * Class AddAnalyticsWebsiteByReferer * Creates analytics_website_by_referer table in database + * * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ @@ -46,12 +47,11 @@ class AddAnalyticsWebsiteByReferer extends Migration ]); $this->forge->addPrimaryKey(['podcast_id', 'date', 'referer_url']); $this->forge->addField( - '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()', ); $this->forge->addField( - '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()', ); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); $this->forge->createTable('analytics_website_by_referer'); } diff --git a/app/Database/Migrations/2020-06-08-190000_add_analytics_website_by_entry_page.php b/app/Database/Migrations/2020-06-08-190000_add_analytics_website_by_entry_page.php index 2203d17fb950806c2518a8f3c4d0dcde83f5448f..366b75af087cffb04ebd2cb49dd2cfa6a5a973b7 100644 --- a/app/Database/Migrations/2020-06-08-190000_add_analytics_website_by_entry_page.php +++ b/app/Database/Migrations/2020-06-08-190000_add_analytics_website_by_entry_page.php @@ -3,6 +3,7 @@ /** * Class AddAnalyticsWebsiteByEntryPage * Creates analytics_website_by_entry_page table in database + * * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ @@ -36,12 +37,11 @@ class AddAnalyticsWebsiteByEntryPage extends Migration ]); $this->forge->addPrimaryKey(['podcast_id', 'date', 'entry_page_url']); $this->forge->addField( - '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()', ); $this->forge->addField( - '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()' + '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()', ); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); $this->forge->createTable('analytics_website_by_entry_page'); } diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_unknown_useragents.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_unknown_useragents.php index 1f57fd7c5ec8ff785e3ebc6baf32d29edf7e9206..fcce6f4966d9535a5a93e0e486df693917e39eb0 100644 --- a/app/Database/Migrations/2020-06-08-210000_add_analytics_unknown_useragents.php +++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_unknown_useragents.php @@ -3,6 +3,7 @@ /** * Class AddAnalyticsUnknownUseragents * Creates analytics_unknown_useragents table in database + * * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ @@ -33,7 +34,8 @@ class AddAnalyticsUnknownUseragents extends Migration 'default' => 1, ], ]); - $this->forge->addKey('id', true); + + $this->forge->addPrimaryKey('id'); // `created_at` and `updated_at` are created with SQL because Model class won’t be used for insertion (Procedure will be used instead) $this->forge->addField( '`created_at` timestamp NOT NULL DEFAULT current_timestamp()' diff --git a/app/Database/Migrations/2020-06-11-210000_add_analytics_podcasts_procedure.php b/app/Database/Migrations/2020-06-11-210000_add_analytics_podcasts_procedure.php index d77a5d1910f314c3861adb5142d9b7381c9451aa..f1792a6ced563efeeca77d3a5c68b30a0d385350 100644 --- a/app/Database/Migrations/2020-06-11-210000_add_analytics_podcasts_procedure.php +++ b/app/Database/Migrations/2020-06-11-210000_add_analytics_podcasts_procedure.php @@ -3,6 +3,7 @@ /** * Class AddAnalyticsPodcastsProcedure * Creates analytics_podcasts procedure in database + * * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ @@ -21,58 +22,58 @@ class AddAnalyticsPodcastsProcedure extends Migration $prefix = $this->db->getPrefix(); $createQuery = <<<EOD -CREATE PROCEDURE `{$prefix}analytics_podcasts` ( - IN `p_podcast_id` INT UNSIGNED, - IN `p_episode_id` INT UNSIGNED, - IN `p_country_code` VARCHAR(3) CHARSET utf8mb4, - IN `p_region_code` VARCHAR(3) CHARSET utf8mb4, - IN `p_latitude` FLOAT, - IN `p_longitude` FLOAT, - IN `p_service` VARCHAR(128) CHARSET utf8mb4, - IN `p_app` VARCHAR(128) CHARSET utf8mb4, - IN `p_device` VARCHAR(32) CHARSET utf8mb4, - IN `p_os` VARCHAR(32) CHARSET utf8mb4, - IN `p_bot` TINYINT(1) UNSIGNED, - IN `p_filesize` INT UNSIGNED, - IN `p_duration` INT UNSIGNED, - IN `p_age` INT UNSIGNED, - IN `p_new_listener` TINYINT(1) UNSIGNED - ) MODIFIES SQL DATA -DETERMINISTIC -SQL SECURITY INVOKER -COMMENT 'Add one hit in podcast logs tables.' -BEGIN + CREATE PROCEDURE `{$prefix}analytics_podcasts` ( + IN `p_podcast_id` INT UNSIGNED, + IN `p_episode_id` INT UNSIGNED, + IN `p_country_code` VARCHAR(3) CHARSET utf8mb4, + IN `p_region_code` VARCHAR(3) CHARSET utf8mb4, + IN `p_latitude` FLOAT, + IN `p_longitude` FLOAT, + IN `p_service` VARCHAR(128) CHARSET utf8mb4, + IN `p_app` VARCHAR(128) CHARSET utf8mb4, + IN `p_device` VARCHAR(32) CHARSET utf8mb4, + IN `p_os` VARCHAR(32) CHARSET utf8mb4, + IN `p_bot` TINYINT(1) UNSIGNED, + IN `p_filesize` INT UNSIGNED, + IN `p_duration` INT UNSIGNED, + IN `p_age` INT UNSIGNED, + IN `p_new_listener` TINYINT(1) UNSIGNED + ) MODIFIES SQL DATA + DETERMINISTIC + SQL SECURITY INVOKER + COMMENT 'Add one hit in podcast logs tables.' + BEGIN -SET @current_datetime = NOW(); -SET @current_date = DATE(@current_datetime); -SET @current_hour = HOUR(@current_datetime); + SET @current_datetime = NOW(); + SET @current_date = DATE(@current_datetime); + SET @current_hour = HOUR(@current_datetime); -IF NOT `p_bot` THEN - INSERT INTO `{$prefix}analytics_podcasts`(`podcast_id`, `date`) - VALUES (p_podcast_id, @current_date) - ON DUPLICATE KEY UPDATE - `duration`=`duration`+`p_duration`, - `bandwidth`=`bandwidth`+`p_filesize`, - `hits`=`hits`+1, - `unique_listeners`=`unique_listeners`+`p_new_listener`; - INSERT INTO `{$prefix}analytics_podcasts_by_hour`(`podcast_id`, `date`, `hour`) - VALUES (p_podcast_id, @current_date, @current_hour) - ON DUPLICATE KEY UPDATE `hits`=`hits`+1; - INSERT INTO `{$prefix}analytics_podcasts_by_episode`(`podcast_id`, `episode_id`, `date`, `age`) - VALUES (p_podcast_id, p_episode_id, @current_date, p_age) - ON DUPLICATE KEY UPDATE `hits`=`hits`+1; - INSERT INTO `{$prefix}analytics_podcasts_by_country`(`podcast_id`, `country_code`, `date`) - VALUES (p_podcast_id, p_country_code, @current_date) - ON DUPLICATE KEY UPDATE `hits`=`hits`+1; - INSERT INTO `{$prefix}analytics_podcasts_by_region`(`podcast_id`, `country_code`, `region_code`, `latitude`, `longitude`, `date`) - VALUES (p_podcast_id, p_country_code, p_region_code, p_latitude, p_longitude, @current_date) - ON DUPLICATE KEY UPDATE `hits`=`hits`+1; -END IF; -INSERT INTO `{$prefix}analytics_podcasts_by_player`(`podcast_id`, `service`, `app`, `device`, `os`, `is_bot`, `date`) - VALUES (p_podcast_id, p_service, p_app, p_device, p_os, p_bot, @current_date) - ON DUPLICATE KEY UPDATE `hits`=`hits`+1; -END -EOD; + IF NOT `p_bot` THEN + INSERT INTO `{$prefix}analytics_podcasts`(`podcast_id`, `date`) + VALUES (p_podcast_id, @current_date) + ON DUPLICATE KEY UPDATE + `duration`=`duration`+`p_duration`, + `bandwidth`=`bandwidth`+`p_filesize`, + `hits`=`hits`+1, + `unique_listeners`=`unique_listeners`+`p_new_listener`; + INSERT INTO `{$prefix}analytics_podcasts_by_hour`(`podcast_id`, `date`, `hour`) + VALUES (p_podcast_id, @current_date, @current_hour) + ON DUPLICATE KEY UPDATE `hits`=`hits`+1; + INSERT INTO `{$prefix}analytics_podcasts_by_episode`(`podcast_id`, `episode_id`, `date`, `age`) + VALUES (p_podcast_id, p_episode_id, @current_date, p_age) + ON DUPLICATE KEY UPDATE `hits`=`hits`+1; + INSERT INTO `{$prefix}analytics_podcasts_by_country`(`podcast_id`, `country_code`, `date`) + VALUES (p_podcast_id, p_country_code, @current_date) + ON DUPLICATE KEY UPDATE `hits`=`hits`+1; + INSERT INTO `{$prefix}analytics_podcasts_by_region`(`podcast_id`, `country_code`, `region_code`, `latitude`, `longitude`, `date`) + VALUES (p_podcast_id, p_country_code, p_region_code, p_latitude, p_longitude, @current_date) + ON DUPLICATE KEY UPDATE `hits`=`hits`+1; + END IF; + INSERT INTO `{$prefix}analytics_podcasts_by_player`(`podcast_id`, `service`, `app`, `device`, `os`, `is_bot`, `date`) + VALUES (p_podcast_id, p_service, p_app, p_device, p_os, p_bot, @current_date) + ON DUPLICATE KEY UPDATE `hits`=`hits`+1; + END + EOD; $this->db->query($createQuery); } @@ -80,7 +81,7 @@ EOD; { $prefix = $this->db->getPrefix(); $this->db->query( - "DROP PROCEDURE IF EXISTS `{$prefix}analytics_podcasts`" + "DROP PROCEDURE IF EXISTS `{$prefix}analytics_podcasts`", ); } } diff --git a/app/Database/Migrations/2020-06-11-210000_add_analytics_unknown_useragents_procedure.php b/app/Database/Migrations/2020-06-11-210000_add_analytics_unknown_useragents_procedure.php index 6b05164dda243fc7b261295bb045e55df1541cf3..39e8d3aa287e722da53236883912c8641380d7f4 100644 --- a/app/Database/Migrations/2020-06-11-210000_add_analytics_unknown_useragents_procedure.php +++ b/app/Database/Migrations/2020-06-11-210000_add_analytics_unknown_useragents_procedure.php @@ -3,6 +3,7 @@ /** * Class AddAnalyticsUnknownUseragentsProcedure * Creates analytics_unknown_useragents procedure in database + * * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ @@ -20,14 +21,14 @@ class AddAnalyticsUnknownUseragentsProcedure extends Migration // Example: CALL analytics_unknown_useragents('Podcasts/1430.46 CFNetwork/1125.2 Darwin/19.4.0'); $procedureName = $this->db->prefixTable('analytics_unknown_useragents'); $createQuery = <<<EOD -CREATE PROCEDURE `$procedureName` (IN `p_useragent` VARCHAR(191) CHARSET utf8mb4) MODIFIES SQL DATA -DETERMINISTIC -SQL SECURITY INVOKER -COMMENT 'Add an unknown useragent to table $procedureName.' -INSERT INTO `$procedureName`(`useragent`) -VALUES (p_useragent) -ON DUPLICATE KEY UPDATE `hits`=`hits`+1 -EOD; + CREATE PROCEDURE `$procedureName` (IN `p_useragent` VARCHAR(191) CHARSET utf8mb4) MODIFIES SQL DATA + DETERMINISTIC + SQL SECURITY INVOKER + COMMENT 'Add an unknown useragent to table $procedureName.' + INSERT INTO `$procedureName`(`useragent`) + VALUES (p_useragent) + ON DUPLICATE KEY UPDATE `hits`=`hits`+1 + EOD; $this->db->query($createQuery); } diff --git a/app/Database/Migrations/2020-06-11-210000_add_analytics_website_procedure.php b/app/Database/Migrations/2020-06-11-210000_add_analytics_website_procedure.php index 8d46ad7ff9b8a0da71616edc0385127520a24504..01e89391f852ef19d6ae062085d61c905821ff53 100644 --- a/app/Database/Migrations/2020-06-11-210000_add_analytics_website_procedure.php +++ b/app/Database/Migrations/2020-06-11-210000_add_analytics_website_procedure.php @@ -3,6 +3,7 @@ /** * Class AddAnalyticsWebsiteProcedure * Creates analytics_website stored procedure in database + * * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ @@ -20,25 +21,25 @@ class AddAnalyticsWebsiteProcedure extends Migration // Example: CALL analytics_website(1,'FR','Firefox'); $procedureName = $this->db->prefixTable('analytics_website'); $createQuery = <<<EOD -CREATE PROCEDURE `$procedureName` (IN `p_podcast_id` INT UNSIGNED, IN `p_browser` VARCHAR(191) CHARSET utf8mb4, IN `p_entry_page` VARCHAR(512) CHARSET utf8mb4, IN `p_referer_url` VARCHAR(512) CHARSET utf8mb4, IN `p_domain` VARCHAR(128) CHARSET utf8mb4, IN `p_keywords` VARCHAR(384) CHARSET utf8mb4) MODIFIES SQL DATA -DETERMINISTIC -SQL SECURITY INVOKER -COMMENT 'Add one hit in website logs tables.' -BEGIN + CREATE PROCEDURE `$procedureName` (IN `p_podcast_id` INT UNSIGNED, IN `p_browser` VARCHAR(191) CHARSET utf8mb4, IN `p_entry_page` VARCHAR(512) CHARSET utf8mb4, IN `p_referer_url` VARCHAR(512) CHARSET utf8mb4, IN `p_domain` VARCHAR(128) CHARSET utf8mb4, IN `p_keywords` VARCHAR(384) CHARSET utf8mb4) MODIFIES SQL DATA + DETERMINISTIC + SQL SECURITY INVOKER + COMMENT 'Add one hit in website logs tables.' + BEGIN -SET @current_date = DATE(NOW()); + SET @current_date = DATE(NOW()); -INSERT INTO {$procedureName}_by_browser(`podcast_id`, `browser`, `date`) - VALUES (p_podcast_id, p_browser, @current_date) - ON DUPLICATE KEY UPDATE `hits`=`hits`+1; -INSERT INTO {$procedureName}_by_referer(`podcast_id`, `referer_url`, `domain`, `keywords`, `date`) - VALUES (p_podcast_id, p_referer_url, p_domain, p_keywords, @current_date) - ON DUPLICATE KEY UPDATE `hits`=`hits`+1; -INSERT INTO {$procedureName}_by_entry_page(`podcast_id`, `entry_page_url`, `date`) - VALUES (p_podcast_id, p_entry_page, @current_date) - ON DUPLICATE KEY UPDATE `hits`=`hits`+1; -END -EOD; + INSERT INTO {$procedureName}_by_browser(`podcast_id`, `browser`, `date`) + VALUES (p_podcast_id, p_browser, @current_date) + ON DUPLICATE KEY UPDATE `hits`=`hits`+1; + INSERT INTO {$procedureName}_by_referer(`podcast_id`, `referer_url`, `domain`, `keywords`, `date`) + VALUES (p_podcast_id, p_referer_url, p_domain, p_keywords, @current_date) + ON DUPLICATE KEY UPDATE `hits`=`hits`+1; + INSERT INTO {$procedureName}_by_entry_page(`podcast_id`, `entry_page_url`, `date`) + VALUES (p_podcast_id, p_entry_page, @current_date) + ON DUPLICATE KEY UPDATE `hits`=`hits`+1; + END + EOD; $this->db->query($createQuery); } diff --git a/app/Database/Migrations/2020-07-03-191500_add_podcasts_users.php b/app/Database/Migrations/2020-07-03-191500_add_podcasts_users.php index 3884d57a430a9706b7d97a7758fb7574a8830c42..37bb9d56468d47d250eb742e5d097d94d26b0397 100644 --- a/app/Database/Migrations/2020-07-03-191500_add_podcasts_users.php +++ b/app/Database/Migrations/2020-07-03-191500_add_podcasts_users.php @@ -1,8 +1,8 @@ <?php /** - * Class AddLanguages - * Creates languages table in database + * Class AddPodcastUsers + * Creates podcast_users table in database * * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -32,9 +32,21 @@ class AddPodcastsUsers extends Migration ], ]); $this->forge->addPrimaryKey(['user_id', 'podcast_id']); - $this->forge->addForeignKey('user_id', 'users', 'id'); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); - $this->forge->addForeignKey('group_id', 'auth_groups', 'id'); + $this->forge->addForeignKey('user_id', 'users', 'id', false, 'CASCADE'); + $this->forge->addForeignKey( + 'podcast_id', + 'podcasts', + 'id', + false, + 'CASCADE', + ); + $this->forge->addForeignKey( + 'group_id', + 'auth_groups', + 'id', + false, + 'CASCADE', + ); $this->forge->createTable('podcasts_users'); } diff --git a/app/Database/Migrations/2020-08-17-150000_add_pages.php b/app/Database/Migrations/2020-08-17-150000_add_pages.php index b35cd443d6b9c97d52d45a80307c31908ed13319..cd271ab50c920c9be497eeff9eca5e53ad556b02 100644 --- a/app/Database/Migrations/2020-08-17-150000_add_pages.php +++ b/app/Database/Migrations/2020-08-17-150000_add_pages.php @@ -1,8 +1,8 @@ <?php /** - * Class AddLanguages - * Creates languages table in database + * Class AddPages + * Creates pages table in database * * @copyright 2020 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 @@ -46,7 +46,7 @@ class AddPages extends Migration 'null' => true, ], ]); - $this->forge->addKey('id', true); + $this->forge->addPrimaryKey('id'); $this->forge->createTable('pages'); } diff --git a/app/Database/Migrations/2020-09-29-150000_add_podcasts_categories.php b/app/Database/Migrations/2020-09-29-150000_add_podcasts_categories.php index 6c0bd504648aa9fb46c8ec069a1e0e69826cc917..17c60b7145c29c5f75baf12bec6045e16de1de7a 100644 --- a/app/Database/Migrations/2020-09-29-150000_add_podcasts_categories.php +++ b/app/Database/Migrations/2020-09-29-150000_add_podcasts_categories.php @@ -28,8 +28,20 @@ class AddPodcastsCategories extends Migration ], ]); $this->forge->addPrimaryKey(['podcast_id', 'category_id']); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); - $this->forge->addForeignKey('category_id', 'categories', 'id'); + $this->forge->addForeignKey( + 'podcast_id', + 'podcasts', + 'id', + false, + 'CASCADE', + ); + $this->forge->addForeignKey( + 'category_id', + 'categories', + 'id', + false, + 'CASCADE', + ); $this->forge->createTable('podcasts_categories'); } diff --git a/app/Database/Migrations/2020-12-25-120000_add_persons.php b/app/Database/Migrations/2020-12-25-120000_add_persons.php index bacdafcc07373399262525f0c4541c72675c8a12..f993360479e649fab2b01c27002c161f7f06d90e 100644 --- a/app/Database/Migrations/2020-12-25-120000_add_persons.php +++ b/app/Database/Migrations/2020-12-25-120000_add_persons.php @@ -45,6 +45,12 @@ class AddPersons extends Migration 'type' => 'VARCHAR', 'constraint' => 255, ], + // constraint is 13 because the longest safe mimetype for images is image/svg+xml, + // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#image_types + 'image_mimetype' => [ + 'type' => 'VARCHAR', + 'constraint' => 13, + ], 'created_by' => [ 'type' => 'INT', 'unsigned' => true, diff --git a/app/Database/Migrations/2020-12-25-130000_add_podcasts_persons.php b/app/Database/Migrations/2020-12-25-130000_add_podcasts_persons.php index 1e7bc16b2d44ecd3d05792924d61390fa82e7672..af6c7ee57a7b4bd3a650a8bf110be5025b870a97 100644 --- a/app/Database/Migrations/2020-12-25-130000_add_podcasts_persons.php +++ b/app/Database/Migrations/2020-12-25-130000_add_podcasts_persons.php @@ -47,8 +47,20 @@ class AddPodcastsPersons extends Migration 'person_group', 'person_role', ]); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); - $this->forge->addForeignKey('person_id', 'persons', 'id'); + $this->forge->addForeignKey( + 'podcast_id', + 'podcasts', + 'id', + false, + 'CASCADE', + ); + $this->forge->addForeignKey( + 'person_id', + 'persons', + 'id', + false, + 'CASCADE', + ); $this->forge->createTable('podcasts_persons'); } diff --git a/app/Database/Migrations/2020-12-25-140000_add_episodes_persons.php b/app/Database/Migrations/2020-12-25-140000_add_episodes_persons.php index 4c1c6383f7a8cac61aee1bcfe890a1e3754baecc..7cc3091418b8733e208dd0c96ceb4345520c6b61 100644 --- a/app/Database/Migrations/2020-12-25-140000_add_episodes_persons.php +++ b/app/Database/Migrations/2020-12-25-140000_add_episodes_persons.php @@ -52,9 +52,27 @@ class AddEpisodesPersons extends Migration 'person_group', 'person_role', ]); - $this->forge->addForeignKey('podcast_id', 'podcasts', 'id'); - $this->forge->addForeignKey('episode_id', 'episodes', 'id'); - $this->forge->addForeignKey('person_id', 'persons', 'id'); + $this->forge->addForeignKey( + 'podcast_id', + 'podcasts', + 'id', + false, + 'CASCADE', + ); + $this->forge->addForeignKey( + 'episode_id', + 'episodes', + 'id', + false, + 'CASCADE', + ); + $this->forge->addForeignKey( + 'person_id', + 'persons', + 'id', + false, + 'CASCADE', + ); $this->forge->createTable('episodes_persons'); } diff --git a/app/Database/Migrations/2020-12-25-150000_add_credit_view.php b/app/Database/Migrations/2020-12-25-150000_add_credit_view.php index 42731dfcba6e317025c9afe3a8e1cabe3f933e6b..68dfd05f7993fb2d51dfe59605f0214eceb56e2f 100644 --- a/app/Database/Migrations/2020-12-25-150000_add_credit_view.php +++ b/app/Database/Migrations/2020-12-25-150000_add_credit_view.php @@ -22,16 +22,16 @@ class AddCreditView extends Migration $podcastPersonTable = $this->db->prefixTable('podcasts_persons'); $episodePersonTable = $this->db->prefixTable('episodes_persons'); $createQuery = <<<EOD -CREATE VIEW `$viewName` AS - SELECT `person_group`, `person_id`, `full_name`, `person_role`, `podcast_id`, NULL AS `episode_id` FROM `$podcastPersonTable` - INNER JOIN `$personTable` - ON (`person_id`=`$personTable`.`id`) - UNION - SELECT `person_group`, `person_id`, `full_name`, `person_role`, `podcast_id`, `episode_id` FROM `$episodePersonTable` - INNER JOIN `$personTable` - ON (`person_id`=`$personTable`.`id`) - ORDER BY `person_group`, `full_name`, `person_role`, `podcast_id`, `episode_id`; -EOD; + CREATE VIEW `$viewName` AS + SELECT `person_group`, `person_id`, `full_name`, `person_role`, `podcast_id`, NULL AS `episode_id` FROM `$podcastPersonTable` + INNER JOIN `$personTable` + ON (`person_id`=`$personTable`.`id`) + UNION + SELECT `person_group`, `person_id`, `full_name`, `person_role`, `podcast_id`, `episode_id` FROM `$episodePersonTable` + INNER JOIN `$personTable` + ON (`person_id`=`$personTable`.`id`) + ORDER BY `person_group`, `full_name`, `person_role`, `podcast_id`, `episode_id`; + EOD; $this->db->query($createQuery); } diff --git a/app/Database/Migrations/2021-02-23-100000_add_episode_id_to_notes.php b/app/Database/Migrations/2021-02-23-100000_add_episode_id_to_notes.php new file mode 100644 index 0000000000000000000000000000000000000000..8278f5a9fb0d2aea5747cbba3b2a339eaa0e2b98 --- /dev/null +++ b/app/Database/Migrations/2021-02-23-100000_add_episode_id_to_notes.php @@ -0,0 +1,38 @@ +<?php + +/** + * Class AddEpisodeIdToNotes + * Adds episode_id field to activitypub_notes table in database + * + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace App\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddEpisodeIdToNotes extends Migration +{ + public function up() + { + $prefix = $this->db->getPrefix(); + + $createQuery = <<<SQL + ALTER TABLE ${prefix}activitypub_notes + ADD COLUMN `episode_id` INT UNSIGNED NULL AFTER `replies_count`, + ADD FOREIGN KEY ${prefix}activitypub_notes_episode_id_foreign(episode_id) REFERENCES ${prefix}episodes(id) ON DELETE CASCADE; + SQL; + $this->db->query($createQuery); + } + + public function down() + { + $this->forge->dropForeignKey( + 'activitypub_notes', + 'activitypub_notes_episode_id_foreign', + ); + $this->forge->dropColumn('activitypub_notes', 'episode_id'); + } +} diff --git a/app/Database/Migrations/2021-03-09-113000_add_created_by_to_notes.php b/app/Database/Migrations/2021-03-09-113000_add_created_by_to_notes.php new file mode 100644 index 0000000000000000000000000000000000000000..67512542796b0dc272e882a9172abf9f97ab9fec --- /dev/null +++ b/app/Database/Migrations/2021-03-09-113000_add_created_by_to_notes.php @@ -0,0 +1,38 @@ +<?php + +/** + * Class AddCreatedByToNotes + * Adds created_by field to activitypub_notes table in database + * + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace App\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddCreatedByToNotes extends Migration +{ + public function up() + { + $prefix = $this->db->getPrefix(); + + $createQuery = <<<SQL + ALTER TABLE ${prefix}activitypub_notes + ADD COLUMN `created_by` INT UNSIGNED AFTER `episode_id`, + ADD FOREIGN KEY ${prefix}activitypub_notes_created_by_foreign(created_by) REFERENCES ${prefix}users(id) ON DELETE CASCADE; + SQL; + $this->db->query($createQuery); + } + + public function down() + { + $this->forge->dropForeignKey( + 'activitypub_notes', + 'activitypub_notes_created_by_foreign', + ); + $this->forge->dropColumn('activitypub_notes', 'created_by'); + } +} diff --git a/app/Database/Seeds/AuthSeeder.php b/app/Database/Seeds/AuthSeeder.php index eb567ad0911f6bf0c8b2cb03f60108b876c068f2..455040f11ca4df8251c5ac3cf849e5ad849f06fe 100644 --- a/app/Database/Seeds/AuthSeeder.php +++ b/app/Database/Seeds/AuthSeeder.php @@ -158,6 +158,18 @@ class AuthSeeder extends Seeder 'description' => 'Set / remove platform links of a podcast', 'has_permission' => ['podcast_admin'], ], + [ + 'name' => 'manage_publications', + 'description' => + 'Publish / unpublish episodes & notes of a podcast', + 'has_permission' => ['podcast_admin'], + ], + [ + 'name' => 'interact_as', + 'description' => + 'Interact as the podcast to favourite / share or reply to notes.', + 'has_permission' => ['podcast_admin'], + ], ], 'podcast_episodes' => [ [ @@ -192,11 +204,6 @@ class AuthSeeder extends Seeder 'Delete all occurrences of an episode of a podcast from the database', 'has_permission' => ['podcast_admin'], ], - [ - 'name' => 'manage_publications', - 'description' => 'Publish / unpublish episodes of a podcast', - 'has_permission' => ['podcast_admin'], - ], ], 'person' => [ [ @@ -220,8 +227,23 @@ class AuthSeeder extends Seeder 'has_permission' => ['superadmin'], ], [ - 'name' => 'delete_permanently', - 'description' => 'Delete any person from the database', + 'name' => 'delete', + 'description' => + 'Delete permanently any person from the database', + 'has_permission' => ['superadmin'], + ], + ], + 'fediverse' => [ + [ + 'name' => 'block_actors', + 'description' => + 'Block an activitypub actors from interacting with the instance.', + 'has_permission' => ['superadmin'], + ], + [ + 'name' => 'block_domains', + 'description' => + 'Block an activitypub domains from interacting with the instance.', 'has_permission' => ['superadmin'], ], ], @@ -266,7 +288,7 @@ class AuthSeeder extends Seeder array_push($dataGroupsPermissions, [ 'group_id' => $this->getGroupIdByName( $role, - $dataGroups + $dataGroups, ), 'permission_id' => $permissionId, ]); diff --git a/app/Database/Seeds/PlatformSeeder.php b/app/Database/Seeds/PlatformSeeder.php index 9eaf24e10178778ea8b39b1460ca25f91ab9d11f..309b767caf2a2343ebc1633e697c5e8c6a17a57d 100644 --- a/app/Database/Seeds/PlatformSeeder.php +++ b/app/Database/Seeds/PlatformSeeder.php @@ -98,7 +98,6 @@ class PlatformSeeder extends Seeder 'home_url' => 'https://fyyd.de/', 'submit_url' => 'https://fyyd.de/add-feed', ], - [ 'slug' => 'google', 'type' => 'podcasting', @@ -249,7 +248,6 @@ class PlatformSeeder extends Seeder 'submit_url' => 'https://help.tunein.com/contact/add-podcast-S19TR3Sdf', ], - [ 'slug' => 'paypal', 'type' => 'funding', @@ -257,7 +255,6 @@ class PlatformSeeder extends Seeder 'home_url' => 'https://www.paypal.com/', 'submit_url' => 'https://www.paypal.com/paypalme/my/grab', ], - [ 'slug' => 'gofundme', 'type' => 'funding', @@ -322,7 +319,6 @@ class PlatformSeeder extends Seeder 'home_url' => 'https://www.ulule.com/', 'submit_url' => 'https://www.ulule.com/projects/create/#/', ], - [ 'slug' => 'discord', 'type' => 'social', @@ -431,6 +427,7 @@ class PlatformSeeder extends Seeder 'submit_url' => 'https://creatoracademy.youtube.com/page/home', ], ]; + $this->db ->table('platforms') ->ignore(true) diff --git a/app/Entities/Credit.php b/app/Entities/Credit.php index 0988e7ca15fc8d621d2a94aecf7632a24a7cb64b..94dd5f4a94c35a41ec10f38245d199871d990f4c 100644 --- a/app/Entities/Credit.php +++ b/app/Entities/Credit.php @@ -27,7 +27,7 @@ class Credit extends Entity protected $podcast; /** - * @var \App\Entities\Episode + * @var \App\Entities\Episode|null */ protected $episode; @@ -44,50 +44,61 @@ class Credit extends Entity public function getPodcast() { return (new PodcastModel())->getPodcastById( - $this->attributes['podcast_id'] + $this->attributes['podcast_id'], ); } public function getEpisode() { - if (empty($this->attributes['episode_id'])) { - return null; - } else { - return (new EpisodeModel())->getEpisodeById( - $this->attributes['podcast_id'], - $this->attributes['episode_id'] + if (empty($this->episode_id)) { + throw new \RuntimeException( + 'Credit must have episode_id before getting episode.', + ); + } + + if (empty($this->episode)) { + $this->episode = (new EpisodeModel())->getPublishedEpisodeById( + $this->episode_id, + $this->podcast_id, ); } + + return $this->episode; } public function getPerson() { - return (new PersonModel())->getPersonById( - $this->attributes['person_id'] - ); + if (empty($this->person_id)) { + throw new \RuntimeException( + 'Credit must have person_id before getting person.', + ); + } + + if (empty($this->person)) { + $this->person = (new PersonModel())->getPersonById( + $this->person_id, + ); + } + + return $this->person; } public function getGroupLabel() { - if (empty($this->attributes['person_group'])) { + if (empty($this->person_group)) { return null; } else { - return lang( - "PersonsTaxonomy.persons.{$this->attributes['person_group']}.label" - ); + return lang("PersonsTaxonomy.persons.{$this->person_group}.label"); } } public function getRoleLabel() { - if ( - empty($this->attributes['person_group']) || - empty($this->attributes['person_role']) - ) { + if (empty($this->person_group) || empty($this->person_role)) { return null; } else { return lang( - "PersonsTaxonomy.persons.{$this->attributes['person_group']}.roles.{$this->attributes['person_role']}.label" + "PersonsTaxonomy.persons.{$this->person_group}.roles.{$this->person_role}.label", ); } } diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index 6d3042ddb5e18525f2c2b12b1b55f41a194abdfb..ced727ebd5785fad35113c549cf14b24ea02ad95 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -11,6 +11,7 @@ namespace App\Entities; use App\Models\PodcastModel; use App\Models\SoundbiteModel; use App\Models\EpisodePersonModel; +use App\Models\NoteModel; use CodeIgniter\Entity; use CodeIgniter\I18n\Time; use League\CommonMark\CommonMarkConverter; @@ -28,7 +29,7 @@ class Episode extends Entity protected $link; /** - * @var \App\Entities\Image + * @var \App\Libraries\Image */ protected $image; @@ -80,13 +81,18 @@ class Episode extends Entity /** * @var \App\Entities\EpisodePerson[] */ - protected $episode_persons; + protected $persons; /** * @var \App\Entities\Soundbite[] */ protected $soundbites; + /** + * @var \App\Entities\Note[] + */ + protected $notes; + /** * Holds text only description, striped of any markdown or html special characters * @@ -122,6 +128,7 @@ class Episode extends Entity protected $casts = [ 'id' => 'integer', + 'podcast_id' => 'integer', 'guid' => 'string', 'slug' => 'string', 'title' => 'string', @@ -133,6 +140,7 @@ class Episode extends Entity 'description_markdown' => 'string', 'description_html' => 'string', 'image_uri' => '?string', + 'image_mimetype' => '?string', 'transcript_uri' => '?string', 'chapters_uri' => '?string', 'parental_advisory' => '?string', @@ -144,6 +152,9 @@ class Episode extends Entity 'location_geo' => '?string', 'location_osmid' => '?string', 'custom_rss' => '?json-array', + 'favourites_total' => 'integer', + 'reblogs_total' => 'integer', + 'notes_total' => 'integer', 'created_by' => 'integer', 'updated_by' => 'integer', ]; @@ -163,15 +174,16 @@ class Episode extends Entity ) { helper('media'); - // check whether the user has inputted an image and store it - $this->attributes['image_uri'] = save_podcast_media( + // check whether the user has inputted an image and store + $this->attributes['image_mimetype'] = $image->getMimeType(); + $this->attributes['image_uri'] = save_media( $image, - $this->getPodcast()->name, - $this->attributes['slug'] + 'podcasts/' . $this->getPodcast()->name, + $this->attributes['slug'], ); - - $this->image = new \App\Entities\Image( - $this->attributes['image_uri'] + $this->image = new \App\Libraries\Image( + $this->attributes['image_uri'], + $this->attributes['image_mimetype'], ); $this->image->saveSizes(); } @@ -179,10 +191,13 @@ class Episode extends Entity return $this; } - public function getImage(): \App\Entities\Image + public function getImage(): \App\Libraries\Image { if ($image_uri = $this->attributes['image_uri']) { - return new \App\Entities\Image($image_uri); + return new \App\Libraries\Image( + $image_uri, + $this->attributes['image_mimetype'], + ); } return $this->getPodcast()->image; } @@ -204,13 +219,13 @@ class Episode extends Entity $enclosure_metadata = get_file_tags($enclosure); - $this->attributes['enclosure_uri'] = save_podcast_media( + $this->attributes['enclosure_uri'] = save_media( $enclosure, - $this->getPodcast()->name, - $this->attributes['slug'] + 'podcasts/' . $this->getPodcast()->name, + $this->attributes['slug'], ); $this->attributes['enclosure_duration'] = round( - $enclosure_metadata['playtime_seconds'] + $enclosure_metadata['playtime_seconds'], ); $this->attributes['enclosure_mimetype'] = $enclosure_metadata['mime_type']; @@ -238,10 +253,10 @@ class Episode extends Entity ) { helper('media'); - $this->attributes['transcript_uri'] = save_podcast_media( + $this->attributes['transcript_uri'] = save_media( $transcript, $this->getPodcast()->name, - $this->attributes['slug'] . '-transcript' + $this->attributes['slug'] . '-transcript', ); } @@ -263,10 +278,10 @@ class Episode extends Entity ) { helper('media'); - $this->attributes['chapters_uri'] = save_podcast_media( + $this->attributes['chapters_uri'] = save_media( $chapters, $this->getPodcast()->name, - $this->attributes['slug'] . '-chapters' + $this->attributes['slug'] . '-chapters', ); } @@ -343,15 +358,15 @@ class Episode extends Entity $this->attributes[ 'enclosure_duration' ]) * - 60 + 60, ), $this->attributes['enclosure_filesize'], $this->attributes['enclosure_duration'], - strtotime($this->attributes['published_at']) - ) + strtotime($this->attributes['published_at']), + ), ), - $this->attributes['enclosure_uri'] - ) + $this->attributes['enclosure_uri'], + ), ); } @@ -384,22 +399,22 @@ class Episode extends Entity * * @return \App\Entities\EpisodePerson[] */ - public function getEpisodePersons() + public function getPersons() { if (empty($this->id)) { throw new \RuntimeException( - 'Episode must be created before getting persons.' + 'Episode must be created before getting persons.', ); } - if (empty($this->episode_persons)) { - $this->episode_persons = (new EpisodePersonModel())->getPersonsByEpisodeId( + if (empty($this->persons)) { + $this->persons = (new EpisodePersonModel())->getPersonsByEpisodeId( $this->podcast_id, - $this->id + $this->id, ); } - return $this->episode_persons; + return $this->persons; } /** @@ -411,28 +426,43 @@ class Episode extends Entity { if (empty($this->id)) { throw new \RuntimeException( - 'Episode must be created before getting soundbites.' + 'Episode must be created before getting soundbites.', ); } if (empty($this->soundbites)) { $this->soundbites = (new SoundbiteModel())->getEpisodeSoundbites( $this->getPodcast()->id, - $this->id + $this->id, ); } return $this->soundbites; } + public function getNotes() + { + if (empty($this->id)) { + throw new \RuntimeException( + 'Episode must be created before getting soundbites.', + ); + } + + if (empty($this->notes)) { + $this->notes = (new NoteModel())->getEpisodeNotes($this->id); + } + + return $this->notes; + } + public function getLink() { return base_url( route_to( 'episode', $this->getPodcast()->name, - $this->attributes['slug'] - ) + $this->attributes['slug'], + ), ); } @@ -444,13 +474,13 @@ class Episode extends Entity 'embeddable-player-theme', $this->getPodcast()->name, $this->attributes['slug'], - $theme + $theme, ) : route_to( 'embeddable-player', $this->getPodcast()->name, - $this->attributes['slug'] - ) + $this->attributes['slug'], + ), ); } @@ -464,7 +494,7 @@ class Episode extends Entity public function getPodcast() { return (new PodcastModel())->getPodcastById( - $this->attributes['podcast_id'] + $this->attributes['podcast_id'], ); } @@ -477,7 +507,7 @@ class Episode extends Entity $this->attributes['description_markdown'] = $descriptionMarkdown; $this->attributes['description_html'] = $converter->convertToHtml( - $descriptionMarkdown + $descriptionMarkdown, ); return $this; @@ -510,25 +540,11 @@ class Episode extends Entity preg_replace( '/\s+/', ' ', - strip_tags($this->attributes['description_html']) - ) + strip_tags($this->attributes['description_html']), + ), ); } - public function setCreatedBy(\App\Entities\User $user) - { - $this->attributes['created_by'] = $user->id; - - return $this; - } - - public function setUpdatedBy(\App\Entities\User $user) - { - $this->attributes['updated_by'] = $user->id; - - return $this; - } - public function getPublicationStatus() { if ($this->publication_status) { @@ -588,7 +604,7 @@ class Episode extends Entity return ''; } else { $xmlNode = (new \App\Libraries\SimpleRSSElement( - '<?xml version="1.0" encoding="utf-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"/>' + '<?xml version="1.0" encoding="utf-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"/>', )) ->addChild('channel') ->addChild('item'); @@ -596,7 +612,7 @@ class Episode extends Entity [ 'elements' => $this->custom_rss, ], - $xmlNode + $xmlNode, ); return str_replace(['<item>', '</item>'], '', $xmlNode->asXML()); } @@ -615,12 +631,12 @@ class Episode extends Entity simplexml_load_string( '<?xml version="1.0" encoding="utf-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"><channel><item>' . $customRssString . - '</item></channel></rss>' - ) + '</item></channel></rss>', + ), )['elements'][0]['elements'][0]; if (array_key_exists('elements', $customRssArray)) { $this->attributes['custom_rss'] = json_encode( - $customRssArray['elements'] + $customRssArray['elements'], ); } else { $this->attributes['custom_rss'] = null; diff --git a/app/Entities/Image.php b/app/Entities/Image.php deleted file mode 100644 index 0f64b16cb8c27fa72fb70782aab0de37e5f07545..0000000000000000000000000000000000000000 --- a/app/Entities/Image.php +++ /dev/null @@ -1,151 +0,0 @@ -<?php - -/** - * @copyright 2020 Podlibre - * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 - * @link https://castopod.org/ - */ - -namespace App\Entities; - -use CodeIgniter\Entity; - -class Image extends Entity -{ - /** - * @var string - */ - protected $original_path; - - /** - * @var string - */ - protected $original_url; - - /** - * @var string - */ - protected $thumbnail_path; - - /** - * @var string - */ - protected $thumbnail_url; - - /** - * @var string - */ - protected $medium_path; - - /** - * @var string - */ - protected $medium_url; - - /** - * @var string - */ - protected $large_path; - - /** - * @var string - */ - protected $large_url; - - /** - * @var string - */ - protected $feed_path; - - /** - * @var string - */ - protected $feed_url; - - /** - * @var string - */ - protected $id3_path; - - public function __construct($originalUri) - { - helper('media'); - - $originalPath = media_path($originalUri); - - [ - 'filename' => $filename, - 'dirname' => $dirname, - 'extension' => $extension, - ] = pathinfo($originalPath); - - // load images extensions from config - $imageConfig = config('Images'); - $thumbnailExtension = $imageConfig->thumbnailExtension; - $mediumExtension = $imageConfig->mediumExtension; - $largeExtension = $imageConfig->largeExtension; - $feedExtension = $imageConfig->feedExtension; - $id3Extension = $imageConfig->id3Extension; - - $thumbnail = - $dirname . '/' . $filename . $thumbnailExtension . '.' . $extension; - $medium = - $dirname . '/' . $filename . $mediumExtension . '.' . $extension; - $large = - $dirname . '/' . $filename . $largeExtension . '.' . $extension; - $feed = $dirname . '/' . $filename . $feedExtension . '.' . $extension; - $id3 = $dirname . '/' . $filename . $id3Extension . '.' . $extension; - - parent::__construct([ - 'original_path' => $originalPath, - 'original_url' => media_url($originalUri), - 'thumbnail_path' => $thumbnail, - 'thumbnail_url' => base_url($thumbnail), - 'medium_path' => $medium, - 'medium_url' => base_url($medium), - 'large_path' => $large, - 'large_url' => base_url($large), - 'feed_path' => $feed, - 'feed_url' => base_url($feed), - 'id3_path' => $id3, - ]); - } - - public function saveSizes() - { - // load images sizes from config - $imageConfig = config('Images'); - $thumbnailSize = $imageConfig->thumbnailSize; - $mediumSize = $imageConfig->mediumSize; - $largeSize = $imageConfig->largeSize; - $feedSize = $imageConfig->feedSize; - $id3Size = $imageConfig->id3Size; - - $imageService = \Config\Services::image(); - - $imageService - ->withFile($this->attributes['original_path']) - ->resize($thumbnailSize, $thumbnailSize) - ->save($this->attributes['thumbnail_path']); - - $imageService - ->withFile($this->attributes['original_path']) - ->resize($mediumSize, $mediumSize) - ->save($this->attributes['medium_path']); - - $imageService - ->withFile($this->attributes['original_path']) - ->resize($largeSize, $largeSize) - ->save($this->attributes['large_path']); - - $imageService - ->withFile($this->attributes['original_path']) - ->resize($feedSize, $feedSize) - ->save($this->attributes['feed_path']); - - $imageService - ->withFile($this->attributes['original_path']) - ->resize($id3Size, $id3Size) - ->save($this->attributes['id3_path']); - } -} diff --git a/app/Entities/Note.php b/app/Entities/Note.php new file mode 100644 index 0000000000000000000000000000000000000000..6ec4802990667a0c2f7a90054f37b33e069385a7 --- /dev/null +++ b/app/Entities/Note.php @@ -0,0 +1,56 @@ +<?php + +/** + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace App\Entities; + +use App\Models\EpisodeModel; + +class Note extends \ActivityPub\Entities\Note +{ + /** + * @var \App\Entities\Episode|null + */ + protected $episode; + + protected $casts = [ + 'id' => 'string', + 'uri' => 'string', + 'actor_id' => 'integer', + 'in_reply_to_id' => '?string', + 'reblog_of_id' => '?string', + 'episode_id' => '?integer', + 'message' => 'string', + 'message_html' => 'string', + 'favourites_count' => 'integer', + 'reblogs_count' => 'integer', + 'replies_count' => 'integer', + 'created_by' => 'integer', + ]; + + /** + * Returns the note's attached episode + * + * @return \App\Entities\Episode + */ + public function getEpisode() + { + if (empty($this->episode_id)) { + throw new \RuntimeException( + 'Note must have an episode_id before getting episode.', + ); + } + + if (empty($this->episode)) { + $this->episode = (new EpisodeModel())->getEpisodeById( + $this->episode_id, + ); + } + + return $this->episode; + } +} diff --git a/app/Entities/Person.php b/app/Entities/Person.php index 8f20885c37138c33bd82258ce533623f13dd9106..222aa56fbbd93f0729bd53995fa7d0eba7acd32c 100644 --- a/app/Entities/Person.php +++ b/app/Entities/Person.php @@ -13,7 +13,7 @@ use CodeIgniter\Entity; class Person extends Entity { /** - * @var \App\Entities\Image + * @var \App\Libraries\Image */ protected $image; @@ -23,12 +23,13 @@ class Person extends Entity 'unique_name' => 'string', 'information_url' => '?string', 'image_uri' => 'string', + 'image_mimetype' => 'string', 'created_by' => 'integer', 'updated_by' => 'integer', ]; /** - * Saves a picture in `public/media/~person/` + * Saves a picture in `public/media/persons/` * * @param \CodeIgniter\HTTP\Files\UploadedFile|\CodeIgniter\Files\File $image * @@ -38,13 +39,15 @@ class Person extends Entity if ($image) { helper('media'); - $this->attributes['image_uri'] = save_podcast_media( + $this->attributes['image_mimetype'] = $image->getMimeType(); + $this->attributes['image_uri'] = save_media( $image, - '~person', - $this->attributes['unique_name'] + 'persons', + $this->attributes['unique_name'], ); - $this->image = new \App\Entities\Image( - $this->attributes['image_uri'] + $this->image = new \App\Libraries\Image( + $this->attributes['image_uri'], + $this->attributes['image_mimetype'], ); $this->image->saveSizes(); } @@ -54,6 +57,9 @@ class Person extends Entity public function getImage() { - return new \App\Entities\Image($this->attributes['image_uri']); + return new \App\Libraries\Image( + $this->attributes['image_uri'], + $this->attributes['image_mimetype'], + ); } } diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php index ec6c8e3f063a3788785527ff705f53ad3ef1a65e..82922b2dd5e0de0edaa32cd33d8d27a928cbfbb2 100644 --- a/app/Entities/Podcast.php +++ b/app/Entities/Podcast.php @@ -8,6 +8,7 @@ namespace App\Entities; +use ActivityPub\Models\ActorModel; use App\Models\CategoryModel; use App\Models\EpisodeModel; use App\Models\PlatformModel; @@ -24,7 +25,12 @@ class Podcast extends Entity protected $link; /** - * @var \App\Entities\Image + * @var \ActivityPub\Entities\Actor + */ + protected $actor; + + /** + * @var \App\Libraries\Image */ protected $image; @@ -36,7 +42,7 @@ class Podcast extends Entity /** * @var \App\Entities\PodcastPerson[] */ - protected $podcast_persons; + protected $persons; /** * @var \App\Entities\Category @@ -89,11 +95,13 @@ class Podcast extends Entity protected $casts = [ 'id' => 'integer', - 'title' => 'string', + 'actor_id' => 'integer', 'name' => 'string', + 'title' => 'string', 'description_markdown' => 'string', 'description_html' => 'string', 'image_uri' => 'string', + 'image_mimetype' => 'string', 'language_code' => 'string', 'category_id' => 'integer', 'parental_advisory' => '?string', @@ -121,6 +129,26 @@ class Podcast extends Entity 'updated_by' => 'integer', ]; + /** + * Returns the podcast actor + * + * @return \App\Entities\Actor + */ + public function getActor() + { + if (!$this->attributes['actor_id']) { + throw new \RuntimeException( + 'Podcast must have an actor_id before getting actor.', + ); + } + + if (empty($this->actor)) { + $this->actor = (new ActorModel())->getActorById($this->actor_id); + } + + return $this->actor; + } + /** * Saves a cover image to the corresponding podcast folder in `public/media/podcast_name/` * @@ -132,13 +160,16 @@ class Podcast extends Entity if ($image) { helper('media'); - $this->attributes['image_uri'] = save_podcast_media( + $this->attributes['image_mimetype'] = $image->getMimeType(); + $this->attributes['image_uri'] = save_media( $image, - $this->attributes['name'], - 'cover' + 'podcasts/' . $this->attributes['name'], + 'cover', ); - $this->image = new \App\Entities\Image( - $this->attributes['image_uri'] + + $this->image = new \App\Libraries\Image( + $this->attributes['image_uri'], + $this->attributes['image_mimetype'], ); $this->image->saveSizes(); } @@ -148,17 +179,20 @@ class Podcast extends Entity public function getImage() { - return new \App\Entities\Image($this->attributes['image_uri']); + return new \App\Libraries\Image( + $this->attributes['image_uri'], + $this->attributes['image_mimetype'], + ); } public function getLink() { - return base_url(route_to('podcast', $this->attributes['name'])); + return url_to('podcast-activity', $this->attributes['name']); } public function getFeedUrl() { - return base_url(route_to('podcast_feed', $this->attributes['name'])); + return url_to('podcast_feed', $this->attributes['name']); } /** @@ -170,14 +204,14 @@ class Podcast extends Entity { if (empty($this->id)) { throw new \RuntimeException( - 'Podcast must be created before getting episodes.' + 'Podcast must be created before getting episodes.', ); } if (empty($this->episodes)) { $this->episodes = (new EpisodeModel())->getPodcastEpisodes( $this->id, - $this->type + $this->type, ); } @@ -189,21 +223,21 @@ class Podcast extends Entity * * @return \App\Entities\PodcastPerson[] */ - public function getPodcastPersons() + public function getPersons() { if (empty($this->id)) { throw new \RuntimeException( - 'Podcast must be created before getting persons.' + 'Podcast must be created before getting persons.', ); } - if (empty($this->podcast_persons)) { - $this->podcast_persons = (new PodcastPersonModel())->getPersonsByPodcastId( - $this->id + if (empty($this->persons)) { + $this->persons = (new PodcastPersonModel())->getPersonsByPodcastId( + $this->id, ); } - return $this->podcast_persons; + return $this->persons; } /** @@ -215,7 +249,7 @@ class Podcast extends Entity { if (empty($this->id)) { throw new \RuntimeException( - 'Podcast must be created before getting category.' + 'Podcast must be created before getting category.', ); } @@ -235,13 +269,13 @@ class Podcast extends Entity { if (empty($this->id)) { throw new \RuntimeException( - 'Podcasts must be created before getting contributors.' + 'Podcasts must be created before getting contributors.', ); } if (empty($this->contributors)) { $this->contributors = (new UserModel())->getPodcastContributors( - $this->id + $this->id, ); } @@ -257,7 +291,7 @@ class Podcast extends Entity $this->attributes['description_markdown'] = $descriptionMarkdown; $this->attributes['description_html'] = $converter->convertToHtml( - $descriptionMarkdown + $descriptionMarkdown, ); return $this; @@ -293,25 +327,11 @@ class Podcast extends Entity preg_replace( '/\s+/', ' ', - strip_tags($this->attributes['description_html']) - ) + strip_tags($this->attributes['description_html']), + ), ); } - public function setCreatedBy(\App\Entities\User $user) - { - $this->attributes['created_by'] = $user->id; - - return $this; - } - - public function setUpdatedBy(\App\Entities\User $user) - { - $this->attributes['updated_by'] = $user->id; - - return $this; - } - /** * Returns the podcast's podcasting platform links * @@ -321,14 +341,14 @@ class Podcast extends Entity { if (empty($this->id)) { throw new \RuntimeException( - 'Podcast must be created before getting podcasting platform links.' + 'Podcast must be created before getting podcasting platform links.', ); } if (empty($this->podcastingPlatforms)) { $this->podcastingPlatforms = (new PlatformModel())->getPodcastPlatforms( $this->id, - 'podcasting' + 'podcasting', ); } @@ -342,7 +362,7 @@ class Podcast extends Entity { if (empty($this->id)) { throw new \RuntimeException( - 'Podcast must be created before getting podcasting platform.' + 'Podcast must be created before getting podcasting platform.', ); } foreach ($this->getPodcastingPlatforms() as $podcastingPlatform) { @@ -362,14 +382,14 @@ class Podcast extends Entity { if (empty($this->id)) { throw new \RuntimeException( - 'Podcast must be created before getting social platform links.' + 'Podcast must be created before getting social platform links.', ); } if (empty($this->socialPlatforms)) { $this->socialPlatforms = (new PlatformModel())->getPodcastPlatforms( $this->id, - 'social' + 'social', ); } @@ -383,7 +403,7 @@ class Podcast extends Entity { if (empty($this->id)) { throw new \RuntimeException( - 'Podcast must be created before getting social platform.' + 'Podcast must be created before getting social platform.', ); } foreach ($this->getSocialPlatforms() as $socialPlatform) { @@ -403,14 +423,14 @@ class Podcast extends Entity { if (empty($this->id)) { throw new \RuntimeException( - 'Podcast must be created before getting funding platform links.' + 'Podcast must be created before getting funding platform links.', ); } if (empty($this->fundingPlatforms)) { $this->fundingPlatforms = (new PlatformModel())->getPodcastPlatforms( $this->id, - 'funding' + 'funding', ); } @@ -424,7 +444,7 @@ class Podcast extends Entity { if (empty($this->id)) { throw new \RuntimeException( - 'Podcast must be created before getting Funding platform.' + 'Podcast must be created before getting Funding platform.', ); } foreach ($this->getFundingPlatforms() as $fundingPlatform) { @@ -439,13 +459,13 @@ class Podcast extends Entity { if (empty($this->id)) { throw new \RuntimeException( - 'Podcast must be created before getting other categories.' + 'Podcast must be created before getting other categories.', ); } if (empty($this->other_categories)) { $this->other_categories = (new CategoryModel())->getPodcastCategories( - $this->id + $this->id, ); } @@ -457,7 +477,7 @@ class Podcast extends Entity if (empty($this->other_categories_ids)) { $this->other_categories_ids = array_column( $this->getOtherCategories(), - 'id' + 'id', ); } @@ -505,18 +525,18 @@ class Podcast extends Entity return ''; } else { $xmlNode = (new \App\Libraries\SimpleRSSElement( - '<?xml version="1.0" encoding="utf-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"/>' + '<?xml version="1.0" encoding="utf-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"/>', ))->addChild('channel'); array_to_rss( [ 'elements' => $this->custom_rss, ], - $xmlNode + $xmlNode, ); return str_replace( ['<channel>', '</channel>'], '', - $xmlNode->asXML() + $xmlNode->asXML(), ); } } @@ -534,12 +554,12 @@ class Podcast extends Entity simplexml_load_string( '<?xml version="1.0" encoding="utf-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"><channel>' . $customRssString . - '</channel></rss>' - ) + '</channel></rss>', + ), )['elements'][0]; if (array_key_exists('elements', $customRssArray)) { $this->attributes['custom_rss'] = json_encode( - $customRssArray['elements'] + $customRssArray['elements'], ); } else { $this->attributes['custom_rss'] = null; diff --git a/app/Entities/Soundbite.php b/app/Entities/Soundbite.php index 33373c8bde834c34f0af390d4590ff948207ece8..04d8f293960de174cdf4343d67f80b33b96164ac 100644 --- a/app/Entities/Soundbite.php +++ b/app/Entities/Soundbite.php @@ -23,13 +23,6 @@ class Soundbite extends Entity 'updated_by' => 'integer', ]; - public function setCreatedBy(\App\Entities\User $user) - { - $this->attributes['created_by'] = $user->id; - - return $this; - } - public function setUpdatedBy(\App\Entities\User $user) { $this->attributes['updated_by'] = $user->id; diff --git a/app/Filters/Permission.php b/app/Filters/PermissionFilter.php similarity index 98% rename from app/Filters/Permission.php rename to app/Filters/PermissionFilter.php index 462257b9f1706f4292b5d725282e4021b614129c..f40c6a499b5baa2455a952402b871a8301fe9ac8 100644 --- a/app/Filters/Permission.php +++ b/app/Filters/PermissionFilter.php @@ -9,7 +9,7 @@ use CodeIgniter\HTTP\ResponseInterface; use CodeIgniter\Filters\FilterInterface; use Myth\Auth\Exceptions\PermissionException; -class Permission implements FilterInterface +class PermissionFilter implements FilterInterface { /** * Do whatever processing this filter needs to do. diff --git a/app/Helpers/analytics_helper.php b/app/Helpers/analytics_helper.php index 3360de83359b92aa2685142c03d269b5d0e762ae..e7b393dbaa63a91a1075076ef0b5f9ebefa04048 100644 --- a/app/Helpers/analytics_helper.php +++ b/app/Helpers/analytics_helper.php @@ -6,30 +6,6 @@ * @link https://castopod.org/ */ -/** - * For compatibility with PHP-FPM v7.2 and below: - */ -if (!function_exists('getallheaders')) { - function getallheaders() - { - $headers = []; - foreach ($_SERVER as $name => $value) { - if (substr($name, 0, 5) == 'HTTP_') { - $headers[ - str_replace( - ' ', - '-', - ucwords( - strtolower(str_replace('_', ' ', substr($name, 5))) - ) - ) - ] = $value; - } - } - return $headers; - } -} - /** * Encode Base64 for URLs */ @@ -57,7 +33,7 @@ function set_user_session_deny_list_ip() if (!$session->has('denyListIp')) { $session->set( 'denyListIp', - \Podlibre\Ipcat\IpDb::find($_SERVER['REMOTE_ADDR']) != null + \Podlibre\Ipcat\IpDb::find($_SERVER['REMOTE_ADDR']) != null, ); } } @@ -81,7 +57,7 @@ function set_user_session_location() if (!$session->has('location')) { try { $cityReader = new \GeoIp2\Database\Reader( - WRITEPATH . 'uploads/GeoLite2-City/GeoLite2-City.mmdb' + WRITEPATH . 'uploads/GeoLite2-City/GeoLite2-City.mmdb', ); $city = $cityReader->city($_SERVER['REMOTE_ADDR']); @@ -132,7 +108,7 @@ function set_user_session_player() try { $db = \Config\Database::connect(); $procedureNameAnalyticsUnknownUseragents = $db->prefixTable( - 'analytics_unknown_useragents' + 'analytics_unknown_useragents', ); $db->query("CALL $procedureNameAnalyticsUnknownUseragents(?)", [ $userAgent, @@ -283,7 +259,7 @@ function podcast_hit( '_' . $_SERVER['HTTP_USER_AGENT'] . '_' . - $episodeId + $episodeId, ); // Was this episode downloaded in the past 24h: $downloadedBytes = cache($episodeHashId); @@ -335,7 +311,7 @@ function podcast_hit( '_' . $_SERVER['HTTP_USER_AGENT'] . '_' . - $podcastId + $podcastId, ); $newListener = 1; // Has this listener already downloaded an episode today: @@ -370,7 +346,7 @@ function podcast_hit( $duration, $age, $newListener, - ] + ], ); } } diff --git a/app/Helpers/auth_helper.php b/app/Helpers/auth_helper.php new file mode 100644 index 0000000000000000000000000000000000000000..d1d095baaf0a96bb042c707c43461b72e80a9732 --- /dev/null +++ b/app/Helpers/auth_helper.php @@ -0,0 +1,89 @@ +<?php + +/** + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +use ActivityPub\Models\ActorModel; +use CodeIgniter\Database\Exceptions\DataException; +use Config\Services; + +if (!function_exists('set_interact_as_actor')) { + /** + * Sets the actor id of which the user is acting as + * + * @return void + */ + function set_interact_as_actor($actorId) + { + $authenticate = Services::authentication(); + $authenticate->check(); + + $session = session(); + $session->set('interact_as_actor_id', $actorId); + } +} + +if (!function_exists('remove_interact_as_actor')) { + /** + * Removes the actor id of which the user is acting as + * + * @return void + */ + function remove_interact_as_actor() + { + $session = session(); + $session->remove('interact_as_actor_id'); + } +} + +if (!function_exists('interact_as_actor_id')) { + /** + * Sets the podcast id of which the user is acting as + * + * @return integer + */ + function interact_as_actor_id() + { + $authenticate = Services::authentication(); + $authenticate->check(); + + $session = session(); + return $session->get('interact_as_actor_id'); + } +} + +if (!function_exists('interact_as_actor')) { + /** + * Get the actor the user is currently interacting as + * + * @return \ActivityPub\Entities\Actor|false + */ + function interact_as_actor() + { + $authenticate = Services::authentication(); + $authenticate->check(); + + $session = session(); + if ($session->has('interact_as_actor_id')) { + return (new ActorModel())->getActorById( + $session->get('interact_as_actor_id'), + ); + } + + return false; + } +} + +if (!function_exists('can_user_interact')) { + /** + * @return bool + * @throws DataException + */ + function can_user_interact() + { + return interact_as_actor() ? true : false; + } +} diff --git a/app/Helpers/components_helper.php b/app/Helpers/components_helper.php index 78b1516e4218ee01b3e12cd5b2a1e21822187624..7c85e9513671ca90ce5bfa8cbe8f17c39cd0236f 100644 --- a/app/Helpers/components_helper.php +++ b/app/Helpers/components_helper.php @@ -30,34 +30,34 @@ if (!function_exists('button')) { 'size' => 'base', 'iconLeft' => null, 'iconRight' => null, - 'isRoundedFull' => false, 'isSquared' => false, ]; $options = array_merge($defaultOptions, $customOptions); $baseClass = - 'inline-flex items-center shadow-xs outline-none focus:shadow-outline'; + 'inline-flex items-center font-semibold shadow-xs rounded-full focus:outline-none focus:ring'; $variantClass = [ - 'default' => 'bg-gray-300 hover:bg-gray-400', - 'primary' => 'text-white bg-green-500 hover:bg-green-600', + 'default' => 'text-black bg-gray-300 hover:bg-gray-400', + 'primary' => 'text-white bg-pine-700 hover:bg-pine-800', 'secondary' => 'text-white bg-gray-700 hover:bg-gray-800', + 'accent' => 'text-white bg-rose-600 hover:bg-rose-800', 'success' => 'text-white bg-green-600 hover:bg-green-700', 'danger' => 'text-white bg-red-600 hover:bg-red-700', 'warning' => 'text-black bg-yellow-500 hover:bg-yellow-600', - 'info' => 'text-white bg-teal-500 hover:bg-teal-600', + 'info' => 'text-white bg-blue-500 hover:bg-blue-600', ]; $sizeClass = [ - 'small' => 'text-xs md:text-sm ', + 'small' => 'text-xs md:text-sm', 'base' => 'text-sm md:text-base', 'large' => 'text-lg md:text-xl', ]; $basePaddings = [ - 'small' => 'px-1 md:px-2 md:py-1', - 'base' => 'px-2 py-1 md:px-3 md:py-2', - 'large' => 'px-3 py-2 md:px-4 md:py-2', + 'small' => 'px-2 md:px-3 md:py-1', + 'base' => 'px-3 py-1 md:px-4 md:py-2', + 'large' => 'px-3 py-2 md:px-5', ]; $squaredPaddings = [ @@ -66,20 +66,9 @@ if (!function_exists('button')) { 'large' => 'p-3', ]; - $roundedClass = [ - 'full' => 'rounded-full', - 'small' => 'rounded-sm md:rounded', - 'base' => 'rounded md:rounded-md', - 'large' => 'rounded-md md:rounded-lg', - ]; - $buttonClass = $baseClass . ' ' . - ($options['isRoundedFull'] - ? $roundedClass['full'] - : $roundedClass[$options['size']]) . - ' ' . ($options['isSquared'] ? $squaredPaddings[$options['size']] : $basePaddings[$options['size']]) . @@ -109,23 +98,23 @@ if (!function_exists('button')) { [ 'class' => $buttonClass, ], - $customAttributes - ) + $customAttributes, + ), ); } $defaultButtonAttributes = [ 'type' => 'button', ]; - $attributes = array_merge($defaultButtonAttributes, $customAttributes); + $attributes = stringify_attributes( + array_merge($defaultButtonAttributes, $customAttributes), + ); - return '<button class="' . - $buttonClass . - '"' . - stringify_attributes($attributes) . - '>' . - $label . - '</button>'; + return <<<HTML + <button class="$buttonClass" $attributes> + $label + </button> + HTML; } } @@ -152,7 +141,6 @@ if (!function_exists('icon_button')) { $customAttributes = [] ): string { $defaultOptions = [ - 'isRoundedFull' => true, 'isSquared' => true, ]; $options = array_merge($defaultOptions, $customOptions); @@ -185,7 +173,7 @@ if (!function_exists('hint_tooltip')) { $tooltip = '<span data-toggle="tooltip" data-placement="bottom" tabindex="0" title="' . $hintText . - '" class="inline-block align-middle outline-none focus:shadow-outline'; + '" class="inline-block text-gray-500 align-middle outline-none focus:ring'; if ($class !== '') { $tooltip .= ' ' . $class; @@ -223,8 +211,8 @@ if (!function_exists('data_table')) { 'cell_start' => '<td class="px-4 py-2">', 'cell_alt_start' => '<td class="px-4 py-2">', - 'row_start' => '<tr class="bg-gray-100 hover:bg-green-100">', - 'row_alt_start' => '<tr class="hover:bg-green-100">', + 'row_start' => '<tr class="bg-gray-100 hover:bg-pine-100">', + 'row_alt_start' => '<tr class="hover:bg-pine-100">', ]; $table->setTemplate($template); @@ -276,8 +264,8 @@ if (!function_exists('publication_pill')) { ): string { $class = $publicationStatus === 'published' - ? 'text-green-500 border-green-500' - : 'text-orange-600 border-orange-600'; + ? 'text-pine-500 border-pine-500' + : 'text-red-600 border-red-600'; $transParam = []; if ($publicationDate) { @@ -294,10 +282,10 @@ if (!function_exists('publication_pill')) { $label = lang( 'Episode.publication_status.' . $publicationStatus, - $transParam + $transParam, ); - return '<span class="px-1 border ' . + return '<span class="px-1 font-semibold border ' . $class . ' ' . $customClass . @@ -309,6 +297,56 @@ if (!function_exists('publication_pill')) { // ------------------------------------------------------------------------ +if (!function_exists('publication_button')) { + /** + * Publication button component + * + * Displays the appropriate publication button depending on the publication status. + * + * @param integer $podcastId + * @param integer $episodeId + * @param boolean $publicationStatus the episode's publication status * + * @return string + */ + function publication_button( + $podcastId, + $episodeId, + $publicationStatus + ): string { + switch ($publicationStatus) { + case 'not_published': + $label = lang('Episode.publish'); + $route = route_to('episode-publish', $podcastId, $episodeId); + $variant = 'primary'; + $iconLeft = 'upload-cloud'; + break; + case 'scheduled': + $label = lang('Episode.publish_edit'); + $route = route_to( + 'episode-publish_edit', + $podcastId, + $episodeId, + ); + $variant = 'accent'; + $iconLeft = 'upload-cloud'; + break; + case 'published': + $label = lang('Episode.unpublish'); + $route = route_to('episode-unpublish', $podcastId, $episodeId); + $variant = 'danger'; + $iconLeft = 'cloud-off'; + break; + } + + return button($label, $route, [ + 'variant' => $variant, + 'iconLeft' => $iconLeft, + ]); + } +} + +// ------------------------------------------------------------------------ + if (!function_exists('episode_numbering')) { /** * Returns relevant translated episode numbering. @@ -387,21 +425,16 @@ if (!function_exists('location_link')) { $link = ''; if (!empty($locationName)) { - $link = button( - $locationName, + $link = anchor( location_url($locationName, $locationGeo, $locationOsmid), - [ - 'variant' => 'default', - 'size' => 'small', - 'isRoundedFull' => true, - 'iconLeft' => 'map-pin', - ], + icon('map-pin', 'mr-2') . $locationName, [ 'class' => - 'text-gray-800' . (empty($class) ? '' : " $class"), + 'inline-flex items-baseline hover:underline' . + (empty($class) ? '' : " $class"), 'target' => '_blank', 'rel' => 'noreferrer noopener', - ] + ], ); } diff --git a/app/Helpers/media_helper.php b/app/Helpers/media_helper.php index 8db7a66396aba520bb3b1a17200d54075c2421a2..88e494c7f9c3ab57efc1735d332a46297e427cf2 100644 --- a/app/Helpers/media_helper.php +++ b/app/Helpers/media_helper.php @@ -6,6 +6,8 @@ * @link https://castopod.org/ */ +use CodeIgniter\Files\File; +use CodeIgniter\HTTP\Exceptions\HTTPException; use CodeIgniter\HTTP\ResponseInterface; /** @@ -17,25 +19,31 @@ use CodeIgniter\HTTP\ResponseInterface; * * @return string The episode's file path in media root */ -function save_podcast_media($file, $podcast_name, $media_name) +function save_media($file, $folder, $mediaName) { - $file_name = $media_name . '.' . $file->getExtension(); + $file_name = $mediaName . '.' . $file->getExtension(); - $mediaRoot = config('App')->mediaRoot; + $mediaRoot = config('App')->mediaRoot . '/' . $folder; - if (!file_exists($mediaRoot . '/' . $podcast_name)) { - mkdir($mediaRoot . '/' . $podcast_name, 0777, true); - touch($mediaRoot . '/' . $podcast_name . '/index.html'); + if (!file_exists($mediaRoot)) { + mkdir($mediaRoot, 0777, true); + touch($mediaRoot . '/index.html'); } // move to media folder and overwrite file if already existing - $file->move($mediaRoot . '/' . $podcast_name . '/', $file_name, true); + $file->move($mediaRoot . '/', $file_name, true); - return $podcast_name . '/' . $file_name; + return $folder . '/' . $file_name; } +/** + * @param string $fileUrl + * @return File + */ function download_file($fileUrl) { + var_dump($fileUrl); + $client = \Config\Services::curlrequest(); $uri = new \CodeIgniter\HTTP\URI($fileUrl); @@ -58,11 +66,11 @@ function download_file($fileUrl) ResponseInterface::HTTP_TEMPORARY_REDIRECT, ResponseInterface::HTTP_PERMANENT_REDIRECT, ], - true + true, ) ) { $newFileUrl = (string) trim( - $response->getHeader('location')->getValue() + $response->getHeader('location')->getValue(), ); $newLocation = new \CodeIgniter\HTTP\URI($newFileUrl); $response = $client->get($newLocation, [ diff --git a/app/Helpers/misc_helper.php b/app/Helpers/misc_helper.php index b87051c4792268c460fb7b0aa4ab2e4e85316a7e..92c16ffa44c88e0c8b582865dc80e8cd9a4701a3 100644 --- a/app/Helpers/misc_helper.php +++ b/app/Helpers/misc_helper.php @@ -167,3 +167,5 @@ if (!function_exists('format_duration')) { ); } } + +//-------------------------------------------------------------------- diff --git a/app/Helpers/persons_helper.php b/app/Helpers/persons_helper.php index 5fe79d763b5e39880a2353433ca719281a2f162a..62dd6b1264a97078369cbdfa3e5d974c1e88bbc8 100644 --- a/app/Helpers/persons_helper.php +++ b/app/Helpers/persons_helper.php @@ -9,87 +9,40 @@ /** * Fetches persons from an episode * - * @param array $podcast_persons - * @param array &$persons + * @param array $persons + * @param array &$personsArray */ -function constructs_podcast_person_array($podcast_persons, &$persons) +function construct_person_array($persons, &$personsArray) { - foreach ($podcast_persons as $podcastPerson) { - if (array_key_exists($podcastPerson->person->id, $persons)) { - $persons[$podcastPerson->person->id]['roles'] .= - empty($podcastPerson->person_group) || - empty($podcastPerson->person_role) + foreach ($persons as $person) { + if (array_key_exists($person->person->id, $personsArray)) { + $personsArray[$person->person->id]['roles'] .= + empty($person->person_group) || empty($person->person_role) ? '' - : (empty($persons[$podcastPerson->person->id]['roles']) + : (empty($personsArray[$person->person->id]['roles']) ? '' : ', ') . lang( 'PersonsTaxonomy.persons.' . - $podcastPerson->person_group . + $person->person_group . '.roles.' . - $podcastPerson->person_role . - '.label' + $person->person_role . + '.label', ); } else { - $persons[$podcastPerson->person->id] = [ - 'full_name' => $podcastPerson->person->full_name, - 'information_url' => $podcastPerson->person->information_url, - 'thumbnail_url' => $podcastPerson->person->image->thumbnail_url, + $personsArray[$person->person->id] = [ + 'full_name' => $person->person->full_name, + 'information_url' => $person->person->information_url, + 'thumbnail_url' => $person->person->image->thumbnail_url, 'roles' => - empty($podcastPerson->person_group) || - empty($podcastPerson->person_role) + empty($person->person_group) || empty($person->person_role) ? '' : lang( 'PersonsTaxonomy.persons.' . - $podcastPerson->person_group . + $person->person_group . '.roles.' . - $podcastPerson->person_role . - '.label' - ), - ]; - } - } -} - -/** - * Fetches persons from an episode - * - * @param array $episode_persons - * @param array &$persons - */ -function construct_episode_person_array($episode_persons, &$persons) -{ - foreach ($episode_persons as $episodePerson) { - if (array_key_exists($episodePerson->person->id, $persons)) { - $persons[$episodePerson->person->id]['roles'] .= - empty($episodePerson->person_group) || - empty($episodePerson->person_role) - ? '' - : (empty($persons[$episodePerson->person->id]['roles']) - ? '' - : ', ') . - lang( - 'PersonsTaxonomy.persons.' . - $episodePerson->person_group . - '.roles.' . - $episodePerson->person_role . - '.label' - ); - } else { - $persons[$episodePerson->person->id] = [ - 'full_name' => $episodePerson->person->full_name, - 'information_url' => $episodePerson->person->information_url, - 'thumbnail_url' => $episodePerson->person->image->thumbnail_url, - 'roles' => - empty($episodePerson->person_group) || - empty($episodePerson->person_role) - ? '' - : lang( - 'PersonsTaxonomy.persons.' . - $episodePerson->person_group . - '.roles.' . - $episodePerson->person_role . - '.label' + $person->person_role . + '.label', ), ]; } diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index 0da88a191a31280ad419981706eea7a096180bdd..90767aae860518f745f5bf1d88b3c24f0f4be88c 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -165,7 +165,7 @@ function get_rss_feed($podcast, $serviceSlug = '') } } - foreach ($podcast->podcast_persons as $podcastPerson) { + foreach ($podcast->persons as $podcastPerson) { $podcastPersonElement = $channel->addChild( 'person', htmlspecialchars($podcastPerson->person->full_name), @@ -358,7 +358,7 @@ function get_rss_feed($podcast, $serviceSlug = '') $soundbiteElement->addAttribute('duration', $soundbite->duration); } - foreach ($episode->episode_persons as $episodePerson) { + foreach ($episode->persons as $episodePerson) { $episodePersonElement = $item->addChild( 'person', htmlspecialchars($episodePerson->person->full_name), diff --git a/app/Helpers/svg_helper.php b/app/Helpers/svg_helper.php index 9474c4a08cd5f75c436d5af240498a2e6dce4ae6..56e36ccfaa2f6fd3238435f1db29654fea4ec0c9 100644 --- a/app/Helpers/svg_helper.php +++ b/app/Helpers/svg_helper.php @@ -20,7 +20,7 @@ function icon(string $name, string $class = '') $svg_contents = str_replace( '<svg', '<svg class="' . $class . '"', - $svg_contents + $svg_contents, ); } @@ -41,36 +41,7 @@ function svg($name, $class = null) $svg_contents = str_replace( '<svg', '<svg class="' . $class . '"', - $svg_contents - ); - } - return $svg_contents; -} - -/** - * Returns the inline svg platform icon. Returns the default icon if not found. - * - * @param string $name name of the image file without the .svg extension - * @param string $class to be added to the svg string - * @return string svg contents - */ -function platform_icon($type, $name, $class = null) -{ - try { - $svg_contents = file_get_contents( - 'assets/images/platforms/' . $type . '/' . $name . '.svg' - ); - } catch (\Exception $e) { - $svg_contents = file_get_contents( - 'assets/images/platforms/_default.svg' - ); - } - - if ($class) { - $svg_contents = str_replace( - '<svg', - '<svg class="' . $class . '"', - $svg_contents + $svg_contents, ); } return $svg_contents; diff --git a/app/Helpers/url_helper.php b/app/Helpers/url_helper.php index 6fa434aefd44fb22fb6b544e245b0635416d0acd..43e287f992574e81d61dda9dda9dc9da5cbcb472 100644 --- a/app/Helpers/url_helper.php +++ b/app/Helpers/url_helper.php @@ -74,3 +74,34 @@ if (!function_exists('location_url')) { return $uri; } } +//-------------------------------------------------------------------- + +if (!function_exists('extract_params_from_episode_uri')) { + /** + * Returns podcast name and episode slug from episode string uri + * + * @param URI $episodeUri + * @return string|null + */ + function extract_params_from_episode_uri($episodeUri) + { + preg_match( + '/@(?P<podcastName>[a-zA-Z0-9\_]{1,32})\/episodes\/(?P<episodeSlug>[a-zA-Z0-9\-]{1,191})/', + $episodeUri->getPath(), + $matches + ); + + if ( + $matches && + array_key_exists('podcastName', $matches) && + array_key_exists('episodeSlug', $matches) + ) { + return [ + 'podcastName' => $matches['podcastName'], + 'episodeSlug' => $matches['episodeSlug'], + ]; + } + + return null; + } +} diff --git a/app/Language/en/ActivityPub.php b/app/Language/en/ActivityPub.php new file mode 100644 index 0000000000000000000000000000000000000000..38b9573dd0e4b0ea891142ec42e6456774c7a787 --- /dev/null +++ b/app/Language/en/ActivityPub.php @@ -0,0 +1,34 @@ +<?php + +/** + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +return [ + 'your_handle' => 'Your handle', + 'your_handle_hint' => 'Enter the @username@domain you want to act from.', + 'follow' => [ + 'label' => 'Follow', + 'title' => 'Follow {actorDisplayName}', + 'subtitle' => 'You are going to follow:', + 'accountNotFound' => 'The account could not be found.', + 'submit' => 'Proceed to follow', + ], + 'favourite' => [ + 'title' => 'Favourite {actorDisplayName}\'s note', + 'subtitle' => 'You are going to favourite:', + 'submit' => 'Proceed to favourite', + ], + 'reblog' => [ + 'title' => 'Share {actorDisplayName}\'s note', + 'subtitle' => 'You are going to share:', + 'submit' => 'Proceed to share', + ], + 'reply' => [ + 'title' => 'Reply to {actorDisplayName}\'s note', + 'subtitle' => 'You are going to reply to:', + 'submit' => 'Proceed to reply', + ], +]; diff --git a/app/Language/en/Admin.php b/app/Language/en/Admin.php index 62a75a8e29f98d1d574642e57df110d3726b25c4..5585b4ff2f20c16c19479910cd5a1b3e46d94f16 100644 --- a/app/Language/en/Admin.php +++ b/app/Language/en/Admin.php @@ -9,4 +9,5 @@ return [ 'dashboard' => 'Admin dashboard', 'welcome_message' => 'Welcome to the admin area!', + 'choose_interact' => 'Choose how to interact', ]; diff --git a/app/Language/en/AdminNavigation.php b/app/Language/en/AdminNavigation.php index aa36aabfd2514fa52f6f6ed2dad67dbc3e9a792f..820767f4ddfd620bfd0307d402c912aa21c5aadb 100644 --- a/app/Language/en/AdminNavigation.php +++ b/app/Language/en/AdminNavigation.php @@ -17,6 +17,9 @@ return [ 'persons' => 'Persons', 'person-list' => 'All persons', 'person-create' => 'New person', + 'fediverse' => 'Fediverse', + 'fediverse-blocked-actors' => 'Blocked accounts', + 'fediverse-blocked-domains' => 'Blocked domains', 'users' => 'Users', 'user-list' => 'All users', 'user-create' => 'New user', diff --git a/app/Language/en/Breadcrumb.php b/app/Language/en/Breadcrumb.php index ab1e511c9cbcf1c797cb2a7b42cca87840615a6e..68f510f2d097dd33857e4bbcdc314f1274574d63 100644 --- a/app/Language/en/Breadcrumb.php +++ b/app/Language/en/Breadcrumb.php @@ -17,6 +17,11 @@ return [ 'new' => 'new', 'edit' => 'edit', 'persons' => 'persons', + 'publish' => 'publish', + 'publish-edit' => 'edit publication', + 'unpublish' => 'unpublish', + 'fediverse' => 'fediverse', + 'block-lists' => 'block lists', 'users' => 'users', 'my-account' => 'my account', 'change-password' => 'change password', diff --git a/app/Language/en/Common.php b/app/Language/en/Common.php index f1d101e1e6a6f897a8c91307eed21b14aad03951..d2a5966c16457d436c73bd1e804c1238236ea703 100644 --- a/app/Language/en/Common.php +++ b/app/Language/en/Common.php @@ -9,14 +9,18 @@ return [ 'yes' => 'Yes', 'no' => 'No', + 'cancel' => 'Cancel', 'optional' => 'Optional', + 'more' => 'More', 'no_data' => 'No data found!', + 'close' => 'Close', 'home' => 'Home', 'explicit' => 'Explicit', 'mediumDate' => '{0,date,medium}', 'powered_by' => 'Powered by {castopod}.', 'actions' => 'Actions', 'pageInfo' => 'Page {currentPage} out of {pageCount}', + 'go_back' => 'Go back', 'forms' => [ 'multiSelect' => [ 'selectText' => 'Press to select', diff --git a/app/Language/en/Episode.php b/app/Language/en/Episode.php index 27f448e193db26983d39b9529d77cb6e558c5692..457df6fe7bd12bd6ddb46f9628164a781dbb694e 100644 --- a/app/Language/en/Episode.php +++ b/app/Language/en/Episode.php @@ -7,19 +7,33 @@ */ return [ - 'previous_episode' => 'Previous episode', - 'previous_season' => 'Previous season', - 'next_episode' => 'Next episode', - 'next_season' => 'Next season', 'season' => 'Season {seasonNumber}', 'season_abbr' => 'S{seasonNumber}', 'number' => 'Episode {episodeNumber}', 'number_abbr' => 'Ep. {episodeNumber}', 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', 'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}', + 'back_to_episodes' => 'Back to episodes of {podcast}', + 'activity' => 'Activity', + 'description' => 'Description', + 'total_favourites' => '{numberOfTotalFavourites, plural, + one {# total favourite} + other {# total favourites} + }', + 'total_reblogs' => '{numberOfTotalReblogs, plural, + one {# total share} + other {# total shares} + }', + 'total_notes' => '{numberOfTotalNotes, plural, + one {# note} + other {# total notes} + }', 'all_podcast_episodes' => 'All podcast episodes', 'back_to_podcast' => 'Go back to podcast', 'edit' => 'Edit', + 'publish' => 'Publish', + 'publish_edit' => 'Edit publication', + 'unpublish' => 'Unpublish', 'delete' => 'Delete', 'go_to_page' => 'Go to page', 'create' => 'Add an episode', @@ -51,19 +65,6 @@ return [ 'trailer' => 'Trailer', 'bonus' => 'Bonus', ], - 'show_notes_section_title' => 'Show notes', - 'show_notes_section_subtitle' => - 'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', - 'description' => 'Description', - 'description_footer' => 'Description footer', - 'description_footer_hint' => - 'This text is added at the end of each episode description, it is a good place to input your social links for example.', - 'publication_section_title' => 'Publication info', - 'publication_section_subtitle' => '', - 'publication_date' => 'Publication date', - 'publication_date_clear' => 'Clear publication date', - 'publication_date_hint' => - 'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', 'parental_advisory' => [ 'label' => 'Parental advisory', 'hint' => 'Does the episode contain explicit content?', @@ -71,30 +72,59 @@ return [ 'clean' => 'Clean', 'explicit' => 'Explicit', ], - 'block' => 'Episode should be hidden from all platforms', - 'block_hint' => - 'The episode show or hide status. If you want this episode removed from the Apple directory, toggle this on.', + 'show_notes_section_title' => 'Show notes', + 'show_notes_section_subtitle' => + 'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', + 'description' => 'Description', + 'description_footer' => 'Description footer', + 'description_footer_hint' => + 'This text is added at the end of each episode description, it is a good place to input your social links for example.', 'additional_files_section_title' => 'Additional files', 'additional_files_section_subtitle' => 'These files may be used by other platforms to provide better experience to your audience.<br />See the {podcastNamespaceLink} for more information.', + 'location_section_title' => 'Location', + 'location_section_subtitle' => 'What place is this episode about?', + 'location_name' => 'Location name or address', + 'location_name_hint' => 'This can be a real or fictional location', 'transcript' => 'Transcript or closed captions', 'transcript_hint' => 'Allowed formats are txt, html, srt or json.', 'transcript_delete' => 'Delete transcript', 'chapters' => 'Chapters', 'chapters_hint' => 'File should be in JSON Chapters Format.', 'chapters_delete' => 'Delete chapters', - 'location_section_title' => 'Location', - 'location_section_subtitle' => 'What place is this episode about?', - 'location_name' => 'Location name or address', - 'location_name_hint' => 'This can be a real place or fictional', 'advanced_section_title' => 'Advanced Parameters', 'advanced_section_subtitle' => 'If you need RSS tags that Castopod does not handle, set them here.', 'custom_rss' => 'Custom RSS tags for the episode', 'custom_rss_hint' => 'This will be injected within the â¬itemâ tag.', + 'block' => 'Episode should be hidden from all platforms', + 'block_hint' => + 'The episode show or hide status. If you want this episode removed from the Apple directory, toggle this on.', 'submit_create' => 'Create episode', 'submit_edit' => 'Save episode', ], + 'publish_form' => [ + 'note' => 'Your note', + 'note_hint' => + 'The message you write will be broadcasted to all your followers in the fediverse.', + 'publication_date' => 'Publication date', + 'publication_method' => [ + 'now' => 'Now', + 'schedule' => 'Schedule', + ], + 'scheduled_publication_date' => 'Scheduled publication date', + 'scheduled_publication_date_clear' => 'Clear publication date', + 'scheduled_publication_date_hint' => + 'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', + 'submit' => 'Publish', + 'submit_edit' => 'Edit publication', + ], + 'unpublish_form' => [ + 'disclaimer' => + 'Unpublishing the episode will delete all the notes associated with the episode and remove it from the podcast\'s RSS feed.', + 'understand' => 'I understand, I want to unpublish the episode', + 'submit' => 'Unpublish', + ], 'soundbites' => 'Soundbites', 'soundbites_form' => [ 'title' => 'Edit soundbites', diff --git a/app/Language/en/Fediverse.php b/app/Language/en/Fediverse.php new file mode 100644 index 0000000000000000000000000000000000000000..17cd0d0b768ccfca7feb43ac09ec00aec4e190c0 --- /dev/null +++ b/app/Language/en/Fediverse.php @@ -0,0 +1,23 @@ +<?php + +/** + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +return [ + 'blocked_actors' => 'Blocked accounts', + 'blocked_domains' => 'Blocked domains', + 'block_lists_form' => [ + 'handle' => 'Account handle', + 'handle_hint' => 'Input @username@domain account.', + 'domain' => 'Domain name', + 'submit' => 'Block!', + ], + 'list' => [ + 'actor' => 'Account', + 'domain' => 'Domain name', + 'unblock' => 'Unblock', + ], +]; diff --git a/app/Language/en/Note.php b/app/Language/en/Note.php new file mode 100644 index 0000000000000000000000000000000000000000..ba75903229e8da4244c119fc7e0573d212b7c4f6 --- /dev/null +++ b/app/Language/en/Note.php @@ -0,0 +1,38 @@ +<?php + +/** + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +return [ + 'title' => '{actorDisplayName}\'s Note', + 'back_to_actor_notes' => 'Back to {actor} notes', + 'actor_shared' => '{actor} shared', + 'reply_to' => 'Reply to @{actorUsername}', + 'form' => [ + 'message_placeholder' => 'Write a message...', + 'episode_message_placeholder' => 'Write a message for the episode...', + 'episode_url_placeholder' => 'Episode URL', + 'reply_to_placeholder' => 'Reply to @{actorUsername}', + 'submit' => 'Send!', + 'submit_reply' => 'Reply', + ], + 'favourites' => '{numberOfFavourites, plural, + one {# favourite} + other {# favourites} + }', + 'reblogs' => '{numberOfReblogs, plural, + one {# share} + other {# shares} + }', + 'replies' => '{numberOfReplies, plural, + one {# reply} + other {# replies} + }', + 'expand' => 'Expand note', + 'block_actor' => 'Block user @{actorUsername}', + 'block_domain' => 'Block domain @{actorDomain}', + 'delete' => 'Delete note', +]; diff --git a/app/Language/en/Page.php b/app/Language/en/Page.php index c15145b1ef80ab0f36c4547af06de3cc43dc03c2..4ddf96022251eae32536aab2361b0414e60151e1 100644 --- a/app/Language/en/Page.php +++ b/app/Language/en/Page.php @@ -7,6 +7,7 @@ */ return [ + 'back_to_home' => 'Back to home', 'page' => 'Page', 'all_pages' => 'All pages', 'create' => 'New page', @@ -21,6 +22,6 @@ return [ 'submit_edit' => 'Save', ], 'messages' => [ - 'createSuccess' => 'The {pageTitle} page was created successfully!', + 'createSuccess' => 'The page "{pageTitle}" was created successfully!', ], ]; diff --git a/app/Language/en/Podcast.php b/app/Language/en/Podcast.php index 67f135b26b41234f94a98be6fb82fbff212072b5..a80477b75525c242a36789e2ae0fca14284379e2 100644 --- a/app/Language/en/Podcast.php +++ b/app/Language/en/Podcast.php @@ -209,9 +209,26 @@ return [ ], 'by' => 'By {publisher}', 'season' => 'Season {seasonNumber}', - 'list_of_episodes_year' => '{year} episodes', - 'list_of_episodes_season' => 'Season {seasonNumber} episodes', + 'list_of_episodes_year' => '{year} episodes ({episodeCount})', + 'list_of_episodes_season' => + 'Season {seasonNumber} episodes ({episodeCount})', 'no_episode' => 'No episode found!', 'no_episode_hint' => 'Navigate the podcast episodes with the navigation bar above.', + 'follow' => 'Follow', + 'followers' => '{numberOfFollowers, plural, + one {<span class="font-semibold">#</span> follower} + other {<span class="font-semibold">#</span> followers} + }', + 'notes' => '{numberOfNotes, plural, + one {<span class="font-semibold">#</span> note} + other {<span class="font-semibold">#</span> notes} + }', + 'activity' => 'Activity', + 'episodes' => 'Episodes', + 'sponsor_title' => 'Enjoying the show?', + 'sponsor' => 'Sponsor', + 'funding_links' => 'Funding links for {podcastTitle}', + 'find_on' => 'Find {podcastTitle} on', + 'listen_on' => 'Listen on', ]; diff --git a/app/Language/en/PodcastNavigation.php b/app/Language/en/PodcastNavigation.php index 49062fe30e9cb0e012133b799281231e55b2c206..f577326d4d6e93a149ebae6e28d59c51fc500f8e 100644 --- a/app/Language/en/PodcastNavigation.php +++ b/app/Language/en/PodcastNavigation.php @@ -14,6 +14,8 @@ return [ 'episodes' => 'Episodes', 'episode-list' => 'All episodes', 'episode-create' => 'New episode', + 'fediverse' => 'Fediverse', + 'fediverse-block_lists' => 'Block lists', 'analytics' => 'Analytics', 'persons' => 'Persons', 'podcast-person-manage' => 'Manage persons', diff --git a/app/Language/fr/ActivityPub.php b/app/Language/fr/ActivityPub.php new file mode 100644 index 0000000000000000000000000000000000000000..b60d822d96f2b54ee0c6033153430270dc904299 --- /dev/null +++ b/app/Language/fr/ActivityPub.php @@ -0,0 +1,35 @@ +<?php + +/** + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +return [ + 'your_handle' => 'Votre pseudonyme', + 'your_handle_hint' => + 'Entrez le @utilisateur@domaine avec lequel vous voulez interagir.', + 'follow' => [ + 'label' => 'Suivre', + 'title' => 'Suivre {actorDisplayName}', + 'subtitle' => 'Vous allez suivre :', + 'accountNotFound' => 'Le compte n’a pas pu être trouvé.', + 'submit' => 'Poursuivre', + ], + 'favourite' => [ + 'title' => 'Mettez la note de {actorDisplayName} en favori', + 'subtitle' => 'Vous allez mettre en favori :', + 'submit' => 'Poursuivre', + ], + 'reblog' => [ + 'title' => 'Partagez la note de {actorDisplayName}', + 'subtitle' => 'Vous allez partager :', + 'submit' => 'Poursuivre', + ], + 'reply' => [ + 'title' => 'Répondre à la note de {actorDisplayName}', + 'subtitle' => 'Vous allez répondre à :', + 'submit' => 'Poursuivre', + ], +]; diff --git a/app/Language/fr/AdminNavigation.php b/app/Language/fr/AdminNavigation.php index b22523f359dd12238678186b074773a82b90fbe9..011880451a81b71bb1ddc6418d99f8ee062ef9ec 100644 --- a/app/Language/fr/AdminNavigation.php +++ b/app/Language/fr/AdminNavigation.php @@ -17,6 +17,9 @@ return [ 'persons' => 'Intervenants', 'person-list' => 'Tous les intervenants', 'person-create' => 'Nouvel intervenant', + 'fediverse' => 'Fédiverse', + 'fediverse-blocked_actors' => 'Utilisateurs blockés', + 'fediverse-blocked_domains' => 'Domaines blockés', 'users' => 'Utilisateurs', 'user-list' => 'Tous les utilisateurs', 'user-create' => 'Créer un utilisateur', diff --git a/app/Language/fr/Breadcrumb.php b/app/Language/fr/Breadcrumb.php index 179238e9f139ac144f90552bde3defc2e29d5d61..ba60f46f6605a4cd0a8188366ef38701dfdde9f0 100644 --- a/app/Language/fr/Breadcrumb.php +++ b/app/Language/fr/Breadcrumb.php @@ -17,6 +17,11 @@ return [ 'new' => 'créer', 'edit' => 'modifier', 'persons' => 'intervenants', + 'publish' => 'publier', + 'publish-edit' => 'modifier la publication', + 'unpublish' => 'dépublier', + 'fediverse' => 'fédiverse', + 'block-lists' => 'listes de blocage', 'users' => 'utilisateurs', 'my-account' => 'mon compte', 'change-password' => 'changer le mot de passe', diff --git a/app/Language/fr/Common.php b/app/Language/fr/Common.php index 59a9514ecab161bfbf0fa790ed346ed0cdd92925..48b599e0fdd1d50dc3307607ed1a810c0c35988a 100644 --- a/app/Language/fr/Common.php +++ b/app/Language/fr/Common.php @@ -9,14 +9,18 @@ return [ 'yes' => 'Oui', 'no' => 'Non', + 'cancel' => 'Annuler', 'optional' => 'Optionnel', + 'more' => 'Plus', 'no_data' => 'Aucune donnée trouvée !', + 'close' => 'Fermer', 'home' => 'Accueil', 'explicit' => 'Explicite', 'mediumDate' => '{0,date,medium}', 'powered_by' => 'Propulsé par {castopod}.', 'actions' => 'Actions', 'pageInfo' => 'Page {currentPage} sur {pageCount}', + 'go_back' => 'Retour en arrière', 'forms' => [ 'multiSelect' => [ 'selectText' => 'Cliquez pour selectionner', diff --git a/app/Language/fr/Episode.php b/app/Language/fr/Episode.php index 70f233af72b7206f35eccaf600c51c50d73caa3b..f9d386849654c55d3efe584005125bd610e3e77c 100644 --- a/app/Language/fr/Episode.php +++ b/app/Language/fr/Episode.php @@ -7,19 +7,33 @@ */ return [ - 'previous_episode' => 'Épisode précédent', - 'previous_season' => 'Saison précédente', - 'next_episode' => 'Épisode suivant', - 'next_season' => 'Saison suivante', 'season' => 'Saison {seasonNumber}', 'season_abbr' => 'S{seasonNumber}', 'number' => 'Épisode {episodeNumber}', 'number_abbr' => 'Ep. {episodeNumber}', 'season_episode' => 'Saison {seasonNumber} épisode {episodeNumber}', 'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}', + 'back_to_episodes' => 'Retour aux épisodes de {podcast}', + 'activity' => 'Activité', + 'description' => 'Description', + 'total_favourites' => '{numberOfTotalFavourites, plural, + one {# favori en tout} + other {# favoris en tout} + }', + 'total_reblogs' => '{numberOfTotalReblogs, plural, + one {# partage en tout} + other {# partages en tout} + }', + 'total_notes' => '{numberOfTotalNotes, plural, + one {# note} + other {# notes} + }', 'all_podcast_episodes' => 'Tous les épisodes du podcast', 'back_to_podcast' => 'Revenir au podcast', 'edit' => 'Modifier', + 'publish' => 'Publier', + 'publish_edit' => 'Modifier la publication', + 'unpublish' => 'Dépublier', 'delete' => 'Supprimer', 'go_to_page' => 'Voir', 'create' => 'Ajouter un épisode', @@ -51,19 +65,6 @@ return [ 'trailer' => 'Bande-annonce', 'bonus' => 'Bonus', ], - 'show_notes_section_title' => 'Notes d’épisode (Show Notes)', - 'show_notes_section_subtitle' => - 'Jusque 4000 caractères, soyez clairs et concis. Les notes d’épisode aident les auditeurs potentiels à le trouver.', - 'description' => 'Description', - 'description_footer' => 'Pied de description', - 'description_footer_hint' => - 'Ce texte est ajouté à la fin de chaque description d’épisode, c’est un bon endroit pour placer vos liens sociaux par exemple.', - 'publication_section_title' => 'Information de publication', - 'publication_section_subtitle' => '', - 'publication_date' => 'Date de publication', - 'publication_date_clear' => 'Effacer la date de publication', - 'publication_date_hint' => - 'Vous pouvez planifier la sortie de l’épisode en saisissant une date de publication future. Ce champ doit être au format YYYY-MM-DD HH:mm', 'parental_advisory' => [ 'label' => 'Avertissement parental', 'hint' => 'L’épisode contient-il un contenu explicite ?', @@ -71,12 +72,20 @@ return [ 'clean' => 'Convenable', 'explicit' => 'Explicite', ], - 'block' => 'L’épisode doit être masqué de toutes les plateformes', - 'block_hint' => - 'La visibilité de l’épisode. Si vous souhaitez retirer cet épisode de l’index Apple, activez ce champ.', + 'show_notes_section_title' => 'Notes d’épisode (Show Notes)', + 'show_notes_section_subtitle' => + 'Jusque 4000 caractères, soyez clairs et concis. Les notes d’épisode aident les auditeurs potentiels à le trouver.', + 'description' => 'Description', + 'description_footer' => 'Pied de description', + 'description_footer_hint' => + 'Ce texte est ajouté à la fin de chaque description d’épisode, c’est un bon endroit pour placer vos liens sociaux par exemple.', 'additional_files_section_title' => 'Fichiers additionels', 'additional_files_section_subtitle' => 'Ces fichiers pourront être utilisées par d’autres plate-formes pour procurer une meilleure expérience à vos auditeurs.<br />Consulter le {podcastNamespaceLink} pour plus d’informations.', + 'location_section_title' => 'Localisation', + 'location_section_subtitle' => 'De quel lieu cet épisode parle-t-il ?', + 'location_name' => 'Nom ou adresse du lieu', + 'location_name_hint' => 'Ce lieu peut être réel ou fictif', 'transcript' => 'Transcription ou sous-titrage', 'transcript_hint' => 'Les formats autorisés sont txt, html, srt ou json.', @@ -84,18 +93,39 @@ return [ 'chapters' => 'Chapitrage', 'chapters_hint' => 'Le fichier doit être en "JSON Chapters Format".', 'chapters_delete' => 'Supprimer le chapitrage', - 'location_section_title' => 'Localisation', - 'location_section_subtitle' => 'De quel lieu cet épisode parle-t-il ?', - 'location_name' => 'Nom ou adresse du lieu', - 'location_name_hint' => 'Ce lieu peut être réel ou fictif', 'advanced_section_title' => 'Paramètres avancés', 'advanced_section_subtitle' => - 'Si vous avez besoin d’une balise que nous n’avons pas couverte, définissez-la ici.', + 'Si vous avez besoin d’une balise que Castopod ne couvre pas, définissez-la ici.', 'custom_rss' => 'Balises RSS personnalisées pour l’épisode', 'custom_rss_hint' => 'Ceci sera injecté dans la balise â¬itemâ.', + 'block' => 'L’épisode doit être masqué de toutes les plateformes', + 'block_hint' => + 'La visibilité de l’épisode. Si vous souhaitez retirer cet épisode de l’index Apple, activez ce champ.', 'submit_create' => 'Créer l’épisode', 'submit_edit' => 'Enregistrer l’épisode', ], + 'publish_form' => [ + 'publication_date' => 'Date de publication', + 'publication_date_clear' => 'Effacer la date de publication', + 'publication_date_hint' => + 'Vous pouvez planifier la sortie de l’épisode en saisissant une date de publication future. Ce champ doit être au format YYYY-MM-DD HH:mm', + ], + 'publish_form' => [ + 'note' => 'Votre note', + 'note_hint' => + 'Le message que vous écrirez sera diffusé à toutes les personnes qui vous suivent dans le fédiverse.', + 'publication_date' => 'Date de publication', + 'publication_method' => [ + 'now' => 'Maintenant', + 'schedule' => 'Planifier', + ], + 'scheduled_publication_date' => 'Date de publication programmée', + 'scheduled_publication_date_clear' => 'Effacer la date de publication', + 'scheduled_publication_date_hint' => + 'Vous pouvez planifier la sortie de l’épisode en saisissant une date de publication future. Ce champ doit être au format YYYY-MM-DD HH:mm', + 'submit' => 'Publier', + 'submit_edit' => 'Modifier la publication', + ], 'soundbites' => 'Extraits sonores', 'soundbites_form' => [ 'title' => 'Modifier les extraits sonores', diff --git a/app/Language/fr/Fediverse.php b/app/Language/fr/Fediverse.php new file mode 100644 index 0000000000000000000000000000000000000000..3d7da1af9efc768d6b61a61ede5fcf219a26e37f --- /dev/null +++ b/app/Language/fr/Fediverse.php @@ -0,0 +1,20 @@ +<?php + +/** + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +return [ + 'block_lists' => 'Listes de blocage', + 'block_lists_form' => [ + 'blocked_users' => 'Utilisateurs bloqués', + 'blocked_users_hint' => + 'Entrez les pseudonymes @utilisateur@domaine séparés par une virgule.', + 'blocked_domains' => 'Domaines bloqués', + 'blocked_domains_hint' => + 'Entrez les noms de domaine séparés par une virgule.', + 'submit' => 'Sauvegarder les listes', + ], +]; diff --git a/app/Language/fr/Note.php b/app/Language/fr/Note.php new file mode 100644 index 0000000000000000000000000000000000000000..fe97031c052a10e5b6ec556a0d0e13c9e461da49 --- /dev/null +++ b/app/Language/fr/Note.php @@ -0,0 +1,39 @@ +<?php + +/** + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +return [ + 'title' => 'Note de {actorDisplayName}', + 'back_to_actor_notes' => 'Retour aux notes de {actor}', + 'actor_shared' => '{actor} a partagé', + 'reply_to' => 'Répondre à @{actorUsername}', + 'form' => [ + 'message_placeholder' => 'Écrivez votre message...', + 'episode_message_placeholder' => + 'Écrivez votre message pour l’épisode...', + 'episode_url_placeholder' => 'URL de l’épisode', + 'reply_to_placeholder' => 'Répondre à @{actorUsername}', + 'submit' => 'Envoyer!', + 'submit_reply' => 'Répondre', + ], + 'favourites' => '{numberOfFavourites, plural, + one {# favori} + other {# favoris} + }', + 'reblogs' => '{numberOfReblogs, plural, + one {# partage} + other {# partages} + }', + 'replies' => '{numberOfReplies, plural, + one {# réponse} + other {# réponses} + }', + 'expand' => 'Ouvrir la note', + 'block_actor' => 'Bloquer l’utilisateur @{actorUsername}', + 'block_domain' => 'Bloquer le domaine @{actorDomain}', + 'delete' => 'Supprimer la note', +]; diff --git a/app/Language/fr/Page.php b/app/Language/fr/Page.php index adc10995cb6620861306c705ffcc234a615c0b16..0514060255e663fb782fcf32789e3178c15f6ef5 100644 --- a/app/Language/fr/Page.php +++ b/app/Language/fr/Page.php @@ -7,6 +7,7 @@ */ return [ + 'back_to_home' => 'Retour à l’accueil', 'page' => 'Page', 'all_pages' => 'Toutes les pages', 'create' => 'Créer une page', diff --git a/app/Language/fr/Podcast.php b/app/Language/fr/Podcast.php index 7daaf7714950b6a3936c103c62fce4dff82fb0ae..3c4ef2044742be44569eb251e2242dc7a777620c 100644 --- a/app/Language/fr/Podcast.php +++ b/app/Language/fr/Podcast.php @@ -211,9 +211,26 @@ return [ ], 'by' => 'Par {publisher}', 'season' => 'Saison {seasonNumber}', - 'list_of_episodes_year' => 'épisodes {year}', - 'list_of_episodes_season' => 'Épisodes de la saison {seasonNumber}', + 'list_of_episodes_year' => 'Épisodes de {year} (episodeCount)', + 'list_of_episodes_season' => + 'Épisodes de la saison {seasonNumber} (episodeCount)', 'no_episode' => 'Aucun épisode trouvé !', 'no_episode_hint' => 'Naviguez au sein des épisodes du podcast episodes grâce à la barre de navigation ci-dessus.', + 'follow' => 'Suivre', + 'followers' => '{numberOfFollowers, plural, + one {<span class="font-semibold">#</span> abonné·e} + other {<span class="font-semibold">#</span> abonné·e·s} + }', + 'notes' => '{numberOfNotes, plural, + one {<span class="font-semibold">#</span> note} + other {<span class="font-semibold">#</span> notes} + }', + 'activity' => 'Activité', + 'episodes' => 'Épisodes', + 'sponsor_title' => 'Vous aimez le podcast ?', + 'sponsor' => 'Soutenez-nous', + 'funding_links' => 'Liens de financement pour {podcastTitle}', + 'find_on' => 'Trouvez {podcastTitle} sur', + 'listen_on' => 'Écoutez sur', ]; diff --git a/app/Language/fr/PodcastNavigation.php b/app/Language/fr/PodcastNavigation.php index 1b5414bc6959f6e7fb1d14cd06b708efae1dac25..77bf5041ad8d6f5ce7f1d71252c2ef37129df47b 100644 --- a/app/Language/fr/PodcastNavigation.php +++ b/app/Language/fr/PodcastNavigation.php @@ -14,6 +14,8 @@ return [ 'episodes' => 'Épisodes', 'episode-list' => 'Tous les épisodes', 'episode-create' => 'Créer un épisode', + 'fediverse' => 'Fédiverse', + 'fediverse-block_lists' => 'Listes de blocage', 'analytics' => 'Mesures d’audience', 'persons' => 'Intervenants', 'podcast-person-manage' => 'Gestion des intervenants', diff --git a/app/Libraries/ActivityPub/Activities/AcceptActivity.php b/app/Libraries/ActivityPub/Activities/AcceptActivity.php new file mode 100644 index 0000000000000000000000000000000000000000..13c18021f214cf4835c23534c123967950dd1576 --- /dev/null +++ b/app/Libraries/ActivityPub/Activities/AcceptActivity.php @@ -0,0 +1,24 @@ +<?php + +/** + * Activity objects are specializations of the base Object type + * that provide information about actions that have either + * already occurred, are in the process of occurring, + * or may occur in the future. + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Activities; + +use ActivityPub\Core\Activity; + +class AcceptActivity extends Activity +{ + /** + * @var string + */ + protected $type = 'Accept'; +} diff --git a/app/Libraries/ActivityPub/Activities/AnnounceActivity.php b/app/Libraries/ActivityPub/Activities/AnnounceActivity.php new file mode 100644 index 0000000000000000000000000000000000000000..30dcf4d2928ff9c8eb2e068e079bc9c9314f7a79 --- /dev/null +++ b/app/Libraries/ActivityPub/Activities/AnnounceActivity.php @@ -0,0 +1,37 @@ +<?php + +/** + * Activity objects are specializations of the base Object type + * that provide information about actions that have either + * already occurred, are in the process of occurring, + * or may occur in the future. + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Activities; + +use ActivityPub\Core\Activity; + +class AnnounceActivity extends Activity +{ + /** + * @var string + */ + protected $type = 'Announce'; + + public function __construct($reblogNote) + { + $this->actor = $reblogNote->actor->uri; + $this->object = $reblogNote->reblog_of_note->uri; + + $this->published = $reblogNote->published_at->format(DATE_W3C); + + $this->cc = [ + $reblogNote->actor->uri, + $reblogNote->actor->followers_url, + ]; + } +} diff --git a/app/Libraries/ActivityPub/Activities/CreateActivity.php b/app/Libraries/ActivityPub/Activities/CreateActivity.php new file mode 100644 index 0000000000000000000000000000000000000000..bb479e0424d2d6b417d20fadbee5ea91c397b2fb --- /dev/null +++ b/app/Libraries/ActivityPub/Activities/CreateActivity.php @@ -0,0 +1,24 @@ +<?php + +/** + * Activity objects are specializations of the base Object type + * that provide information about actions that have either + * already occurred, are in the process of occurring, + * or may occur in the future. + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Activities; + +use ActivityPub\Core\Activity; + +class CreateActivity extends Activity +{ + /** + * @var string + */ + protected $type = 'Create'; +} diff --git a/app/Libraries/ActivityPub/Activities/DeleteActivity.php b/app/Libraries/ActivityPub/Activities/DeleteActivity.php new file mode 100644 index 0000000000000000000000000000000000000000..58483f6e216e219957423841ccd2267951c8fa13 --- /dev/null +++ b/app/Libraries/ActivityPub/Activities/DeleteActivity.php @@ -0,0 +1,24 @@ +<?php + +/** + * Activity objects are specializations of the base Object type + * that provide information about actions that have either + * already occurred, are in the process of occurring, + * or may occur in the future. + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Activities; + +use ActivityPub\Core\Activity; + +class DeleteActivity extends Activity +{ + /** + * @var string + */ + protected $type = 'Delete'; +} diff --git a/app/Libraries/ActivityPub/Activities/FollowActivity.php b/app/Libraries/ActivityPub/Activities/FollowActivity.php new file mode 100644 index 0000000000000000000000000000000000000000..b78e091204323a7f81875380bdc94792fda02588 --- /dev/null +++ b/app/Libraries/ActivityPub/Activities/FollowActivity.php @@ -0,0 +1,24 @@ +<?php + +/** + * Activity objects are specializations of the base Object type + * that provide information about actions that have either + * already occurred, are in the process of occurring, + * or may occur in the future. + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Activities; + +use ActivityPub\Core\Activity; + +class FollowActivity extends Activity +{ + /** + * @var string + */ + protected $type = 'Follow'; +} diff --git a/app/Libraries/ActivityPub/Activities/LikeActivity.php b/app/Libraries/ActivityPub/Activities/LikeActivity.php new file mode 100644 index 0000000000000000000000000000000000000000..df21cc42f4967ab8e5685c10aafe48f353f7ae49 --- /dev/null +++ b/app/Libraries/ActivityPub/Activities/LikeActivity.php @@ -0,0 +1,24 @@ +<?php + +/** + * Activity objects are specializations of the base Object type + * that provide information about actions that have either + * already occurred, are in the process of occurring, + * or may occur in the future. + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Activities; + +use ActivityPub\Core\Activity; + +class LikeActivity extends Activity +{ + /** + * @var string + */ + protected $type = 'Like'; +} diff --git a/app/Libraries/ActivityPub/Activities/UndoActivity.php b/app/Libraries/ActivityPub/Activities/UndoActivity.php new file mode 100644 index 0000000000000000000000000000000000000000..aa21fd34a2ec9aaa33e2d4b06f358a11222ae7f9 --- /dev/null +++ b/app/Libraries/ActivityPub/Activities/UndoActivity.php @@ -0,0 +1,24 @@ +<?php + +/** + * Activity objects are specializations of the base Object type + * that provide information about actions that have either + * already occurred, are in the process of occurring, + * or may occur in the future. + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Activities; + +use ActivityPub\Core\Activity; + +class UndoActivity extends Activity +{ + /** + * @var string + */ + protected $type = 'Undo'; +} diff --git a/app/Libraries/ActivityPub/ActivityRequest.php b/app/Libraries/ActivityPub/ActivityRequest.php new file mode 100644 index 0000000000000000000000000000000000000000..3386dc77c99d18f14a204c2c44b0d560e0ae6864 --- /dev/null +++ b/app/Libraries/ActivityPub/ActivityRequest.php @@ -0,0 +1,119 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub; + +use CodeIgniter\I18n\Time; +use phpseclib\Crypt\RSA; + +class ActivityRequest +{ + /** + * @var \CodeIgniter\HTTP\CURLRequest + */ + protected $request; + + /** + * @var \CodeIgniter\HTTP\URI + */ + protected $uri; + + /** + * @var \ActivityPub\Core\Activity|null + */ + protected $activity; + + /** + * @var array + */ + protected $options = [ + 'headers' => [ + 'Content-Type' => 'application/activity+json', + 'Accept' => 'application/activity+json', // TODO: outgoing and incoming requests + ], + ]; + + /** + * @param string $uri + * @param string $activityPayload + */ + public function __construct($uri, $activityPayload = null) + { + $this->request = \Config\Services::curlrequest(); + + if ($activityPayload) { + $this->request->setBody($activityPayload); + } + + $this->uri = new \CodeIgniter\HTTP\URI($uri); + } + + public function post() + { + // send Message to Fediverse instance + $this->request->post($this->uri, $this->options); + } + + public function get() + { + return $this->request->get($this->uri, $this->options); + } + + public function getDomain() + { + return $this->uri->getHost() . + ($this->uri->getPort() ? ':' . $this->uri->getPort() : ''); + } + + public function sign($keyId, $privateKey) + { + $rsa = new RSA(); + $rsa->loadKey($privateKey); // private key + $rsa->setHash('sha256'); + $rsa->setSignatureMode(RSA::SIGNATURE_PKCS1); + + $path = + $this->uri->getPath() . + ($this->uri->getQuery() ? "?{$this->uri->getQuery()}" : ''); + $host = $this->uri->getHost(); + $date = Time::now('GMT')->format('D, d M Y H:i:s T'); + $digest = 'SHA-256=' . base64_encode($this->getBodyDigest()); + $contentType = $this->options['headers']['Content-Type']; + $contentLength = strval(strlen($this->request->getBody())); + $userAgent = 'Castopod'; + + $plainText = "(request-target): post $path\nhost: $host\ndate: $date\ndigest: $digest\ncontent-type: $contentType\ncontent-length: $contentLength\nuser-agent: $userAgent"; + + $signature = $rsa->sign($plainText); + + $signatureHeader = + 'keyId="' . + $keyId . + '",algorithm="rsa-sha256",headers="(request-target) host date digest content-type content-length user-agent",signature="' . + base64_encode($signature) . + '"'; + + $this->options = [ + 'headers' => [ + 'Content-Type' => $contentType, + 'Content-Length' => $contentLength, + 'Authorization' => "Signature $signatureHeader", + 'Signature' => $signatureHeader, + 'Host' => $host, + 'Date' => $date, + 'User-Agent' => $userAgent, + 'Digest' => $digest, + ], + ]; + } + + protected function getBodyDigest() + { + return hash('sha256', $this->request->getBody(), true); + } +} diff --git a/app/Libraries/ActivityPub/Config/ActivityPub.php b/app/Libraries/ActivityPub/Config/ActivityPub.php new file mode 100644 index 0000000000000000000000000000000000000000..199817af0fccee9689c9b3ba98484194afb6b5bd --- /dev/null +++ b/app/Libraries/ActivityPub/Config/ActivityPub.php @@ -0,0 +1,22 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Config; + +use CodeIgniter\Config\BaseConfig; + +class ActivityPub extends BaseConfig +{ + /** + * -------------------------------------------------------------------- + * ActivityPub Objects + * -------------------------------------------------------------------- + */ + public $actorObject = 'ActivityPub\Objects\ActorObject'; + public $noteObject = 'ActivityPub\Objects\NoteObject'; +} diff --git a/app/Libraries/ActivityPub/Config/Routes.php b/app/Libraries/ActivityPub/Config/Routes.php new file mode 100644 index 0000000000000000000000000000000000000000..9f68c1a986f5370007de4758372e06bdbbbe32ab --- /dev/null +++ b/app/Libraries/ActivityPub/Config/Routes.php @@ -0,0 +1,106 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +$routes->addPlaceholder('actorUsername', '[a-zA-Z0-9\_]{1,32}'); +$routes->addPlaceholder( + 'uuid', + '[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-4[0-9A-Fa-f]{3}-[89ABab][0-9A-Fa-f]{3}-[0-9A-Fa-f]{12}', +); +$routes->addPlaceholder('noteAction', '\bfavourite|\breblog|\breply'); + +/** + * ActivityPub routes file + */ + +$routes->group('', ['namespace' => 'ActivityPub\Controllers'], function ( + $routes +) { + // webfinger + $routes->get('.well-known/webfinger', 'WebFingerController', [ + 'as' => 'webfinger', + ]); + + // Actor + $routes->group('@(:actorUsername)', function ($routes) { + // Actor + $routes->get('/', 'ActorController/$1', [ + 'as' => 'actor', + ]); + $routes->post('inbox', 'ActorController::inbox/$1', [ + 'as' => 'inbox', + 'filter' => + 'activity-pub:verify-activitystream,verify-blocks,verify-signature', + ]); + $routes->get('outbox', 'ActorController::outbox/$1', [ + 'as' => 'outbox', + 'filter' => 'activity-pub:verify-activitystream', + ]); + $routes->get('followers', 'ActorController::followers/$1', [ + 'as' => 'followers', + 'filter' => 'activity-pub::activity-stream', + ]); + $routes->post('follow', 'ActorController::attemptFollow/$1', [ + 'as' => 'attempt-follow', + ]); + $routes->get('activities/(:uuid)', 'ActorController::activity/$1/$2', [ + 'as' => 'activity', + ]); + }); + + // Note + $routes->post('notes/new', 'NoteController::attemptCreate/$1', [ + 'as' => 'note-attempt-create', + ]); + + $routes->get('notes/(:uuid)', 'NoteController/$1', [ + 'as' => 'note', + ]); + + $routes->get('notes/(:uuid)/replies', 'NoteController/$1', [ + 'as' => 'note-replies', + ]); + + $routes->post( + 'notes/(:uuid)/remote/(:noteAction)', + 'NoteController::attemptRemoteAction/$1/$2/$3', + [ + 'as' => 'note-attempt-remote-action', + ], + ); + + // Blocking actors and domains + $routes->post( + 'fediverse-block-actor', + 'BlockController::attemptBlockActor', + ['as' => 'fediverse-attempt-block-actor'], + ); + + $routes->post( + 'fediverse-block-domain', + 'BlockController::attemptBlockDomain', + ['as' => 'fediverse-attempt-block-domain'], + ); + + $routes->post( + 'fediverse-unblock-actor', + 'BlockController::attemptUnblockActor', + [ + 'as' => 'fediverse-attempt-unblock-actor', + ], + ); + + $routes->post( + 'fediverse-unblock-domain', + 'BlockController::attemptUnblockDomain', + [ + 'as' => 'fediverse-attempt-unblock-domain', + ], + ); + + $routes->cli('scheduled-activities', 'SchedulerController::activity'); +}); diff --git a/app/Libraries/ActivityPub/Controllers/ActorController.php b/app/Libraries/ActivityPub/Controllers/ActorController.php new file mode 100644 index 0000000000000000000000000000000000000000..e6cdc3a284f43bbaf4567fa44840053e62dad754 --- /dev/null +++ b/app/Libraries/ActivityPub/Controllers/ActorController.php @@ -0,0 +1,376 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Controllers; + +use ActivityPub\Objects\OrderedCollectionObject; +use ActivityPub\Objects\OrderedCollectionPage; +use CodeIgniter\Controller; +use CodeIgniter\I18n\Time; + +class ActorController extends Controller +{ + protected $helpers = ['activitypub']; + + /** + * @var \ActivityPub\Entities\Actor + */ + protected $actor; + + /** + * @var \ActivityPub\Config\ActivityPub + */ + protected $config; + + public function __construct() + { + $this->config = config('ActivityPub'); + } + + public function _remap($method, ...$params) + { + if (count($params) > 0) { + if ( + !($this->actor = model('ActorModel')->getActorByUsername( + $params[0], + )) + ) { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + } + unset($params[0]); + + return $this->$method(...$params); + } + + public function index() + { + $actorObjectClass = $this->config->actorObject; + $actorObject = new $actorObjectClass($this->actor); + + return $this->response + ->setContentType('application/activity+json') + ->setBody($actorObject->toJSON()); + } + + /** + * Handles incoming requests from fediverse servers + */ + public function inbox() + { + // get json body and parse it + $payload = $this->request->getJSON(); + + // retrieve payload actor from database or create it if it doesn't exist + $payloadActor = get_or_create_actor_from_uri($payload->actor); + + // store activity to database + $activityId = model('ActivityModel')->newActivity( + $payload->type, + $payloadActor->id, + $this->actor->id, + null, + json_encode($payload), + ); + + // switch/case on activity type + switch ($payload->type) { + case 'Create': + switch ($payload->object->type) { + case 'Note': + if (!$payload->object->inReplyTo) { + return $this->response + ->setStatusCode(501) + ->setJSON([]); + } + + $replyToNote = model('NoteModel')->getNoteByUri( + $payload->object->inReplyTo, + ); + + // TODO: strip content from html to retrieve message + // remove all html tags and reconstruct message with mentions? + extract_text_from_html($payload->object->content); + + $reply = new \ActivityPub\Entities\Note([ + 'uri' => $payload->object->id, + 'actor_id' => $payloadActor->id, + 'in_reply_to_id' => $replyToNote->id, + 'message' => $payload->object->content, + 'published_at' => Time::parse( + $payload->object->published, + ), + ]); + + $noteId = model('NoteModel')->addReply( + $reply, + true, + false, + ); + + model('ActivityModel')->update($activityId, [ + 'note_id' => service('uuid') + ->fromBytes($noteId) + ->getString(), + ]); + + return $this->response->setStatusCode(200)->setJSON([]); + default: + // return not handled undo error (501 = not implemented) + return $this->response->setStatusCode(501)->setJSON([]); + } + break; + case 'Delete': + $noteToDelete = model('NoteModel')->getNoteByUri( + $payload->object->id, + ); + + model('NoteModel')->removeNote($noteToDelete, false); + + return $this->response->setStatusCode(200)->setJSON([]); + case 'Follow': + // add to followers table + model('FollowModel')->addFollower( + $payloadActor, + $this->actor, + false, + ); + + // Automatically accept follow by returning accept activity + accept_follow($this->actor, $payloadActor, $payload->id); + + // TODO: return 202 (Accepted) followed! + return $this->response->setStatusCode(202)->setJSON([]); + + case 'Like': + // get favourited note + $note = model('NoteModel')->getNoteByUri($payload->object); + + // Like side-effect + model('FavouriteModel')->addFavourite( + $payloadActor, + $note, + false, + ); + + model('ActivityModel')->update($activityId, [ + 'note_id' => $note->id, + ]); + + return $this->response->setStatusCode(200)->setJSON([]); + case 'Announce': + $note = model('NoteModel')->getNoteByUri($payload->object); + + model('ActivityModel')->update($activityId, [ + 'note_id' => $note->id, + ]); + + model('NoteModel')->reblog($payloadActor, $note, false); + + return $this->response->setStatusCode(200)->setJSON([]); + case 'Undo': + // switch/case on the type of activity to undo + switch ($payload->object->type) { + case 'Follow': + // revert side-effect by removing follow from database + model('FollowModel')->removeFollower( + $payloadActor, + $this->actor, + false, + ); + + // TODO: undo has been accepted! (202 - Accepted) + return $this->response->setStatusCode(202)->setJSON([]); + case 'Like': + $note = model('NoteModel')->getNoteByUri( + $payload->object->object, + ); + + // revert side-effect by removing favourite from database + model('FavouriteModel')->removeFavourite( + $payloadActor, + $note, + false, + ); + + model('ActivityModel')->update($activityId, [ + 'note_id' => $note->id, + ]); + + return $this->response->setStatusCode(200)->setJSON([]); + case 'Announce': + $note = model('NoteModel')->getNoteByUri( + $payload->object->object, + ); + + $reblogNote = model('NoteModel') + ->where([ + 'actor_id' => $payloadActor->id, + 'reblog_of_id' => service('uuid') + ->fromString($note->id) + ->getBytes(), + ]) + ->first(); + + model('NoteModel')->undoReblog($reblogNote, false); + + model('ActivityModel')->update($activityId, [ + 'note_id' => $note->id, + ]); + + return $this->response->setStatusCode(200)->setJSON([]); + default: + // return not handled undo error (501 = not implemented) + return $this->response->setStatusCode(501)->setJSON([]); + } + default: + // return not handled activity error (501 = not implemented) + return $this->response->setStatusCode(501)->setJSON([]); + } + } + + public function outbox() + { + // get published activities by publication date + $actorActivity = model('ActivityModel') + ->where('actor_id', $this->actor->id) + ->where('`created_at` <= NOW()', null, false) + ->orderBy('created_at', 'DESC'); + + $pageNumber = $this->request->getGet('page'); + + if (!isset($pageNumber)) { + $actorActivity->paginate(12); + $pager = $actorActivity->pager; + $collection = new OrderedCollectionObject(null, $pager); + } else { + $paginatedActivity = $actorActivity->paginate( + 12, + 'default', + $pageNumber, + ); + $pager = $actorActivity->pager; + $orderedItems = []; + foreach ($paginatedActivity as $activity) { + array_push($orderedItems, $activity->payload); + } + $collection = new OrderedCollectionPage($pager, $orderedItems); + } + + return $this->response + ->setContentType('application/activity+json') + ->setBody($collection->toJSON()); + } + + public function followers() + { + // get followers for a specific actor + $followers = model('ActorModel') + ->join( + 'activitypub_follows', + 'activitypub_follows.actor_id = id', + 'inner', + ) + ->where('activitypub_follows.target_actor_id', $this->actor->id) + ->orderBy('activitypub_follows.created_at', 'DESC'); + + $pageNumber = $this->request->getGet('page'); + + if (!isset($pageNumber)) { + $followers->paginate(12); + $pager = $followers->pager; + $followersCollection = new OrderedCollectionObject(null, $pager); + } else { + $paginatedFollowers = $followers->paginate( + 12, + 'default', + $pageNumber, + ); + $pager = $followers->pager; + + $orderedItems = []; + foreach ($paginatedFollowers as $follower) { + array_push($orderedItems, $follower->uri); + } + $followersCollection = new OrderedCollectionPage( + $pager, + $orderedItems, + ); + } + + return $this->response + ->setContentType('application/activity+json') + ->setBody($followersCollection->toJSON()); + } + + public function attemptFollow() + { + $rules = [ + 'handle' => + 'regex_match[/^@?(?P<username>[\w\.\-]+)@(?P<host>[\w\.\-]+)(?P<port>:[\d]+)?$/]', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + helper('text'); + + // get webfinger data from actor + // parse activityPub id to get actor and domain + // check if actor and domain exist + + try { + if ($parts = split_handle($this->request->getPost('handle'))) { + extract($parts); + + $data = get_webfinger_data($username, $domain); + } + } catch (\CodeIgniter\HTTP\Exceptions\HTTPException $e) { + return redirect() + ->back() + ->withInput() + ->with('error', lang('ActivityPub.follow.accountNotFound')); + } + + $ostatusKey = array_search( + 'http://ostatus.org/schema/1.0/subscribe', + array_column($data->links, 'rel'), + ); + + if (!$ostatusKey) { + // TODO: error, couldn't subscribe to activitypub account + // The instance doesn't allow its users to follow others + return $this->response->setJSON([]); + } + + return redirect()->to( + str_replace( + '{uri}', + urlencode($this->actor->uri), + $data->links[$ostatusKey]->template, + ), + ); + } + + public function activity($activityId) + { + if ( + !($activity = model('ActivityModel')->getActivityById($activityId)) + ) { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + + return $this->response + ->setContentType('application/activity+json') + ->setBody(json_encode($activity->payload)); + } +} diff --git a/app/Libraries/ActivityPub/Controllers/BlockController.php b/app/Libraries/ActivityPub/Controllers/BlockController.php new file mode 100644 index 0000000000000000000000000000000000000000..87ffe0bbc882c90c2e60e19c3f0676025b015397 --- /dev/null +++ b/app/Libraries/ActivityPub/Controllers/BlockController.php @@ -0,0 +1,105 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Controllers; + +use CodeIgniter\Controller; + +class BlockController extends Controller +{ + protected $helpers = ['activitypub']; + + public function attemptBlockActor() + { + $rules = [ + 'handle' => 'required', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + $handle = $this->request->getPost('handle'); + + if ($parts = split_handle($handle)) { + extract($parts); + + if (!($actor = get_or_create_actor($username, $domain))) { + return redirect() + ->back() + ->withInput() + ->with('error', 'Actor not found.'); + } + + model('ActorModel')->blockActor($actor->id); + } + + return redirect()->back(); + } + + function attemptBlockDomain() + { + $rules = [ + 'domain' => 'required', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + model('BlockedDomainModel')->blockDomain( + $this->request->getPost('domain'), + ); + + return redirect()->back(); + } + + function attemptUnblockActor() + { + $rules = [ + 'actor_id' => 'required', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + model('ActorModel')->unblockActor($this->request->getPost('actor_id')); + + return redirect()->back(); + } + + function attemptUnblockDomain() + { + $rules = [ + 'domain' => 'required', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + model('BlockedDomainModel')->unblockDomain( + $this->request->getPost('domain'), + ); + + return redirect()->back(); + } +} diff --git a/app/Libraries/ActivityPub/Controllers/NoteController.php b/app/Libraries/ActivityPub/Controllers/NoteController.php new file mode 100644 index 0000000000000000000000000000000000000000..048beaa059a0f7e62293977091e2990aa7144141 --- /dev/null +++ b/app/Libraries/ActivityPub/Controllers/NoteController.php @@ -0,0 +1,278 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Controllers; + +use ActivityPub\Config\ActivityPub; +use ActivityPub\Objects\OrderedCollectionObject; +use ActivityPub\Objects\OrderedCollectionPage; +use CodeIgniter\Controller; +use CodeIgniter\I18n\Time; + +class NoteController extends Controller +{ + protected $helpers = ['activitypub']; + + /** + * @var \ActivityPub\Entities\Note|null + */ + protected $note; + + /** + * @var \ActivityPub\Config\ActivityPub + */ + protected $config; + + public function __construct() + { + $this->config = config('ActivityPub'); + } + + public function _remap($method, ...$params) + { + if (!($this->note = model('NoteModel')->getNoteById($params[0]))) { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + unset($params[0]); + + return $this->$method(...$params); + } + + public function index() + { + $noteObjectClass = $this->config->noteObject; + $noteObject = new $noteObjectClass($this->note); + + return $this->response + ->setContentType('application/activity+json') + ->setBody($noteObject->toJSON()); + } + + public function replies() + { + // get note replies + $noteReplies = model('NoteModel') + ->where( + 'in_reply_to_id', + service('uuid') + ->fromString($this->note->id) + ->getBytes(), + ) + ->where('`published_at` <= NOW()', null, false) + ->orderBy('published_at', 'ASC'); + + $pageNumber = $this->request->getGet('page'); + + if (!isset($pageNumber)) { + $noteReplies->paginate(12); + $pager = $noteReplies->pager; + $collection = new OrderedCollectionObject(null, $pager); + } else { + $paginatedReplies = $noteReplies->paginate( + 12, + 'default', + $pageNumber, + ); + $pager = $noteReplies->pager; + + $orderedItems = []; + $noteObjectClass = $this->config->noteObject; + foreach ($paginatedReplies as $reply) { + $replyObject = new $noteObjectClass($reply); + array_push($orderedItems, $replyObject->toJSON()); + } + $collection = new OrderedCollectionPage($pager, $orderedItems); + } + + return $this->response + ->setContentType('application/activity+json') + ->setBody($collection->toJSON()); + } + + public function attemptCreate() + { + $rules = [ + 'actor_id' => 'required|is_natural_no_zero', + 'message' => 'required|max_length[500]', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + $newNote = new \ActivityPub\Entities\Note([ + 'actor_id' => $this->request->getPost('actor_id'), + 'message' => $this->request->getPost('message'), + 'published_at' => Time::now(), + ]); + + if (!model('NoteModel')->addNote($newNote)) { + return redirect() + ->back() + ->withInput() + // TODO: translate + ->with('error', 'Couldn\'t create Note'); + } + + // Note without preview card has been successfully created + return redirect()->back(); + } + + public function attemptFavourite() + { + $rules = [ + 'actor_id' => 'required|is_natural_no_zero', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + $actor = model('ActorModel')->getActorById( + $this->request->getPost('actor_id'), + ); + + model('FavouriteModel')->toggleFavourite($actor, $this->note->id); + + return redirect()->back(); + } + + public function attemptReblog() + { + $rules = [ + 'actor_id' => 'required|is_natural_no_zero', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + $actor = model('ActorModel')->getActorById( + $this->request->getPost('actor_id'), + ); + + model('NoteModel')->toggleReblog($actor, $this->note); + + return redirect()->back(); + } + + public function attemptReply() + { + $rules = [ + 'actor_id' => 'required|is_natural_no_zero', + 'message' => 'required|max_length[500]', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + $newReplyNote = new \ActivityPub\Entities\Note([ + 'actor_id' => $this->request->getPost('actor_id'), + 'in_reply_to_id' => $this->note->id, + 'message' => $this->request->getPost('message'), + 'published_at' => Time::now(), + ]); + + if (!model('NoteModel')->addReply($newReplyNote)) { + return redirect() + ->back() + ->withInput() + // TODO: translate + ->with('error', 'Couldn\'t create Reply'); + } + + // Reply note without preview card has been successfully created + return redirect()->back(); + } + + public function attemptRemoteAction($action) + { + $rules = [ + 'handle' => + 'regex_match[/^@?(?P<username>[\w\.\-]+)@(?P<host>[\w\.\-]+)(?P<port>:[\d]+)?$/]', + ]; + + if (!$this->validate($rules)) { + return redirect() + ->back() + ->withInput() + ->with('errors', $this->validator->getErrors()); + } + + helper('text'); + + // get webfinger data from actor + // parse activityPub id to get actor and domain + // check if actor and domain exist + try { + if ($parts = split_handle($this->request->getPost('handle'))) { + extract($parts); + + $data = get_webfinger_data($username, $domain); + } + } catch (\CodeIgniter\HTTP\Exceptions\HTTPException $e) { + return redirect() + ->back() + ->withInput() + ->with('error', lang('ActivityPub.follow.accountNotFound')); + } + + $ostatusKey = array_search( + 'http://ostatus.org/schema/1.0/subscribe', + array_column($data->links, 'rel'), + ); + + if (!$ostatusKey) { + // TODO: error, couldn't remote favourite/share/reply to note + // The instance doesn't allow its users remote actions on notes + return $this->response->setJSON([]); + } + + return redirect()->to( + str_replace( + '{uri}', + urlencode($this->note->uri), + $data->links[$ostatusKey]->template, + ), + ); + } + + public function attemptBlockActor() + { + model('ActorModel')->blockActor($this->note->actor->id); + + return redirect()->back(); + } + + public function attemptBlockDomain() + { + model('BlockedDomainModel')->blockDomain($this->note->actor->domain); + + return redirect()->back(); + } + + public function attemptDelete() + { + model('NoteModel', false)->removeNote($this->note); + + return redirect()->back(); + } +} diff --git a/app/Libraries/ActivityPub/Controllers/SchedulerController.php b/app/Libraries/ActivityPub/Controllers/SchedulerController.php new file mode 100644 index 0000000000000000000000000000000000000000..617290ae0c8ae5bf2d9b41fe13d60879cf737c15 --- /dev/null +++ b/app/Libraries/ActivityPub/Controllers/SchedulerController.php @@ -0,0 +1,36 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Controllers; + +use CodeIgniter\Controller; + +class SchedulerController extends Controller +{ + protected $helpers = ['activitypub']; + + public function activity() + { + // retrieve scheduled activities from database + $scheduledActivities = model('ActivityModel')->getScheduledActivities(); + + // Send activity to all followers + foreach ($scheduledActivities as $scheduledActivity) { + // send activity to all actor followers + send_activity_to_followers( + $scheduledActivity->actor, + json_encode($scheduledActivity->payload), + ); + + // set activity status to delivered + model('ActivityModel')->update($scheduledActivity->id, [ + 'status' => 'delivered', + ]); + } + } +} diff --git a/app/Libraries/ActivityPub/Controllers/WebFingerController.php b/app/Libraries/ActivityPub/Controllers/WebFingerController.php new file mode 100644 index 0000000000000000000000000000000000000000..df671370d7836fd26e2405386c8b1b1b74fa401b --- /dev/null +++ b/app/Libraries/ActivityPub/Controllers/WebFingerController.php @@ -0,0 +1,28 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Controllers; + +use ActivityPub\WebFinger; +use CodeIgniter\Controller; +use Exception; + +class WebFingerController extends Controller +{ + public function index() + { + try { + $webfinger = new WebFinger($this->request->getGet('resource')); + } catch (Exception $e) { + // return 404, actor not found + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + + return $this->response->setJSON($webfinger->toArray()); + } +} diff --git a/app/Libraries/ActivityPub/Core/AbstractObject.php b/app/Libraries/ActivityPub/Core/AbstractObject.php new file mode 100644 index 0000000000000000000000000000000000000000..d25c9db60e5801aab39a52b6b6b06ef44f8b5766 --- /dev/null +++ b/app/Libraries/ActivityPub/Core/AbstractObject.php @@ -0,0 +1,50 @@ +<?php + +/** + * This class defines the Object which is the + * primary base type for the Activity Streams vocabulary. + * + * Object is a reserved word in php, so the class is named ObjectType. + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Core; + +abstract class AbstractObject +{ + public function set($property, $value) + { + $this->$property = $value; + + return $this; + } + + public function toArray() + { + $objectVars = get_object_vars($this); + $array = []; + foreach ($objectVars as $key => $value) { + if ($key === 'context') { + $key = '@context'; + } + if (is_object($value) && $value instanceof self) { + $array[$key] = $value->toArray(); + } else { + $array[$key] = $value; + } + } + + // removes all NULL, FALSE and Empty Strings but leaves 0 (zero) values + return array_filter($array, function ($value) { + return $value !== null && $value !== false && $value !== ''; + }); + } + + public function toJSON() + { + return json_encode($this->toArray(), JSON_UNESCAPED_UNICODE); + } +} diff --git a/app/Libraries/ActivityPub/Core/Activity.php b/app/Libraries/ActivityPub/Core/Activity.php new file mode 100644 index 0000000000000000000000000000000000000000..5219bbfcdb65d22d81c177d7dbb29d0d173ae990 --- /dev/null +++ b/app/Libraries/ActivityPub/Core/Activity.php @@ -0,0 +1,32 @@ +<?php + +/** + * Activity objects are specializations of the base Object type + * that provide information about actions that have either + * already occurred, are in the process of occurring, + * or may occur in the future. + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Core; + +class Activity extends ObjectType +{ + /** + * @var string + */ + protected $type = 'Activity'; + + /** + * @var string + */ + protected $actor; + + /** + * @var string|\ActivityPub\Core\ObjectType + */ + protected $object; +} diff --git a/app/Libraries/ActivityPub/Core/ObjectType.php b/app/Libraries/ActivityPub/Core/ObjectType.php new file mode 100644 index 0000000000000000000000000000000000000000..53b865aca55534d7728a55b4150df1e0dabd95f1 --- /dev/null +++ b/app/Libraries/ActivityPub/Core/ObjectType.php @@ -0,0 +1,52 @@ +<?php + +/** + * This class defines the Object which is the + * primary base type for the Activity Streams vocabulary. + * + * Object is a reserved word in php, so the class is named ObjectType. + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Core; + +class ObjectType extends AbstractObject +{ + /** + * @var array|string + */ + protected $context = 'https://www.w3.org/ns/activitystreams'; + + /** + * @var string + */ + protected $id; + + /** + * @var string + */ + protected $type = 'Object'; + + /** + * @var string + */ + protected $content; + + /** + * @var string + */ + protected $published; + + /** + * @var array + */ + protected $to = ['https://www.w3.org/ns/activitystreams#Public']; + + /** + * @var array + */ + protected $cc; +} diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-010000_add_actors.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-010000_add_actors.php new file mode 100644 index 0000000000000000000000000000000000000000..9e6ab14cbead2e4aa08f58caad91461eca6a9932 --- /dev/null +++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-010000_add_actors.php @@ -0,0 +1,120 @@ +<?php + +/** + * Class AddActors + * Creates activitypub_actors table in database + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddActors extends Migration +{ + public function up() + { + $this->forge->addField([ + 'id' => [ + 'type' => 'INT', + 'unsigned' => true, + 'auto_increment' => true, + ], + 'uri' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + ], + 'username' => [ + 'type' => 'VARCHAR', + 'constraint' => 32, + ], + 'domain' => [ + 'type' => 'VARCHAR', + 'constraint' => 191, + ], + 'private_key' => [ + 'type' => 'TEXT', + 'null' => true, + ], + 'public_key' => [ + 'type' => 'TEXT', + 'null' => true, + ], + 'display_name' => [ + 'type' => 'VARCHAR', + 'constraint' => 128, + ], + 'summary' => [ + 'type' => 'TEXT', + 'null' => true, + ], + 'avatar_image_url' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + ], + // constraint is 13 because the longest safe mimetype for images is image/svg+xml, + // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#image_types + 'avatar_image_mimetype' => [ + 'type' => 'VARCHAR', + 'constraint' => 13, + ], + 'cover_image_url' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + 'null' => true, + ], + 'cover_image_mimetype' => [ + 'type' => 'VARCHAR', + 'constraint' => 13, + 'null' => true, + ], + 'inbox_url' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + ], + 'outbox_url' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + 'null' => true, + ], + 'followers_url' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + 'null' => true, + ], + 'followers_count' => [ + 'type' => 'INT', + 'unsigned' => true, + 'default' => 0, + ], + 'notes_count' => [ + 'type' => 'INT', + 'unsigned' => true, + 'default' => 0, + ], + 'is_blocked' => [ + 'type' => 'TINYINT', + 'constraint' => 1, + 'default' => 0, + ], + 'created_at' => [ + 'type' => 'DATETIME', + ], + 'updated_at' => [ + 'type' => 'DATETIME', + ], + ]); + $this->forge->addPrimaryKey('id'); + $this->forge->addUniqueKey('uri'); + $this->forge->addUniqueKey(['username', 'domain']); + $this->forge->createTable('activitypub_actors'); + } + + public function down() + { + $this->forge->dropTable('activitypub_actors'); + } +} diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-020000_add_notes.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-020000_add_notes.php new file mode 100644 index 0000000000000000000000000000000000000000..22f42938c4a3a1020b7d2af0797af8a5dd026c02 --- /dev/null +++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-020000_add_notes.php @@ -0,0 +1,108 @@ +<?php + +/** + * Class AddNotes + * Creates activitypub_notes table in database + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddNotes extends Migration +{ + public function up() + { + $this->forge->addField([ + 'id' => [ + 'type' => 'BINARY', + 'constraint' => 16, + ], + 'uri' => [ + 'type' => 'VARCHAR', + 'constraint' => 191, + ], + 'actor_id' => [ + 'type' => 'INT', + 'unsigned' => true, + ], + 'in_reply_to_id' => [ + 'type' => 'BINARY', + 'constraint' => 16, + 'null' => true, + ], + 'reblog_of_id' => [ + 'type' => 'BINARY', + 'constraint' => 16, + 'null' => true, + ], + 'message' => [ + 'type' => 'VARCHAR', + 'constraint' => 500, + 'null' => true, + ], + 'message_html' => [ + 'type' => 'VARCHAR', + 'constraint' => 600, + 'null' => true, + ], + 'favourites_count' => [ + 'type' => 'INT', + 'unsigned' => true, + 'default' => 0, + ], + 'reblogs_count' => [ + 'type' => 'INT', + 'unsigned' => true, + 'default' => 0, + ], + 'replies_count' => [ + 'type' => 'INT', + 'unsigned' => true, + 'default' => 0, + ], + 'published_at' => [ + 'type' => 'DATETIME', + 'null' => true, + ], + 'created_at' => [ + 'type' => 'DATETIME', + ], + ]); + $this->forge->addPrimaryKey('id'); + $this->forge->addUniqueKey('uri'); + // FIXME: an actor must reblog a note only once + // $this->forge->addUniqueKey(['actor_id', 'reblog_of_id']); + $this->forge->addForeignKey( + 'actor_id', + 'activitypub_actors', + 'id', + false, + 'CASCADE', + ); + $this->forge->addForeignKey( + 'in_reply_to_id', + 'activitypub_notes', + 'id', + false, + 'CASCADE', + ); + $this->forge->addForeignKey( + 'reblog_of_id', + 'activitypub_notes', + 'id', + false, + 'CASCADE', + ); + $this->forge->createTable('activitypub_notes'); + } + + public function down() + { + $this->forge->dropTable('activitypub_notes'); + } +} diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_activities.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_activities.php new file mode 100644 index 0000000000000000000000000000000000000000..11555bf1a046175cf9420373cf0f8aed267386df --- /dev/null +++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_activities.php @@ -0,0 +1,90 @@ +<?php + +/** + * Class AddActivities + * Creates activitypub_activities table in database + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddActivities extends Migration +{ + public function up() + { + $this->forge->addField([ + 'id' => [ + 'type' => 'BINARY', + 'constraint' => 16, + ], + 'actor_id' => [ + 'type' => 'INT', + 'unsigned' => true, + ], + 'target_actor_id' => [ + 'type' => 'INT', + 'unsigned' => true, + 'null' => true, + ], + 'note_id' => [ + 'type' => 'BINARY', + 'constraint' => 16, + 'null' => true, + ], + 'type' => [ + 'type' => 'VARCHAR', + 'constraint' => 100, + ], + 'payload' => [ + 'type' => 'JSON', + ], + 'status' => [ + 'type' => 'ENUM', + 'constraint' => ['queued', 'delivered'], + 'null' => true, + 'default' => null, + ], + 'scheduled_at' => [ + 'type' => 'DATETIME', + 'null' => true, + 'default' => null, + ], + 'created_at' => [ + 'type' => 'DATETIME', + ], + ]); + $this->forge->addPrimaryKey('id'); + $this->forge->addForeignKey( + 'actor_id', + 'activitypub_actors', + 'id', + false, + 'CASCADE', + ); + $this->forge->addForeignKey( + 'target_actor_id', + 'activitypub_actors', + 'id', + false, + 'CASCADE', + ); + $this->forge->addForeignKey( + 'note_id', + 'activitypub_notes', + 'id', + false, + 'CASCADE', + ); + $this->forge->createTable('activitypub_activities'); + } + + public function down() + { + $this->forge->dropTable('activitypub_activities'); + } +} diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_favourites.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_favourites.php new file mode 100644 index 0000000000000000000000000000000000000000..d76d54523a0492a7ec957a29356fca2ad85b6cac --- /dev/null +++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_favourites.php @@ -0,0 +1,55 @@ +<?php + +/** + * Class AddFavourites + * Creates activitypub_favourites table in database + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddFavourites extends Migration +{ + public function up() + { + $this->forge->addField([ + 'actor_id' => [ + 'type' => 'INT', + 'unsigned' => true, + ], + 'note_id' => [ + 'type' => 'BINARY', + 'constraint' => 16, + ], + ]); + $this->forge->addField( + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()', + ); + $this->forge->addPrimaryKey(['actor_id', 'note_id']); + $this->forge->addForeignKey( + 'actor_id', + 'activitypub_actors', + 'id', + false, + 'CASCADE', + ); + $this->forge->addForeignKey( + 'note_id', + 'activitypub_notes', + 'id', + false, + 'CASCADE', + ); + $this->forge->createTable('activitypub_favourites'); + } + + public function down() + { + $this->forge->dropTable('activitypub_favourites'); + } +} diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_follows.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_follows.php new file mode 100644 index 0000000000000000000000000000000000000000..f3145f4f3c3c815e32d9ccfe22ae2106a7728950 --- /dev/null +++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_follows.php @@ -0,0 +1,57 @@ +<?php + +/** + * Class AddFollowers + * Creates activitypub_followers table in database + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddFollowers extends Migration +{ + public function up() + { + $this->forge->addField([ + 'actor_id' => [ + 'type' => 'INT', + 'unsigned' => true, + 'comment' => 'Actor that is following', + ], + 'target_actor_id' => [ + 'type' => 'INT', + 'unsigned' => true, + 'comment' => 'Actor that is followed', + ], + ]); + $this->forge->addField( + '`created_at` timestamp NOT NULL DEFAULT current_timestamp()', + ); + $this->forge->addPrimaryKey(['actor_id', 'target_actor_id']); + $this->forge->addForeignKey( + 'actor_id', + 'activitypub_actors', + 'id', + false, + 'CASCADE', + ); + $this->forge->addForeignKey( + 'target_actor_id', + 'activitypub_actors', + 'id', + false, + 'CASCADE', + ); + $this->forge->createTable('activitypub_follows'); + } + + public function down() + { + $this->forge->dropTable('activitypub_follows'); + } +} diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_preview_cards.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_preview_cards.php new file mode 100644 index 0000000000000000000000000000000000000000..eaa07eb47cdcf32f10693bd4b2d03ab610d85ac6 --- /dev/null +++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_preview_cards.php @@ -0,0 +1,82 @@ +<?php + +/** + * Class AddPreviewCards + * Creates activitypub_preview_cards table in database + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddPreviewCards extends Migration +{ + public function up() + { + $this->forge->addField([ + 'id' => [ + 'type' => 'INT', + 'unsigned' => true, + 'auto_increment' => true, + ], + 'url' => [ + 'type' => 'VARCHAR', + 'constraint' => 512, + ], + 'title' => [ + 'type' => 'VARCHAR', + 'constraint' => 128, + ], + 'description' => ['type' => 'TEXT'], + 'type' => [ + 'type' => 'ENUM', + 'constraint' => ['link', 'video', 'image', 'rich'], + 'default' => 'link', + ], + 'author_name' => [ + 'type' => 'VARCHAR', + 'constraint' => 64, + 'null' => true, + ], + 'author_url' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + 'null' => true, + ], + 'provider_name' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + ], + 'provider_url' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + ], + 'image' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + ], + 'html' => [ + 'type' => 'TEXT', + ], + 'updated_at' => [ + 'type' => 'DATETIME', + ], + 'created_at' => [ + 'type' => 'DATETIME', + ], + ]); + + $this->forge->addPrimaryKey('id'); + $this->forge->addUniqueKey('url'); + $this->forge->createTable('activitypub_preview_cards'); + } + + public function down() + { + $this->forge->dropTable('activitypub_preview_cards'); + } +} diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-110000_add_notes_preview_cards.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-110000_add_notes_preview_cards.php new file mode 100644 index 0000000000000000000000000000000000000000..25fd22f9f743e2348f68c4d95a7df0a40971d57e --- /dev/null +++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-110000_add_notes_preview_cards.php @@ -0,0 +1,53 @@ +<?php + +/** + * Class AddNotePreviewCards + * Creates activitypub_notes_preview_cards table in database + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddNotesPreviewCards extends Migration +{ + public function up() + { + $this->forge->addField([ + 'note_id' => [ + 'type' => 'BINARY', + 'constraint' => 16, + ], + 'preview_card_id' => [ + 'type' => 'INT', + 'unsigned' => true, + ], + ]); + + $this->forge->addPrimaryKey(['note_id', 'preview_card_id']); + $this->forge->addForeignKey( + 'note_id', + 'activitypub_notes', + 'id', + false, + 'CASCADE', + ); + $this->forge->addForeignKey( + 'preview_card_id', + 'activitypub_preview_cards', + 'id', + false, + 'CASCADE', + ); + $this->forge->createTable('activitypub_notes_preview_cards'); + } + + public function down() + { + $this->forge->dropTable('activitypub_notes_preview_cards'); + } +} diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-120000_add_blocked_domains.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-120000_add_blocked_domains.php new file mode 100644 index 0000000000000000000000000000000000000000..3b136dca55086602ff97721498e78aacbfd945fd --- /dev/null +++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-120000_add_blocked_domains.php @@ -0,0 +1,37 @@ +<?php + +/** + * Class AddBlockedDomains + * Creates activitypub_blocked_domains table in database + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Database\Migrations; + +use CodeIgniter\Database\Migration; + +class AddBlockedDomains extends Migration +{ + public function up() + { + $this->forge->addField([ + 'name' => [ + 'type' => 'VARCHAR', + 'constraint' => 191, + ], + 'created_at' => [ + 'type' => 'DATETIME', + ], + ]); + $this->forge->addPrimaryKey('name'); + $this->forge->createTable('activitypub_blocked_domains'); + } + + public function down() + { + $this->forge->dropTable('activitypub_blocked_domains'); + } +} diff --git a/app/Libraries/ActivityPub/Entities/Activity.php b/app/Libraries/ActivityPub/Entities/Activity.php new file mode 100644 index 0000000000000000000000000000000000000000..14a7ed0dd4f8395f690118326c749eb9d675d7b9 --- /dev/null +++ b/app/Libraries/ActivityPub/Entities/Activity.php @@ -0,0 +1,99 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Entities; + +use Michalsn\Uuid\UuidEntity; + +class Activity extends UuidEntity +{ + protected $uuids = ['id', 'note_id']; + + /** + * @var \ActivityPub\Entities\Actor + */ + protected $actor; + + /** + * @var \ActivityPub\Entities\Actor + */ + protected $target_actor; + + /** + * @var \ActivityPub\Entities\Note + */ + protected $note; + + protected $dates = ['scheduled_at', 'created_at']; + + protected $casts = [ + 'id' => 'string', + 'actor_id' => 'integer', + 'target_actor_id' => '?integer', + 'note_id' => '?string', + 'type' => 'string', + 'payload' => 'json', + 'status' => '?string', + ]; + + /** + * @return \ActivityPub\Entities\Actor + */ + public function getActor() + { + if (empty($this->actor_id)) { + throw new \RuntimeException( + 'Activity must have an actor_id before getting the actor.', + ); + } + + if (empty($this->actor)) { + $this->actor = model('ActorModel')->getActorById($this->actor_id); + } + + return $this->actor; + } + + /** + * @return \ActivityPub\Entities\Actor + */ + public function getTargetActor() + { + if (empty($this->target_actor_id)) { + throw new \RuntimeException( + 'Activity must have a target_actor_id before getting the target actor.', + ); + } + + if (empty($this->target_actor)) { + $this->target_actor = model('ActorModel')->getActorById( + $this->target_actor_id, + ); + } + + return $this->target_actor; + } + + /** + * @return \ActivityPub\Entities\Note + */ + public function getNote() + { + if (empty($this->note_id)) { + throw new \RuntimeException( + 'Activity must have a note_id before getting note.', + ); + } + + if (empty($this->note)) { + $this->note = model('NoteModel')->getNoteById($this->note_id); + } + + return $this->note; + } +} diff --git a/app/Libraries/ActivityPub/Entities/Actor.php b/app/Libraries/ActivityPub/Entities/Actor.php new file mode 100644 index 0000000000000000000000000000000000000000..2d8d769dfaff3d30772c58abe96be2747829f771 --- /dev/null +++ b/app/Libraries/ActivityPub/Entities/Actor.php @@ -0,0 +1,84 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Entities; + +use CodeIgniter\Entity; + +class Actor extends Entity +{ + /** + * @var string + */ + protected $key_id; + + /** + * @var \ActivityPub\Entities\Actor[] + */ + protected $followers; + + /** + * @var boolean + */ + protected $is_local; + + protected $casts = [ + 'id' => 'integer', + 'uri' => 'string', + 'username' => 'string', + 'domain' => 'string', + 'display_name' => 'string', + 'summary' => '?string', + 'private_key' => '?string', + 'public_key' => '?string', + 'avatar_image_url' => 'string', + 'avatar_image_mimetype' => 'string', + 'cover_image_url' => '?string', + 'cover_image_mimetype' => '?string', + 'inbox_url' => 'string', + 'outbox_url' => '?string', + 'followers_url' => '?string', + 'followers_count' => 'integer', + 'notes_count' => 'integer', + 'is_blocked' => 'boolean', + ]; + + public function getKeyId() + { + return $this->uri . '#main-key'; + } + + public function getIsLocal() + { + if (!$this->is_local) { + $uri = current_url(true); + + $this->is_local = + $this->domain === + $uri->getHost() . + ($uri->getPort() ? ':' . $uri->getPort() : ''); + } + + return $this->is_local; + } + + public function getFollowers() + { + if (empty($this->id)) { + throw new \RuntimeException( + 'Actor must be created before getting followers.', + ); + } + + if (empty($this->followers)) { + $this->followers = model('ActorModel')->getFollowers($this->id); + } + + return $this->followers; + } +} diff --git a/app/Libraries/ActivityPub/Entities/BlockedDomain.php b/app/Libraries/ActivityPub/Entities/BlockedDomain.php new file mode 100644 index 0000000000000000000000000000000000000000..bf609e7cb4470bd09796b1e0a3f5272e7973f1e4 --- /dev/null +++ b/app/Libraries/ActivityPub/Entities/BlockedDomain.php @@ -0,0 +1,18 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Entities; + +use CodeIgniter\Entity; + +class BlockedDomain extends Entity +{ + protected $casts = [ + 'name' => 'string', + ]; +} diff --git a/app/Libraries/ActivityPub/Entities/Favourite.php b/app/Libraries/ActivityPub/Entities/Favourite.php new file mode 100644 index 0000000000000000000000000000000000000000..759448d433f5a545b588a6a97f738fec012d7265 --- /dev/null +++ b/app/Libraries/ActivityPub/Entities/Favourite.php @@ -0,0 +1,21 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Entities; + +use Michalsn\Uuid\UuidEntity; + +class Favourite extends UuidEntity +{ + protected $uuids = ['note_id']; + + protected $casts = [ + 'actor_id' => 'integer', + 'note_id' => 'integer', + ]; +} diff --git a/app/Libraries/ActivityPub/Entities/Follow.php b/app/Libraries/ActivityPub/Entities/Follow.php new file mode 100644 index 0000000000000000000000000000000000000000..dea45eed6ca80a24dcc69d3350a3083e0767fb49 --- /dev/null +++ b/app/Libraries/ActivityPub/Entities/Follow.php @@ -0,0 +1,19 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Entities; + +use CodeIgniter\Entity; + +class Follow extends Entity +{ + protected $casts = [ + 'actor_id' => 'integer', + 'target_actor_id' => 'integer', + ]; +} diff --git a/app/Libraries/ActivityPub/Entities/Note.php b/app/Libraries/ActivityPub/Entities/Note.php new file mode 100644 index 0000000000000000000000000000000000000000..9e1736d0c24b307a96b70feea744c74b47b1de3d --- /dev/null +++ b/app/Libraries/ActivityPub/Entities/Note.php @@ -0,0 +1,200 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Entities; + +use Michalsn\Uuid\UuidEntity; + +class Note extends UuidEntity +{ + protected $uuids = ['id', 'in_reply_to_id', 'reblog_of_id']; + + /** + * @var \ActivityPub\Entities\Actor + */ + protected $actor; + + /** + * @var boolean + */ + protected $is_reply; + + /** + * @var \ActivityPub\Entities\Note + */ + protected $reply_to_note; + + /** + * @var boolean + */ + protected $is_reblog; + + /** + * @var \ActivityPub\Entities\Note + */ + protected $reblog_of_note; + + /** + * @var \ActivityPub\Entities\PreviewCard + */ + protected $preview_card; + + /** + * @var \ActivityPub\Entities\Note[] + */ + protected $replies; + + /** + * @var \ActivityPub\Entities\Note[] + */ + protected $reblogs; + + protected $dates = ['published_at', 'created_at']; + + protected $casts = [ + 'id' => 'string', + 'uri' => 'string', + 'actor_id' => 'integer', + 'in_reply_to_id' => '?string', + 'reblog_of_id' => '?string', + 'message' => 'string', + 'message_html' => 'string', + 'favourites_count' => 'integer', + 'reblogs_count' => 'integer', + 'replies_count' => 'integer', + ]; + + /** + * Returns the note's actor + * + * @return \ActivityPub\Entities\Actor + */ + public function getActor() + { + if (empty($this->actor_id)) { + throw new \RuntimeException( + 'Note must have an actor_id before getting actor.', + ); + } + + if (empty($this->actor)) { + $this->actor = model('ActorModel')->getActorById($this->actor_id); + } + + return $this->actor; + } + + public function getPreviewCard() + { + if (empty($this->id)) { + throw new \RuntimeException( + 'Note must be created before getting preview_card.', + ); + } + + if (empty($this->preview_card)) { + $this->preview_card = model('PreviewCardModel')->getNotePreviewCard( + $this->id, + ); + } + + return $this->preview_card; + } + + public function getReplies() + { + if (empty($this->id)) { + throw new \RuntimeException( + 'Note must be created before getting replies.', + ); + } + + if (empty($this->replies)) { + $this->replies = model('NoteModel')->getNoteReplies($this->id); + } + + return $this->replies; + } + + public function getIsReply() + { + $this->is_reply = $this->in_reply_to_id !== null; + + return $this->is_reply; + } + + public function getReplyToNote() + { + if (empty($this->in_reply_to_id)) { + throw new \RuntimeException('Note is not a reply.'); + } + + if (empty($this->reply_to_note)) { + $this->reply_to_note = model('NoteModel')->getNoteById( + $this->in_reply_to_id, + ); + } + + return $this->reply_to_note; + } + + public function getReblogs() + { + if (empty($this->id)) { + throw new \RuntimeException( + 'Note must be created before getting reblogs.', + ); + } + + if (empty($this->reblogs)) { + $this->reblogs = model('NoteModel')->getNoteReblogs( + service('uuid') + ->fromString($this->id) + ->getBytes(), + ); + } + + return $this->reblogs; + } + + public function getIsReblog() + { + return $this->reblog_of_id != null; + } + + public function getReblogOfNote() + { + if (empty($this->reblog_of_id)) { + throw new \RuntimeException('Note is not a reblog.'); + } + + if (empty($this->reblog_of_note)) { + $this->reblog_of_note = model('NoteModel')->getNoteById( + $this->reblog_of_id, + ); + } + + return $this->reblog_of_note; + } + + public function setMessage(string $message) + { + helper('activitypub'); + + $messageWithoutTags = strip_tags($message); + + $this->attributes['message'] = $messageWithoutTags; + $this->attributes['message_html'] = str_replace( + "\n", + '<br />', + linkify($messageWithoutTags), + ); + + return $this; + } +} diff --git a/app/Libraries/ActivityPub/Entities/PreviewCard.php b/app/Libraries/ActivityPub/Entities/PreviewCard.php new file mode 100644 index 0000000000000000000000000000000000000000..cd3523c460c689acb836b53b33e8f6a70dac36b4 --- /dev/null +++ b/app/Libraries/ActivityPub/Entities/PreviewCard.php @@ -0,0 +1,29 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Entities; + +use CodeIgniter\Entity; + +class PreviewCard extends Entity +{ + protected $casts = [ + 'id' => 'integer', + 'note_id' => 'string', + 'url' => 'string', + 'title' => 'string', + 'description' => 'string', + 'type' => 'string', + 'author_name' => '?string', + 'author_url' => '?string', + 'provider_name' => '?string', + 'provider_url' => '?string', + 'image' => '?string', + 'html' => '?string', + ]; +} diff --git a/app/Libraries/ActivityPub/Filters/ActivityPubFilter.php b/app/Libraries/ActivityPub/Filters/ActivityPubFilter.php new file mode 100644 index 0000000000000000000000000000000000000000..bf9d870838dd517a2bed2d3da8df109018fc2b19 --- /dev/null +++ b/app/Libraries/ActivityPub/Filters/ActivityPubFilter.php @@ -0,0 +1,99 @@ +<?php + +namespace ActivityPub\Filters; + +use ActivityPub\HttpSignature; +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\HTTP\ResponseInterface; +use CodeIgniter\Filters\FilterInterface; +use CodeIgniter\HTTP\URI; + +class ActivityPubFilter implements FilterInterface +{ + /** + * Do whatever processing this filter needs to do. + * By default it should not return anything during + * normal execution. However, when an abnormal state + * is found, it should return an instance of + * CodeIgniter\HTTP\Response. If it does, script + * execution will end and that Response will be + * sent back to the client, allowing for error pages, + * redirects, etc. + * + * @param \CodeIgniter\HTTP\RequestInterface $request + * @param array|null $params + * + * @return mixed + */ + public function before(RequestInterface $request, $params = null) + { + if (empty($params)) { + return; + } + + if (in_array('verify-activitystream', $params)) { + $negotiate = \Config\Services::negotiator(); + + $allowedContentTypes = [ + 'application/ld+json; profile="https://www.w3.org/ns/activitystreams', + 'application/activity+json', + ]; + + if (empty($negotiate->media($allowedContentTypes))) { + // return $this->response->setStatusCode(415)->setJSON([]); + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + } + + if (in_array('verify-blocks', $params)) { + $payload = $request->getJSON(); + + $actorUri = $payload->actor; + $domain = (new URI($actorUri))->getHost(); + + // check first if domain is blocked + if (model('BlockedDomainModel')->isDomainBlocked($domain)) { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + + // check if actor is blocked + if (model('ActorModel')->isActorBlocked($actorUri)) { + throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); + } + } + + if (in_array('verify-signature', $params)) { + try { + // securityCheck: check activity signature before handling it + (new HttpSignature())->verify(); + } catch (\Exception $e) { + // Invalid HttpSignature (401 = unauthorized) + // TODO: show error message? + return service('response')->setStatusCode(401); + } + } + } + + //-------------------------------------------------------------------- + + /** + * Allows After filters to inspect and modify the response + * object as needed. This method does not allow any way + * to stop execution of other after filters, short of + * throwing an Exception or Error. + * + * @param \CodeIgniter\HTTP\RequestInterface $request + * @param \CodeIgniter\HTTP\ResponseInterface $response + * @param array|null $arguments + * + * @return void + */ + public function after( + RequestInterface $request, + ResponseInterface $response, + $arguments = null + ) { + } + + //-------------------------------------------------------------------- +} diff --git a/app/Libraries/ActivityPub/Helpers/activitypub_helper.php b/app/Libraries/ActivityPub/Helpers/activitypub_helper.php new file mode 100644 index 0000000000000000000000000000000000000000..b42273718c00cc05bca95da39255c926774205ca --- /dev/null +++ b/app/Libraries/ActivityPub/Helpers/activitypub_helper.php @@ -0,0 +1,513 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +use ActivityPub\Activities\AcceptActivity; +use ActivityPub\ActivityRequest; +use CodeIgniter\HTTP\Exceptions\HTTPException; + +if (!function_exists('get_webfinger_data')) { + /** + * Retrieve actor webfinger data from username and domain + * + * @param string $username + * @param string $domain + * @return mixed + * @throws HTTPException + * @throws InvalidArgumentException + */ + function get_webfinger_data($username, $domain) + { + $webfingerUri = new \CodeIgniter\HTTP\URI(); + $webfingerUri->setScheme('https'); + $webfingerUri->setHost($domain); + isset($port) && $webfingerUri->setPort((int) $port); + $webfingerUri->setPath('/.well-known/webfinger'); + $webfingerUri->setQuery("resource=acct:{$username}@{$domain}"); + + $webfingerRequest = new ActivityRequest($webfingerUri); + $webfingerResponse = $webfingerRequest->get(); + + return json_decode($webfingerResponse->getBody()); + } +} + +if (!function_exists('split_handle')) { + /** + * Splits handle into its parts (username, host and port) + * + * @param string $handle + * @return bool|array + */ + function split_handle(string $handle) + { + if ( + !preg_match( + '/^@?(?P<username>[\w\.\-]+)@(?P<domain>[\w\.\-]+)(?P<port>:[\d]+)?$/', + $handle, + $matches, + ) + ) { + return false; + } + + return $matches; + } +} + +if (!function_exists('accept_follow')) { + /** + * Sends an accept activity to the targetActor's inbox + * + * @param \ActivityPub\Entities\Actor $actor Actor which accepts the follow + * @param \ActivityPub\Entities\Actor $targetActor Actor which receives the accept follow + * @param string $objectId + * @return void + */ + function accept_follow($actor, $targetActor, $objectId) + { + $acceptActivity = new AcceptActivity(); + $acceptActivity->set('actor', $actor->uri)->set('object', $objectId); + + $db = \Config\Database::connect(); + $db->transStart(); + + $activityModel = model('ActivityModel'); + $activityId = $activityModel->newActivity( + 'Accept', + $actor->id, + $targetActor->id, + null, + $acceptActivity->toJSON(), + ); + + $acceptActivity->set( + 'id', + url_to('activity', $actor->username, $activityId), + ); + + $activityModel->update($activityId, [ + 'payload' => $acceptActivity->toJSON(), + ]); + + try { + $acceptRequest = new ActivityRequest( + $targetActor->inbox_url, + $acceptActivity->toJSON(), + ); + $acceptRequest->sign($actor->key_id, $actor->private_key); + $acceptRequest->post(); + } catch (\Exception $e) { + $db->transRollback(); + } + + $db->transComplete(); + } +} + +if (!function_exists('send_activity_to_followers')) { + /** + * Sends an activity to all actor followers + * + * @param \ActivityPub\Entities\Actor $actor + * @param string $activity + * @return void + */ + function send_activity_to_followers($actor, $activityPayload) + { + foreach ($actor->followers as $follower) { + try { + $acceptRequest = new ActivityRequest( + $follower->inbox_url, + $activityPayload, + ); + $acceptRequest->sign($actor->key_id, $actor->private_key); + $acceptRequest->post(); + } catch (\Exception $e) { + // log error + log_message('critical', $e); + } + } + } +} + +if (!function_exists('extract_urls_from_message')) { + /** + * Returns an array of all urls from a string + * + * @param mixed $message + * @return string[] + */ + function extract_urls_from_message($message) + { + preg_match_all( + '~(?:(https?)://([^\s<]+)|(www\.[^\s<]+?\.[^\s<]+))(?<![\.,:])~i', + $message, + $match, + ); + + return $match[0]; + } +} + +if (!function_exists('create_preview_card_from_url')) { + /** + * Extract open graph metadata from given url and create preview card + * + * @param \CodeIgniter\HTTP\URI $url + * @return \ActivityPub\Entities\PreviewCard|null + */ + function create_preview_card_from_url($url) + { + $essence = new \Essence\Essence([ + 'filters' => [ + 'OEmbedProvider' => '//', + 'OpenGraphProvider' => '//', + 'TwitterCardsProvider' => '//', + ], + ]); + $media = $essence->extract((string) $url); + + if ($media) { + $typeMapping = [ + 'photo' => 'image', + 'video' => 'video', + 'website' => 'link', + 'rich' => 'rich', + ]; + + // Check that, at least, the url and title are set + if ($media->url && $media->title) { + $preview_card = new \ActivityPub\Entities\PreviewCard([ + 'url' => (string) $url, + 'title' => $media->title, + 'description' => $media->description, + 'type' => isset($typeMapping[$media->type]) + ? $typeMapping[$media->type] + : 'link', + 'author_name' => $media->authorName, + 'author_url' => $media->authorUrl, + 'provider_name' => $media->providerName, + 'provider_url' => $media->providerUrl, + 'image' => $media->thumbnailUrl, + 'html' => $media->html, + ]); + + if ( + !($newPreviewCardId = model('PreviewCardModel')->insert( + $preview_card, + true, + )) + ) { + return null; + } + + $preview_card->id = $newPreviewCardId; + return $preview_card; + } + } + + return null; + } +} + +if (!function_exists('get_or_create_preview_card_from_url')) { + /** + * Extract open graph metadata from given url and create preview card + * + * @param \CodeIgniter\HTTP\URI $url + * @return \ActivityPub\Entities\PreviewCard|null + */ + function get_or_create_preview_card_from_url($url) + { + // check if preview card has already been generated + if ( + $previewCard = model('PreviewCardModel')->getPreviewCardFromUrl( + (string) $url, + ) + ) { + return $previewCard; + } + + // create preview card + return create_preview_card_from_url($url); + } +} + +if (!function_exists('get_or_create_actor_from_uri')) { + /** + * Retrieves actor from database using the actor uri + * If Actor is not present, it creates the record in the database and returns it. + * + * @param string $actorUri + * @return \ActivityPub\Entities\Actor|null + */ + function get_or_create_actor_from_uri($actorUri) + { + // check if actor exists in database already and return it + if ($actor = model('ActorModel')->getActorByUri($actorUri)) { + return $actor; + } + + // if the actor doesn't exist, request actorUri to create it + return create_actor_from_uri($actorUri); + } +} + +if (!function_exists('get_or_create_actor')) { + /** + * Retrieves actor from database using the actor username and domain + * If actor is not present, it creates the record in the database and returns it. + * + * @param string $username + * @param string $domain + * @return \ActivityPub\Entities\Actor|null + */ + function get_or_create_actor($username, $domain) + { + // check if actor exists in database already and return it + if ( + $actor = model('ActorModel')->getActorByUsername($username, $domain) + ) { + return $actor; + } + + // get actorUri with webfinger request + $webfingerData = get_webfinger_data($username, $domain); + $actorUriKey = array_search( + 'self', + array_column($webfingerData->links, 'rel'), + ); + + return create_actor_from_uri($webfingerData->links[$actorUriKey]->href); + } +} + +if (!function_exists('create_actor_from_uri')) { + /** + * Creates actor record in database using + * the info gathered from the actorUri parameter + * + * @param string $actorUri + * @return \ActivityPub\Entities\Actor|null + */ + function create_actor_from_uri($actorUri) + { + $activityRequest = new ActivityRequest($actorUri); + $actorResponse = $activityRequest->get(); + $actorPayload = json_decode($actorResponse->getBody()); + + $newActor = new \ActivityPub\Entities\Actor(); + $newActor->uri = $actorUri; + $newActor->username = $actorPayload->preferredUsername; + $newActor->domain = $activityRequest->getDomain(); + $newActor->public_key = $actorPayload->publicKey->publicKeyPem; + $newActor->private_key = null; + $newActor->display_name = $actorPayload->name; + $newActor->summary = $actorPayload->summary; + if (property_exists($actorPayload, 'icon')) { + $newActor->avatar_image_url = $actorPayload->icon->url; + $newActor->avatar_image_mimetype = $actorPayload->icon->mediaType; + } + + if (property_exists($actorPayload, 'image')) { + $newActor->cover_image_url = $actorPayload->image->url; + $newActor->cover_image_mimetype = $actorPayload->image->mediaType; + } + $newActor->inbox_url = $actorPayload->inbox; + $newActor->outbox_url = $actorPayload->outbox; + $newActor->followers_url = $actorPayload->followers; + + if (!($newActorId = model('ActorModel')->insert($newActor, true))) { + return null; + } + + $newActor->id = $newActorId; + return $newActor; + } +} + +if (!function_exists('get_current_domain')) { + /** + * Returns instance's domain name + * + * @return string + * @throws HTTPException + */ + function get_current_domain() + { + $uri = current_url(true); + return $uri->getHost() . ($uri->getPort() ? ':' . $uri->getPort() : ''); + } +} + +if (!function_exists('extract_text_from_html')) { + /** + * Extracts the text from html content + * + * @param mixed $content + * @return string|string[]|null + */ + function extract_text_from_html($content) + { + return preg_replace('/\s+/', ' ', strip_tags($content)); + } +} + +if (!function_exists('linkify')) { + /** + * Turn all link elements in clickable links. + * Transforms urls and handles + * + * @param string $value + * @param array $protocols http/https, ftp, mail, twitter + * @param array $attributes + * @return string + */ + function linkify($text, $protocols = ['http', 'handle']) + { + $links = []; + + // Extract text links for each protocol + foreach ((array) $protocols as $protocol) { + switch ($protocol) { + case 'http': + case 'https': + $text = preg_replace_callback( + '~(?:(https?)://([^\s<]+)|(www\.[^\s<]+?\.[^\s<]+))(?<![\.,:])~i', + function ($match) use ($protocol, &$links) { + if ($match[1]) { + $protocol = $match[1]; + } + $link = $match[2] ?: $match[3]; + + helper('text'); + + $link = preg_replace( + '#^www\.(.+\.)#i', + '$1', + $link, + ); + + return '<' . + array_push( + $links, + anchor( + "$protocol://$link", + ellipsize(rtrim($link, '/'), 30), + [ + 'target' => '_blank', + 'rel' => 'noopener noreferrer', + ], + ), + ) . + '>'; + }, + $text, + ); + break; + case 'handle': + $text = preg_replace_callback( + '~(?<!\w)@(?<username>\w++)(?:@(?<domain>(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]))?~', + function ($match) use (&$links) { + // check if host is set and look for actor in database + if (isset($match['host'])) { + if ( + $actor = model( + 'ActorModel', + )->getActorByUsername( + $match['username'], + $match['domain'], + ) + ) { + // TODO: check that host is local to remove target blank? + return '<' . + array_push( + $links, + anchor($actor->uri, $match[0], [ + 'target' => '_blank', + 'rel' => 'noopener noreferrer', + ]), + ) . + '>'; + } else { + try { + $actor = get_or_create_actor( + $match['username'], + $match['domain'], + ); + return '<' . + array_push( + $links, + anchor($actor->uri, $match[0], [ + 'target' => '_blank', + 'rel' => + 'noopener noreferrer', + ]), + ) . + '>'; + } catch (\CodeIgniter\HTTP\Exceptions\HTTPException $e) { + // Couldn't retrieve actor, do not wrap the text in link + return '<' . + array_push($links, $match[0]) . + '>'; + } + } + } else { + if ( + $actor = model( + 'ActorModel', + )->getActorByUsername($match['username']) + ) { + return '<' . + array_push( + $links, + anchor($actor->uri, $match[0]), + ) . + '>'; + } + + return '<' . + array_push($links, $match[0]) . + '>'; + } + }, + $text, + ); + break; + default: + $text = preg_replace_callback( + '~' . + preg_quote($protocol, '~') . + '://([^\s<]+?)(?<![\.,:])~i', + function ($match) use ($protocol, &$links) { + return '<' . + array_push( + $links, + anchor("$protocol://$match[1]", $match[1], [ + 'target' => '_blank', + 'rel' => 'noopener noreferrer', + ]), + ) . + '>'; + }, + $text, + ); + break; + } + } + + // Insert all links + return preg_replace_callback( + '/<(\d+)>/', + function ($match) use (&$links) { + return $links[$match[1] - 1]; + }, + $text, + ); + } +} diff --git a/app/Libraries/ActivityPub/HttpSignature.php b/app/Libraries/ActivityPub/HttpSignature.php new file mode 100644 index 0000000000000000000000000000000000000000..8b1bde6dbedf362e0e438b76439b3c2bfa85dcff --- /dev/null +++ b/app/Libraries/ActivityPub/HttpSignature.php @@ -0,0 +1,170 @@ +<?php + +/** + * This file is based on the HttpSignature file from the ActivityPhp package. + * It is adapted to work with CodeIgniter4 + * + * More info: https://github.com/landrok/activitypub + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub; + +use CodeIgniter\HTTP\IncomingRequest; +use CodeIgniter\I18n\Time; +use Config\Services; +use Exception; +use phpseclib\Crypt\RSA; + +/** + * HTTP signatures tool + */ +class HttpSignature +{ + const SIGNATURE_PATTERN = '/^ + keyId="(?P<keyId> + (https?:\/\/[\w\-\.]+[\w]+) + (:[\d]+)? + ([\w\-\.#\/@]+) + )", + algorithm="(?P<algorithm>[\w\-]+)", + (headers="\(request-target\) (?P<headers>[\w\-\s]+)",)? + signature="(?P<signature>[\w+\/]+={0,2})" + /x'; + + /** + * @var \CodeIgniter\HTTP\IncomingRequest + */ + protected $request; + + /** + * @param \CodeIgniter\HTTP\IncomingRequest $request + */ + public function __construct(IncomingRequest $request = null) + { + if (is_null($request)) { + $request = Services::request(); + } + + $this->request = $request; + } + + /** + * Verify an incoming message based upon its HTTP signature + * + * @return bool True if signature has been verified. Otherwise false + */ + public function verify() + { + if (!($dateHeader = $this->request->header('date'))) { + throw new Exception('Request must include a date header.'); + } + + // verify that request has been made within the last hour + $currentTime = Time::now(); + $requestTime = Time::createFromFormat( + 'D, d M Y H:i:s T', + $dateHeader->getValue(), + ); + + $diff = $requestTime->difference($currentTime); + if ($diff->getSeconds() > 3600) { + throw new Exception('Request must be made within the last hour.'); + } + + // check that digest header is set + if (!($digestHeader = $this->request->header('digest'))) { + throw new Exception('Request must include a digest header'); + } + // compute body digest and compare with header digest + $bodyDigest = hash('sha256', $this->request->getBody(), true); + $digest = 'SHA-256=' . base64_encode($bodyDigest); + if ($digest !== $digestHeader->getValue()) { + throw new Exception('Request digest is incorrect.'); + } + + // read the Signature header + if (!($signature = $this->request->getHeaderLine('signature'))) { + // Signature header not found + throw new Exception('Request must include a signature header'); + } + + // Split it into its parts (keyId, headers and signature) + if (!($parts = $this->splitSignature($signature))) { + throw new Exception('Malformed signature string.'); + } + + // extract parts as $keyId, $headers and $signature variables + extract($parts); + + // Fetch the public key linked from keyId + $actorRequest = new ActivityRequest($keyId); + $actorResponse = $actorRequest->get(); + $actor = json_decode($actorResponse->getBody()); + + $publicKeyPem = $actor->publicKey->publicKeyPem; + + // Create a comparison string from the plaintext headers we got + // in the same order as was given in the signature header, + $data = $this->getPlainText(explode(' ', trim($headers))); + + // Verify that string using the public key and the original signature. + $rsa = new RSA(); + $rsa->setHash('sha256'); + $rsa->setSignatureMode(RSA::SIGNATURE_PKCS1); + $rsa->loadKey($publicKeyPem); + + return $rsa->verify($data, base64_decode($signature, true)); + } + + /** + * Split HTTP signature into its parts (keyId, headers and signature) + * + * @param string $signature + * @return bool|array + */ + private function splitSignature(string $signature) + { + if (!preg_match(self::SIGNATURE_PATTERN, $signature, $matches)) { + // Signature pattern failed + return false; + } + + // Headers are optional + if (!isset($matches['headers']) || $matches['headers'] == '') { + $matches['headers'] = 'date'; + } + + return $matches; + } + + /** + * Get plain text that has been originally signed + * + * @param array $headers HTTP header keys + * @return string + */ + private function getPlainText(array $headers) + { + $strings = []; + $strings[] = sprintf( + '(request-target): %s %s%s', + $this->request->getMethod(), + '/' . $this->request->uri->getPath(), + $this->request->uri->getQuery() + ? '?' . $this->request->uri->getQuery() + : '', + ); + + foreach ($headers as $key) { + if ($this->request->hasHeader($key)) { + $strings[] = "$key: {$this->request->getHeaderLine($key)}"; + } + } + + return implode("\n", $strings); + } +} diff --git a/app/Libraries/ActivityPub/Models/ActivityModel.php b/app/Libraries/ActivityPub/Models/ActivityModel.php new file mode 100644 index 0000000000000000000000000000000000000000..33c7f45e41811b217d8b2ad57714e4840b1b7087 --- /dev/null +++ b/app/Libraries/ActivityPub/Models/ActivityModel.php @@ -0,0 +1,83 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Models; + +class ActivityModel extends UuidModel +{ + protected $table = 'activitypub_activities'; + protected $primaryKey = 'id'; + + protected $uuidFields = ['id', 'note_id']; + + protected $allowedFields = [ + 'id', + 'actor_id', + 'target_actor_id', + 'note_id', + 'type', + 'payload', + 'status', + 'scheduled_at', + ]; + + protected $returnType = \ActivityPub\Entities\Activity::class; + protected $useSoftDeletes = false; + + protected $useTimestamps = true; + protected $updatedField = null; + + public function getActivityById($activityId) + { + return $this->find($activityId); + } + + /** + * Inserts a new activity record in the database + * + * @param string $type + * @param integer $actorId + * @param integer $targetActorId + * @param integer $noteId + * @param string $payload + * @param \CodeIgniter\I18n\Time $scheduledAt + * @param string $status + * + * @return Michalsn\Uuid\BaseResult|int|string|false + */ + public function newActivity( + $type, + $actorId, + $targetActorId, + $noteId, + $payload, + $scheduledAt = null, + $status = null + ) { + return $this->insert( + [ + 'actor_id' => $actorId, + 'target_actor_id' => $targetActorId, + 'note_id' => $noteId, + 'type' => $type, + 'payload' => $payload, + 'scheduled_at' => $scheduledAt, + 'status' => $status, + ], + true, + ); + } + + public function getScheduledActivities() + { + return $this->where('`scheduled_at` <= NOW()', null, false) + ->where('status', 'queued') + ->orderBy('scheduled_at', 'ASC') + ->findAll(); + } +} diff --git a/app/Libraries/ActivityPub/Models/ActorModel.php b/app/Libraries/ActivityPub/Models/ActorModel.php new file mode 100644 index 0000000000000000000000000000000000000000..deed724ef544ee327c133d310ac2e11f01ae7ff3 --- /dev/null +++ b/app/Libraries/ActivityPub/Models/ActorModel.php @@ -0,0 +1,125 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Models; + +use CodeIgniter\Model; + +class ActorModel extends Model +{ + protected $table = 'activitypub_actors'; + + protected $allowedFields = [ + 'id', + 'uri', + 'username', + 'domain', + 'display_name', + 'summary', + 'private_key', + 'public_key', + 'avatar_image_url', + 'avatar_image_mimetype', + 'cover_image_url', + 'cover_image_mimetype', + 'inbox_url', + 'outbox_url', + 'followers_url', + 'followers_count', + 'notes_count', + 'is_blocked', + ]; + + protected $returnType = \ActivityPub\Entities\Actor::class; + protected $useSoftDeletes = false; + + protected $useTimestamps = true; + + public function getActorById($id) + { + return $this->find($id); + } + + /** + * Looks for actor with username and domain, + * if no domain has been specified, the current host will be used + * + * @param mixed $username + * @param mixed|null $domain + * @return mixed + */ + public function getActorByUsername($username, $domain = null) + { + // TODO: is there a better way? + helper('activitypub'); + + if (!$domain) { + $domain = get_current_domain(); + } + + if (!($found = cache("actor@{$username}@{$domain}"))) { + $found = $this->where([ + 'username' => $username, + 'domain' => $domain, + ])->first(); + + cache()->save("actor@{$username}@{$domain}", $found, DECADE); + } + + return $found; + } + + public function getActorByUri($actorUri) + { + return $this->where('uri', $actorUri)->first(); + } + + public function getFollowers($actorId) + { + return $this->join( + 'activitypub_follows', + 'activitypub_follows.actor_id = id', + 'inner', + ) + ->where('activitypub_follows.target_actor_id', $actorId) + ->findAll(); + } + + /** + * Check if an actor is blocked using its uri + * + * @param mixed $actorUri + * @return boolean + */ + public function isActorBlocked($actorUri) + { + return $this->where(['uri' => $actorUri, 'is_blocked' => true])->first() + ? true + : false; + } + + /** + * Retrieves all blocked actors. + * + * @return \ActivityPub\Entities\Actor[] + */ + public function getBlockedActors() + { + return $this->where('is_blocked', 1)->findAll(); + } + + public function blockActor($actorId) + { + $this->update($actorId, ['is_blocked' => 1]); + } + + public function unblockActor($actorId) + { + $this->update($actorId, ['is_blocked' => 0]); + } +} diff --git a/app/Libraries/ActivityPub/Models/BlockedDomainModel.php b/app/Libraries/ActivityPub/Models/BlockedDomainModel.php new file mode 100644 index 0000000000000000000000000000000000000000..482ef77c49860ee6706f054e87005020dd382ebc --- /dev/null +++ b/app/Libraries/ActivityPub/Models/BlockedDomainModel.php @@ -0,0 +1,79 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Models; + +use CodeIgniter\Model; + +class BlockedDomainModel extends Model +{ + protected $table = 'activitypub_blocked_domains'; + protected $primaryKey = 'name'; + + protected $allowedFields = ['name']; + + protected $returnType = \ActivityPub\Entities\BlockedDomain::class; + protected $useSoftDeletes = false; + + protected $useTimestamps = true; + protected $updatedField = null; + + /** + * Retrieves instance or podcast domain blocks depending on whether or not $podcastId param is set. + * + * @param integer|null $podcastId + */ + public function getBlockedDomains() + { + return $this->findAll(); + } + + public function isDomainBlocked($domain) + { + if ($this->find($domain)) { + return true; + } + + return false; + } + + public function blockDomain($name) + { + $this->db->transStart(); + + // set all actors from the domain as blocked + model('ActorModel') + ->where('domain', $name) + ->set('is_blocked', 1) + ->update(); + + $result = $this->insert([ + 'name' => $name, + ]); + + $this->db->transComplete(); + + return $result; + } + + public function unblockDomain($name) + { + $this->db->transStart(); + // unblock all actors from the domain + model('ActorModel') + ->where('domain', $name) + ->set('is_blocked', 0) + ->update(); + + $result = $this->delete($name); + + $this->db->transComplete(); + + return $result; + } +} diff --git a/app/Libraries/ActivityPub/Models/FavouriteModel.php b/app/Libraries/ActivityPub/Models/FavouriteModel.php new file mode 100644 index 0000000000000000000000000000000000000000..8a5d781e48912b0ca3aba4714e101aa776cfe4ae --- /dev/null +++ b/app/Libraries/ActivityPub/Models/FavouriteModel.php @@ -0,0 +1,178 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Models; + +use ActivityPub\Activities\LikeActivity; +use ActivityPub\Activities\UndoActivity; +use CodeIgniter\Events\Events; + +class FavouriteModel extends UuidModel +{ + protected $table = 'activitypub_favourites'; + protected $uuidFields = ['note_id']; + + protected $allowedFields = ['actor_id', 'note_id']; + + protected $returnType = \ActivityPub\Entities\Favourite::class; + + protected $useTimestamps = true; + protected $updatedField = null; + + /** + * + * @param \ActivityPub\Entities\Actor $actor + * @param \ActivityPub\Entities\Note $note + * @param bool $registerActivity + * @return void + */ + public function addFavourite($actor, $note, $registerActivity = true) + { + $this->db->transStart(); + + $this->insert([ + 'actor_id' => $actor->id, + 'note_id' => $note->id, + ]); + + model('NoteModel') + ->where( + 'id', + service('uuid') + ->fromString($note->id) + ->getBytes(), + ) + ->increment('favourites_count'); + + Events::trigger('on_note_favourite', $actor, $note); + + if ($registerActivity) { + $likeActivity = new LikeActivity(); + $likeActivity->set('actor', $actor->uri)->set('object', $note->uri); + + $activityId = model('ActivityModel')->newActivity( + 'Like', + $actor->id, + null, + $note->id, + $likeActivity->toJSON(), + $note->published_at, + 'queued', + ); + + $likeActivity->set( + 'id', + url_to('activity', $actor->username, $activityId), + ); + + model('ActivityModel')->update($activityId, [ + 'payload' => $likeActivity->toJSON(), + ]); + } + + $this->db->transComplete(); + } + + public function removeFavourite($actor, $note, $registerActivity = true) + { + $this->db->transStart(); + + model('NoteModel') + ->where( + 'id', + service('uuid') + ->fromString($note->id) + ->getBytes(), + ) + ->decrement('favourites_count'); + + $this->table('activitypub_favourites') + ->where([ + 'actor_id' => $actor->id, + 'note_id' => service('uuid') + ->fromString($note->id) + ->getBytes(), + ]) + ->delete(); + + Events::trigger('on_note_undo_favourite', $actor, $note); + + if ($registerActivity) { + $undoActivity = new UndoActivity(); + // get like activity + $activity = model('ActivityModel') + ->where([ + 'type' => 'Like', + 'actor_id' => $actor->id, + 'note_id' => service('uuid') + ->fromString($note->id) + ->getBytes(), + ]) + ->first(); + + $likeActivity = new LikeActivity(); + $likeActivity + ->set( + 'id', + base_url( + route_to('activity', $actor->username, $activity->id), + ), + ) + ->set('actor', $actor->uri) + ->set('object', $note->uri); + + $undoActivity + ->set('actor', $actor->uri) + ->set('object', $likeActivity); + + $activityId = model('ActivityModel')->newActivity( + 'Undo', + $actor->id, + null, + $note->id, + $undoActivity->toJSON(), + $note->published_at, + 'queued', + ); + + $undoActivity->set( + 'id', + url_to('activity', $actor->username, $activityId), + ); + + model('ActivityModel')->update($activityId, [ + 'payload' => $undoActivity->toJSON(), + ]); + } + + $this->db->transComplete(); + } + + /** + * Adds or removes favourite from database and increments count + * + * @param \ActivityPub\Entities\Actor $actor + * @param \ActivityPub\Entities\Note $note + * @return void + */ + public function toggleFavourite($actor, $note) + { + if ( + $this->where([ + 'actor_id' => $actor->id, + 'note_id' => service('uuid') + ->fromString($note->id) + ->getBytes(), + ])->first() + ) { + $this->removeFavourite($actor, $note); + } else { + $this->addFavourite($actor, $note); + } + } +} diff --git a/app/Libraries/ActivityPub/Models/FollowModel.php b/app/Libraries/ActivityPub/Models/FollowModel.php new file mode 100644 index 0000000000000000000000000000000000000000..89831855d4730a85e8ed8e413d8aef4743d2ff37 --- /dev/null +++ b/app/Libraries/ActivityPub/Models/FollowModel.php @@ -0,0 +1,148 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Models; + +use ActivityPub\Activities\FollowActivity; +use ActivityPub\Activities\UndoActivity; +use CodeIgniter\Database\Exceptions\DatabaseException; +use CodeIgniter\I18n\Time; +use CodeIgniter\Model; +use InvalidArgumentException; + +class FollowModel extends Model +{ + protected $table = 'activitypub_follows'; + + protected $allowedFields = ['actor_id', 'target_actor_id']; + + protected $returnType = \ActivityPub\Entities\Follow::class; + + protected $useTimestamps = true; + protected $updatedField = null; + + /** + * + * @param \ActivityPub\Entities\Actor $actor + * @param \ActivityPub\Entities\Actor $targetActor + * @param bool $registerActivity + * @return void + * @throws DatabaseException + */ + public function addFollower($actor, $targetActor, $registerActivity = true) + { + try { + $this->db->transStart(); + + $this->insert([ + 'actor_id' => $actor->id, + 'target_actor_id' => $targetActor->id, + ]); + + // increment followers_count for target actor + model('ActorModel') + ->where('id', $targetActor->id) + ->increment('followers_count'); + + if ($registerActivity) { + $followActivity = new FollowActivity(); + + $followActivity + ->set('actor', $actor->uri) + ->set('object', $targetActor->uri); + + $activityId = model('ActivityModel')->newActivity( + 'Follow', + $actor->id, + $targetActor->id, + null, + $followActivity->toJSON(), + Time::now(), + 'queued', + ); + + $followActivity->set( + 'id', + base_url( + route_to('activity', $actor->username, $activityId), + ), + ); + + model('ActivityModel')->update($activityId, [ + 'payload' => $followActivity->toJSON(), + ]); + } + + $this->db->transComplete(); + } catch (\Exception $e) { + // follow already exists, do nothing + } + } + + /** + * @param \ActivityPub\Entities\Actor $actor + * @param \ActivityPub\Entities\Actor $targetActor + * @return void + * @throws InvalidArgumentException + * @throws DatabaseException + */ + public function removeFollower( + $actor, + $targetActor, + $registerActivity = true + ) { + $this->db->transStart(); + + $this->where([ + 'actor_id' => $actor->id, + 'target_actor_id' => $targetActor->id, + ])->delete(); + + // decrement followers_count for target actor + model('ActorModel') + ->where('id', $targetActor->id) + ->decrement('followers_count'); + + if ($registerActivity) { + $undoActivity = new UndoActivity(); + // get follow activity from database + $followActivity = model('ActivityModel') + ->where([ + 'type' => 'Follow', + 'actor_id' => $actor->id, + 'target_actor_id' => $targetActor->id, + ]) + ->first(); + + $undoActivity + ->set('actor', $actor->uri) + ->set('object', $followActivity->payload); + + $activityId = model('ActivityModel')->newActivity( + 'Undo', + $actor->id, + $targetActor->id, + null, + $undoActivity->toJSON(), + Time::now(), + 'queued', + ); + + $undoActivity->set( + 'id', + url_to('activity', $actor->username, $activityId), + ); + + model('ActivityModel')->update($activityId, [ + 'payload' => $undoActivity->toJSON(), + ]); + } + + $this->db->transComplete(); + } +} diff --git a/app/Libraries/ActivityPub/Models/NoteModel.php b/app/Libraries/ActivityPub/Models/NoteModel.php new file mode 100644 index 0000000000000000000000000000000000000000..f0914542d6f06df81104206c21d7277dcbccfbd2 --- /dev/null +++ b/app/Libraries/ActivityPub/Models/NoteModel.php @@ -0,0 +1,548 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Models; + +use ActivityPub\Entities\Note; +use ActivityPub\Activities\AnnounceActivity; +use ActivityPub\Activities\CreateActivity; +use ActivityPub\Activities\DeleteActivity; +use ActivityPub\Activities\UndoActivity; +use ActivityPub\Objects\TombstoneObject; +use CodeIgniter\Events\Events; +use CodeIgniter\HTTP\URI; +use CodeIgniter\I18n\Time; + +class NoteModel extends UuidModel +{ + protected $table = 'activitypub_notes'; + protected $primaryKey = 'id'; + + protected $uuidFields = ['id', 'in_reply_to_id', 'reblog_of_id']; + + protected $allowedFields = [ + 'id', + 'uri', + 'actor_id', + 'in_reply_to_id', + 'reblog_of_id', + 'message', + 'message_html', + 'favourites_count', + 'reblogs_count', + 'replies_count', + 'published_at', + ]; + + protected $returnType = \ActivityPub\Entities\Note::class; + protected $useSoftDeletes = false; + + protected $useTimestamps = true; + protected $updatedField = null; + + protected $validationRules = [ + 'actor_id' => 'required', + 'message_html' => 'required_without[reblog_of_id]|max_length[500]', + ]; + + protected $beforeInsert = ['setNoteId']; + + public function getNoteById($noteId) + { + return $this->find($noteId); + } + + public function getNoteByUri($noteUri) + { + return $this->where('uri', $noteUri)->first(); + } + + /** + * Retrieves all published notes for a given actor ordered by publication date + * + * @return \ActivityPub\Entities\Note[] + */ + public function getActorNotes($actorId) + { + return $this->where([ + 'actor_id' => $actorId, + 'in_reply_to_id' => null, + ]) + ->where('`published_at` <= NOW()', null, false) + ->orderBy('published_at', 'DESC') + ->findAll(); + } + + /** + * Retrieves all published replies for a given note. + * By default, it does not get replies from blocked actors. + * + * @param mixed $noteId + * @param boolean $withBlocked false by default + * @return array + */ + public function getNoteReplies($noteId, $withBlocked = false) + { + if (!$withBlocked) { + $this->select('activitypub_notes.*') + ->join( + 'activitypub_actors', + 'activitypub_actors.id = activitypub_notes.actor_id', + 'inner', + ) + ->where('activitypub_actors.is_blocked', 0); + } + + $this->where( + 'in_reply_to_id', + service('uuid') + ->fromString($noteId) + ->getBytes(), + ) + ->where('`published_at` <= NOW()', null, false) + ->orderBy('published_at', 'ASC'); + + return $this->findAll(); + } + + /** + * Retrieves all published reblogs for a given note + */ + public function getNoteReblogs($noteId) + { + return $this->where('reblog_of_id', $noteId) + ->where('`published_at` <= NOW()', null, false) + ->orderBy('published_at', 'ASC') + ->findAll(); + } + + public function addPreviewCard($noteId, $previewCardId) + { + return $this->db->table('activitypub_notes_preview_cards')->insert([ + 'note_id' => $noteId, + 'preview_card_id' => $previewCardId, + ]); + } + + /** + * Adds note in database along preview card if relevant + * + * @param \ActivityPub\Entities\Note $note + * @param boolean $registerActivity + * @param boolean $createPreviewCard + * @return string|false returns the new note id if success or false otherwise + */ + public function addNote( + $note, + $createPreviewCard = true, + $registerActivity = true + ) { + helper('activitypub'); + + $this->db->transStart(); + + if (!($newNoteId = $this->insert($note, true))) { + $this->db->transRollback(); + + // Couldn't insert note + return false; + } + + if ($createPreviewCard) { + // parse message + $messageUrls = extract_urls_from_message($note->message); + + if ( + !empty($messageUrls) && + ($previewCard = get_or_create_preview_card_from_url( + new URI($messageUrls[0]), + )) + ) { + if (!$this->addPreviewCard($newNoteId, $previewCard->id)) { + $this->db->transRollback(); + + // problem when linking note to preview card + return false; + } + + $this->db->transComplete(); + + return $newNoteId; + } + } + + model('ActorModel') + ->where('id', $note->actor_id) + ->increment('notes_count'); + + Events::trigger('on_note_add', $note); + + if ($registerActivity) { + $noteUuid = service('uuid') + ->fromBytes($newNoteId) + ->toString(); + + // set note id and uri to construct NoteObject + $note->id = $noteUuid; + $note->uri = base_url( + route_to('note', $note->actor->username, $noteUuid), + ); + + $createActivity = new CreateActivity(); + $noteObjectClass = config('ActivityPub')->noteObject; + $createActivity + ->set('actor', $note->actor->uri) + ->set('object', new $noteObjectClass($note)); + + $activityId = model('ActivityModel')->newActivity( + 'Create', + $note->actor_id, + null, + $noteUuid, + $createActivity->toJSON(), + $note->published_at, + 'queued', + ); + + $createActivity->set( + 'id', + base_url( + route_to('activity', $note->actor->username, $activityId), + ), + ); + + model('ActivityModel')->update($activityId, [ + 'payload' => $createActivity->toJSON(), + ]); + } + + $this->db->transComplete(); + + return $newNoteId; + } + + public function editNote($updatedNote) + { + $this->db->transStart(); + + // update note create activity schedule in database + $scheduledActivity = model('ActivityModel') + ->where([ + 'type' => 'Create', + 'note_id' => service('uuid') + ->fromString($updatedNote->id) + ->getBytes(), + ]) + ->first(); + + // update published date in payload + $newPayload = $scheduledActivity->payload; + $newPayload->object->published = $updatedNote->published_at->format( + DATE_W3C, + ); + model('ActivityModel')->update($scheduledActivity->id, [ + 'payload' => json_encode($newPayload), + 'scheduled_at' => $updatedNote->published_at, + ]); + + // update note + $updateResult = $this->update($updatedNote->id, $updatedNote); + + $this->db->transComplete(); + + return $updateResult; + } + + /** + * Removes a note from the database and decrements meta data + * + * @param \ActivityPub\Entities\Note $note + * @return mixed + */ + public function removeNote($note, $registerActivity = true) + { + $this->db->transStart(); + + model('ActorModel') + ->where('id', $note->actor_id) + ->decrement('notes_count'); + + if ($note->in_reply_to_id) { + // Note to remove is a reply + model('NoteModel') + ->where( + 'id', + service('uuid') + ->fromString($note->in_reply_to_id) + ->getBytes(), + ) + ->decrement('replies_count'); + } + + // remove all reblogs + foreach ($note->reblogs as $reblog) { + $this->removeNote($reblog); + } + + // remove all replies + foreach ($note->replies as $reply) { + $this->removeNote($reply); + } + + Events::trigger('on_note_remove', $note); + + if ($registerActivity) { + $deleteActivity = new DeleteActivity(); + $tombstoneObject = new TombstoneObject(); + $tombstoneObject->set('id', $note->uri); + $deleteActivity + ->set('actor', $note->actor->uri) + ->set('object', $tombstoneObject); + + $activityId = model('ActivityModel')->newActivity( + 'Delete', + $note->actor_id, + null, + null, + $deleteActivity->toJSON(), + Time::now(), + 'queued', + ); + + $deleteActivity->set( + 'id', + base_url( + route_to('activity', $note->actor->username, $activityId), + ), + ); + + model('ActivityModel')->update($activityId, [ + 'payload' => $deleteActivity->toJSON(), + ]); + } + + $result = model('NoteModel', false)->delete($note->id); + + $this->db->transComplete(); + + return $result; + } + + public function addReply( + $reply, + $createPreviewCard = true, + $registerActivity = true + ) { + if (!$reply->in_reply_to_id) { + throw new \Exception('Passed note is not a reply!'); + } + + $this->db->transStart(); + + $noteId = $this->addNote($reply, $createPreviewCard, $registerActivity); + + model('NoteModel') + ->where( + 'id', + service('uuid') + ->fromString($reply->in_reply_to_id) + ->getBytes(), + ) + ->increment('replies_count'); + + Events::trigger('on_note_reply', $reply); + + $this->db->transComplete(); + + return $noteId; + } + + /** + * + * @param \ActivityPub\Entities\Actor $actor + * @param \ActivityPub\Entities\Note $note + * @return ActivityPub\Models\BaseResult|int|string|false + */ + public function reblog($actor, $note, $registerActivity = true) + { + $this->db->transStart(); + + $reblog = new Note([ + 'actor_id' => $actor->id, + 'reblog_of_id' => $note->id, + 'published_at' => Time::now(), + ]); + + // add reblog + $reblogId = $this->insert($reblog, true); + + model('ActorModel') + ->where('id', $actor->id) + ->increment('notes_count'); + + model('NoteModel') + ->where( + 'id', + service('uuid') + ->fromString($note->id) + ->getBytes(), + ) + ->increment('reblogs_count'); + + Events::trigger('on_note_reblog', $actor, $note); + + if ($registerActivity) { + $announceActivity = new AnnounceActivity($reblog); + + $activityId = model('ActivityModel')->newActivity( + 'Announce', + $actor->id, + null, + $note->id, + $announceActivity->toJSON(), + $reblog->published_at, + 'queued', + ); + + $announceActivity->set( + 'id', + base_url( + route_to('activity', $note->actor->username, $activityId), + ), + ); + + model('ActivityModel')->update($activityId, [ + 'payload' => $announceActivity->toJSON(), + ]); + } + + $this->db->transComplete(); + + return $reblogId; + } + + /** + * @param \ActivityPub\Entities\Note $reblogNote + * @return mixed + */ + public function undoReblog($reblogNote, $registerActivity = true) + { + $this->db->transStart(); + + model('ActorModel') + ->where('id', $reblogNote->actor_id) + ->decrement('notes_count'); + + model('NoteModel') + ->where( + 'id', + service('uuid') + ->fromString($reblogNote->reblog_of_id) + ->getBytes(), + ) + ->decrement('reblogs_count'); + + Events::trigger('on_note_undo_reblog', $reblogNote); + + if ($registerActivity) { + $undoActivity = new UndoActivity(); + // get like activity + $activity = model('ActivityModel') + ->where([ + 'type' => 'Announce', + 'actor_id' => $reblogNote->actor_id, + 'note_id' => service('uuid') + ->fromString($reblogNote->reblog_of_id) + ->getBytes(), + ]) + ->first(); + + $announceActivity = new AnnounceActivity($reblogNote); + $announceActivity->set( + 'id', + base_url( + route_to( + 'activity', + $reblogNote->actor->username, + $activity->id, + ), + ), + ); + + $undoActivity + ->set('actor', $reblogNote->actor->uri) + ->set('object', $announceActivity); + + $activityId = model('ActivityModel')->newActivity( + 'Undo', + $reblogNote->actor_id, + null, + $reblogNote->reblog_of_id, + $undoActivity->toJSON(), + Time::now(), + 'queued', + ); + + $undoActivity->set( + 'id', + base_url( + route_to( + 'activity', + $reblogNote->actor->username, + $activityId, + ), + ), + ); + + model('ActivityModel')->update($activityId, [ + 'payload' => $undoActivity->toJSON(), + ]); + } + + $result = model('NoteModel', false)->delete($reblogNote->id); + + $this->db->transComplete(); + + return $result; + } + + public function toggleReblog($actor, $note) + { + if ( + !($reblogNote = $this->where([ + 'actor_id' => $actor->id, + 'reblog_of_id' => service('uuid') + ->fromString($note->id) + ->getBytes(), + ])->first()) + ) { + $this->reblog($actor, $note); + } else { + $this->undoReblog($reblogNote); + } + } + + protected function setNoteId($data) + { + $uuid4 = service('uuid')->uuid4(); + $data['id'] = $uuid4->toString(); + $data['data']['id'] = $uuid4->getBytes(); + + if (!isset($data['data']['uri'])) { + $actor = model('ActorModel')->getActorById( + $data['data']['actor_id'], + ); + + $data['data']['uri'] = base_url( + route_to('note', $actor->username, $uuid4->toString()), + ); + } + + return $data; + } +} diff --git a/app/Libraries/ActivityPub/Models/PreviewCardModel.php b/app/Libraries/ActivityPub/Models/PreviewCardModel.php new file mode 100644 index 0000000000000000000000000000000000000000..874fe1151841c29864b2bf5fcac7a9539ee75727 --- /dev/null +++ b/app/Libraries/ActivityPub/Models/PreviewCardModel.php @@ -0,0 +1,56 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Models; + +use CodeIgniter\Model; + +class PreviewCardModel extends Model +{ + protected $table = 'activitypub_preview_cards'; + + protected $allowedFields = [ + 'id', + 'url', + 'title', + 'description', + 'type', + 'author_name', + 'author_url', + 'provider_name', + 'provider_url', + 'image', + 'html', + ]; + + protected $returnType = \ActivityPub\Entities\PreviewCard::class; + protected $useSoftDeletes = false; + + protected $useTimestamps = true; + + public function getPreviewCardFromUrl($url) + { + return $this->where('url', $url)->first(); + } + + public function getNotePreviewCard($noteId) + { + return $this->join( + 'activitypub_notes_preview_cards', + 'activitypub_notes_preview_cards.preview_card_id = id', + 'inner', + ) + ->where( + 'note_id', + service('uuid') + ->fromString($noteId) + ->getBytes(), + ) + ->first(); + } +} diff --git a/app/Libraries/ActivityPub/Models/UuidModel.php b/app/Libraries/ActivityPub/Models/UuidModel.php new file mode 100644 index 0000000000000000000000000000000000000000..2029a846f76ca68a33127819e55616c2b90a51f8 --- /dev/null +++ b/app/Libraries/ActivityPub/Models/UuidModel.php @@ -0,0 +1,206 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Models; + +use CodeIgniter\Database\Exceptions\DataException; +use stdClass; + +class UuidModel extends \Michalsn\Uuid\UuidModel +{ + /** + * This insert overwrite is added as a means to FIX some bugs + * from the extended Uuid package. See: https://github.com/michalsn/codeigniter4-uuid/issues/2 + * + * Inserts data into the current table. If an object is provided, + * it will attempt to convert it to an array. + * + * @param array|object $data + * @param boolean $returnID Whether insert ID should be returned or not. + * + * @return BaseResult|integer|string|false + * @throws \ReflectionException + */ + public function insert($data = null, bool $returnID = true) + { + $escape = null; + + $this->insertID = 0; + + if (empty($data)) { + $data = $this->tempData['data'] ?? null; + $escape = $this->tempData['escape'] ?? null; + $this->tempData = []; + } + + if (empty($data)) { + throw DataException::forEmptyDataset('insert'); + } + + // If $data is using a custom class with public or protected + // properties representing the table elements, we need to grab + // them as an array. + if (is_object($data) && !$data instanceof stdClass) { + $data = static::classToArray( + $data, + $this->primaryKey, + $this->dateFormat, + false, + ); + } + + // If it's still a stdClass, go ahead and convert to + // an array so doProtectFields and other model methods + // don't have to do special checks. + if (is_object($data)) { + $data = (array) $data; + } + + if (empty($data)) { + throw DataException::forEmptyDataset('insert'); + } + + // Validate data before saving. + if ($this->skipValidation === false) { + if ($this->cleanRules()->validate($data) === false) { + return false; + } + } + + // Must be called first so we don't + // strip out created_at values. + $data = $this->doProtectFields($data); + + // Set created_at and updated_at with same time + $date = $this->setDate(); + + if ( + $this->useTimestamps && + !empty($this->createdField) && + !array_key_exists($this->createdField, $data) + ) { + $data[$this->createdField] = $date; + } + + if ( + $this->useTimestamps && + !empty($this->updatedField) && + !array_key_exists($this->updatedField, $data) + ) { + $data[$this->updatedField] = $date; + } + + $eventData = ['data' => $data]; + if ($this->tempAllowCallbacks) { + $eventData = $this->trigger('beforeInsert', $eventData); + } + + // Require non empty primaryKey when + // not using auto-increment feature + if ( + !$this->useAutoIncrement && + empty($eventData['data'][$this->primaryKey]) + ) { + throw DataException::forEmptyPrimaryKey('insert'); + } + + if (!empty($this->uuidFields)) { + foreach ($this->uuidFields as $field) { + if ($field === $this->primaryKey) { + $this->uuidTempData[ + $field + ] = $this->uuid->{$this->uuidVersion}(); + + if ($this->uuidUseBytes === true) { + $this->builder()->set( + $field, + $this->uuidTempData[$field]->getBytes(), + ); + } else { + $this->builder()->set( + $field, + $this->uuidTempData[$field]->toString(), + ); + } + } else { + if ( + $this->uuidUseBytes === true && + !empty($eventData['data'][$field]) + ) { + $this->uuidTempData[$field] = $this->uuid->fromString( + $eventData['data'][$field], + ); + $this->builder()->set( + $field, + $this->uuidTempData[$field]->getBytes(), + ); + unset($eventData['data'][$field]); + } + } + } + } + + // Must use the set() method to ensure objects get converted to arrays + $result = $this->builder() + ->set($eventData['data'], '', $escape) + ->insert(); + + // If insertion succeeded then save the insert ID + if ($result) { + if ( + !$this->useAutoIncrement || + isset($eventData['data'][$this->primaryKey]) + ) { + $this->insertID = $eventData['data'][$this->primaryKey]; + } else { + if (in_array($this->primaryKey, $this->uuidFields)) { + $this->insertID = $this->uuidTempData[ + $this->primaryKey + ]->toString(); + } else { + $this->insertID = $this->db->insertID(); + } + } + } + + // Cleanup data before event trigger + if (!empty($this->uuidFields) && $this->uuidUseBytes === true) { + foreach ($this->uuidFields as $field) { + if ( + $field === $this->primaryKey || + empty($this->uuidTempData[$field]) + ) { + continue; + } + + $eventData['data'][$field] = $this->uuidTempData[ + $field + ]->toString(); + } + } + + $eventData = [ + 'id' => $this->insertID, + 'data' => $eventData['data'], + 'result' => $result, + ]; + if ($this->tempAllowCallbacks) { + // Trigger afterInsert events with the inserted data and new ID + $this->trigger('afterInsert', $eventData); + } + $this->tempAllowCallbacks = $this->allowCallbacks; + + // If insertion failed, get out of here + if (!$result) { + return $result; + } + + // otherwise return the insertID, if requested. + return $returnID ? $this->insertID : $result; + } +} diff --git a/app/Libraries/ActivityPub/Objects/ActorObject.php b/app/Libraries/ActivityPub/Objects/ActorObject.php new file mode 100644 index 0000000000000000000000000000000000000000..5d9f07ee8521f55fcf4e8b23743d16db0d4ab83e --- /dev/null +++ b/app/Libraries/ActivityPub/Objects/ActorObject.php @@ -0,0 +1,113 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Objects; + +use ActivityPub\Core\ObjectType; + +class ActorObject extends ObjectType +{ + /** + * @var array|string + */ + protected $context = [ + 'https://www.w3.org/ns/activitystreams', + 'https://w3id.org/security/v1', + ]; + + /** + * @var string + */ + protected $type = 'Person'; + + /** + * @var string + */ + protected $name; + + /** + * @var string + */ + protected $preferredUsername; + + /** + * @var string + */ + protected $summary; + + /** + * @var string + */ + protected $inbox; + + /** + * @var string + */ + protected $outbox; + + /** + * @var string + */ + protected $followers; + + /** + * @var string + */ + protected $url; + + /** + * @var array|null + */ + protected $image; + + /** + * @var array + */ + protected $icon; + + /** + * @var object + */ + protected $publicKey; + + /** + * @param \ActivityPub\Entities\Actor $podcast + */ + public function __construct($actor) + { + $this->id = $actor->uri; + + $this->name = $actor->display_name; + $this->preferredUsername = $actor->username; + $this->summary = $actor->summary; + $this->url = $actor->uri; + + $this->inbox = $actor->inbox_url; + $this->outbox = $actor->outbox_url; + $this->followers = $actor->followers_url; + + if ($actor->cover_image_url) { + $this->image = [ + 'type' => 'Image', + 'mediaType' => $actor->cover_image_mimetype, + 'url' => $actor->cover_image_url, + ]; + } + $this->icon = [ + 'type' => 'Image', + 'mediaType' => $actor->avatar_image_mimetype, + 'url' => $actor->avatar_image_url, + ]; + + $this->publicKey = [ + 'id' => $actor->key_id, + 'owner' => $actor->uri, + 'publicKeyPem' => $actor->public_key, + ]; + } +} diff --git a/app/Libraries/ActivityPub/Objects/NoteObject.php b/app/Libraries/ActivityPub/Objects/NoteObject.php new file mode 100644 index 0000000000000000000000000000000000000000..92a83c53fbef8641ba67d6b40368303974f58d84 --- /dev/null +++ b/app/Libraries/ActivityPub/Objects/NoteObject.php @@ -0,0 +1,61 @@ +<?php + +/** + * This class defines the Object which is the + * primary base type for the Activity Streams vocabulary. + * + * Object is a reserved word in php, so the class is named ObjectType. + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Objects; + +use ActivityPub\Core\ObjectType; + +class NoteObject extends ObjectType +{ + /** + * @var string + */ + protected $type = 'Note'; + + /** + * @var string + */ + protected $attributedTo; + + /** + * @var string + */ + protected $inReplyTo; + + /** + * @var array + */ + protected $replies; + + /** + * @param \ActivityPub\Entities\Note $note + */ + public function __construct($note) + { + $this->id = $note->uri; + + $this->content = $note->message_html; + $this->published = $note->published_at->format(DATE_W3C); + $this->attributedTo = $note->actor->uri; + + if ($note->is_reply) { + $this->inReplyTo = $note->reply_to_note->uri; + } + + $this->replies = base_url( + route_to('note-replies', $note->actor->username, $note->id), + ); + + $this->cc = [$note->actor->followers_url]; + } +} diff --git a/app/Libraries/ActivityPub/Objects/OrderedCollectionObject.php b/app/Libraries/ActivityPub/Objects/OrderedCollectionObject.php new file mode 100644 index 0000000000000000000000000000000000000000..faabb78b1eddc382712cc0c976b1ae1bf3f39aa6 --- /dev/null +++ b/app/Libraries/ActivityPub/Objects/OrderedCollectionObject.php @@ -0,0 +1,66 @@ +<?php + +/** + * This class defines a Paginated OrderedCollection + * based on CodeIgniter4 Pager to get the pagination metadata + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Objects; + +use ActivityPub\Core\ObjectType; + +class OrderedCollectionObject extends ObjectType +{ + protected $type = 'OrderedCollection'; + + /** + * @var integer + */ + protected $totalItems; + + /** + * @var integer|null + */ + protected $first; + + /** + * @var integer|null + */ + protected $current; + + /** + * @var integer|null + */ + protected $last; + + /** + * @var array|null + */ + protected $orderedItems; + + /** + * @param \ActivityPub\Libraries\ActivityPub\Activity[] $orderedItems + * @param \CodeIgniter\Pager\Pager $pager + */ + public function __construct($orderedItems, $pager = null) + { + $this->id = current_url(); + + if ($pager) { + $totalItems = $pager->getTotal(); + $this->totalItems = $totalItems; + + if ($totalItems) { + $this->first = $pager->getPageURI($pager->getFirstPage()); + $this->current = $pager->getPageURI(); + $this->last = $pager->getPageURI($pager->getLastPage()); + } + } + + $this->orderedItems = $orderedItems; + } +} diff --git a/app/Libraries/ActivityPub/Objects/OrderedCollectionPage.php b/app/Libraries/ActivityPub/Objects/OrderedCollectionPage.php new file mode 100644 index 0000000000000000000000000000000000000000..98eba8f257faf96b5959e83fc0a48f654bd460cf --- /dev/null +++ b/app/Libraries/ActivityPub/Objects/OrderedCollectionPage.php @@ -0,0 +1,55 @@ +<?php + +/** + * This class defines a Paginated OrderedCollection + * based on CodeIgniter4 Pager to get the pagination metadata + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Objects; + +class OrderedCollectionPage extends OrderedCollectionObject +{ + /** + * @var string + */ + protected $type = 'OrderedCollectionPage'; + + /** + * @var string + */ + protected $partOf; + + /** + * @var integer + */ + protected $prev; + + /** + * @var integer + */ + protected $next; + + /** + * @param \CodeIgniter\Pager\Pager $pager + * @param \ActivityPub\Libraries\ActivityPub\Activity[] $orderedItems + */ + public function __construct($pager, $orderedItems) + { + parent::__construct($orderedItems, $pager); + + $isFirstPage = $pager->getCurrentPage() === $pager->getFirstPage(); + $isLastPage = $pager->getCurrentPage() === $pager->getLastPage(); + $isFirstPage && ($this->first = null); + $isLastPage && ($this->last = null); + + $this->id = $pager->getPageURI($pager->getCurrentPage()); + $this->partOf = $pager->getPageURI(); + $this->prev = $pager->getPreviousPageURI(); + $this->current = $pager->getPageURI($pager->getCurrentPage()); + $this->next = $pager->getNextPageURI(); + } +} diff --git a/app/Libraries/ActivityPub/Objects/TombstoneObject.php b/app/Libraries/ActivityPub/Objects/TombstoneObject.php new file mode 100644 index 0000000000000000000000000000000000000000..a29bdd7a075bae197c3c3238de956297bb798b22 --- /dev/null +++ b/app/Libraries/ActivityPub/Objects/TombstoneObject.php @@ -0,0 +1,19 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub\Objects; + +use ActivityPub\Core\ObjectType; + +class TombstoneObject extends ObjectType +{ + /** + * @var string + */ + protected $type = 'Tombstone'; +} diff --git a/app/Libraries/ActivityPub/WebFinger.php b/app/Libraries/ActivityPub/WebFinger.php new file mode 100644 index 0000000000000000000000000000000000000000..58f6ce4b88695239f892249c4f79353d1f4bf947 --- /dev/null +++ b/app/Libraries/ActivityPub/WebFinger.php @@ -0,0 +1,126 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace ActivityPub; + +use Exception; + +class WebFinger +{ + const RESOURCE_PATTERN = '/^acct:(?P<username>([\w_]+))@(?P<domain>([\w\-\.]+[\w]+)(:[\d]+)?)$/x'; + + /** + * @var string + */ + protected $username; + + /** + * @var string + */ + protected $host; + + /** + * @var string + */ + protected $port; + + /** + * @var string + */ + protected $subject; + + /** + * @var array + */ + protected $aliases; + + /** + * @var string + */ + protected $links; + + /** + * @param string $resource + */ + public function __construct($resource) + { + $this->subject = $resource; + + // Split resource into its parts (username, domain) + $parts = $this->splitResource($resource); + if (!$parts) { + throw new Exception('Wrong WebFinger resource pattern.'); + } + extract($parts); + + $this->username = $username; + $this->domain = $domain; + + $currentUrl = current_url(true); + $currentDomain = + $currentUrl->getHost() . + ($currentUrl->getPort() ? ':' . $currentUrl->getPort() : ''); + if ($currentDomain !== $domain) { + // TODO: return error code + throw new Exception('Domain does not correspond to Instance.'); + } + + if ( + !($actor = model('ActorModel')->getActorByUsername( + $username, + $domain, + )) + ) { + throw new Exception('Could not find actor'); + } + + $this->aliases = [$actor->id]; + $this->links = [ + [ + 'rel' => 'self', + 'type' => 'application/activity+json', + 'href' => $actor->uri, + ], + [ + 'rel' => 'http://webfinger.net/rel/profile-page', + 'type' => 'text/html', + 'href' => $actor->uri, # TODO: should there be 2 values? @actorUsername + ], + ]; + } + + /** + * Split resource into its parts (username, domain) + * + * @param string $resource + * @return bool|array + */ + private function splitResource(string $resource) + { + if (!preg_match(self::RESOURCE_PATTERN, $resource, $matches)) { + // Resource pattern failed + return false; + } + + return $matches; + } + + /** + * Get WebFinger response as an array + * + * @return array + */ + public function toArray() + { + return [ + 'subject' => $this->subject, + 'aliases' => $this->aliases, + 'links' => $this->links, + ]; + } +} diff --git a/app/Libraries/Breadcrumb.php b/app/Libraries/Breadcrumb.php index 816f61eb3e67648fd2b4dd71f43d91f1d0c4dfe2..5f5bea273ad7e380fde470bf2bbc40589b7c95dc 100644 --- a/app/Libraries/Breadcrumb.php +++ b/app/Libraries/Breadcrumb.php @@ -3,7 +3,7 @@ /** * Generates and renders a breadcrumb based on the current url segments * - * @copyright 2020 Podlibre + * @copyright 2021 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ */ diff --git a/app/Libraries/Image.php b/app/Libraries/Image.php new file mode 100644 index 0000000000000000000000000000000000000000..c71339370956a7dd6cb663f18412af7dedb03f10 --- /dev/null +++ b/app/Libraries/Image.php @@ -0,0 +1,153 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace App\Libraries; + +class Image +{ + /** + * @var \Config\Images + */ + protected $config; + + /** + * @var string + */ + protected $original_path; + + /** + * @var string + */ + public $original_url; + + /** + * @var string + */ + protected $thumbnail_path; + + /** + * @var string + */ + public $thumbnail_url; + + /** + * @var string + */ + protected $medium_path; + + /** + * @var string + */ + public $medium_url; + + /** + * @var string + */ + protected $large_path; + + /** + * @var string + */ + public $large_url; + + /** + * @var string + */ + public $feed_path; + + /** + * @var string + */ + public $feed_url; + + /** + * @var string + */ + public $id3_path; + + public function __construct($originalUri, $mimetype) + { + helper('media'); + + $originalPath = media_path($originalUri); + + [ + 'filename' => $filename, + 'dirname' => $dirname, + 'extension' => $extension, + ] = pathinfo($originalPath); + + // load images extensions from config + $this->config = config('Images'); + + $thumbnailExtension = $this->config->thumbnailExtension; + $mediumExtension = $this->config->mediumExtension; + $largeExtension = $this->config->largeExtension; + $feedExtension = $this->config->feedExtension; + $id3Extension = $this->config->id3Extension; + + $thumbnail = + $dirname . '/' . $filename . $thumbnailExtension . '.' . $extension; + $medium = + $dirname . '/' . $filename . $mediumExtension . '.' . $extension; + $large = + $dirname . '/' . $filename . $largeExtension . '.' . $extension; + $feed = $dirname . '/' . $filename . $feedExtension . '.' . $extension; + $id3 = $dirname . '/' . $filename . $id3Extension . '.' . $extension; + + $this->original_path = $originalPath; + $this->original_url = media_url($originalUri); + $this->thumbnail_path = $thumbnail; + $this->thumbnail_url = base_url($thumbnail); + $this->medium_path = $medium; + $this->medium_url = base_url($medium); + $this->large_path = $large; + $this->large_url = base_url($large); + $this->feed_path = $feed; + $this->feed_url = base_url($feed); + $this->id3_path = $id3; + + $this->mimetype = $mimetype; + } + + public function saveSizes() + { + $thumbnailSize = $this->config->thumbnailSize; + $mediumSize = $this->config->mediumSize; + $largeSize = $this->config->largeSize; + $feedSize = $this->config->feedSize; + $id3Size = $this->config->id3Size; + + $imageService = \Config\Services::image(); + + $imageService + ->withFile($this->original_path) + ->resize($thumbnailSize, $thumbnailSize) + ->save($this->thumbnail_path); + + $imageService + ->withFile($this->original_path) + ->resize($mediumSize, $mediumSize) + ->save($this->medium_path); + + $imageService + ->withFile($this->original_path) + ->resize($largeSize, $largeSize) + ->save($this->large_path); + + $imageService + ->withFile($this->original_path) + ->resize($feedSize, $feedSize) + ->save($this->feed_path); + + $imageService + ->withFile($this->original_path) + ->resize($id3Size, $id3Size) + ->save($this->id3_path); + } +} diff --git a/app/Libraries/Negotiate.php b/app/Libraries/Negotiate.php new file mode 100644 index 0000000000000000000000000000000000000000..8e52ca036ee41e10550e070c4b390cc7967e2d93 --- /dev/null +++ b/app/Libraries/Negotiate.php @@ -0,0 +1,14 @@ +<?php + +namespace App\Libraries; + +class Negotiate extends \CodeIgniter\HTTP\Negotiate +{ + public function callMatch( + array $acceptable, + string $supported, + bool $enforceTypes = false + ): bool { + return $this->match($acceptable, $supported, $enforceTypes); + } +} diff --git a/app/Libraries/NoteObject.php b/app/Libraries/NoteObject.php new file mode 100644 index 0000000000000000000000000000000000000000..4602784e250ed4d32c51d6235a682e9aab2e7881 --- /dev/null +++ b/app/Libraries/NoteObject.php @@ -0,0 +1,30 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace App\Libraries; + +class NoteObject extends \ActivityPub\Objects\NoteObject +{ + /** + * @param \App\Entities\Note $note + */ + public function __construct($note) + { + parent::__construct($note); + + if ($note->episode_id) { + $this->content = + '<a href="' . + $note->episode->link . + '" target="_blank" rel="noopener noreferrer">' . + $note->episode->title . + '</a><br/>' . + $note->message_html; + } + } +} diff --git a/app/Libraries/PodcastActor.php b/app/Libraries/PodcastActor.php new file mode 100644 index 0000000000000000000000000000000000000000..acc55e2ce46c609527a4ebc3ee4375aff8f45260 --- /dev/null +++ b/app/Libraries/PodcastActor.php @@ -0,0 +1,31 @@ +<?php + +/** + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace App\Libraries; + +use App\Models\PodcastModel; + +class PodcastActor extends \ActivityPub\Objects\ActorObject +{ + /** + * @var string + */ + protected $rss; + + /** + * @param \App\Entities\Actor $actor + */ + public function __construct($actor) + { + parent::__construct($actor); + + $podcast = (new PodcastModel())->where('actor_id', $actor->id)->first(); + + $this->rss = $podcast->feed_url; + } +} diff --git a/app/Libraries/Router.php b/app/Libraries/Router.php new file mode 100644 index 0000000000000000000000000000000000000000..fddaa2ba4f2df9a24b8c21fa57e916f2684d1f57 --- /dev/null +++ b/app/Libraries/Router.php @@ -0,0 +1,205 @@ +<?php + +/** + * This file extends the Router class from the CodeIgniter 4 framework. + * + * It introduces the alternate-content option for a route. + * + * @copyright 2021 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace App\Libraries; + +use Config\Services; +use CodeIgniter\Router\Exceptions\RedirectException; + +class Router extends \CodeIgniter\Router\Router +{ + /** + * Compares the uri string against the routes that the + * RouteCollection class defined for us, attempting to find a match. + * This method will modify $this->controller, etal as needed. + * + * @param string $uri The URI path to compare against the routes + * + * @return boolean Whether the route was matched or not. + * @throws RedirectException + */ + protected function checkRoutes(string $uri): bool + { + $routes = $this->collection->getRoutes( + $this->collection->getHTTPVerb(), + ); + + // Don't waste any time + if (empty($routes)) { + return false; + } + + $uri = $uri === '/' ? $uri : ltrim($uri, '/ '); + + // Loop through the route array looking for wildcards + foreach ($routes as $key => $val) { + // Reset localeSegment + $localeSegment = null; + + $key = $key === '/' ? $key : ltrim($key, '/ '); + + $matchedKey = $key; + + // Are we dealing with a locale? + if (strpos($key, '{locale}') !== false) { + $localeSegment = array_search( + '{locale}', + preg_split( + '/[\/]*((^[a-zA-Z0-9])|\(([^()]*)\))*[\/]+/m', + $key, + ), + true, + ); + + // Replace it with a regex so it + // will actually match. + $key = str_replace('/', '\/', $key); + $key = str_replace('{locale}', '[^\/]+', $key); + } + + // Does the RegEx match? + if (preg_match('#^' . $key . '$#u', $uri, $matches)) { + $this->matchedRouteOptions = $this->collection->getRoutesOptions( + $matchedKey, + ); + + // Is this route supposed to redirect to another? + if ($this->collection->isRedirect($key)) { + throw new RedirectException( + is_array($val) ? key($val) : $val, + $this->collection->getRedirectCode($key), + ); + } + // Store our locale so CodeIgniter object can + // assign it to the Request. + if (isset($localeSegment)) { + // The following may be inefficient, but doesn't upset NetBeans :-/ + $temp = explode('/', $uri); + $this->detectedLocale = $temp[$localeSegment]; + } + + // Are we using Closures? If so, then we need + // to collect the params into an array + // so it can be passed to the controller method later. + if (!is_string($val) && is_callable($val)) { + $this->controller = $val; + + // Remove the original string from the matches array + array_shift($matches); + + $this->params = $matches; + + $this->matchedRoute = [$matchedKey, $val]; + + return true; + } + + // Is there an alternate content for the matchedRoute? + + // check if the alternate-content has been requested in the accept + // header and overwrite the $val with the matching controller method + if ( + array_key_exists( + 'alternate-content', + $this->matchedRouteOptions, + ) && + is_array($this->matchedRouteOptions['alternate-content']) + ) { + $request = Services::request(); + $negotiate = Services::negotiator(); + + $acceptHeader = $request->getHeader('Accept')->getValue(); + $parsedHeader = $negotiate->parseHeader($acceptHeader); + + $supported = array_keys( + $this->matchedRouteOptions['alternate-content'], + ); + + $expectedContentType = $parsedHeader[0]; + foreach ($supported as $available) { + if ( + $negotiate->callMatch( + $expectedContentType, + $available, + true, + ) + ) { + if ( + array_key_exists( + 'namespace', + $this->matchedRouteOptions[ + 'alternate-content' + ][$available], + ) + ) { + $this->collection->setDefaultNamespace( + $this->matchedRouteOptions[ + 'alternate-content' + ][$available]['namespace'], + ); + } + $val = + $this->collection->getDefaultNamespace() . + $this->directory . + $this->matchedRouteOptions['alternate-content'][ + $available + ]['controller-method']; + + // no need to continue loop as $val has been overwritten + break; + } + } + } + + // Are we using the default method for back-references? + + // Support resource route when function with subdirectory + // ex: $routes->resource('Admin/Admins'); + if ( + strpos($val, '$') !== false && + strpos($key, '(') !== false && + strpos($key, '/') !== false + ) { + $replacekey = str_replace('/(.*)', '', $key); + $val = preg_replace('#^' . $key . '$#u', $val, $uri); + $val = str_replace( + $replacekey, + str_replace('/', '\\', $replacekey), + $val, + ); + } elseif ( + strpos($val, '$') !== false && + strpos($key, '(') !== false + ) { + $val = preg_replace('#^' . $key . '$#u', $val, $uri); + } elseif (strpos($val, '/') !== false) { + [$controller, $method] = explode('::', $val); + + // Only replace slashes in the controller, not in the method. + $controller = str_replace('/', '\\', $controller); + + $val = $controller . '::' . $method; + } + + $this->setRequest(explode('/', $val)); + + $this->matchedRoute = [$matchedKey, $val]; + + return true; + } + } + + return false; + } + + //-------------------------------------------------------------------- +} diff --git a/app/Libraries/SimpleRSSElement.php b/app/Libraries/SimpleRSSElement.php index 3aad896505c9586dc3597910ef16678d76c7bdba..f37453c17a02f16166cca742cc64e6c563af7b8b 100644 --- a/app/Libraries/SimpleRSSElement.php +++ b/app/Libraries/SimpleRSSElement.php @@ -1,7 +1,7 @@ <?php /** - * @copyright 2020 Podlibre + * @copyright 2021 Podlibre * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 * @link https://castopod.org/ */ diff --git a/app/Models/AnalyticsPodcastByCountryModel.php b/app/Models/AnalyticsPodcastByCountryModel.php index 413da94348196bb7a7dbc1f14abc5f2e09581224..af76704cf348dc60d04c9fc1f0d3e8c47452ff53 100644 --- a/app/Models/AnalyticsPodcastByCountryModel.php +++ b/app/Models/AnalyticsPodcastByCountryModel.php @@ -34,24 +34,24 @@ class AnalyticsPodcastByCountryModel extends Model { if ( !($found = cache( - "{$podcastId}_analytics_podcast_by_country_weekly" + "{$podcastId}_analytics_podcast_by_country_weekly", )) ) { $oneWeekAgo = date('Y-m-d', strtotime('-1 week')); - $found = $this->select('`country_code` as `labels`') - ->selectSum('`hits`', '`values`') + $found = $this->select('country_code as labels') + ->selectSum('hits', 'values') ->where([ - '`podcast_id`' => $podcastId, - '`date` >' => $oneWeekAgo, + 'podcast_id' => $podcastId, + 'date >' => $oneWeekAgo, ]) - ->groupBy('`labels`') - ->orderBy('`values`', 'DESC') + ->groupBy('labels') + ->orderBy('values', 'DESC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcast_by_country_weekly", $found, - 600 + 600, ); } return $found; @@ -68,24 +68,24 @@ class AnalyticsPodcastByCountryModel extends Model { if ( !($found = cache( - "{$podcastId}_analytics_podcast_by_country_yearly" + "{$podcastId}_analytics_podcast_by_country_yearly", )) ) { $oneYearAgo = date('Y-m-d', strtotime('-1 year')); - $found = $this->select('`country_code` as `labels`') - ->selectSum('`hits`', '`values`') + $found = $this->select('country_code as labels') + ->selectSum('hits', 'values') ->where([ - '`podcast_id`' => $podcastId, - '`date` >' => $oneYearAgo, + 'podcast_id' => $podcastId, + 'date >' => $oneYearAgo, ]) - ->groupBy('`labels`') - ->orderBy('`values`', 'DESC') + ->groupBy('labels') + ->orderBy('values', 'DESC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcast_by_country_yearly", $found, - 600 + 600, ); } return $found; diff --git a/app/Models/AnalyticsPodcastByEpisodeModel.php b/app/Models/AnalyticsPodcastByEpisodeModel.php index fce1544546bf690aeecc7bec00ec1788b7355712..15725032d53311dfc728f92ae3121415d2ba2bf7 100644 --- a/app/Models/AnalyticsPodcastByEpisodeModel.php +++ b/app/Models/AnalyticsPodcastByEpisodeModel.php @@ -33,25 +33,25 @@ class AnalyticsPodcastByEpisodeModel extends Model if (!$episodeId) { if ( !($found = cache( - "{$podcastId}_analytics_podcast_by_episode_by_day" + "{$podcastId}_analytics_podcast_by_episode_by_day", )) ) { $lastEpisodes = (new EpisodeModel()) - ->select('`id`, `season_number`, `number`, `title`') - ->orderBy('`id`', 'DESC') - ->where(['`podcast_id`' => $podcastId]) + ->select('id, season_number, number, title') + ->orderBy('id', 'DESC') + ->where(['podcast_id' => $podcastId]) ->findAll(5); - $found = $this->select('`age` AS `X`'); + $found = $this->select('age AS X'); $letter = 97; foreach ($lastEpisodes as $episode) { $found = $found ->selectSum( - '(CASE WHEN `episode_id`=' . + '(CASE WHEN episode_id=' . $episode->id . - ' THEN `hits` END)', - '`' . chr($letter) . 'Y`' + ' THEN hits END)', + '' . chr($letter) . 'Y', ) ->select( '"' . @@ -62,50 +62,50 @@ class AnalyticsPodcastByEpisodeModel extends Model ? '' : '-' . $episode->number . '/ ') . $episode->title . - '" AS `' . + '" AS ' . chr($letter) . - 'Value`' + 'Value', ); $letter++; } $found = $found ->where([ - '`podcast_id`' => $podcastId, - '`age` <' => 60, + 'podcast_id' => $podcastId, + 'age <' => 60, ]) - ->groupBy('`X`') - ->orderBy('`X`', 'ASC') + ->groupBy('X') + ->orderBy('X', 'ASC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcast_by_episode_by_day", $found, - 600 + 600, ); } return $found; } else { if ( !($found = cache( - "{$podcastId}_{$episodeId}_analytics_podcast_by_episode_by_day" + "{$podcastId}_{$episodeId}_analytics_podcast_by_episode_by_day", )) ) { - $found = $this->select('`date as `labels`') - ->selectSum('`hits`', '`values`') + $found = $this->select('date as labels') + ->selectSum('hits', 'values') ->where([ - '`episode_id`' => $episodeId, - '`podcast_id`' => $podcastId, - '`age` <' => 60, + 'episode_id' => $episodeId, + 'podcast_id' => $podcastId, + 'age <' => 60, ]) - ->groupBy('`labels`') - ->orderBy('`labels`', 'ASC') + ->groupBy('labels') + ->orderBy('labels', 'ASC') ->findAll(); cache()->save( "{$podcastId}_{$episodeId}_analytics_podcast_by_episode_by_day", $found, - 600 + 600, ); } return $found; @@ -121,23 +121,23 @@ class AnalyticsPodcastByEpisodeModel extends Model { if ( !($found = cache( - "{$podcastId}_{$episodeId}_analytics_podcast_by_episode_by_month" + "{$podcastId}_{$episodeId}_analytics_podcast_by_episode_by_month", )) ) { - $found = $this->select('DATE_FORMAT(`date`,"%Y-%m-01") as `labels`') - ->selectSum('`hits`', '`values`') + $found = $this->select('DATE_FORMAT(date,"%Y-%m-01") as labels') + ->selectSum('hits', 'values') ->where([ 'episode_id' => $episodeId, 'podcast_id' => $podcastId, ]) - ->groupBy('`labels`') - ->orderBy('`labels`', 'ASC') + ->groupBy('labels') + ->orderBy('labels', 'ASC') ->findAll(); cache()->save( "{$podcastId}_{$episodeId}_analytics_podcast_by_episode_by_month", $found, - 600 + 600, ); } return $found; diff --git a/app/Models/AnalyticsPodcastByHourModel.php b/app/Models/AnalyticsPodcastByHourModel.php index 2d65209db02bd0674d4424ba2d3faf3908d7d9d7..df43d0383ec794c7b8bcc3421ff600168660f4e4 100644 --- a/app/Models/AnalyticsPodcastByHourModel.php +++ b/app/Models/AnalyticsPodcastByHourModel.php @@ -34,21 +34,21 @@ class AnalyticsPodcastByHourModel extends Model { if (!($found = cache("{$podcastId}_analytics_podcasts_by_hour"))) { $found = $this->select( - 'right(concat(\'0\',`hour`,\'h\'),3) as `labels`' + 'right(concat(\'0\',hour,\'h\'),3) as labels', ) - ->selectSum('`hits`', '`values`') + ->selectSum('hits', 'values') ->where([ - '`podcast_id`' => $podcastId, - '`date` >' => date('Y-m-d', strtotime('-60 days')), + 'podcast_id' => $podcastId, + 'date >' => date('Y-m-d', strtotime('-60 days')), ]) - ->groupBy('`labels`') - ->orderBy('`labels`', 'ASC') + ->groupBy('labels') + ->orderBy('labels', 'ASC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcasts_by_hour", $found, - 600 + 600, ); } return $found; diff --git a/app/Models/AnalyticsPodcastByPlayerModel.php b/app/Models/AnalyticsPodcastByPlayerModel.php index 39359b8ccd7ec53e46e5182dfb4373b8ac46051f..668ca123e9743ddf4a7f8ede1a76bebe9fdea51d 100644 --- a/app/Models/AnalyticsPodcastByPlayerModel.php +++ b/app/Models/AnalyticsPodcastByPlayerModel.php @@ -34,25 +34,25 @@ class AnalyticsPodcastByPlayerModel extends Model { if ( !($found = cache( - "{$podcastId}_analytics_podcasts_by_player_by_app_weekly" + "{$podcastId}_analytics_podcasts_by_player_by_app_weekly", )) ) { $oneWeekAgo = date('Y-m-d', strtotime('-1 week')); - $found = $this->select('`app` as `labels`') - ->selectSum('`hits`', '`values`') + $found = $this->select('app as labels') + ->selectSum('hits', 'values') ->where([ - '`podcast_id`' => $podcastId, - '`app` !=' => '', - '`is_bot`' => 0, - '`date` >' => $oneWeekAgo, + 'podcast_id' => $podcastId, + 'app !=' => '', + 'is_bot' => 0, + 'date >' => $oneWeekAgo, ]) - ->groupBy('`labels`') - ->orderBy('`values`', 'DESC') + ->groupBy('labels') + ->orderBy('values', 'DESC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcasts_by_player_by_app_weekly", $found, - 600 + 600, ); } return $found; @@ -69,25 +69,25 @@ class AnalyticsPodcastByPlayerModel extends Model { if ( !($found = cache( - "{$podcastId}_analytics_podcasts_by_player_by_app_yearly" + "{$podcastId}_analytics_podcasts_by_player_by_app_yearly", )) ) { $oneYearAgo = date('Y-m-d', strtotime('-1 year')); - $found = $this->select('`app` as `labels`') - ->selectSum('`hits`', '`values`') + $found = $this->select('app as labels') + ->selectSum('hits', 'values') ->where([ - '`podcast_id`' => $podcastId, - '`app` !=' => '', - '`is_bot`' => 0, - '`date` >' => $oneYearAgo, + 'podcast_id' => $podcastId, + 'app !=' => '', + 'is_bot' => 0, + 'date >' => $oneYearAgo, ]) - ->groupBy('`labels`') - ->orderBy('`values`', 'DESC') + ->groupBy('labels') + ->orderBy('values', 'DESC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcasts_by_player_by_app_yearly", $found, - 600 + 600, ); } return $found; @@ -104,26 +104,26 @@ class AnalyticsPodcastByPlayerModel extends Model { if ( !($found = cache( - "{$podcastId}_analytics_podcasts_by_player_by_os_weekly" + "{$podcastId}_analytics_podcasts_by_player_by_os_weekly", )) ) { $oneWeekAgo = date('Y-m-d', strtotime('-1 week')); - $found = $this->select('`os` as `labels`') - ->selectSum('`hits`', '`values`') + $found = $this->select('os as labels') + ->selectSum('hits', 'values') ->where([ - '`podcast_id`' => $podcastId, - '`app` !=' => '', - '`os` !=' => '', - '`is_bot`' => 0, - '`date` >' => $oneWeekAgo, + 'podcast_id' => $podcastId, + 'app !=' => '', + 'os !=' => '', + 'is_bot' => 0, + 'date >' => $oneWeekAgo, ]) - ->groupBy('`labels`') - ->orderBy('`values`', 'DESC') + ->groupBy('labels') + ->orderBy('values', 'DESC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcasts_by_player_by_os_weekly", $found, - 600 + 600, ); } return $found; @@ -140,25 +140,25 @@ class AnalyticsPodcastByPlayerModel extends Model { if ( !($found = cache( - "{$podcastId}_analytics_podcasts_by_player_by_device_weekly" + "{$podcastId}_analytics_podcasts_by_player_by_device_weekly", )) ) { $oneWeekAgo = date('Y-m-d', strtotime('-1 week')); - $found = $this->select('`device` as `labels`') - ->selectSum('`hits`', '`values`') + $found = $this->select('device as labels') + ->selectSum('hits', 'values') ->where([ - '`podcast_id`' => $podcastId, - '`device` !=' => '', - '`is_bot`' => 0, - '`date` >' => $oneWeekAgo, + 'podcast_id' => $podcastId, + 'device !=' => '', + 'is_bot' => 0, + 'date >' => $oneWeekAgo, ]) - ->groupBy('`labels`') - ->orderBy('`values`', 'DESC') + ->groupBy('labels') + ->orderBy('values', 'DESC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcasts_by_player_by_device_weekly", $found, - 600 + 600, ); } return $found; @@ -177,21 +177,21 @@ class AnalyticsPodcastByPlayerModel extends Model !($found = cache("{$podcastId}_analytics_podcasts_by_player_bots")) ) { $oneYearAgo = date('Y-m-d', strtotime('-1 year')); - $found = $this->select('DATE_FORMAT(`date`,"%Y-%m-01") as `labels`') - ->selectSum('`hits`', '`values`') + $found = $this->select('DATE_FORMAT(date,"%Y-%m-01") as labels') + ->selectSum('hits', 'values') ->where([ - '`podcast_id`' => $podcastId, - '`is_bot`' => 1, - '`date` >' => $oneYearAgo, + 'podcast_id' => $podcastId, + 'is_bot' => 1, + 'date >' => $oneYearAgo, ]) - ->groupBy('`labels`') - ->orderBy('`labels`', 'ASC') + ->groupBy('labels') + ->orderBy('labels', 'ASC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcasts_by_player_bots", $found, - 600 + 600, ); } return $found; diff --git a/app/Models/AnalyticsPodcastByRegionModel.php b/app/Models/AnalyticsPodcastByRegionModel.php index 511a0769b17157296b3eb167abbbd5895b594180..be9a81c0766f64f948cccde68f3b201527659483 100644 --- a/app/Models/AnalyticsPodcastByRegionModel.php +++ b/app/Models/AnalyticsPodcastByRegionModel.php @@ -35,25 +35,25 @@ class AnalyticsPodcastByRegionModel extends Model $locale = service('request')->getLocale(); if ( !($found = cache( - "{$podcastId}_analytics_podcast_by_region_{$locale}" + "{$podcastId}_analytics_podcast_by_region_{$locale}", )) ) { - $found = $this->select('`country_code`, `region_code`') - ->selectSum('`hits`', '`value`') - ->selectAvg('`latitude`') - ->selectAvg('`longitude`') - ->groupBy('`country_code`, `region_code`') + $found = $this->select('country_code, region_code') + ->selectSum('hits', 'value') + ->selectAvg('latitude') + ->selectAvg('longitude') + ->groupBy('country_code, region_code') ->where([ - '`podcast_id`' => $podcastId, - '`date` >' => date('Y-m-d', strtotime('-1 week')), + 'podcast_id' => $podcastId, + 'date >' => date('Y-m-d', strtotime('-1 week')), ]) - ->orderBy('`value`', 'DESC') + ->orderBy('value', 'DESC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcast_by_region_{$locale}", $found, - 600 + 600, ); } return $found; diff --git a/app/Models/AnalyticsPodcastByServiceModel.php b/app/Models/AnalyticsPodcastByServiceModel.php index d65531a0539737691041a04bc415b03f26988c1d..9170f8618fee98aa40e701071dc543fd43d062a3 100644 --- a/app/Models/AnalyticsPodcastByServiceModel.php +++ b/app/Models/AnalyticsPodcastByServiceModel.php @@ -34,25 +34,25 @@ class AnalyticsPodcastByServiceModel extends Model { if ( !($found = cache( - "{$podcastId}_analytics_podcasts_by_service_weekly" + "{$podcastId}_analytics_podcasts_by_service_weekly", )) ) { $oneWeekAgo = date('Y-m-d', strtotime('-1 week')); - $found = $this->select('`service` as `labels`') - ->selectSum('`hits`', '`values`') + $found = $this->select('service as labels') + ->selectSum('hits', 'values') ->where([ - '`podcast_id`' => $podcastId, - '`service` !=' => '', - '`is_bot`' => 0, - '`date` >' => $oneWeekAgo, + 'podcast_id' => $podcastId, + 'service !=' => '', + 'is_bot' => 0, + 'date >' => $oneWeekAgo, ]) - ->groupBy('`labels`') - ->orderBy('`values`', 'DESC') + ->groupBy('labels') + ->orderBy('values', 'DESC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcasts_by_service_weekly", $found, - 600 + 600, ); } return $found; diff --git a/app/Models/AnalyticsPodcastModel.php b/app/Models/AnalyticsPodcastModel.php index 1d44a55150486d739abe691c8cfb02bedd3d90fe..b8e84fb11415a9e06e45af5ffedbf6bfcbaaa81a 100644 --- a/app/Models/AnalyticsPodcastModel.php +++ b/app/Models/AnalyticsPodcastModel.php @@ -33,12 +33,12 @@ class AnalyticsPodcastModel extends Model public function getDataByDay(int $podcastId): array { if (!($found = cache("{$podcastId}_analytics_podcast_by_day"))) { - $found = $this->select('`date` as `labels`, `hits` as `values`') + $found = $this->select('date as labels, hits as values') ->where([ - '`podcast_id`' => $podcastId, - '`date` >' => date('Y-m-d', strtotime('-60 days')), + 'podcast_id' => $podcastId, + 'date >' => date('Y-m-d', strtotime('-60 days')), ]) - ->orderBy('`labels`', 'ASC') + ->orderBy('labels', 'ASC') ->findAll(); cache()->save("{$podcastId}_analytics_podcast_by_day", $found, 600); @@ -57,21 +57,21 @@ class AnalyticsPodcastModel extends Model { if (!($found = cache("{$podcastId}_analytics_podcasts_by_weekday"))) { $found = $this->select( - 'LEFT(DAYNAME(`date`),3) as `labels`, WEEKDAY(`date`) as `sort_labels`' + 'LEFT(DAYNAME(date),3) as labels, WEEKDAY(date) as sort_labels', ) - ->selectSum('`hits`', '`values`') + ->selectSum('hits', 'values') ->where([ - '`podcast_id`' => $podcastId, - '`date` >' => date('Y-m-d', strtotime('-60 days')), + 'podcast_id' => $podcastId, + 'date >' => date('Y-m-d', strtotime('-60 days')), ]) - ->groupBy('`labels`, `sort_labels`') - ->orderBy('`sort_labels`', 'ASC') + ->groupBy('labels, sort_labels') + ->orderBy('sort_labels', 'ASC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcasts_by_weekday", $found, - 600 + 600, ); } return $found; @@ -88,19 +88,19 @@ class AnalyticsPodcastModel extends Model { if (!($found = cache("{$podcastId}_analytics_podcast_by_bandwidth"))) { $found = $this->select( - '`date` as `labels`, round(`bandwidth` / 1048576, 1) as `values`' + 'date as labels, round(bandwidth / 1048576, 1) as `values`', ) ->where([ - '`podcast_id`' => $podcastId, - '`date` >' => date('Y-m-d', strtotime('-60 days')), + 'podcast_id' => $podcastId, + 'date >' => date('Y-m-d', strtotime('-60 days')), ]) - ->orderBy('`labels`', 'ASC') + ->orderBy('labels', 'ASC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcast_by_bandwidth", $found, - 600 + 600, ); } return $found; @@ -116,19 +116,19 @@ class AnalyticsPodcastModel extends Model public function getDataByMonth(int $podcastId): array { if (!($found = cache("{$podcastId}_analytics_podcast_by_month"))) { - $found = $this->select('DATE_FORMAT(`date`,"%Y-%m-01") as `labels`') - ->selectSum('`hits`', '`values`') + $found = $this->select('DATE_FORMAT(date,"%Y-%m-01") as labels') + ->selectSum('hits', 'values') ->where([ - '`podcast_id`' => $podcastId, + 'podcast_id' => $podcastId, ]) - ->groupBy('`labels`') - ->orderBy('`labels`', 'ASC') + ->groupBy('labels') + ->orderBy('labels', 'ASC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcast_by_month", $found, - 600 + 600, ); } return $found; @@ -145,23 +145,21 @@ class AnalyticsPodcastModel extends Model { if ( !($found = cache( - "{$podcastId}_analytics_podcast_unique_listeners_by_day" + "{$podcastId}_analytics_podcast_unique_listeners_by_day", )) ) { - $found = $this->select( - '`date` as `labels`, `unique_listeners` as `values`' - ) + $found = $this->select('date as labels, unique_listeners as values') ->where([ - '`podcast_id`' => $podcastId, - '`date` >' => date('Y-m-d', strtotime('-60 days')), + 'podcast_id' => $podcastId, + 'date >' => date('Y-m-d', strtotime('-60 days')), ]) - ->orderBy('`labels`', 'ASC') + ->orderBy('labels', 'ASC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcast_unique_listeners_by_day", $found, - 600 + 600, ); } return $found; @@ -178,22 +176,22 @@ class AnalyticsPodcastModel extends Model { if ( !($found = cache( - "{$podcastId}_analytics_podcast_unique_listeners_by_month" + "{$podcastId}_analytics_podcast_unique_listeners_by_month", )) ) { - $found = $this->select('DATE_FORMAT(`date`,"%Y-%m-01") as `labels`') - ->selectSum('`unique_listeners`', '`values`') + $found = $this->select('DATE_FORMAT(date,"%Y-%m-01") as labels') + ->selectSum('unique_listeners', 'values') ->where([ - '`podcast_id`' => $podcastId, + 'podcast_id' => $podcastId, ]) - ->groupBy('`labels`') - ->orderBy('`labels`', 'ASC') + ->groupBy('labels') + ->orderBy('labels', 'ASC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcast_unique_listeners_by_month", $found, - 600 + 600, ); } return $found; @@ -210,7 +208,7 @@ class AnalyticsPodcastModel extends Model { if ( !($found = cache( - "{$podcastId}_analytics_podcast_listening_time_by_day" + "{$podcastId}_analytics_podcast_listening_time_by_day", )) ) { $found = $this->select('date as labels') @@ -226,7 +224,7 @@ class AnalyticsPodcastModel extends Model cache()->save( "{$podcastId}_analytics_podcast_listening_time_by_day", $found, - 600 + 600, ); } return $found; @@ -243,22 +241,22 @@ class AnalyticsPodcastModel extends Model { if ( !($found = cache( - "{$podcastId}_analytics_podcast_listening_time_by_month" + "{$podcastId}_analytics_podcast_listening_time_by_month", )) ) { - $found = $this->select('DATE_FORMAT(`date`,"%Y-%m-01") as `labels`') + $found = $this->select('DATE_FORMAT(date,"%Y-%m-01") as labels') ->selectSum('duration', 'values') ->where([ $this->table . '.podcast_id' => $podcastId, ]) - ->groupBy('`labels`') - ->orderBy('`labels`', 'ASC') + ->groupBy('labels') + ->orderBy('labels', 'ASC') ->findAll(); cache()->save( "{$podcastId}_analytics_podcast_listening_time_by_month", $found, - 600 + 600, ); } return $found; diff --git a/app/Models/AnalyticsWebsiteByBrowserModel.php b/app/Models/AnalyticsWebsiteByBrowserModel.php index d2da9b3ac8cf274111477685daf769280287db35..b7b7c132639f54ab96598314fd677bca76200dfc 100644 --- a/app/Models/AnalyticsWebsiteByBrowserModel.php +++ b/app/Models/AnalyticsWebsiteByBrowserModel.php @@ -34,19 +34,20 @@ class AnalyticsWebsiteByBrowserModel extends Model { if (!($found = cache("{$podcastId}_analytics_website_by_browser"))) { $oneWeekAgo = date('Y-m-d', strtotime('-1 week')); - $found = $this->select('`browser` as `labels`') - ->selectSum('`hits`', '`values`') + $found = $this->select('browser as labels') + ->selectSum('hits', 'values') ->where([ - '`podcast_id`' => $podcastId, - '`date` >' => $oneWeekAgo, + 'podcast_id' => $podcastId, + 'date >' => $oneWeekAgo, ]) - ->groupBy('`labels`') - ->orderBy('`values`', 'DESC') + ->groupBy('labels') + ->orderBy('values', 'DESC') ->findAll(); + cache()->save( "{$podcastId}_analytics_website_by_browser", $found, - 600 + 600, ); } return $found; diff --git a/app/Models/AnalyticsWebsiteByEntryPageModel.php b/app/Models/AnalyticsWebsiteByEntryPageModel.php index ad19f6a6989cf9288fd5ecdbbe350d30edbe17b5..220719d4094786a706478ee2d63d4363dbe2b8f5 100644 --- a/app/Models/AnalyticsWebsiteByEntryPageModel.php +++ b/app/Models/AnalyticsWebsiteByEntryPageModel.php @@ -35,20 +35,20 @@ class AnalyticsWebsiteByEntryPageModel extends Model if (!($found = cache("{$podcastId}_analytics_website_by_entry_page"))) { $oneWeekAgo = date('Y-m-d', strtotime('-1 week')); $found = $this->select( - 'IF(`entry_page_url`=\'/\',\'/\',SUBSTRING_INDEX(`entry_page_url`,\'/\',-1)) as `labels`' + 'IF(entry_page_url=\'/\',\'/\',SUBSTRING_INDEX(entry_page_url,\'/\',-1)) as labels', ) - ->selectSum('`hits`', '`values`') + ->selectSum('hits', 'values') ->where([ - '`podcast_id`' => $podcastId, - '`date` >' => $oneWeekAgo, + 'podcast_id' => $podcastId, + 'date >' => $oneWeekAgo, ]) - ->groupBy('`labels`') - ->orderBy('`values`', 'DESC') + ->groupBy('labels') + ->orderBy('values', 'DESC') ->findAll(); cache()->save( "{$podcastId}_analytics_website_by_entry_page", $found, - 600 + 600, ); } return $found; diff --git a/app/Models/AnalyticsWebsiteByRefererModel.php b/app/Models/AnalyticsWebsiteByRefererModel.php index 570f2ec8e5170cecbdea7d318354e436a0b85b7e..aed2f46bc6b4eb25bcb09ceeeaaad5800d14af8c 100644 --- a/app/Models/AnalyticsWebsiteByRefererModel.php +++ b/app/Models/AnalyticsWebsiteByRefererModel.php @@ -34,19 +34,19 @@ class AnalyticsWebsiteByRefererModel extends Model { if (!($found = cache("{$podcastId}_analytics_website_by_referer"))) { $oneWeekAgo = date('Y-m-d', strtotime('-1 week')); - $found = $this->select('`referer_url` as `labels`') - ->selectSum('`hits`', '`values`') + $found = $this->select('referer_url as labels') + ->selectSum('hits', 'values') ->where([ - '`podcast_id`' => $podcastId, - '`date` >' => $oneWeekAgo, + 'podcast_id' => $podcastId, + 'date >' => $oneWeekAgo, ]) - ->groupBy('`labels`') - ->orderBy('`values`', 'DESC') + ->groupBy('labels') + ->orderBy('values', 'DESC') ->findAll(); cache()->save( "{$podcastId}_analytics_website_by_referer", $found, - 600 + 600, ); } return $found; @@ -66,20 +66,20 @@ class AnalyticsWebsiteByRefererModel extends Model ) { $oneWeekAgo = date('Y-m-d', strtotime('-1 week')); $found = $this->select( - 'SUBSTRING_INDEX(`domain`, \'.\', -2) as `labels`' + 'SUBSTRING_INDEX(domain, \'.\', -2) as labels', ) - ->selectSum('`hits`', '`values`') + ->selectSum('hits', 'values') ->where([ - '`podcast_id`' => $podcastId, - '`date` >' => $oneWeekAgo, + 'podcast_id' => $podcastId, + 'date >' => $oneWeekAgo, ]) - ->groupBy('`labels`') - ->orderBy('`values`', 'DESC') + ->groupBy('labels') + ->orderBy('values', 'DESC') ->findAll(); cache()->save( "{$podcastId}_analytics_website_by_domain_weekly", $found, - 600 + 600, ); } return $found; @@ -99,20 +99,20 @@ class AnalyticsWebsiteByRefererModel extends Model ) { $oneYearAgo = date('Y-m-d', strtotime('-1 year')); $found = $this->select( - 'SUBSTRING_INDEX(`domain`, \'.\', -2) as `labels`' + 'SUBSTRING_INDEX(domain, \'.\', -2) as labels', ) - ->selectSum('`hits`', '`values`') + ->selectSum('hits', 'values') ->where([ - '`podcast_id`' => $podcastId, - '`date` >' => $oneYearAgo, + 'podcast_id' => $podcastId, + 'date >' => $oneYearAgo, ]) - ->groupBy('`labels`') - ->orderBy('`values`', 'DESC') + ->groupBy('labels') + ->orderBy('values', 'DESC') ->findAll(); cache()->save( "{$podcastId}_analytics_website_by_domain_yearly", $found, - 600 + 600, ); } return $found; diff --git a/app/Models/EpisodeModel.php b/app/Models/EpisodeModel.php index 6a071434d4b6d0a3fe5057224d8cfc1ce4626ea4..429ac67630cfad340708f15c50bf9e77314063b9 100644 --- a/app/Models/EpisodeModel.php +++ b/app/Models/EpisodeModel.php @@ -16,6 +16,7 @@ class EpisodeModel extends Model protected $primaryKey = 'id'; protected $allowedFields = [ + 'id', 'podcast_id', 'guid', 'title', @@ -28,6 +29,7 @@ class EpisodeModel extends Model 'description_markdown', 'description_html', 'image_uri', + 'image_mimetype', 'transcript_uri', 'chapters_uri', 'parental_advisory', @@ -39,6 +41,9 @@ class EpisodeModel extends Model 'location_geo', 'location_osmid', 'custom_rss', + 'favourites_total', + 'reblogs_total', + 'notes_total', 'published_at', 'created_by', 'updated_by', @@ -70,6 +75,7 @@ class EpisodeModel extends Model protected $afterUpdate = ['writeEnclosureMetadata']; protected $beforeDelete = ['clearCache']; + // TODO: remove public static $themes = [ 'light-transparent' => [ 'style' => @@ -99,87 +105,77 @@ class EpisodeModel extends Model ], ]; + /** + * + * @param int|string $podcastId Podcast Id or name + * @param mixed $episodeSlug + * @return mixed + */ public function getEpisodeBySlug($podcastId, $episodeSlug) { - if (!($found = cache("podcast{$podcastId}_episode@{$episodeSlug}"))) { - $found = $this->where([ - 'podcast_id' => $podcastId, - 'slug' => $episodeSlug, - ]) - ->where('`published_at` <= NOW()', null, false) - ->first(); + if (!($found = cache("podcast@{$podcastId}_episode@{$episodeSlug}"))) { + $builder = $this->select('episodes.*') + ->where('slug', $episodeSlug) + ->where('`published_at` <= NOW()', null, false); + + if (is_numeric($podcastId)) { + // passed argument is the podcast id + $builder->where('podcast_id', $podcastId); + } else { + // passed argument is the podcast name, must perform join + $builder + ->join('podcasts', 'podcasts.id = episodes.podcast_id') + ->where('podcasts.name', $podcastId); + } + + $found = $builder->first(); cache()->save( "podcast{$podcastId}_episode@{$episodeSlug}", $found, - DECADE + DECADE, ); } return $found; } - public function getEpisodeById($podcastId, $episodeId) + public function getEpisodeById($episodeId) { - if (!($found = cache("podcast{$podcastId}_episode{$episodeId}"))) { - $found = $this->where([ - 'podcast_id' => $podcastId, + if (!($found = cache("podcast_episode{$episodeId}"))) { + $builder = $this->where([ 'id' => $episodeId, - ]) - ->where('published_at <=', 'NOW()') - ->first(); + ]); - cache()->save( - "podcast{$podcastId}_episode{$episodeId}", - $found, - DECADE - ); + $found = $builder->first(); + + cache()->save("podcast_episode{$episodeId}", $found, DECADE); } return $found; } - /** - * Returns the previous episode based on episode ordering - */ - public function getPreviousNextEpisodes($episode, $podcastType) + public function getPublishedEpisodeById($episodeId, $podcastId = null) { - $sortNumberField = - $podcastType == 'serial' - ? 'if(isnull(season_number),0,season_number)*1000+number' - : 'if(isnull(season_number),0,season_number)*100000000000000+published_at'; - $sortNumberValue = - $podcastType == 'serial' - ? (empty($episode->season_number) - ? 0 - : $episode->season_number) * - 1000 + - $episode->number - : (empty($episode->season_number) - ? '' - : $episode->season_number) . - date('YmdHis', strtotime($episode->published_at)); - - $previousData = $this->orderBy('(' . $sortNumberField . ') DESC') - ->where([ - 'podcast_id' => $episode->podcast_id, - $sortNumberField . ' <' => $sortNumberValue, - ]) - ->where('`published_at` <= NOW()', null, false) - ->first(); + if (!($found = cache("podcast{$podcastId}_episode{$episodeId}"))) { + $builder = $this->where([ + 'id' => $episodeId, + ])->where('`published_at` <= NOW()', null, false); - $nextData = $this->orderBy('(' . $sortNumberField . ') ASC') - ->where([ - 'podcast_id' => $episode->podcast_id, - $sortNumberField . ' >' => $sortNumberValue, - ]) - ->where('`published_at` <= NOW()', null, false) - ->first(); + if ($podcastId) { + $builder->where('podcast_id', $podcastId); + } + + $found = $builder->first(); - return [ - 'previous' => $previousData, - 'next' => $nextData, - ]; + cache()->save( + "podcast{$podcastId}_episode{$episodeId}", + $found, + DECADE, + ); + } + + return $found; } /** @@ -203,7 +199,7 @@ class EpisodeModel extends Model $year, $season ? 'season' . $season : null, 'episodes', - ]) + ]), ); if (!($found = cache($cacheName))) { @@ -232,7 +228,7 @@ class EpisodeModel extends Model } $secondsToNextUnpublishedEpisode = $this->getSecondsToNextUnpublishedEpisode( - $podcastId + $podcastId, ); cache()->save( @@ -240,7 +236,7 @@ class EpisodeModel extends Model $found, $secondsToNextUnpublishedEpisode ? $secondsToNextUnpublishedEpisode - : DECADE + : DECADE, ); } @@ -251,7 +247,7 @@ class EpisodeModel extends Model { if (!($found = cache("podcast{$podcastId}_years"))) { $found = $this->select( - 'YEAR(published_at) as year, count(*) as number_of_episodes' + 'YEAR(published_at) as year, count(*) as number_of_episodes', ) ->where([ 'podcast_id' => $podcastId, @@ -265,7 +261,7 @@ class EpisodeModel extends Model ->getResultArray(); $secondsToNextUnpublishedEpisode = $this->getSecondsToNextUnpublishedEpisode( - $podcastId + $podcastId, ); cache()->save( @@ -273,7 +269,7 @@ class EpisodeModel extends Model $found, $secondsToNextUnpublishedEpisode ? $secondsToNextUnpublishedEpisode - : DECADE + : DECADE, ); } @@ -284,7 +280,7 @@ class EpisodeModel extends Model { if (!($found = cache("podcast{$podcastId}_seasons"))) { $found = $this->select( - 'season_number, count(*) as number_of_episodes' + 'season_number, count(*) as number_of_episodes', ) ->where([ 'podcast_id' => $podcastId, @@ -298,7 +294,7 @@ class EpisodeModel extends Model ->getResultArray(); $secondsToNextUnpublishedEpisode = $this->getSecondsToNextUnpublishedEpisode( - $podcastId + $podcastId, ); cache()->save( @@ -306,7 +302,7 @@ class EpisodeModel extends Model $found, $secondsToNextUnpublishedEpisode ? $secondsToNextUnpublishedEpisode - : DECADE + : DECADE, ); } @@ -341,7 +337,7 @@ class EpisodeModel extends Model cache()->save( "podcast{$podcastId}_defaultQuery", $defaultQuery, - DECADE + DECADE, ); } return $defaultQuery; @@ -358,7 +354,7 @@ class EpisodeModel extends Model public function getSecondsToNextUnpublishedEpisode(int $podcastId) { $result = $this->select( - 'TIMESTAMPDIFF(SECOND, NOW(), `published_at`) as timestamp_diff' + 'TIMESTAMPDIFF(SECOND, NOW(), `published_at`) as timestamp_diff', ) ->where([ 'podcast_id' => $podcastId, @@ -376,7 +372,7 @@ class EpisodeModel extends Model helper('id3'); $episode = (new EpisodeModel())->find( - is_array($data['id']) ? $data['id'][0] : $data['id'] + is_array($data['id']) ? $data['id'][0] : $data['id'], ); write_enclosure_tags($episode); @@ -386,16 +382,15 @@ class EpisodeModel extends Model public function clearCache(array $data) { - $episodeModel = new EpisodeModel(); $episode = (new EpisodeModel())->find( - is_array($data['id']) ? $data['id'][0] : $data['id'] + is_array($data['id']) ? $data['id'][0] : $data['id'], ); // delete cache for rss feed cache()->delete("podcast{$episode->podcast_id}_feed"); foreach (\Opawg\UserAgentsPhp\UserAgentsRSS::$db as $service) { cache()->delete( - "podcast{$episode->podcast_id}_feed_{$service['slug']}" + "podcast{$episode->podcast_id}_feed_{$service['slug']}", ); } @@ -403,40 +398,43 @@ class EpisodeModel extends Model cache()->delete("podcast{$episode->podcast_id}_episodes"); cache()->delete( - "podcast{$episode->podcast_id}_episode@{$episode->slug}" + "podcast{$episode->podcast_id}_episode@{$episode->slug}", ); + cache()->delete("podcast_episode{$episode->id}"); + // delete episode lists cache per year / season for a podcast // and localized pages + $episodeModel = new EpisodeModel(); $years = $episodeModel->getYears($episode->podcast_id); $seasons = $episodeModel->getSeasons($episode->podcast_id); $supportedLocales = config('App')->supportedLocales; foreach ($supportedLocales as $locale) { cache()->delete( - "page_podcast{$episode->podcast->id}_episode{$episode->id}_{$locale}" + "page_podcast{$episode->podcast->id}_episode{$episode->id}_{$locale}", ); cache()->delete("credits_{$locale}"); } foreach ($years as $year) { cache()->delete( - "podcast{$episode->podcast_id}_{$year['year']}_episodes" + "podcast{$episode->podcast_id}_{$year['year']}_episodes", ); foreach ($supportedLocales as $locale) { cache()->delete( - "page_podcast{$episode->podcast_id}_{$year['year']}_{$locale}" + "page_podcast{$episode->podcast_id}_{$year['year']}_{$locale}", ); } } foreach ($seasons as $season) { cache()->delete( - "podcast{$episode->podcast_id}_season{$season['season_number']}_episodes" + "podcast{$episode->podcast_id}_season{$season['season_number']}_episodes", ); foreach ($supportedLocales as $locale) { cache()->delete( - "page_podcast{$episode->podcast_id}_season{$season['season_number']}_{$locale}" + "page_podcast{$episode->podcast_id}_season{$season['season_number']}_{$locale}", ); } } @@ -444,7 +442,7 @@ class EpisodeModel extends Model foreach (array_keys(self::$themes) as $themeKey) { foreach ($supportedLocales as $locale) { cache()->delete( - "page_podcast{$episode->podcast_id}_episode{$episode->id}_embeddable_player_{$themeKey}_{$locale}" + "page_podcast{$episode->podcast_id}_episode{$episode->id}_embeddable_player_{$themeKey}_{$locale}", ); } } diff --git a/app/Models/NoteModel.php b/app/Models/NoteModel.php new file mode 100644 index 0000000000000000000000000000000000000000..5a95a16ecd79d0513a1db8426d56034461ca8039 --- /dev/null +++ b/app/Models/NoteModel.php @@ -0,0 +1,45 @@ +<?php + +/** + * @copyright 2020 Podlibre + * @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3 + * @link https://castopod.org/ + */ + +namespace App\Models; + +class NoteModel extends \ActivityPub\Models\NoteModel +{ + protected $returnType = \App\Entities\Note::class; + + protected $allowedFields = [ + 'id', + 'uri', + 'actor_id', + 'in_reply_to_id', + 'reblog_of_id', + 'episode_id', + 'message', + 'message_html', + 'favourites_count', + 'reblogs_count', + 'replies_count', + 'created_by', + 'published_at', + ]; + + /** + * Retrieves all published notes for a given episode ordered by publication date + * + * @return \App\Entities\Note[] + */ + public function getEpisodeNotes($episodeId) + { + return $this->where([ + 'episode_id' => $episodeId, + ]) + ->where('`published_at` <= NOW()', null, false) + ->orderBy('published_at', 'DESC') + ->findAll(); + } +} diff --git a/app/Models/PersonModel.php b/app/Models/PersonModel.php index ac8661c8d11a2c4b7a2a6e4f762870f0d1e48dcd..e1812cf47eb8ce185d48e3c96cbd00f6ff2b7a24 100644 --- a/app/Models/PersonModel.php +++ b/app/Models/PersonModel.php @@ -21,6 +21,7 @@ class PersonModel extends Model 'unique_name', 'information_url', 'image_uri', + 'image_mimetype', 'created_by', 'updated_by', ]; @@ -86,7 +87,7 @@ class PersonModel extends Model $result[$person->id] = $person->full_name; return $result; }, - [] + [], ); cache()->save('person_options', $options, DECADE); } @@ -116,7 +117,7 @@ class PersonModel extends Model protected function clearCache(array $data) { $person = (new PersonModel())->getPersonById( - is_array($data['id']) ? $data['id'][0] : $data['id'] + is_array($data['id']) ? $data['id'][0] : $data['id'], ); cache()->delete('person_options'); diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php index ffdcbfe7c6b6590e1927dcb84e0d5451e6b15e46..dfd4044de8135f40adf2069c2519609cf6c15fc7 100644 --- a/app/Models/PodcastModel.php +++ b/app/Models/PodcastModel.php @@ -8,7 +8,10 @@ namespace App\Models; +use ActivityPub\Models\ActorModel; +use CodeIgniter\HTTP\URI; use CodeIgniter\Model; +use phpseclib\Crypt\RSA; class PodcastModel extends Model { @@ -24,6 +27,7 @@ class PodcastModel extends Model 'episode_description_footer_markdown', 'episode_description_footer_html', 'image_uri', + 'image_mimetype', 'language_code', 'category_id', 'parental_advisory', @@ -69,6 +73,10 @@ class PodcastModel extends Model ]; protected $validationMessages = []; + protected $beforeInsert = ['createPodcastActor']; + protected $afterInsert = ['setAvatarImageUrl']; + protected $afterUpdate = ['updatePodcastActor']; + // clear cache before update if by any chance, the podcast name changes, so will the podcast link protected $beforeUpdate = ['clearCache']; protected $beforeDelete = ['clearCache']; @@ -107,7 +115,7 @@ class PodcastModel extends Model $found = $this->select('podcasts.*') ->join( 'podcasts_users', - 'podcasts_users.podcast_id = podcasts.id' + 'podcasts_users.podcast_id = podcasts.id', ) ->where('podcasts_users.user_id', $userId) ->findAll(); @@ -159,15 +167,29 @@ class PodcastModel extends Model public function getContributorGroupId($userId, $podcastId) { - $user_podcast = $this->db - ->table('podcasts_users') - ->select('group_id') - ->where([ - 'user_id' => $userId, - 'podcast_id' => $podcastId, - ]) - ->get() - ->getResultObject(); + if (!is_numeric($podcastId)) { + // identifier is the podcast name, request must be a join + $user_podcast = $this->db + ->table('podcasts_users') + ->select('group_id', 'user_id') + ->join('podcasts', 'podcasts.id = podcasts_users.podcast_id') + ->where([ + 'user_id' => $userId, + 'name' => $podcastId, + ]) + ->get() + ->getResultObject(); + } else { + $user_podcast = $this->db + ->table('podcasts_users') + ->select('group_id') + ->where([ + 'user_id' => $userId, + 'podcast_id' => $podcastId, + ]) + ->get() + ->getResultObject(); + } return (int) count($user_podcast) > 0 ? $user_podcast[0]->group_id @@ -177,7 +199,7 @@ class PodcastModel extends Model public function clearCache(array $data) { $podcast = (new PodcastModel())->getPodcastById( - is_array($data['id']) ? $data['id'][0] : $data['id'] + is_array($data['id']) ? $data['id'][0] : $data['id'], ); $supportedLocales = config('App')->supportedLocales; @@ -195,14 +217,14 @@ class PodcastModel extends Model foreach ($podcast->episodes as $episode) { foreach ($supportedLocales as $locale) { cache()->delete( - "page_podcast{$podcast->id}_episode{$episode->id}_{$locale}" + "page_podcast{$podcast->id}_episode{$episode->id}_{$locale}", ); foreach ( array_keys(\App\Models\EpisodeModel::$themes) as $themeKey ) { cache()->delete( - "page_podcast{$podcast->id}_episode{$episode->id}_embeddable_player_{$themeKey}_{$locale}" + "page_podcast{$podcast->id}_episode{$episode->id}_embeddable_player_{$themeKey}_{$locale}", ); } } @@ -222,17 +244,17 @@ class PodcastModel extends Model cache()->delete("podcast{$podcast->id}_{$year['year']}_episodes"); foreach ($supportedLocales as $locale) { cache()->delete( - "page_podcast{$podcast->id}_{$year['year']}_{$locale}" + "page_podcast{$podcast->id}_{$year['year']}_{$locale}", ); } } foreach ($seasons as $season) { cache()->delete( - "podcast{$podcast->id}_season{$season['season_number']}_episodes" + "podcast{$podcast->id}_season{$season['season_number']}_episodes", ); foreach ($supportedLocales as $locale) { cache()->delete( - "page_podcast{$podcast->id}_season{$season['season_number']}_{$locale}" + "page_podcast{$podcast->id}_season{$season['season_number']}_{$locale}", ); } } @@ -244,4 +266,85 @@ class PodcastModel extends Model return $data; } + + /** + * Creates an actor linked to the podcast + * (Triggered before insert) + * + * @param array $data + */ + protected function createPodcastActor(array $data) + { + $rsa = new RSA(); + $rsa->setHash('sha256'); + + // extracts $privatekey and $publickey variables + extract($rsa->createKey(2048)); + + $url = new URI(base_url()); + $username = $data['data']['name']; + $domain = + $url->getHost() . ($url->getPort() ? ':' . $url->getPort() : ''); + + $actorId = (new ActorModel())->insert( + [ + 'uri' => url_to('actor', $username), + 'username' => $username, + 'domain' => $domain, + 'private_key' => $privatekey, + 'public_key' => $publickey, + 'display_name' => $data['data']['title'], + 'summary' => $data['data']['description_html'], + 'avatar_image_url' => '', + 'avatar_image_mimetype' => '', + 'cover_image_url' => base_url( + 'assets/images/castopod-cover-default.jpg', + ), + 'cover_image_mimetype' => 'image/jpeg', + 'inbox_url' => url_to('inbox', $username), + 'outbox_url' => url_to('outbox', $username), + 'followers_url' => url_to('followers', $username), + ], + true, + ); + + $data['data']['actor_id'] = $actorId; + + return $data; + } + + protected function setAvatarImageUrl($data) + { + $podcast = (new PodcastModel())->getPodcastById( + is_array($data['id']) ? $data['id'][0] : $data['id'], + ); + + $podcast->actor->avatar_image_url = $podcast->image->thumbnail_url; + $podcast->actor->avatar_image_mimetype = $podcast->image_mimetype; + + (new ActorModel())->update($podcast->actor->id, $podcast->actor); + + return $data; + } + + protected function updatePodcastActor(array $data) + { + $podcast = (new PodcastModel())->getPodcastById( + is_array($data['id']) ? $data['id'][0] : $data['id'], + ); + + $actorModel = new ActorModel(); + $actor = $actorModel->find($podcast->actor_id); + + // update values + $actor->display_name = $podcast->title; + $actor->summary = $podcast->description_html; + $actor->avatar_image_url = $podcast->image->thumbnail_url; + + if ($actor->hasChanged()) { + $actorModel->update($actor->id, $actor); + } + + return $data; + } } diff --git a/app/Models/UserModel.php b/app/Models/UserModel.php index af71d7a15a4b5ad65feba2c3ea4beb15a1108fd3..4a03446129653a0f936df86f9d431ab2cc0f1ec0 100644 --- a/app/Models/UserModel.php +++ b/app/Models/UserModel.php @@ -19,7 +19,7 @@ class UserModel extends \Myth\Auth\Models\UserModel ->join('podcasts_users', 'podcasts_users.user_id = users.id') ->join( 'auth_groups', - 'auth_groups.id = podcasts_users.group_id' + 'auth_groups.id = podcasts_users.group_id', ) ->where('podcasts_users.podcast_id', $podcastId) ->findAll(); @@ -33,7 +33,7 @@ class UserModel extends \Myth\Auth\Models\UserModel public function getPodcastContributor($user_id, $podcast_id) { return $this->select( - 'users.*, podcasts_users.podcast_id as podcast_id, auth_groups.name as podcast_role' + 'users.*, podcasts_users.podcast_id as podcast_id, auth_groups.name as podcast_role', ) ->join('podcasts_users', 'podcasts_users.user_id = users.id') ->join('auth_groups', 'auth_groups.id = podcasts_users.group_id') diff --git a/app/Views/_assets/admin.ts b/app/Views/_assets/admin.ts index 8cb179e0016bd0b033e7a8f76cd693d8865c914a..be731524092d2cac7f4e8f29e125e3ce585ab594 100644 --- a/app/Views/_assets/admin.ts +++ b/app/Views/_assets/admin.ts @@ -1,6 +1,5 @@ import ClientTimezone from "./modules/ClientTimezone"; import Clipboard from "./modules/Clipboard"; -import ThemePicker from "./modules/ThemePicker"; import DateTimePicker from "./modules/DateTimePicker"; import Dropdown from "./modules/Dropdown"; import MarkdownEditor from "./modules/MarkdownEditor"; @@ -8,6 +7,7 @@ import MultiSelect from "./modules/MultiSelect"; import SidebarToggler from "./modules/SidebarToggler"; import Slugify from "./modules/Slugify"; import Soundbites from "./modules/Soundbites"; +import ThemePicker from "./modules/ThemePicker"; import Time from "./modules/Time"; import Tooltip from "./modules/Tooltip"; diff --git a/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-700.woff b/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-700.woff new file mode 100644 index 0000000000000000000000000000000000000000..468422fe537a00b04a15e4d033e667568dcbe350 Binary files /dev/null and b/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-700.woff differ diff --git a/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-700.woff2 b/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4312f3d1a34dd865724c73068da4d57ae44d99d2 Binary files /dev/null and b/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-700.woff2 differ diff --git a/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-regular.woff b/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..e3c9edce6977c9ae42fe1b33007f25f5e1b57668 Binary files /dev/null and b/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-regular.woff differ diff --git a/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-regular.woff2 b/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..69b6584a65724b22d6c9f6792ae62a92b0e5c539 Binary files /dev/null and b/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-regular.woff2 differ diff --git a/app/Views/_assets/fonts/montserrat/montserrat-600.woff b/app/Views/_assets/fonts/montserrat/montserrat-600.woff new file mode 100644 index 0000000000000000000000000000000000000000..e7f8a31ba35c59891483cc67b9471ff78c7b000f Binary files /dev/null and b/app/Views/_assets/fonts/montserrat/montserrat-600.woff differ diff --git a/app/Views/_assets/fonts/montserrat/montserrat-600.woff2 b/app/Views/_assets/fonts/montserrat/montserrat-600.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..29cc1a9734501f08df2d097c77bead989321249c Binary files /dev/null and b/app/Views/_assets/fonts/montserrat/montserrat-600.woff2 differ diff --git a/app/Views/_assets/fonts/montserrat/montserrat-regular.woff b/app/Views/_assets/fonts/montserrat/montserrat-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..676a065e24ff77f050f1fe75c0f295d4ab48acbb Binary files /dev/null and b/app/Views/_assets/fonts/montserrat/montserrat-regular.woff differ diff --git a/app/Views/_assets/fonts/montserrat/montserrat-regular.woff2 b/app/Views/_assets/fonts/montserrat/montserrat-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..70788c2732074a4a752cb2e0410d49fb1b067cc0 Binary files /dev/null and b/app/Views/_assets/fonts/montserrat/montserrat-regular.woff2 differ diff --git a/app/Views/_assets/icons/add-box.svg b/app/Views/_assets/icons/add-box.svg old mode 100644 new mode 100755 index dc56100ad479ce9b628ba3346016b81ff0dee1b7..5a6fd80c6c75c10098ca2d56578cd312260e34a3 --- a/app/Views/_assets/icons/add-box.svg +++ b/app/Views/_assets/icons/add-box.svg @@ -1 +1,6 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M4 3h16a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zm1 2v14h14V5H5zm6 6V7h2v4h4v2h-4v4h-2v-4H7v-2h4z"/></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <g> + <path fill="none" d="M0 0h24v24H0z"/> + <path d="M4 3h16a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zm7 8H7v2h4v4h2v-4h4v-2h-4V7h-2v4z"/> + </g> +</svg> diff --git a/app/Views/_assets/icons/add.svg b/app/Views/_assets/icons/add.svg old mode 100644 new mode 100755 diff --git a/app/Views/_assets/icons/alert.svg b/app/Views/_assets/icons/alert.svg old mode 100644 new mode 100755 index 02da88f90b82ce5b809f776e1ee1c8edf25e824a..7dd74af774378677f9f749c34d9b35eb3a837fba --- a/app/Views/_assets/icons/alert.svg +++ b/app/Views/_assets/icons/alert.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0h24v24H0z"/> - <path fill-rule="nonzero" d="M12.866 3l9.526 16.5a1 1 0 0 1-.866 1.5H2.474a1 1 0 0 1-.866-1.5L11.134 3a1 1 0 0 1 1.732 0zm-8.66 16h15.588L12 5.5 4.206 19zM11 16h2v2h-2v-2zm0-7h2v5h-2V9z"/> + <path d="M12.866 3l9.526 16.5a1 1 0 0 1-.866 1.5H2.474a1 1 0 0 1-.866-1.5L11.134 3a1 1 0 0 1 1.732 0zM11 16v2h2v-2h-2zm0-7v5h2V9h-2z"/> </g> </svg> diff --git a/app/Views/_assets/icons/bookmark.svg b/app/Views/_assets/icons/bookmark.svg old mode 100644 new mode 100755 index f340d6ed246d92df66f1d1be3101a0d0c489624c..d3bde5f356bca78e0c794f583d6ecb0544b014d2 --- a/app/Views/_assets/icons/bookmark.svg +++ b/app/Views/_assets/icons/bookmark.svg @@ -1 +1,6 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M5 2h14a1 1 0 0 1 1 1v19.143a.5.5 0 0 1-.766.424L12 18.03l-7.234 4.536A.5.5 0 0 1 4 22.143V3a1 1 0 0 1 1-1z"/></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <g> + <path fill="none" d="M0 0h24v24H0z"/> + <path d="M5 2h14a1 1 0 0 1 1 1v19.143a.5.5 0 0 1-.766.424L12 18.03l-7.234 4.536A.5.5 0 0 1 4 22.143V3a1 1 0 0 1 1-1z"/> + </g> +</svg> diff --git a/app/Views/_assets/icons/chat.svg b/app/Views/_assets/icons/chat.svg new file mode 100755 index 0000000000000000000000000000000000000000..594b150329b7daf028758b04fb0b0df7af720137 --- /dev/null +++ b/app/Views/_assets/icons/chat.svg @@ -0,0 +1,6 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <g> + <path fill="none" d="M0 0h24v24H0z"/> + <path d="M6.455 19L2 22.5V4a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H6.455z"/> + </g> +</svg> diff --git a/app/Views/_assets/icons/cloud-off.svg b/app/Views/_assets/icons/cloud-off.svg new file mode 100755 index 0000000000000000000000000000000000000000..7177145aaf3ba7c9f8200fe53922b3c752dc93fc --- /dev/null +++ b/app/Views/_assets/icons/cloud-off.svg @@ -0,0 +1,6 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <g> + <path fill="none" d="M0 0h24v24H0z"/> + <path d="M3.515 2.1l19.092 19.092-1.415 1.415-2.014-2.015A5.985 5.985 0 0 1 17 21H7A6 6 0 0 1 5.008 9.339a6.992 6.992 0 0 1 .353-2.563L2.1 3.514 3.515 2.1zM17 9a6.003 6.003 0 0 1 5.204 8.989L14.01 9.796C14.89 9.29 15.91 9 17 9zm-5-7a7.003 7.003 0 0 1 6.765 5.195 8.027 8.027 0 0 0-6.206 1.15L7.694 3.48A6.97 6.97 0 0 1 12 2z"/> + </g> +</svg> diff --git a/app/Views/_assets/icons/dashboard.svg b/app/Views/_assets/icons/dashboard.svg old mode 100644 new mode 100755 index 1d2279e5d19991377249f857ee54e5f06203ab23..a25c9e477a738547538b4f4b5f2dcad79819d52b --- a/app/Views/_assets/icons/dashboard.svg +++ b/app/Views/_assets/icons/dashboard.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0h24v24H0z"/> - <path d="M13 21V11h8v10h-8zM3 13V3h8v10H3zm6-2V5H5v6h4zM3 21v-6h8v6H3zm2-2h4v-2H5v2zm10 0h4v-6h-4v6zM13 3h8v6h-8V3zm2 2v2h4V5h-4z"/> + <path d="M3 13h8V3H3v10zm0 8h8v-6H3v6zm10 0h8V11h-8v10zm0-18v6h8V3h-8z"/> </g> </svg> diff --git a/app/Views/_assets/icons/delete-bin.svg b/app/Views/_assets/icons/delete-bin.svg old mode 100644 new mode 100755 index 91a963ddcf99bfd9a7b0cec5fdf77a7e25d7ee61..bd1f9b30ede7cb03799ea9374f261dba04e51a76 --- a/app/Views/_assets/icons/delete-bin.svg +++ b/app/Views/_assets/icons/delete-bin.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0h24v24H0z"/> - <path d="M17 6h5v2h-2v13a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V8H2V6h5V3a1 1 0 0 1 1-1h8a1 1 0 0 1 1 1v3zm1 2H6v12h12V8zm-9 3h2v6H9v-6zm4 0h2v6h-2v-6zM9 4v2h6V4H9z"/> + <path d="M17 6h5v2h-2v13a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V8H2V6h5V3a1 1 0 0 1 1-1h8a1 1 0 0 1 1 1v3zm-8 5v6h2v-6H9zm4 0v6h2v-6h-2zM9 4v2h6V4H9z"/> </g> </svg> diff --git a/app/Views/_assets/icons/download.svg b/app/Views/_assets/icons/download.svg old mode 100644 new mode 100755 index 42702f57dbf6950b95553d4f18191790d7041f0a..b3ea2a9f6ee4f8c329536446ac0e97ab621d27ef --- a/app/Views/_assets/icons/download.svg +++ b/app/Views/_assets/icons/download.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0h24v24H0z"/> - <path d="M13 10h5l-6 6-6-6h5V3h2v7zm-9 9h16v-7h2v8a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1v-8h2v7z"/> + <path d="M4 19h16v-7h2v8a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1v-8h2v7zM14 9h5l-7 7-7-7h5V3h4v6z"/> </g> </svg> diff --git a/app/Views/_assets/icons/edit.svg b/app/Views/_assets/icons/edit.svg old mode 100644 new mode 100755 index ace6db3a1b4ff4b934ea9198b9b08bc8dc6dbc64..d9efb56cad9934a8400d031c3d3e3e09f17ef325 --- a/app/Views/_assets/icons/edit.svg +++ b/app/Views/_assets/icons/edit.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0h24v24H0z"/> - <path d="M6.414 16L16.556 5.858l-1.414-1.414L5 14.586V16h1.414zm.829 2H3v-4.243L14.435 2.322a1 1 0 0 1 1.414 0l2.829 2.829a1 1 0 0 1 0 1.414L7.243 18zM3 20h18v2H3v-2z"/> + <path d="M7.243 18H3v-4.243L14.435 2.322a1 1 0 0 1 1.414 0l2.829 2.829a1 1 0 0 1 0 1.414L7.243 18zM3 20h18v2H3v-2z"/> </g> </svg> diff --git a/app/Views/_assets/icons/external-link.svg b/app/Views/_assets/icons/external-link.svg old mode 100644 new mode 100755 index 2a69c5f35391bb08e1c245f7514f915cf55f7538..2efc62595c3bafd577df34f0fcb63dbe3d3d85d0 --- a/app/Views/_assets/icons/external-link.svg +++ b/app/Views/_assets/icons/external-link.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0h24v24H0z"/> - <path d="M10 6v2H5v11h11v-5h2v6a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h6zm11-3v8h-2V6.413l-7.793 7.794-1.414-1.414L17.585 5H13V3h8z"/> + <path d="M10 6v2H5v11h11v-5h2v6a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h6zm11-3v9l-3.794-3.793-5.999 6-1.414-1.414 5.999-6L12 3h9z"/> </g> </svg> diff --git a/app/Views/_assets/icons/eye.svg b/app/Views/_assets/icons/eye.svg old mode 100644 new mode 100755 index 0b8b52e099bdbf099ce1bdd5e9b2343bae410a30..f14a8b7d5738cdb86cee487131c2ad33ab5d70ca --- a/app/Views/_assets/icons/eye.svg +++ b/app/Views/_assets/icons/eye.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0h24v24H0z"/> - <path d="M12 3c5.392 0 9.878 3.88 10.819 9-.94 5.12-5.427 9-10.819 9-5.392 0-9.878-3.88-10.819-9C2.121 6.88 6.608 3 12 3zm0 16a9.005 9.005 0 0 0 8.777-7 9.005 9.005 0 0 0-17.554 0A9.005 9.005 0 0 0 12 19zm0-2.5a4.5 4.5 0 1 1 0-9 4.5 4.5 0 0 1 0 9zm0-2a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z"/> + <path d="M1.181 12C2.121 6.88 6.608 3 12 3c5.392 0 9.878 3.88 10.819 9-.94 5.12-5.427 9-10.819 9-5.392 0-9.878-3.88-10.819-9zM12 17a5 5 0 1 0 0-10 5 5 0 0 0 0 10zm0-2a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/> </g> </svg> diff --git a/app/Views/_assets/icons/file-copy.svg b/app/Views/_assets/icons/file-copy.svg old mode 100644 new mode 100755 index 491df11d372ab1a6668a7193a78734abd4a96181..0b90743626fb9ec6a8919866a1e3f8a1eafc74f7 --- a/app/Views/_assets/icons/file-copy.svg +++ b/app/Views/_assets/icons/file-copy.svg @@ -1 +1,6 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M7 6V3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1h-3v3c0 .552-.45 1-1.007 1H4.007A1.001 1.001 0 0 1 3 21l.003-14c0-.552.45-1 1.006-1H7zM5.002 8L5 20h10V8H5.002zM9 6h8v10h2V4H9v2zm-2 5h6v2H7v-2zm0 4h6v2H7v-2z"/></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <g> + <path fill="none" d="M0 0h24v24H0z"/> + <path d="M7 6V3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1h-3v3c0 .552-.45 1-1.007 1H4.007A1.001 1.001 0 0 1 3 21l.003-14c0-.552.45-1 1.007-1H7zm2 0h8v10h2V4H9v2zm-2 5v2h6v-2H7zm0 4v2h6v-2H7z"/> + </g> +</svg> diff --git a/app/Views/_assets/icons/file.svg b/app/Views/_assets/icons/file.svg old mode 100644 new mode 100755 index dcddb3965b71517e06e85c2a1265f18062a0b6d6..d10c86cf8168c2a1ec7e1ed6b16c96ada84cdcb4 --- a/app/Views/_assets/icons/file.svg +++ b/app/Views/_assets/icons/file.svg @@ -1 +1,6 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M19 22H5a3 3 0 0 1-3-3V3a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v12h4v4a3 3 0 0 1-3 3zm-1-5v2a1 1 0 0 0 2 0v-2h-2zm-2 3V4H4v15a1 1 0 0 0 1 1h11zM6 7h8v2H6V7zm0 4h8v2H6v-2zm0 4h5v2H6v-2z"/></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <g> + <path fill="none" d="M0 0h24v24H0z"/> + <path d="M19 22H5a3 3 0 0 1-3-3V3a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v12h4v4a3 3 0 0 1-3 3zm-1-5v2a1 1 0 0 0 2 0v-2h-2zM6 7v2h8V7H6zm0 4v2h8v-2H6zm0 4v2h5v-2H6z"/> + </g> +</svg> diff --git a/app/Views/_assets/icons/folder-user.svg b/app/Views/_assets/icons/folder-user.svg old mode 100644 new mode 100755 index 590e6aa19abc431a1edf746bb8630f1edb4efab2..6dcd37c42a6d649415d46d3eb5401025927dce86 --- a/app/Views/_assets/icons/folder-user.svg +++ b/app/Views/_assets/icons/folder-user.svg @@ -1 +1,6 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12.414 5H21a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414l2 2zM4 5v14h16V7h-8.414l-2-2H4zm4 13a4 4 0 1 1 8 0H8zm4-5a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5z"/></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <g> + <path fill="none" d="M0 0h24v24H0z"/> + <path d="M12.414 5H21a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414l2 2zM12 13a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5zm-4 5h8a4 4 0 1 0-8 0z"/> + </g> +</svg> diff --git a/app/Views/_assets/icons/funding/gofundme.svg b/app/Views/_assets/icons/funding/gofundme.svg new file mode 100755 index 0000000000000000000000000000000000000000..8573eaa3e6ce5dd626b62786c603c98146046907 --- /dev/null +++ b/app/Views/_assets/icons/funding/gofundme.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M6.07,14.76a4.78,4.78,0,0,1,.48-.37A2.58,2.58,0,0,1,8.13,14a2.5,2.5,0,0,1,.76.19A2,2,0,0,1,9.7,15c0,.05.06.06.09,0A2,2,0,0,1,11.3,14a2,2,0,0,1,1.69.48,1.44,1.44,0,0,1,.44.83,4.6,4.6,0,0,1,.05.64V19.3c0,.1,0,.12-.12.12q-.87,0-1.74,0c-.08,0-.1,0-.1-.11v-2.6a2.56,2.56,0,0,0-.07-.62.8.8,0,0,0-1.33-.38,1.15,1.15,0,0,0-.33.76,5.88,5.88,0,0,0,0,.73v2.12c0,.07,0,.1-.09.1H7.91c-.08,0-.1,0-.1-.1V16.68a3.27,3.27,0,0,0,0-.54.73.73,0,0,0-.58-.61.86.86,0,0,0-1,.36,1.12,1.12,0,0,0-.15.62q0,1.39,0,2.79c0,.1,0,.12-.13.12q-.87,0-1.74,0c-.08,0-.1,0-.1-.1V14.21c0-.08,0-.1.11-.1H6c.08,0,.1,0,.1.1s0,.36,0,.55Zm14.62,2.29a3.65,3.65,0,0,0-.11-1,2.5,2.5,0,0,0-1.81-1.9,3.93,3.93,0,0,0-2.35,0,2.5,2.5,0,0,0-1.36,1,3,3,0,0,0-.38,2.17,2.56,2.56,0,0,0,1.72,2,4,4,0,0,0,1.5.22,4.14,4.14,0,0,0,.87-.1,2.36,2.36,0,0,0,1.81-1.61c0-.08,0-.1-.07-.1H18.82c-.07,0-.1,0-.14.07a.93.93,0,0,1-.52.37,1.47,1.47,0,0,1-.88,0,.88.88,0,0,1-.62-.67,1.64,1.64,0,0,1-.05-.32c0-.11,0-.12.1-.12h3.88C20.64,17.12,20.69,17.12,20.69,17.05Zm-1.91-1h-2c-.06,0-.08,0-.07-.08a1,1,0,0,1,1-.83,1.18,1.18,0,0,1,.77.18,1.12,1.12,0,0,1,.42.66C18.87,16.07,18.82,16.05,18.78,16.05Zm3-10.15a1.67,1.67,0,0,0-1.81-.3,2.7,2.7,0,0,0-.34.17L16.32,8.16a1.15,1.15,0,0,0-.48.73.82.82,0,0,0,.24.75,1.74,1.74,0,0,0,2,.28c.42-.25,3.2-2.31,3.66-2.64l.11-.12a1,1,0,0,0-.06-1.26ZM7.92,9.58a.82.82,0,0,0,.24-.75,1.19,1.19,0,0,0-.48-.74L4.39,5.71a1.83,1.83,0,0,0-.34-.18,1.68,1.68,0,0,0-1.8.31,1,1,0,0,0-.06,1.25l.11.12C2.76,7.55,5.54,9.6,6,9.86a1.76,1.76,0,0,0,2-.28ZM12,8.94A1.4,1.4,0,0,0,13.48,8a1.07,1.07,0,0,0,0-.25l0-2.14V5.58c0-.82-.66-1.2-1.49-1.2s-1.5.44-1.51,1.26V7.79a1,1,0,0,0,0,.25,1.35,1.35,0,0,0,1.47.9Zm4.34,1.62a10.11,10.11,0,0,0-4.51-.9c-3.23,0-5.39,1-6.49,2.5h13a5.75,5.75,0,0,0-2-1.6Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/funding/helloasso.svg b/app/Views/_assets/icons/funding/helloasso.svg new file mode 100755 index 0000000000000000000000000000000000000000..a16faf738a202f4d94dfdcecbac5dfe0d0ba96aa --- /dev/null +++ b/app/Views/_assets/icons/funding/helloasso.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M9.74,3c7.35.4,6.31,7.57,6.31,7.57A7.62,7.62,0,0,0,9.56,7.08c-3.39.08-7,2.61-7.06,7.71A8,8,0,0,1,2,12.14C2.14,5.71,7,2.83,9.74,3Zm7.11.07a8,8,0,0,0-2.56-.81c4.48,2.43,5,6.84,3.43,9.87a7.61,7.61,0,0,1-6.13,4.07s5.83,4.32,9.66-2C22.7,11.83,22.45,6.23,16.85,3.05ZM17,20.32a8,8,0,0,0,2-1.77c-4.4,2.58-8.43.73-10.23-2.15a7.64,7.64,0,0,1-.32-7.35s-6.7,2.76-3.3,9.28C6.44,20.8,11.37,23.48,17,20.32Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/funding/indiegogo.svg b/app/Views/_assets/icons/funding/indiegogo.svg new file mode 100755 index 0000000000000000000000000000000000000000..0d6240d3fb711ae4fda6d349575ad11426d2844c --- /dev/null +++ b/app/Views/_assets/icons/funding/indiegogo.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M17.08,15.11c-1.66,0-1.88-1.14-1.88-3s.22-3,1.88-3,1.87,1.14,1.87,3S18.72,15.11,17.08,15.11Zm0-8.87C12.89,6.24,12.14,9,12.14,12s.75,5.75,4.94,5.75S22,15,22,12s-.73-5.77-4.92-5.77m-10.7,7H8.32v.2c0,1.24,0,1.79-1.44,1.79S5,14.63,5,12.1s.79-3,2-3a4,4,0,0,1,2,.51l1.61-2.5a6.61,6.61,0,0,0-3.5-.91C3.25,6.24,2,8.1,2,12c0,3.4.91,5.75,4.6,5.75a9.41,9.41,0,0,0,1.7-.13h2.77V10.84H6.71l-.33,2.44"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/funding/kickstarter.svg b/app/Views/_assets/icons/funding/kickstarter.svg new file mode 100755 index 0000000000000000000000000000000000000000..2f055f75e76fb0edc80e819ec7e38034fc251609 --- /dev/null +++ b/app/Views/_assets/icons/funding/kickstarter.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M21,17.52a4.6,4.6,0,0,1-8.33,2.56l-.94-1.33A4.21,4.21,0,0,1,7.47,22,4.44,4.44,0,0,1,3,17.56V6.44A4.42,4.42,0,0,1,7.47,2a4.27,4.27,0,0,1,4.29,3.38l1.08-1.46A4.63,4.63,0,0,1,16.53,2,4.4,4.4,0,0,1,21,6.38,4.35,4.35,0,0,1,20.16,9L18,12l2.15,3A4.44,4.44,0,0,1,21,17.52Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/funding/kisskissbankbank.svg b/app/Views/_assets/icons/funding/kisskissbankbank.svg new file mode 100755 index 0000000000000000000000000000000000000000..f3041450f1ae631b3a030eb59e12ea7383b2aeb0 --- /dev/null +++ b/app/Views/_assets/icons/funding/kisskissbankbank.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M15,6.84a7.54,7.54,0,1,0-.09,10.42L9.77,12.09Zm4.86,5.23A2.54,2.54,0,1,0,17.7,7.73h0l-4.33,4.34,4.23,4.23a2.55,2.55,0,1,0,2.3-4.24"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/funding/liberapay.svg b/app/Views/_assets/icons/funding/liberapay.svg new file mode 100755 index 0000000000000000000000000000000000000000..e3e261bca4d9cba5e0355d805453a4c773ec8bf7 --- /dev/null +++ b/app/Views/_assets/icons/funding/liberapay.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M8.12,18.36A5.69,5.69,0,0,1,5.79,18a2.41,2.41,0,0,1-1.2-1,3,3,0,0,1-.36-1.53,8.94,8.94,0,0,1,.24-1.84l2.65-11L10.34,2,7.45,14a3,3,0,0,0-.09.68,1.12,1.12,0,0,0,.11.56.86.86,0,0,0,.43.38,2.37,2.37,0,0,0,.84.19Zm11.65-6.89a7.55,7.55,0,0,1-.5,2.78,6.68,6.68,0,0,1-1.39,2.17,6.15,6.15,0,0,1-2.12,1.43,7,7,0,0,1-2.69.51,7.5,7.5,0,0,1-1.42-.13L10.71,22H7.63L11.09,7.6A16.73,16.73,0,0,1,13,7.15,13,13,0,0,1,15.31,7a5.08,5.08,0,0,1,2,.36,3.8,3.8,0,0,1,1.39,1,4.06,4.06,0,0,1,.8,1.44,5.9,5.9,0,0,1,.26,1.76Zm-7.56,4.27a4.33,4.33,0,0,0,.88.08,3.51,3.51,0,0,0,1.47-.3,3.22,3.22,0,0,0,1.14-.85,4,4,0,0,0,.73-1.3,5.18,5.18,0,0,0,.26-1.67,2.79,2.79,0,0,0-.4-1.52,1.48,1.48,0,0,0-1.37-.63,6.15,6.15,0,0,0-1.25.13Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/funding/patreon.svg b/app/Views/_assets/icons/funding/patreon.svg new file mode 100755 index 0000000000000000000000000000000000000000..0c02798fa1d33bdceffee9acb38989d6fe2b52d5 --- /dev/null +++ b/app/Views/_assets/icons/funding/patreon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M15,17a7.5,7.5,0,1,1,7.5-7.5A7.5,7.5,0,0,1,15,17ZM2,2H6V22H2Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/funding/paypal.svg b/app/Views/_assets/icons/funding/paypal.svg new file mode 100755 index 0000000000000000000000000000000000000000..5e055a78a837607bbccb32d2dabb0c19a9695e70 --- /dev/null +++ b/app/Views/_assets/icons/funding/paypal.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M20.07,8.48a4.89,4.89,0,0,1,.3,3.32c-.74,3.81-3.28,5.12-6.52,5.12h-.5a.81.81,0,0,0-.79.68l0,.22-.63,4,0,.17a.81.81,0,0,1-.8.68H7.72a.48.48,0,0,1-.48-.49v-.07L7.42,21H8.94l1-6h1.38C16,15,19,12.78,20.07,8.48Zm-3-5.09a3.62,3.62,0,0,1,.75,3.28L17.8,7c-.74,3.78-3.09,5.45-7,5.45H9a1.42,1.42,0,0,0-1.36,1h0l-.93,5.89H3.12a0,0,0,0,1-.05-.05h0L5.67,2.8A1,1,0,0,1,6.61,2h6c2.19,0,3.72.47,4.53,1.39Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/funding/tipeee.svg b/app/Views/_assets/icons/funding/tipeee.svg new file mode 100755 index 0000000000000000000000000000000000000000..2984b9b3de9d7b2a5eab889f9ac0839608f4f627 --- /dev/null +++ b/app/Views/_assets/icons/funding/tipeee.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12.7,14h-.62V7.58a.2.2,0,0,0-.19-.2l-3.3,1a.27.27,0,0,0-.19.29v1.89a.19.19,0,0,0,.19.19l.59-.17V14H8.56a.19.19,0,0,0-.19.19v2a.19.19,0,0,0,.19.2h4.15a.2.2,0,0,0,.19-.2v-2a.2.2,0,0,0-.2-.19ZM10.63,7.09A1.45,1.45,0,1,0,9.18,5.64a1.45,1.45,0,0,0,1.45,1.45Zm-3.42.29H5.69V5.26s0-.55-.53-.35-1.94.6-1.94.6A.42.42,0,0,0,2.9,6c0,.34,0,.54,0,1.41H2.19a.2.2,0,0,0-.19.2v2a.2.2,0,0,0,.19.19h.73v4.32s-.17,3.49,4.24,1.77c0,0,.23-.12.24-.31V13.61s0-.29-.27-.16c0,0-1.44.65-1.44-.29V9.75H7.21a.2.2,0,0,0,.2-.2v-2a.2.2,0,0,0-.2-.19Zm10.88,0a3.56,3.56,0,0,0-1.34.27V7.57a.2.2,0,0,0-.2-.2H13.21a.2.2,0,0,0-.2.2v2a.2.2,0,0,0,.2.2h.63v7.69h-.63a.19.19,0,0,0-.2.19v2a.2.2,0,0,0,.2.2h4.16a.19.19,0,0,0,.19-.2v-2a.19.19,0,0,0-.19-.19h-.62V16.05a3.56,3.56,0,0,0,1.34.27A4.22,4.22,0,0,0,22,11.85,4.22,4.22,0,0,0,18.09,7.38ZM18.14,14c-.78,0-1.4-1-1.39-2.16s.63-2.15,1.41-2.14,1.39,1,1.39,2.16S18.91,14,18.14,14Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/funding/ulule.svg b/app/Views/_assets/icons/funding/ulule.svg new file mode 100755 index 0000000000000000000000000000000000000000..c4231b3e3b5d96fc918a3d24d726073688114987 --- /dev/null +++ b/app/Views/_assets/icons/funding/ulule.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M21.88,6.22a.42.42,0,0,0-.59,0h0l-.69.68a10,10,0,0,0-17.2,0l-.69-.68a.42.42,0,0,0-.59,0,.45.45,0,0,0-.12.3V12a10,10,0,0,0,20,0V6.52A.42.42,0,0,0,21.88,6.22ZM16.32,17.57a4.6,4.6,0,0,1-4.09-2.49.26.26,0,0,0-.35-.1.24.24,0,0,0-.1.1,4.62,4.62,0,1,1,0-4.15,2.28,2.28,0,0,0,.11,3.13.1.1,0,0,0,.14,0,2.28,2.28,0,0,0,.11-3.13,4.61,4.61,0,1,1,4.13,6.64Zm.16-8.2Zm-6.25,2.91a2.91,2.91,0,1,1-3.1-2.9c0,.13-.1.21-.21.32l0,0a.79.79,0,0,0-.28.58.73.73,0,0,0,1.45,0,.76.76,0,0,0-.29-.6.78.78,0,0,1-.26-.34A2.9,2.9,0,0,1,10.23,12.28Zm9.34,0a2.91,2.91,0,1,1-3.11-2.9c0,.13-.1.21-.21.32l0,0a.82.82,0,0,0-.28.58.74.74,0,0,0,.7.7.73.73,0,0,0,.75-.7.76.76,0,0,0-.29-.6c-.12-.11-.24-.23-.25-.34A2.9,2.9,0,0,1,19.57,12.28Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/group.svg b/app/Views/_assets/icons/group.svg old mode 100644 new mode 100755 index fff529099d4de6fd6928191b2b94bcea809110c5..5c2f10ee221026e791ab5d5754c07e2a365ff06d --- a/app/Views/_assets/icons/group.svg +++ b/app/Views/_assets/icons/group.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0h24v24H0z"/> - <path d="M2 22a8 8 0 1 1 16 0h-2a6 6 0 1 0-12 0H2zm8-9c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6zm0-2c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm8.284 3.703A8.002 8.002 0 0 1 23 22h-2a6.001 6.001 0 0 0-3.537-5.473l.82-1.824zm-.688-11.29A5.5 5.5 0 0 1 21 8.5a5.499 5.499 0 0 1-5 5.478v-2.013a3.5 3.5 0 0 0 1.041-6.609l.555-1.943z"/> + <path d="M2 22a8 8 0 1 1 16 0H2zm8-9c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6zm7.363 2.233A7.505 7.505 0 0 1 22.983 22H20c0-2.61-1-4.986-2.637-6.767zm-2.023-2.276A7.98 7.98 0 0 0 18 7a7.964 7.964 0 0 0-1.015-3.903A5 5 0 0 1 21 8a4.999 4.999 0 0 1-5.66 4.957z"/> </g> </svg> diff --git a/app/Views/_assets/icons/heart.svg b/app/Views/_assets/icons/heart.svg new file mode 100755 index 0000000000000000000000000000000000000000..f10aafa42785d45723268d8ab186bf42978fe946 --- /dev/null +++ b/app/Views/_assets/icons/heart.svg @@ -0,0 +1,6 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <g> + <path fill="none" d="M0 0H24V24H0z"/> + <path d="M16.5 3C19.538 3 22 5.5 22 9c0 7-7.5 11-10 12.5C9.5 20 2 16 2 9c0-3.5 2.5-6 5.5-6C9.36 3 11 4 12 5c1-1 2.64-2 4.5-2z"/> + </g> +</svg> diff --git a/app/Views/_assets/icons/line-chart.svg b/app/Views/_assets/icons/line-chart.svg old mode 100644 new mode 100755 index c3080e57c76267efe565bf8b8e4d6e829aafac8b..dc43cd7ddff400c56af24a447123bca083300f08 --- a/app/Views/_assets/icons/line-chart.svg +++ b/app/Views/_assets/icons/line-chart.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0H24V24H0z"/> - <path d="M5 3v16h16v2H3V3h2zm15.293 3.293l1.414 1.414L16 13.414l-3-2.999-4.293 4.292-1.414-1.414L13 7.586l3 2.999 4.293-4.292z"/> + <path d="M5 3v16h16v2H3V3h2zm14.94 2.94l2.12 2.12L16 14.122l-3-3-3.94 3.94-2.12-2.122L13 6.88l3 3 3.94-3.94z"/> </g> </svg> diff --git a/app/Views/_assets/icons/link.svg b/app/Views/_assets/icons/link.svg new file mode 100755 index 0000000000000000000000000000000000000000..3b7c8e0697ead2786b45422d1a4d1d6bd5e9d0b9 --- /dev/null +++ b/app/Views/_assets/icons/link.svg @@ -0,0 +1,6 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <g> + <path fill="none" d="M0 0h24v24H0z"/> + <path d="M18.364 15.536L16.95 14.12l1.414-1.414a5 5 0 1 0-7.071-7.071L9.879 7.05 8.464 5.636 9.88 4.222a7 7 0 0 1 9.9 9.9l-1.415 1.414zm-2.828 2.828l-1.415 1.414a7 7 0 0 1-9.9-9.9l1.415-1.414L7.05 9.88l-1.414 1.414a5 5 0 1 0 7.071 7.071l1.414-1.414 1.415 1.414zm-.708-10.607l1.415 1.415-7.071 7.07-1.415-1.414 7.071-7.07z"/> + </g> +</svg> diff --git a/app/Views/_assets/icons/links.svg b/app/Views/_assets/icons/links.svg deleted file mode 100644 index 3bff86576e3c3ed3489db3e557975a72e5677ef2..0000000000000000000000000000000000000000 --- a/app/Views/_assets/icons/links.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M13.06 8.11l1.415 1.415a7 7 0 0 1 0 9.9l-.354.353a7 7 0 0 1-9.9-9.9l1.415 1.415a5 5 0 1 0 7.071 7.071l.354-.354a5 5 0 0 0 0-7.07l-1.415-1.415 1.415-1.414zm6.718 6.011l-1.414-1.414a5 5 0 1 0-7.071-7.071l-.354.354a5 5 0 0 0 0 7.07l1.415 1.415-1.415 1.414-1.414-1.414a7 7 0 0 1 0-9.9l.354-.353a7 7 0 0 1 9.9 9.9z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/map-pin.svg b/app/Views/_assets/icons/map-pin.svg index 8e2366f3b9033a6fcb835ea0e7cf945ab9950ca1..5950f0560224afc55f2e0bb0fa5da028711e37c5 100644 --- a/app/Views/_assets/icons/map-pin.svg +++ b/app/Views/_assets/icons/map-pin.svg @@ -1 +1,6 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M17.657 15.657L12 21.314l-5.657-5.657a8 8 0 1 1 11.314 0zM5 22h14v2H5v-2z"/></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <g> + <path fill="none" d="M0 0h24v24H0z"/> + <path d="M18.364 17.364L12 23.728l-6.364-6.364a9 9 0 1 1 12.728 0zM12 13a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"/> + </g> +</svg> diff --git a/app/Views/_assets/icons/menu.svg b/app/Views/_assets/icons/menu.svg old mode 100644 new mode 100755 diff --git a/app/Views/_assets/icons/mic.svg b/app/Views/_assets/icons/mic.svg old mode 100644 new mode 100755 index 836c580d135e65edc514e33e1221d88762e82067..becff50cfb6f07e01d7520b7e2a17b1909075d66 --- a/app/Views/_assets/icons/mic.svg +++ b/app/Views/_assets/icons/mic.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0h24v24H0z"/> - <path d="M12 3a3 3 0 0 0-3 3v6a3 3 0 0 0 6 0V6a3 3 0 0 0-3-3zm0-2a5 5 0 0 1 5 5v6a5 5 0 0 1-10 0V6a5 5 0 0 1 5-5zM2.192 13.962l1.962-.393a8.003 8.003 0 0 0 15.692 0l1.962.393C20.896 18.545 16.85 22 12 22s-8.896-3.455-9.808-8.038z"/> + <path d="M12 1a5 5 0 0 1 5 5v4a5 5 0 0 1-10 0V6a5 5 0 0 1 5-5zM3.055 11H5.07a7.002 7.002 0 0 0 13.858 0h2.016A9.004 9.004 0 0 1 13 18.945V23h-2v-4.055A9.004 9.004 0 0 1 3.055 11z"/> </g> </svg> diff --git a/app/Views/_assets/icons/more.svg b/app/Views/_assets/icons/more.svg old mode 100644 new mode 100755 index d77a746cbebce32434520870ceceeb9b11460bed..5f6b5dba6abb0fbf9bd351bd4b57a6c2c3282d4a --- a/app/Views/_assets/icons/more.svg +++ b/app/Views/_assets/icons/more.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0h24v24H0z"/> - <path d="M12 3c-.825 0-1.5.675-1.5 1.5S11.175 6 12 6s1.5-.675 1.5-1.5S12.825 3 12 3zm0 15c-.825 0-1.5.675-1.5 1.5S11.175 21 12 21s1.5-.675 1.5-1.5S12.825 18 12 18zm0-7.5c-.825 0-1.5.675-1.5 1.5s.675 1.5 1.5 1.5 1.5-.675 1.5-1.5-.675-1.5-1.5-1.5z"/> + <path d="M5 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm14 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-7 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/> </g> </svg> diff --git a/app/Views/_assets/icons/movie.svg b/app/Views/_assets/icons/movie.svg old mode 100644 new mode 100755 index a3eaa1b73d707fc82251ced6f3ce081acff9c7cd..f92dd60fc6a6d6788904d3afbdbe032898d2b841 --- a/app/Views/_assets/icons/movie.svg +++ b/app/Views/_assets/icons/movie.svg @@ -1 +1,6 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M2 3.993A1 1 0 0 1 2.992 3h18.016c.548 0 .992.445.992.993v16.014a1 1 0 0 1-.992.993H2.992A.993.993 0 0 1 2 20.007V3.993zM4 5v14h16V5H4zm6.622 3.415l4.879 3.252a.4.4 0 0 1 0 .666l-4.88 3.252a.4.4 0 0 1-.621-.332V8.747a.4.4 0 0 1 .622-.332z"/></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <g> + <path fill="none" d="M0 0h24v24H0z"/> + <path d="M2 3.993A1 1 0 0 1 2.992 3h18.016c.548 0 .992.445.992.993v16.014a1 1 0 0 1-.992.993H2.992A.993.993 0 0 1 2 20.007V3.993zm8.622 4.422a.4.4 0 0 0-.622.332v6.506a.4.4 0 0 0 .622.332l4.879-3.252a.4.4 0 0 0 0-.666l-4.88-3.252z"/> + </g> +</svg> diff --git a/app/Views/_assets/icons/pages.svg b/app/Views/_assets/icons/pages.svg old mode 100644 new mode 100755 index e33ed93fdafe8ff84bd56f9a1cc57f620aa53d15..3d28c4005c53f529a41fcb44fab2ee231c59b95b --- a/app/Views/_assets/icons/pages.svg +++ b/app/Views/_assets/icons/pages.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0h24v24H0z"/> - <path d="M5 8v12h14V8H5zm0-2h14V4H5v2zm15 16H4a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1h16a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1zM7 10h4v4H7v-4zm0 6h10v2H7v-2zm6-5h4v2h-4v-2z"/> + <path d="M20 22H4a1 1 0 0 1-1-1V8h18v13a1 1 0 0 1-1 1zm1-16H3V3a1 1 0 0 1 1-1h16a1 1 0 0 1 1 1v3zM7 11v4h4v-4H7zm0 6v2h10v-2H7zm6-5v2h4v-2h-4z"/> </g> </svg> diff --git a/app/Views/_assets/icons/podcasting/amazon.svg b/app/Views/_assets/icons/podcasting/amazon.svg new file mode 100755 index 0000000000000000000000000000000000000000..82ba8b799719b4fcb2a0b13a4107d738033728c8 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/amazon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M22,18.23a4.28,4.28,0,0,1-1.32,2.9c-.18.14-.36.06-.28-.15.26-.65.87-2.14.58-2.49s-1-.24-1.73-.18c-.33,0-.61.06-.83.1s-.25-.16,0-.3a3.36,3.36,0,0,1,.87-.43,3.87,3.87,0,0,1,2.67.09.84.84,0,0,1,.08.46Zm-1.92,1.29a7,7,0,0,1-.83.55A14.69,14.69,0,0,1,12,22,14.57,14.57,0,0,1,2.1,18.23c-.22-.18,0-.45.22-.3a19.85,19.85,0,0,0,9.89,2.63,19.55,19.55,0,0,0,7-1.34l.5-.2C20.12,18.85,20.44,19.26,20.08,19.52Zm-6.17-11a3.85,3.85,0,0,0-.31-2.18A1.7,1.7,0,0,0,12,5.66a2,2,0,0,0-1.87,1.53.55.55,0,0,1-.44.48L7.29,7.36a.4.4,0,0,1-.35-.52C7.46,4.09,9.81,3.13,12,3h.53a5.89,5.89,0,0,1,3.79,1.26c1.21,1.14,1.08,2.67,1.08,4.32v3.93a3.24,3.24,0,0,0,1,2.31.48.48,0,0,1,0,.66c-.48.43-1.4,1.22-1.92,1.65a.57.57,0,0,1-.61.05,6.86,6.86,0,0,1-1.43-1.66A5.45,5.45,0,0,1,12,17.13a7.11,7.11,0,0,1-1.78.22A3.56,3.56,0,0,1,6.5,13.47a4.2,4.2,0,0,1,2.7-4.1,15.59,15.59,0,0,1,4.7-.88Zm-.48,5.2c.52-.88.47-1.59.47-3.19a8.6,8.6,0,0,0-1.87.18A2.29,2.29,0,0,0,10.16,13c0,1.09.57,1.84,1.52,1.84a1.18,1.18,0,0,0,.35,0A2,2,0,0,0,13.43,13.69Z"/><path d="M0,0H24V24H0Z" fill="none"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/antennapod.svg b/app/Views/_assets/icons/podcasting/antennapod.svg new file mode 100755 index 0000000000000000000000000000000000000000..26e9699d398fb034e6a7f75610b211058a5c6134 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/antennapod.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12.06,2.52A8.55,8.55,0,0,0,4.82,6.4,9.93,9.93,0,0,0,3.69,9a8.64,8.64,0,0,0,2.69,8.59,10.55,10.55,0,0,0,1,.73,3.82,3.82,0,0,0,.24-.61c.12-.34.21-.64.21-.66a1.08,1.08,0,0,0-.21-.19,8.14,8.14,0,0,1-1.2-1.16,7.2,7.2,0,0,1-1.62-4.61A7,7,0,0,1,5.5,7.88a7.23,7.23,0,0,1,5.49-4,8.62,8.62,0,0,1,2,0,7.27,7.27,0,0,1,6.17,6.17,9.1,9.1,0,0,1,0,1.88,7.35,7.35,0,0,1-1.62,3.76,9.94,9.94,0,0,1-1.14,1.11,1.31,1.31,0,0,0-.23.21s.1.31.22.64l.22.61.26-.17a8.18,8.18,0,0,0,1.14-1,8,8,0,0,0,1.62-2.25,8.58,8.58,0,0,0,.69-5.71A8.4,8.4,0,0,0,18.12,5.1a8.39,8.39,0,0,0-6.06-2.58ZM12,5.83a4.59,4.59,0,0,0-1.64.25A5.52,5.52,0,0,0,7.54,8.26a6.34,6.34,0,0,0-.74,1.93,7.2,7.2,0,0,0,0,1.67,5.44,5.44,0,0,0,1,2.39,5.31,5.31,0,0,0,.71.77,6.13,6.13,0,0,0,.26-.65c.12-.36.23-.67.23-.69a1.41,1.41,0,0,0-.17-.26,3.84,3.84,0,0,1-.75-2.36,3.68,3.68,0,0,1,.52-2,3.95,3.95,0,0,1,7,3.7,3.51,3.51,0,0,1-.36.61l-.19.26.17.44c.09.24.19.54.24.67a.74.74,0,0,0,.1.23,6.13,6.13,0,0,0,.8-.89,5.44,5.44,0,0,0,.85-2,5.14,5.14,0,0,0-.4-3.33,4.74,4.74,0,0,0-1-1.47,5.07,5.07,0,0,0-2.08-1.29A4.51,4.51,0,0,0,12,5.83Zm0,3.28a1.93,1.93,0,0,0-1.38.59A1.84,1.84,0,0,0,10,11.2a1.92,1.92,0,0,0,.44,1.14l.15.19-.11.3c0,.16-.49,1.4-1,2.75S8.36,18.92,8,20s-.64,1.8-.7,1.95a12.15,12.15,0,0,0,1.57.55L9,22c.1-.27.34-1,.55-1.55l.37-1H10l.55.1a6.71,6.71,0,0,0,1.43.08,6.43,6.43,0,0,0,1.41-.08l.54-.1.1,0L14.62,21c.27.78.5,1.44.53,1.54A12.34,12.34,0,0,0,16.73,22h0S16,19.89,15.1,17.39l-1.66-4.7-.06-.16.17-.22a2,2,0,0,0,.22-2.12,2.32,2.32,0,0,0-.87-.86A2,2,0,0,0,12,9.11Zm0,4.51s1.5,4.12,1.51,4.21a7.6,7.6,0,0,1-2.09.16,5.39,5.39,0,0,1-.9-.15S12,13.67,12,13.62Z" fill-opacity="0.88"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/apple.svg b/app/Views/_assets/icons/podcasting/apple.svg new file mode 100755 index 0000000000000000000000000000000000000000..358ce6f5ab4e0036a7553208c7966921e1a78481 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/apple.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M11.36,22.27c-.77-.28-.94-.65-1.25-2.84-.37-2.54-.45-4.11-.23-4.61a2.11,2.11,0,0,1,2.11-1,2.09,2.09,0,0,1,2.12,1c.21.5.13,2.07-.24,4.61-.24,1.78-.38,2.23-.72,2.53a1.78,1.78,0,0,1-1.78.31ZM8.08,19.66a9,9,0,0,1-5-6.45,11.9,11.9,0,0,1,0-3.26A9.05,9.05,0,0,1,5.43,5.33,9,9,0,0,1,18.5,5.26,8.83,8.83,0,0,1,20.92,10a12.6,12.6,0,0,1,0,3.07,9.08,9.08,0,0,1-3.47,5.68A10.5,10.5,0,0,1,15,20.08c-.09,0-.1-.1-.06-.5.08-.63.16-.76.52-.92a8.2,8.2,0,0,0,4.31-5.33,10.13,10.13,0,0,0-.06-3.76,8,8,0,0,0-6-5.74,9.67,9.67,0,0,0-3.22,0A8.06,8.06,0,0,0,4.33,9.76a10.76,10.76,0,0,0,0,3.58,8.27,8.27,0,0,0,3.42,4.84,7,7,0,0,0,.89.5c.36.16.43.29.5.92,0,.39,0,.5-.06.5a6.76,6.76,0,0,1-1-.41Zm0-3.49A6.54,6.54,0,0,1,6.1,13a7.36,7.36,0,0,1,0-2.92A6.3,6.3,0,0,1,10.2,5.72a7.57,7.57,0,0,1,3.13-.12A6.12,6.12,0,0,1,18,12.23a6,6,0,0,1-1.3,3.09,5.44,5.44,0,0,1-1.39,1.23,2.06,2.06,0,0,1-.05-.65v-.64l.44-.54a4.87,4.87,0,0,0-.27-6.67,4.66,4.66,0,0,0-2.6-1.34,3.25,3.25,0,0,0-1.55,0A4.71,4.71,0,0,0,8.6,8.05a4.88,4.88,0,0,0-.28,6.67l.44.54v.65a1.9,1.9,0,0,1-.06.65,3,3,0,0,1-.55-.39Zm3-3.51a2,2,0,0,1-1.19-1.9,2.1,2.1,0,0,1,1.2-1.87,2.28,2.28,0,0,1,1.81,0A2.35,2.35,0,0,1,14,10.25a2.08,2.08,0,0,1-2.91,2.41Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/blubrry.svg b/app/Views/_assets/icons/podcasting/blubrry.svg new file mode 100755 index 0000000000000000000000000000000000000000..d3db4e2575e91ecbbe2bbf315ef294c6820e6c47 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/blubrry.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M15.84,4.47s.92-2.09.87-2.13-2.1,1.25-2.1,1.25S12.11,1.66,12,1.66,9.74,3.43,9.74,3.43,7.47,1.78,7.41,1.84s.74,2.65.74,2.65a8.83,8.83,0,0,0-5.62,8.13,9.26,9.26,0,0,0,9.47,9,9.16,9.16,0,0,0,9.47-9A8.88,8.88,0,0,0,15.84,4.47Zm.93,8.12a4.45,4.45,0,0,0-2.56-3.93l.35-.88a5.39,5.39,0,0,1,3.19,4.81Zm2.14,0A6.47,6.47,0,0,0,15,6.74l.5-1.26a7.81,7.81,0,0,1,4.86,7.11Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/breaker.svg b/app/Views/_assets/icons/podcasting/breaker.svg new file mode 100755 index 0000000000000000000000000000000000000000..98fe46f3493220a30e36f2782a17d1cb88270dae --- /dev/null +++ b/app/Views/_assets/icons/podcasting/breaker.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M13.3,13.07a1.91,1.91,0,0,1,.48,0,2.51,2.51,0,0,1,1.88,1.63c.08.26.19.66.26.93l.09.37h.38a5.49,5.49,0,0,0,5.38-5.46c0-4.52-3.77-8.28-9.54-8.28A10.16,10.16,0,0,0,5.9,4.56,10,10,0,0,0,2.23,12.3a10.64,10.64,0,0,0,.28,2.35,10,10,0,0,0,9.72,7.65,11.07,11.07,0,0,0,1.3-.08A10,10,0,0,0,20,18.6l.1-.12-.2-.73-.38.1a14.32,14.32,0,0,1-3.72.48,14.14,14.14,0,0,1-3-.31,2.51,2.51,0,0,1-1.87-1.65,2.51,2.51,0,0,1,.48-2.44A2.5,2.5,0,0,1,13.3,13.07ZM12.23,3.24c5.34,0,8.6,3.42,8.6,7.34a4.55,4.55,0,0,1-4.1,4.5c-.06-.22-.13-.45-.18-.62a15.25,15.25,0,0,0-9.36-9.7A8.79,8.79,0,0,1,12.23,3.24ZM3.17,12.3A9,9,0,0,1,6.3,5.45a14.35,14.35,0,0,1,8.38,7A3.26,3.26,0,0,0,14,12.2a15.86,15.86,0,0,0-3.17-.33,15.65,15.65,0,0,0-7.51,1.94A9.33,9.33,0,0,1,3.17,12.3Zm9.44,6.64a15.9,15.9,0,0,0,3.19.33,16.77,16.77,0,0,0,2.46-.19,9,9,0,0,1-4.6,2.17,13.91,13.91,0,0,1-1.73-2.52A3.83,3.83,0,0,0,12.61,18.94Zm-.07,2.42h-.31a8.82,8.82,0,0,1-4.16-1A14.24,14.24,0,0,1,9.88,16a4.07,4.07,0,0,0,.16.71A15.68,15.68,0,0,0,12.54,21.36Zm-1.83-8a15.6,15.6,0,0,0-3.48,6.55,9,9,0,0,1-3.72-5.1,14.27,14.27,0,0,1,7.29-1.95h.44A3.57,3.57,0,0,0,10.71,13.31Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/castbox.svg b/app/Views/_assets/icons/podcasting/castbox.svg new file mode 100755 index 0000000000000000000000000000000000000000..f3b4a19722ec35a32248a8f6f498dc611fec3c81 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/castbox.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M14.42,6.47a1.07,1.07,0,0,0-1.11,1.06v2.56c0,.33-.28.55-.67.55a.63.63,0,0,1-.67-.55V6.64a1.11,1.11,0,0,0-1.11-1.06A1.07,1.07,0,0,0,9.75,6.64V9.41c0,.34-.28.56-.67.56a.63.63,0,0,1-.66-.56v-1a1.1,1.1,0,0,0-1.11-1,1.07,1.07,0,0,0-1.12,1V10.8a.58.58,0,0,1-.66.56.63.63,0,0,1-.67-.56v-.27a1.11,1.11,0,1,0-2.22-.08v3.41a1.11,1.11,0,0,0,2.22,0v-.28c0-.33.28-.55.67-.55a.61.61,0,0,1,.66.55v3.78a1.11,1.11,0,0,0,1.12,1.06,1.07,1.07,0,0,0,1.11-1.06V12.2a.58.58,0,0,1,.66-.56.63.63,0,0,1,.67.56v2.55a1.1,1.1,0,0,0,1.11,1.06A1.07,1.07,0,0,0,12,14.75V12.86c0-.33.28-.55.67-.55a.63.63,0,0,1,.67.55v2.06A1.11,1.11,0,0,0,14.42,16a1.07,1.07,0,0,0,1.11-1.06V7.53a1.11,1.11,0,0,0-1.11-1.06M18,9.36a1.07,1.07,0,0,0-1.11,1.06v4.22A1.1,1.1,0,0,0,18,15.7a1.07,1.07,0,0,0,1.11-1.06V10.42A1.07,1.07,0,0,0,18,9.36m3.56,2.11a1.07,1.07,0,0,0-1.11,1.06v1.06a1.1,1.1,0,0,0,1.11,1.06,1.07,1.07,0,0,0,1.11-1.06V12.53a1.07,1.07,0,0,0-1.11-1.06" fill-rule="evenodd"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/castopod.svg b/app/Views/_assets/icons/podcasting/castopod.svg new file mode 100755 index 0000000000000000000000000000000000000000..ff91790c9da64dede52f84a03257b7f0acc64e88 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/castopod.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M17.13,11.69a1.28,1.28,0,0,1-.26.8,2.91,2.91,0,0,0-1.09-.3,2.12,2.12,0,0,0-1.15.35,1.36,1.36,0,0,1-.29-.85,1.4,1.4,0,1,1,2.79,0ZM8.26,10.28a1.39,1.39,0,0,0-1.14,2.2,2.84,2.84,0,0,1,1.09-.3,2.12,2.12,0,0,1,1.15.35,1.36,1.36,0,0,0,.29-.85A1.39,1.39,0,0,0,8.26,10.28ZM22,7.19V17.8a1.34,1.34,0,0,1-1.34,1.35H17.17s-.36-.65-.49-.86a.57.57,0,0,0-.45-.19H7.75a.54.54,0,0,0-.46.19c-.17.23-.5.86-.5.86H3.35A1.35,1.35,0,0,1,2,17.81V7.2A1.35,1.35,0,0,1,3.34,5.85H20.65A1.35,1.35,0,0,1,22,7.19Zm-2.6,4.39a2.82,2.82,0,0,0-2.84-2.86H7.43a2.85,2.85,0,0,0,0,5.7h9.13A2.84,2.84,0,0,0,19.4,11.58Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/castro.svg b/app/Views/_assets/icons/podcasting/castro.svg new file mode 100755 index 0000000000000000000000000000000000000000..d3716c8e1e9c46cee66dbd58648740c108f08b2a --- /dev/null +++ b/app/Views/_assets/icons/podcasting/castro.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12,2h0A10,10,0,1,0,22,12,10,10,0,0,0,12,2Zm0,11.67a1.73,1.73,0,1,1,1.72-1.73A1.72,1.72,0,0,1,12,13.67Zm4.17,4L14.5,15.39a4.25,4.25,0,1,0-4.94,0L7.89,17.72a7.12,7.12,0,1,1,11.28-5.78A7.37,7.37,0,0,1,16.17,17.72Z" fill-rule="evenodd"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/chartable.svg b/app/Views/_assets/icons/podcasting/chartable.svg new file mode 100755 index 0000000000000000000000000000000000000000..6383bbfc6f18f0722970b3627efdc0fdc1798d4b --- /dev/null +++ b/app/Views/_assets/icons/podcasting/chartable.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M7.64,19.53a7.62,7.62,0,0,1-1.95-.36,5.47,5.47,0,0,1-2.47-1.63A5.89,5.89,0,0,1,2,13.2,8.75,8.75,0,0,1,3,9.59,7,7,0,0,1,4.38,7.65,6.18,6.18,0,0,1,7.82,6,7.11,7.11,0,0,1,9.8,6a2.89,2.89,0,0,1,2.07,1.6A3.44,3.44,0,0,1,11.62,11a1,1,0,0,1-.71.31.92.92,0,0,1-.9-.36,1.36,1.36,0,0,1-.06-1,3.21,3.21,0,0,0,.07-1C9.9,8.1,9.35,7.72,8.38,7.77c-2,.09-3.51,1.85-3.91,4.41a7,7,0,0,0,.11,3,3.16,3.16,0,0,0,.9,1.45,4.21,4.21,0,0,0,3.1,1,9.81,9.81,0,0,0,3.78-.79l.42-.16,0-.33c0-.18,0-.57,0-.87a27.41,27.41,0,0,1,.52-4.86c.54-2.76,1.55-5,2.57-5.71a2,2,0,0,1,1.57-.39A1.78,1.78,0,0,1,18.7,5.85a2.67,2.67,0,0,1,.09.77c.06,2.08-1,4.14-3.64,7.11l-.35.39,0,.35c0,.19,0,.54,0,.78v.44l.14-.33a6,6,0,0,1,2.48-3.09c.77-.38,1.51-.33,1.82.12s.23.93-.19,3c-.29,1.44-.33,1.79-.23,2.12s.4.34.74.17A6,6,0,0,0,21,16.29c.27-.31.38-.39.57-.39s.44.2.46.68a1.57,1.57,0,0,1-.17.86,7.38,7.38,0,0,1-1.49,1.46,3.08,3.08,0,0,1-1.52.62,1.57,1.57,0,0,1-2-1.13,2.76,2.76,0,0,1-.05-.69,9.31,9.31,0,0,1,.28-2c.18-.94.17-1.18,0-1.2s-.13,0-.28.16a8.75,8.75,0,0,0-1.65,3.46,2.14,2.14,0,0,1-.43,1,1.39,1.39,0,0,1-1.08.45c-.27,0-.31,0-.44-.09a.71.71,0,0,1-.32-.58l0-.22-.38.13a11.51,11.51,0,0,1-2.94.69,14.78,14.78,0,0,1-1.84.06Zm7.7-7.89c1.28-1.68,2-3.62,1.88-4.86,0-.36-.08-.49-.19-.61s-.46-.09-.73.46a15.26,15.26,0,0,0-1,3.44c-.09.47-.31,1.86-.31,2s0,.05.35-.39Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/deezer.svg b/app/Views/_assets/icons/podcasting/deezer.svg new file mode 100755 index 0000000000000000000000000000000000000000..869b06ef07b497803b82585d0ed4c9e303ee687e --- /dev/null +++ b/app/Views/_assets/icons/podcasting/deezer.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M17.37,5.47H21.7V8H17.37Zm0,3.51H21.7v2.53H17.37Zm0,3.51H21.7V15H17.37ZM1.7,16H6v2.53H1.7Zm5.22,0h4.33v2.53H6.92Zm5.23,0h4.33v2.53H12.15Zm5.22,0H21.7v2.53H17.37Zm-5.22-3.51h4.33V15H12.15Zm-5.23,0h4.33V15H6.92ZM6.92,9h4.33v2.53H6.92Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/fyyd.svg b/app/Views/_assets/icons/podcasting/fyyd.svg new file mode 100755 index 0000000000000000000000000000000000000000..f8b6518caab562ddcc58cf16bccccc2f4cb87500 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/fyyd.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M2,12A10,10,0,1,1,12,22,10,10,0,0,1,2,12Zm8.16,6.5a.85.85,0,0,0,1.18,0l5.91-5.91a.83.83,0,0,0,0-1.17L11.34,5.5a.85.85,0,0,0-1.18,0L8.84,6.83A.82.82,0,0,0,8.84,8l4,4-4,4a.82.82,0,0,0,0,1.17Z" fill-rule="evenodd"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/google.svg b/app/Views/_assets/icons/podcasting/google.svg new file mode 100755 index 0000000000000000000000000000000000000000..51056db8e6ec0be2137dbbf2023707176c7980ff --- /dev/null +++ b/app/Views/_assets/icons/podcasting/google.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M3.22,10.08A1.24,1.24,0,0,0,2,11.31V12.7a1.22,1.22,0,0,0,2.44,0h0V11.31A1.17,1.17,0,0,0,3.22,10.08Zm17.56,0a1.23,1.23,0,0,0-1.22,1.23V12.7a1.21,1.21,0,0,0,1.22,1.22A1.22,1.22,0,0,0,22,12.7h0V11.31A1.24,1.24,0,0,0,20.78,10.08ZM7.56,14.2a1.24,1.24,0,0,0-1.23,1.23v1.4a1.23,1.23,0,0,0,2.45,0h0v-1.4A1.17,1.17,0,0,0,7.56,14.2ZM7.56,6A1.24,1.24,0,0,0,6.33,7.24V11.7h0a1.23,1.23,0,0,0,2.45,0h0V7.24A1.17,1.17,0,0,0,7.56,6Zm8.88,0a1.24,1.24,0,0,0-1.22,1.23V8.63a1.23,1.23,0,0,0,2.45,0h0V7.24A1.24,1.24,0,0,0,16.44,6ZM12,2a1.23,1.23,0,0,0-1.22,1.23V4.62a1.22,1.22,0,1,0,2.44,0h0V3.23A1.23,1.23,0,0,0,12,2Zm0,16.16a1.22,1.22,0,0,0-1.22,1.22v1.4a1.22,1.22,0,1,0,2.44,0h0v-1.4A1.26,1.26,0,0,0,12,18.16Zm4.44-7a1.23,1.23,0,0,0-1.22,1.22v4.47a1.23,1.23,0,0,0,2.45,0h0V12.36A1.23,1.23,0,0,0,16.44,11.14ZM13.22,8.41a1.22,1.22,0,0,0-2.44,0h0v7.36h0a1.22,1.22,0,1,0,2.44,0h0V8.41Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/ivoox.svg b/app/Views/_assets/icons/podcasting/ivoox.svg new file mode 100755 index 0000000000000000000000000000000000000000..6715e45240c63640a65adfec2daa8a2e671609c6 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/ivoox.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12,2.07a10,10,0,0,0-1.62,19.86c0-2.77,0-6.41,0-9,0-.29,0-.29-.28-.29H7.69c-.17,0-.22-.05-.22-.22q0-1.38,0-2.76c0-.17,0-.23.22-.23,1.6,0,3.21,0,4.82,0a1.64,1.64,0,0,1,.7.22,1.05,1.05,0,0,1,.47,1c0,1.29,0,2.56,0,3.83v7.44A10,10,0,0,0,12,2.07ZM11.91,8.7h-.07a1.76,1.76,0,0,1-1.73-1.82,1.8,1.8,0,0,1,1.83-1.81,1.82,1.82,0,0,1,0,3.63Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/listennotes.svg b/app/Views/_assets/icons/podcasting/listennotes.svg new file mode 100755 index 0000000000000000000000000000000000000000..05f99886cbe64d35bb76e06c092d7a84bcaab439 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/listennotes.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M22.48,21.2a3.61,3.61,0,0,0-.34-.84,7.94,7.94,0,0,0-.84-1.29A13.12,13.12,0,0,0,19,16.81a9.68,9.68,0,0,0-1.46-1l0,0a8.34,8.34,0,0,0,.4-9.31,8.65,8.65,0,0,0-.67-.92A8.32,8.32,0,1,0,4.44,16.21a8.13,8.13,0,0,0,5.32,2.92,8.24,8.24,0,0,0,6.11-1.61.05.05,0,0,0,0,0,9.88,9.88,0,0,0,.91,1.31,13.73,13.73,0,0,0,2,2,10.41,10.41,0,0,0,1.42,1,5.15,5.15,0,0,0,1,.44,1.79,1.79,0,0,0,.69.08.71.71,0,0,0,.37-.12.64.64,0,0,0,.26-.5A1.67,1.67,0,0,0,22.48,21.2ZM10.84,17.46a6.58,6.58,0,0,1,0-13.16h0a6.58,6.58,0,0,1,0,13.16ZM7.62,6.31a7.29,7.29,0,0,1,3,.62,7.77,7.77,0,0,1,4.7,7.17H14.12V14a6.54,6.54,0,0,0-2.86-5.36,6.12,6.12,0,0,0-2.08-.94,5.36,5.36,0,0,0-.89-.16l-.57,0h-.1Zm5.57,8H12a4.39,4.39,0,0,0-1.36-3.18,4.49,4.49,0,0,0-3.2-1.31V8.59a5.8,5.8,0,0,1,5,2.86A5.5,5.5,0,0,1,13.19,14.3ZM7.42,11.71V10.59a3.67,3.67,0,0,1,3.23,1.94,3.42,3.42,0,0,1,.4,1.66H9.94a2.43,2.43,0,0,0-.75-1.76A2.45,2.45,0,0,0,7.42,11.71Zm1.69,2A1.06,1.06,0,1,1,8,12.68a1,1,0,0,1,1.07,1.05Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/overcast.svg b/app/Views/_assets/icons/podcasting/overcast.svg new file mode 100755 index 0000000000000000000000000000000000000000..742522639ed59f16b8b82ae2bbbe021af85f0a4c --- /dev/null +++ b/app/Views/_assets/icons/podcasting/overcast.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12,22a10,10,0,1,1,.08,0Zm0-3.94.72-.73L12,14.44l-.72,2.89ZM11.06,18l-.39,1.44.89-.88Zm1.88,0-.5.5.89.89Zm.72,2.56L12,18.89l-1.67,1.67a8.51,8.51,0,0,0,1.67.16,5.92,5.92,0,0,0,1.67-.16ZM12,3.22A8.8,8.8,0,0,0,3.22,12a8.65,8.65,0,0,0,5.89,8.22L11,13.28A1.53,1.53,0,0,1,10.33,12,1.67,1.67,0,0,1,12,10.28a1.64,1.64,0,0,1,1.67,1.61v0A1.76,1.76,0,0,1,13,13.28l1.89,6.94A8.71,8.71,0,0,0,20.78,12,8.8,8.8,0,0,0,12,3.22Zm5.72,13.11a.61.61,0,0,1-.89.11.57.57,0,0,1-.11-.83,6.43,6.43,0,0,0,0-7.22.57.57,0,0,1,.11-.83.66.66,0,0,1,.89.11A7,7,0,0,1,19.11,12,7.28,7.28,0,0,1,17.72,16.33Zm-3.06-1.61a.68.68,0,0,1,.06-.94A2.79,2.79,0,0,0,15.33,12a3.2,3.2,0,0,0-.61-1.78.67.67,0,0,1-.05-.94.61.61,0,0,1,.87-.06h0a4.19,4.19,0,0,1,0,5.55.69.69,0,0,1-.89-.06Zm-5.33,0a.63.63,0,0,1-.88.07h0A4.07,4.07,0,0,1,7.38,12,4.19,4.19,0,0,1,8.44,9.22a.62.62,0,0,1,.89.06.68.68,0,0,1-.06.94,2.89,2.89,0,0,0,0,3.55.68.68,0,0,1,.06,1ZM7.16,16.44a.67.67,0,0,1-.89-.11A7,7,0,0,1,4.89,12,7.15,7.15,0,0,1,6.27,7.67a.62.62,0,0,1,.89-.12.55.55,0,0,1,.11.83,6.43,6.43,0,0,0,0,7.22.56.56,0,0,1,0,.79l-.06.05Z" fill-rule="evenodd"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/playerfm.svg b/app/Views/_assets/icons/podcasting/playerfm.svg new file mode 100755 index 0000000000000000000000000000000000000000..fc24e26d74b9cf3e1681e5de70fa7ef599df607b --- /dev/null +++ b/app/Views/_assets/icons/podcasting/playerfm.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M11.4,22A9.4,9.4,0,0,1,9.17,3.48,2,2,0,0,1,11.62,5a2,2,0,0,1-1.5,2.44A5.37,5.37,0,0,0,11.4,18h0a5.36,5.36,0,0,0,5.23-4.12,2,2,0,0,1,3.95.95A9.47,9.47,0,0,1,11.4,22Zm9.74-11.24a.84.84,0,0,1-.84-.61,10.1,10.1,0,0,0-6.4-6.51A.84.84,0,1,1,14.36,2h.05A11.81,11.81,0,0,1,22,9.66a.86.86,0,0,1-.56,1.06A.5.5,0,0,1,21.14,10.77Zm-2.78.56a.85.85,0,0,1-.84-.61,7.38,7.38,0,0,0-4.17-4.34.85.85,0,0,1,.51-1.62,8.61,8.61,0,0,1,5.28,5.45.86.86,0,0,1-.56,1.06C18.52,11.27,18.41,11.33,18.36,11.33Zm-2.84.33a.82.82,0,0,1-.78-.5,4.61,4.61,0,0,0-2-2.06.87.87,0,1,1,.78-1.56h0a6.77,6.77,0,0,1,2.78,2.9A.8.8,0,0,1,16,11.53l0,0A.76.76,0,0,1,15.52,11.66Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/pocketcasts.svg b/app/Views/_assets/icons/podcasting/pocketcasts.svg new file mode 100755 index 0000000000000000000000000000000000000000..bb55131204b0c2ddd7331e1f511e61480f368c8d --- /dev/null +++ b/app/Views/_assets/icons/podcasting/pocketcasts.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M2,12a10,10,0,0,1,20,0H19.5A7.5,7.5,0,1,0,12,19.5V22A10,10,0,0,1,2,12Zm10,6a6,6,0,1,1,6-6H15.83A3.83,3.83,0,1,0,12,15.83h0Z" fill-rule="evenodd"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/podbean.svg b/app/Views/_assets/icons/podcasting/podbean.svg new file mode 100755 index 0000000000000000000000000000000000000000..c8577b5f88acef41aac08e8438bff2e3850acb66 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/podbean.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M11.79,4.1a10.58,10.58,0,0,1,1.69.08,10.85,10.85,0,0,1,1.38.27,12.06,12.06,0,0,1,2,.68A11.42,11.42,0,0,1,19,6.4,10.4,10.4,0,0,1,20,7.31c.2.2.41.4.61.61a11.51,11.51,0,0,1,1.23,1.64A1.36,1.36,0,0,1,22,10a1.25,1.25,0,0,1-.43,1,1.16,1.16,0,0,1-.67.26A1.14,1.14,0,0,1,20,11a5.65,5.65,0,0,1-.56-.73A9.11,9.11,0,0,0,17.12,8a10,10,0,0,0-1.4-.77c-.18-.08-.37-.14-.55-.21a6.54,6.54,0,0,0-1.31-.37,8.88,8.88,0,0,0-1.78-.18,8.27,8.27,0,0,0-1.79.14A9.52,9.52,0,0,0,8.9,7a9.33,9.33,0,0,0-4.12,2.9c-.19.25-.38.49-.54.75a1.72,1.72,0,0,1-.36.4,1.14,1.14,0,0,1-.44.18,1.51,1.51,0,0,1-.56,0,1.14,1.14,0,0,1-.7-.52,1.21,1.21,0,0,1-.11-1,2,2,0,0,1,.17-.32A11.7,11.7,0,0,1,6.36,5.54a12.77,12.77,0,0,1,2.12-.91A12,12,0,0,1,11.79,4.1Zm.12,4.3a7.24,7.24,0,0,1,5.21,2.1,6.88,6.88,0,0,1,1.05,1.3,1.27,1.27,0,0,1,.09,1,1.24,1.24,0,0,1-.65.68,1.2,1.2,0,0,1-1.21-.16,1.34,1.34,0,0,1-.31-.36,6.31,6.31,0,0,0-.71-.84A4.85,4.85,0,0,0,13,10.89a6.09,6.09,0,0,0-1.13-.1,4.91,4.91,0,0,0-2.7.88,5.55,5.55,0,0,0-.94.87c-.19.23-.34.49-.54.71a1.2,1.2,0,0,1-1.69,0,1.13,1.13,0,0,1-.29-.51,1.06,1.06,0,0,1,0-.61,1.86,1.86,0,0,1,.23-.47,9.71,9.71,0,0,1,.86-1.06A7.92,7.92,0,0,1,8,9.57a7.16,7.16,0,0,1,1.38-.7A7.33,7.33,0,0,1,11.91,8.4Zm-.09,4.65a3.7,3.7,0,0,1,3.89,3.42,5.13,5.13,0,0,1,0,1,3.92,3.92,0,0,1-1.19,2.12,3.74,3.74,0,0,1-1.76.89,4,4,0,0,1-1.25,0A3.88,3.88,0,0,1,10.16,20a4.32,4.32,0,0,1-1.1-.94,5.11,5.11,0,0,1-.57-1,3.76,3.76,0,0,1,1.39-4.36,3.59,3.59,0,0,1,1.94-.66m0,1.77a3.21,3.21,0,0,0-.63.14,2.77,2.77,0,0,0-.6.41,2,2,0,0,0-.47,2.09,2.12,2.12,0,0,0,.61.86,2.61,2.61,0,0,0,.77.37,3.08,3.08,0,0,0,.68,0,1.7,1.7,0,0,0,.9-.33,1.93,1.93,0,0,0,.82-1.29A2.21,2.21,0,0,0,13.81,16a2.57,2.57,0,0,0-.34-.54,2,2,0,0,0-1.61-.65Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/podcastaddict.svg b/app/Views/_assets/icons/podcasting/podcastaddict.svg new file mode 100755 index 0000000000000000000000000000000000000000..2db5845757f7a494a390bb1b7305dff20b24ef39 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/podcastaddict.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M22,11.77A10,10,0,1,0,7.3,20.83V12a4.76,4.76,0,0,1,3.86-4.66V9a3.12,3.12,0,0,0-2.24,3v0h0a3.13,3.13,0,0,0,6.13.85h1.66a4.74,4.74,0,0,1-5.56,3.76,4.59,4.59,0,0,1-2.23-1.09v6A10.33,10.33,0,0,0,12,22a10,10,0,0,0,5.61-1.72V22H22Zm-9.95,2a1.83,1.83,0,1,1,1.82-1.83h0a1.81,1.81,0,0,1-1.81,1.82ZM16.79,12H15.18a3.13,3.13,0,0,0-3.13-3.13h0V7.2h0A4.75,4.75,0,0,1,16.79,12h0Zm2.78,0H18A5.93,5.93,0,0,0,12.05,6h0V4.42h0A7.53,7.53,0,0,1,19.57,12Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/podcastindex.svg b/app/Views/_assets/icons/podcasting/podcastindex.svg new file mode 100755 index 0000000000000000000000000000000000000000..4b88645e773645f46a3e7184a597436772c0c875 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/podcastindex.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M4.52,3.59l-.13.15A8.84,8.84,0,0,0,2.08,8.48a11.43,11.43,0,0,0-.06,2,9.65,9.65,0,0,0,.42,2A8.64,8.64,0,0,0,3.93,15.2a5,5,0,0,0,.61.66s.29-.27.62-.6l.61-.61-.17-.17a7,7,0,0,1-1.78-3.63,7.94,7.94,0,0,1,0-1.95A7.06,7.06,0,0,1,5.55,5l.2-.22-.61-.61Zm15,0L18.25,4.82l.19.21a7.34,7.34,0,0,1,.85,1.14,6.92,6.92,0,0,1,.78,5.25,7.79,7.79,0,0,1-.8,1.93,8.66,8.66,0,0,1-.86,1.12l-.16.16.61.62.61.61.14-.13.33-.36a8.83,8.83,0,0,0,2-4.33,10.75,10.75,0,0,0,0-2.27,8.3,8.3,0,0,0-.83-2.84,8.55,8.55,0,0,0-1.49-2.16ZM17.41,5.66l-.6.6-.59.59.11.13a4.32,4.32,0,0,1,1,1.95,5.59,5.59,0,0,1,0,1.42,4.43,4.43,0,0,1-.54,1.49,5.32,5.32,0,0,1-.52.69c-.06.05-.06.05.53.66a7.84,7.84,0,0,0,.6.59l.15-.15a6,6,0,0,0,1.34-2.48,5.81,5.81,0,0,0-1.26-5.22Zm-10.8,0s-.08,0-.25.25a5.59,5.59,0,0,0-.62.83A5.94,5.94,0,0,0,5,8.8a7.78,7.78,0,0,0,0,1.53,5.83,5.83,0,0,0,1.4,3.2l.25.27.58-.6.59-.6-.13-.16a4.22,4.22,0,0,1-.95-1.9A5,5,0,0,1,6.68,9a4.11,4.11,0,0,1,1-2l.17-.19-.55-.54-.61-.59s0,0,0,0Zm2,1.93L8.5,7.7A3.78,3.78,0,0,0,7.91,9a4.11,4.11,0,0,0,0,1.31,3.55,3.55,0,0,0,.27.89,3.16,3.16,0,0,0,.4.64,3.26,3.26,0,0,0,.36-.34l.34-.35L9.19,11a2.38,2.38,0,0,1,0-2.6l.07-.11L8.92,8Zm6.87,0a5.54,5.54,0,0,0-.68.69.56.56,0,0,0,.08.15,2.41,2.41,0,0,1,.05,2.42l-.12.21.34.35a4.92,4.92,0,0,0,.35.35.58.58,0,0,0,.11-.13A3.52,3.52,0,0,0,16,10.9a3.47,3.47,0,0,0-.21-2.8,2.72,2.72,0,0,0-.33-.47Zm-3.38.19a2.13,2.13,0,0,0-.46,0,2,2,0,0,0-1.27,1,1.93,1.93,0,0,0,.89,2.58,1.57,1.57,0,0,0,.9.18,1.47,1.47,0,0,0,.53-.07,2,2,0,0,0,1.26-1.24,2.48,2.48,0,0,0,0-1.05,2,2,0,0,0-1.42-1.43,1.72,1.72,0,0,0-.47,0ZM11,12.44l-.08.58c-.11.9-.36,2.77-.5,3.81s-.4,3-.51,3.87c0,.36-.09.68-.09.71l0,.06h2.13v-.09c0-.05,0-.23.06-.4s.09-.75.16-1.26.2-1.47.28-2.12c.21-1.6.41-3.09.55-4.2.07-.51.13-.94.13-1H11Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/podchaser.svg b/app/Views/_assets/icons/podcasting/podchaser.svg new file mode 100755 index 0000000000000000000000000000000000000000..ca80217dc174f1c58f1eb32ec9ab4acafb2c36cf --- /dev/null +++ b/app/Views/_assets/icons/podcasting/podchaser.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12,2A10,10,0,1,0,22,12,10,10,0,0,0,12,2Zm0,18.63a8.81,8.81,0,0,1-2.78-.46V17.94a6.39,6.39,0,1,0-3.61-5.76v5.61A8.61,8.61,0,1,1,12,20.63Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/podcloud.svg b/app/Views/_assets/icons/podcasting/podcloud.svg new file mode 100755 index 0000000000000000000000000000000000000000..9abda5d7365d595fac27f2bd25b50871ee9490f3 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/podcloud.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M19.42,11.07c0-.08,0-.16,0-.24a4.92,4.92,0,0,0-9.28-2.3,3.87,3.87,0,0,0-.77-.08A3.56,3.56,0,0,0,6,11l-.4,0a3.57,3.57,0,0,0,0,7.14H18.41a3.59,3.59,0,0,0,1-7Zm-6.77,6.71c-1,0-1.76-1.16-1.76-2.24,0-1.28.48-1.28,1.69-1.28s1.83,0,1.83,1.28C14.41,16.62,13.62,17.78,12.65,17.78Zm-1.18-5.3a1.17,1.17,0,1,1,1.17,1.17A1.17,1.17,0,0,1,11.47,12.48Zm2.85,1.33a2.07,2.07,0,0,0,.47-1.33,2.15,2.15,0,1,0-3.86,1.3,1,1,0,0,0-.35.25,2.58,2.58,0,1,1,4.09,0A.9.9,0,0,0,14.32,13.81ZM15,15.89a4.38,4.38,0,0,0,0-.51,2.62,2.62,0,0,0,0-.29,3.53,3.53,0,1,0-4.75,0c0,.09,0,.18,0,.28a3.05,3.05,0,0,0,.05.52,4.14,4.14,0,1,1,4.68,0Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/podfriend.svg b/app/Views/_assets/icons/podcasting/podfriend.svg new file mode 100755 index 0000000000000000000000000000000000000000..6c96c60d53d199e0435a7342cb507419df7bf8d4 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/podfriend.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M2.46,15.14l.07.48a7.24,7.24,0,0,0,1.56,3.22C5.29,20.28,7.63,22,12,22s6.71-1.72,7.9-3.16a7.2,7.2,0,0,0,1.57-3.22l.07-.48Zm9.54,6a10.56,10.56,0,0,1-5.34-1.24,9.09,9.09,0,0,1,.3-1.1,5.35,5.35,0,0,1,.78-1.45A5.06,5.06,0,0,1,9.54,16H13l0,0A6,6,0,0,0,11.8,19h0c0,.18,0,.41.14.49a.33.33,0,0,0,.37-.1,1,1,0,0,0,.17-.37,7.32,7.32,0,0,1,1.88-3h6.17C20.11,17.34,18.35,21.17,12,21.17ZM20.24,9.49h0c0-.39-.76-7.41-8.18-7.49h-.12C4.53,2.08,3.8,9.09,3.76,9.49c0,.19-.28,2.38.77,3.58a2.24,2.24,0,0,0,1.78.76H17.69a2.24,2.24,0,0,0,1.78-.76C20.52,11.87,20.26,9.68,20.24,9.49Zm-7.6-1.57a1.25,1.25,0,1,1,1.25,1.24A1.25,1.25,0,0,1,12.64,7.92Zm6.21,4.6h0a1.45,1.45,0,0,1-1.16.48H14A4.35,4.35,0,1,0,10,13H6.31a1.45,1.45,0,0,1-1.16-.48c-.82-.94-.57-2.91-.57-2.93v0c0-.27.55-6.69,7.41-6.73s7.39,6.46,7.41,6.73v0A4.39,4.39,0,0,1,18.85,12.52Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/podinstall.svg b/app/Views/_assets/icons/podcasting/podinstall.svg new file mode 100755 index 0000000000000000000000000000000000000000..9bec6ac614284b73f466b60ade3f39f295374963 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/podinstall.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M22,9.69C21.74,8,21.37,7.38,18.94,5s-3-2.78-4.5-3.07c-.45-.09-3-.13-5.23-.13H4.43v17.5l.07.07,1.43,1.43,1.42,1.43.07.07h6.36V16.67H15a17.15,17.15,0,0,0,2.2-.13A6.08,6.08,0,0,0,22,9.69ZM7.22,19.46v1.26l-.66-.65L6,19.46Zm0-14.27V18.48H5.42V3.39Zm.65-.65L6.08,2.74H10v1.8ZM8.2,18.48v-13H10v13Zm0,2.79V19.46h2.14l1.07,1.08.73.73ZM11,12.9V5.52H12.8V12.9Zm1.81,1v3.5c0,1.44,0,2.57,0,3.2L12,19.85,11,18.8V13.89ZM11,4.54V3.4l.55.54.59.59H11Zm7,5.13a5.32,5.32,0,0,1-2.89,2.89,5.61,5.61,0,0,1-1.13.3l-.24,0V5.52h1.49a9.07,9.07,0,0,1,2.27.18l.49.14.17.64A5.86,5.86,0,0,1,18,9.67Zm-4.26,4.19.25,0a7.76,7.76,0,0,0,2.56-1,6.1,6.1,0,0,0,2.66-6c0-.12,0-.24-.06-.34.12.1.25.23.4.37a5.46,5.46,0,0,1,1.14,1.55,3.41,3.41,0,0,1,.37,2.06,4.39,4.39,0,0,1-.26,1.9,5.42,5.42,0,0,1-2.92,2.92,6.39,6.39,0,0,1-2.49.29l-1.65.05Zm3.39-9.19A15.74,15.74,0,0,0,15,4.55H13.45L11.66,2.73l1.2,0c1.65,0,1.81.06,2.43.35a5.66,5.66,0,0,1,2,1.59h0Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/podlink.svg b/app/Views/_assets/icons/podcasting/podlink.svg new file mode 100755 index 0000000000000000000000000000000000000000..c980f8f623bbf28f2831397c618c8c01d0211a05 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/podlink.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M2.49,10.51a.27.27,0,0,1,.37-.09l2.63,1.66a.27.27,0,0,1,.08.38.26.26,0,0,1-.22.12.28.28,0,0,1-.15,0L2.57,10.88A.27.27,0,0,1,2.49,10.51Zm3.61,1a.28.28,0,0,0,.23.13.23.23,0,0,0,.14,0,.27.27,0,0,0,.1-.37L5.32,9.14A.27.27,0,0,0,5,9.05a.28.28,0,0,0-.1.37ZM4.92,14a.28.28,0,0,0,.27-.24.27.27,0,0,0-.23-.3l-2.41-.33a.27.27,0,1,0-.08.53L4.88,14ZM21.6,6.89h0a.71.71,0,0,0-1-.09h0l-4.1,3.42L13.46,5.09a1.49,1.49,0,0,0-1-.73V1.89a.27.27,0,0,0-.54,0V4.34a1.5,1.5,0,0,0-1.1.75h0l-7,13.81a.73.73,0,0,0,1.26.72h0l7-13.78a.09.09,0,0,1,.09,0h0a.12.12,0,0,1,.09,0h0l3.13,5.3h0L9.91,15.71h0a.69.69,0,0,0,.88,1.07l5.31-4.42,3.3,5.58a.11.11,0,0,1-.1.16h0L5.34,20.24a.69.69,0,0,0-.68.69.7.7,0,0,0,.7.69h0l14-2.13a1.53,1.53,0,0,0,1.3-2.29h0l-3.44-5.77,4.28-3.55h0A.71.71,0,0,0,21.6,6.89Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/podtail.svg b/app/Views/_assets/icons/podcasting/podtail.svg new file mode 100755 index 0000000000000000000000000000000000000000..09426777e419ae15680e30f3ca0f73fec6726fbb --- /dev/null +++ b/app/Views/_assets/icons/podcasting/podtail.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M13.51,22l-.45-.08A2.68,2.68,0,0,1,11,20.08a5.9,5.9,0,0,1-.28-1.91c0-.29,0-.3-.31-.3H9.11a.53.53,0,0,1,0-1.05c.44,0,.87,0,1.31,0,.19,0,.26-.07.26-.26,0-.4,0-.79,0-1.19,0-.16-.07-.23-.23-.25a3.34,3.34,0,0,1-2.94-3.47c0-.53.05-.48-.48-.48H6.75a.6.6,0,0,1-.51-.54.57.57,0,0,1,.51-.52h.46c.3,0,.31,0,.31-.3V5.43A3.36,3.36,0,0,1,10.3,2l.1,0h1.79a3.78,3.78,0,0,1,1.65.76A3.22,3.22,0,0,1,15,5.21c0,2.26,0,4.51,0,6.77a3.3,3.3,0,0,1-2.87,3.14c-.41.05-.41,0-.41.47v1c0,.17.07.24.24.24h1.46a.46.46,0,0,1,.51.51.48.48,0,0,1-.52.54H12c-.19,0-.26.07-.25.25A5,5,0,0,0,12,19.72a1.73,1.73,0,0,0,1.41,1.2A2.17,2.17,0,0,0,15.71,20c.36-.51.64-1.06,1-1.59a10,10,0,0,1,.79-1.24,2.14,2.14,0,0,1,2.9-.39,1.53,1.53,0,0,1,.32.35.42.42,0,0,1-.05.58.52.52,0,0,1-.59.11l-.17-.12a1.11,1.11,0,0,0-1.67.19c-.24.33-.43.7-.64,1.05-.38.62-.74,1.26-1.16,1.84A2.9,2.9,0,0,1,14.46,22l-.1,0ZM11.27,10.1h2.39c.3,0,.31,0,.31-.3V9.69c0-.37,0-.37-.38-.37H12.27a.52.52,0,0,1-.52-.52.53.53,0,0,1,.49-.54h1.48c.24,0,.24,0,.25-.35s0-.26-.25-.25H12.33a.54.54,0,1,1,0-1.08h1.33c.27,0,.28,0,.28-.3S14,6,13.69,6H12.17a.53.53,0,0,1-.5-.57.54.54,0,0,1,.44-.49,1.22,1.22,0,0,1,.27,0h1.29c.23,0,.25,0,.18-.25a2.18,2.18,0,0,0-1.8-1.53,6.19,6.19,0,0,0-1.29,0,2.27,2.27,0,0,0-2,1.55c-.07.23-.05.26.18.26h1.32a.54.54,0,1,1,0,1.08H8.91c-.3,0-.31,0-.31.3s0,.31.3.31h1.41a.54.54,0,1,1,0,1.07c-.5,0-1,0-1.48,0-.24,0-.27,0-.27.31s0,.28.27.29h1.38c.39,0,.64.21.65.52s-.25.55-.65.55H9.07c-.5,0-.48-.06-.48.49,0,.27,0,.29.3.29Zm0,1.06H8.85c-.18,0-.27.06-.26.25s0,.36,0,.52a2.25,2.25,0,0,0,2.18,2.15c.32,0,.64,0,1,0a2.23,2.23,0,0,0,2-1.26A2.61,2.61,0,0,0,14,11.44c0-.26,0-.28-.29-.28Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/podverse.svg b/app/Views/_assets/icons/podcasting/podverse.svg new file mode 100755 index 0000000000000000000000000000000000000000..ccec56af03c1ad82a9e6e469db38c3e147bc167f --- /dev/null +++ b/app/Views/_assets/icons/podcasting/podverse.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M7.12,21.73a4.62,4.62,0,0,1-2.46-2.49,10.13,10.13,0,0,0-.85-1.63,10,10,0,1,1,16.4,0,9.39,9.39,0,0,0-.85,1.63,4.5,4.5,0,0,1-2.52,2.49A2.48,2.48,0,0,1,16,22a65.25,65.25,0,0,1,2.21-7.53,1.55,1.55,0,0,1,.59.46,2.13,2.13,0,0,0,.52.46,3.71,3.71,0,0,0,.42-1,7.37,7.37,0,0,0,.24-2.76,5.78,5.78,0,0,0-.76-3.12,8,8,0,0,0-14.34,0,5.79,5.79,0,0,0-.77,3.12,7.56,7.56,0,0,0,.25,2.76,3.71,3.71,0,0,0,.42,1,2.34,2.34,0,0,0,.52-.46,1.49,1.49,0,0,1,.6-.46,10.94,10.94,0,0,1,.84,2.45c.37,1.35.84,3,1,3.71A3.32,3.32,0,0,1,8,21.9a2,2,0,0,1-.84-.17Zm1.41-.3c-.1-.34-.62-2.19-1.17-4.11-.83-3-1-3.51-.72-3.65a1.35,1.35,0,0,1,1.54.16A54.67,54.67,0,0,1,10.34,21c0,.32-.58.78-1.14.92s-.52.06-.67-.49Zm5.84.37a1,1,0,0,1-.62-.61,33.68,33.68,0,0,1,2-7.26,1.14,1.14,0,0,1,.85-.44c1.11,0,1.11,0-.15,4.43A23.9,23.9,0,0,1,15.09,22a4.11,4.11,0,0,1-.72-.2Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/radiopublic.svg b/app/Views/_assets/icons/podcasting/radiopublic.svg new file mode 100755 index 0000000000000000000000000000000000000000..1803cccd202a19ecac7580534f71be22ff29d145 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/radiopublic.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M15.52,12.63V9.58l.37-.08c.46-.11.51.13.51.52v1.8c0,.33,0,.62-.51.73ZM7.65,9.85V7.12L8.09,7c.4-.09.49,0,.49.5V9c0,.51-.15.69-.55.78Zm5.89-4.47V2.48C9.92.82,6.3,4.14,2.68,2.48V19.06c2.64,1.21,5.27-.22,7.91-.44v2.9c3.58,1.66,7.15-1.66,10.73,0V4.94C18.73,3.74,16.14,5.14,13.54,5.38Zm-2.8,10.31a13.18,13.18,0,0,0-2,.32c-.1-.1-.18-.31-.18-.79V12.06c0-.5-.12-.61-.52-.52l-.41.1v4.62a16.38,16.38,0,0,1-2,.34V5.79a24.5,24.5,0,0,0,3.12-.6c1.21-.27,1.81.35,1.81,1.5V8.42A1.72,1.72,0,0,1,9.73,10a1.09,1.09,0,0,1,.84,1.17v3.67a1.36,1.36,0,0,0,.17.79Zm7.65-4a2.26,2.26,0,0,1-1.93,2.51l-.94.22v4.33a14.75,14.75,0,0,1-2,.34V8.26a23.56,23.56,0,0,0,2.81-.54c1.68-.38,2,.46,2,1.78Z" fill-rule="evenodd"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/spotify.svg b/app/Views/_assets/icons/podcasting/spotify.svg new file mode 100755 index 0000000000000000000000000000000000000000..da84da85c7c18ee49437d9582a453ff59cd811c4 --- /dev/null +++ b/app/Views/_assets/icons/podcasting/spotify.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M17.91,10.87C14.69,9,9.37,8.77,6.3,9.71a.93.93,0,1,1-.54-1.79c3.53-1.08,9.4-.87,13.11,1.34a.93.93,0,1,1-1,1.6h0Zm-.1,2.83a.78.78,0,0,1-1.07.26h0a13.14,13.14,0,0,0-10-1.17.78.78,0,0,1-1-.49.79.79,0,0,1,.5-1h0a14.58,14.58,0,0,1,11.23,1.33.78.78,0,0,1,.26,1.07Zm-1.22,2.72a.63.63,0,0,1-.86.21h0c-2.35-1.44-5.3-1.76-8.79-1a.62.62,0,0,1-.27-1.21c3.81-.87,7.07-.5,9.71,1.11a.63.63,0,0,1,.21.86ZM12,2A10,10,0,1,0,22,12,10,10,0,0,0,12,2Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/spreaker.svg b/app/Views/_assets/icons/podcasting/spreaker.svg new file mode 100755 index 0000000000000000000000000000000000000000..06ddebe33a4f70f71426c59815b35c6409eb9a1d --- /dev/null +++ b/app/Views/_assets/icons/podcasting/spreaker.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M14.82,2,10.11,7.45l-7-1.52,7.23,6.15L3.2,18.29l7-1.65L15,22l.59-7.17,6.6-2.9L15.56,9.16,14.82,2Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/stitcher.svg b/app/Views/_assets/icons/podcasting/stitcher.svg new file mode 100755 index 0000000000000000000000000000000000000000..b2f7c0d02cf7a2a82860dd842d19b42dfc9a018f --- /dev/null +++ b/app/Views/_assets/icons/podcasting/stitcher.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M14.69,8.5h3v6.32h-3Zm-4.21.89h3V15.5h-3ZM6.24,8.9h3v5.92h-3ZM2,9.82H5.07v5.4H2Zm16.93-.21H22v4.78H18.93Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/podcasting/tunein.svg b/app/Views/_assets/icons/podcasting/tunein.svg new file mode 100755 index 0000000000000000000000000000000000000000..8ebef8d47288d0791f7bbb51bfc500166964346a --- /dev/null +++ b/app/Views/_assets/icons/podcasting/tunein.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M21.5,5.23H12.06a.49.49,0,0,0-.5.49h0V8.32H2.5a.5.5,0,0,0-.5.5H2v9.45a.5.5,0,0,0,.49.5h9.45a.49.49,0,0,0,.5-.49h0v-2.6H21.5a.49.49,0,0,0,.5-.49h0V5.67A.49.49,0,0,0,21.5,5.23Zm-10,12.6H2.94V9.26H11.5Zm6.41-5.36a.11.11,0,0,1-.11.11h-2a.11.11,0,0,1-.11-.11v-.61a.12.12,0,0,1,.11-.11h.5s0,0,0-.05V9.21c0-.06,0-.06,0-.06h-.45A.12.12,0,0,1,15.7,9v-.6a.11.11,0,0,1,.11-.11h1.88a.11.11,0,0,1,.11.11V9a.11.11,0,0,1-.11.11h-.44c-.05,0-.05,0-.05.06V11.7c0,.05,0,.05.05.05h.5a.12.12,0,0,1,.11.11l.06.61Zm-12-.33v-.61A.11.11,0,0,1,6,11.42H8.46a.11.11,0,0,1,.11.11v.61h0a.12.12,0,0,1-.11.11H7.7c-.06,0-.06,0-.06.05v3.26a.11.11,0,0,1-.11.11H6.92a.11.11,0,0,1-.11-.11V12.3c0-.05,0-.05-.06-.05H6A.12.12,0,0,1,5.87,12.14Z" fill-rule="evenodd"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/question.svg b/app/Views/_assets/icons/question.svg old mode 100644 new mode 100755 index 984376ae7d43d4ab2905522caa475a996b81d81e..b7fd91eda2ac71396dc82d844d0ff291bf3b765e --- a/app/Views/_assets/icons/question.svg +++ b/app/Views/_assets/icons/question.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0h24v24H0z"/> - <path d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-2a8 8 0 1 0 0-16 8 8 0 0 0 0 16zm-1-5h2v2h-2v-2zm2-1.645V14h-2v-1.5a1 1 0 0 1 1-1 1.5 1.5 0 1 0-1.471-1.794l-1.962-.393A3.501 3.501 0 1 1 13 13.355z"/> + <path d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-7v2h2v-2h-2zm2-1.645A3.502 3.502 0 0 0 12 6.5a3.501 3.501 0 0 0-3.433 2.813l1.962.393A1.5 1.5 0 1 1 12 11.5a1 1 0 0 0-1 1V14h2v-.645z"/> </g> </svg> diff --git a/app/Views/_assets/icons/repeat.svg b/app/Views/_assets/icons/repeat.svg new file mode 100644 index 0000000000000000000000000000000000000000..c5a26047736111fd0be4dd863d3bdf87104b2354 --- /dev/null +++ b/app/Views/_assets/icons/repeat.svg @@ -0,0 +1,6 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <g> + <path fill="none" d="M0 0h24v24H0z"/> + <path d="M6 4h15a1 1 0 0 1 1 1v7h-2V6H6v3L1 5l5-4v3zm12 16H3a1 1 0 0 1-1-1v-7h2v6h14v-3l5 4-5 4v-3z"/> + </g> +</svg> diff --git a/app/Views/_assets/icons/rss.svg b/app/Views/_assets/icons/rss.svg old mode 100644 new mode 100755 index e8cff80175e9e43884886b887202a2e594f5b085..723552d9b132eb4263dc4cf9ebcf37273576e5fa --- a/app/Views/_assets/icons/rss.svg +++ b/app/Views/_assets/icons/rss.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0h24v24H0z"/> - <path d="M3 17a4 4 0 0 1 4 4H3v-4zm0-7c6.075 0 11 4.925 11 11h-2a9 9 0 0 0-9-9v-2zm0-7c9.941 0 18 8.059 18 18h-2c0-8.837-7.163-16-16-16V3z"/> + <path d="M3 3c9.941 0 18 8.059 18 18h-3c0-8.284-6.716-15-15-15V3zm0 7c6.075 0 11 4.925 11 11h-3a8 8 0 0 0-8-8v-3zm0 7a4 4 0 0 1 4 4H3v-4z"/> </g> </svg> diff --git a/app/Views/_assets/icons/scales.svg b/app/Views/_assets/icons/scales.svg old mode 100644 new mode 100755 index 2592d2ca599da5a9fe5dfe561a777df7288e6ea8..7383e06a6f6a86f0f8e5e20e4ceda88456edaa5b --- a/app/Views/_assets/icons/scales.svg +++ b/app/Views/_assets/icons/scales.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0H24V24H0z"/> - <path d="M13 2v1.278l5 1.668 3.632-1.21.633 1.896-3.032 1.011 3.096 8.512C21.237 16.292 19.7 17 18 17c-1.701 0-3.237-.708-4.329-1.845l3.094-8.512L13 5.387V19H17v2H7v-2h4V5.387L7.232 6.643l3.096 8.512C9.237 16.292 7.7 17 6 17c-1.701 0-3.237-.708-4.329-1.845l3.094-8.512-3.03-1.01.633-1.898L6 4.945l5-1.667V2h2zm5 7.103l-1.958 5.386c.587.331 1.257.511 1.958.511.7 0 1.37-.18 1.958-.51L18 9.102zm-12 0l-1.958 5.386C4.629 14.82 5.299 15 6 15c.7 0 1.37-.18 1.958-.51L6 9.102z"/> + <path d="M13 2v1.278l5 1.668 3.632-1.21.633 1.896-3.032 1.011 3.096 8.512C21.237 16.292 19.7 17 18 17c-1.701 0-3.237-.708-4.329-1.845l3.094-8.512L13 5.387V19H17v2H7v-2h4V5.387L7.232 6.643l3.096 8.512C9.237 16.292 7.7 17 6 17c-1.701 0-3.237-.708-4.329-1.845l3.094-8.512-3.03-1.01.633-1.898L6 4.945l5-1.667V2h2zm5 7.103L16.582 13h2.835L18 9.103zm-12 0L4.582 13h2.835L6 9.103z"/> </g> </svg> diff --git a/app/Views/_assets/icons/settings.svg b/app/Views/_assets/icons/settings.svg old mode 100644 new mode 100755 index 8ab66f65d22a13d10c8760f3417a2cfd57ee51ab..893c92d2ee17f1bf5bd98a83a4ccc8c170d94c90 --- a/app/Views/_assets/icons/settings.svg +++ b/app/Views/_assets/icons/settings.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0h24v24H0z"/> - <path d="M2 12c0-.865.11-1.703.316-2.504A3 3 0 0 0 4.99 4.867a9.99 9.99 0 0 1 4.335-2.505 3 3 0 0 0 5.348 0 9.99 9.99 0 0 1 4.335 2.505 3 3 0 0 0 2.675 4.63c.206.8.316 1.638.316 2.503 0 .865-.11 1.703-.316 2.504a3 3 0 0 0-2.675 4.629 9.99 9.99 0 0 1-4.335 2.505 3 3 0 0 0-5.348 0 9.99 9.99 0 0 1-4.335-2.505 3 3 0 0 0-2.675-4.63C2.11 13.704 2 12.866 2 12zm4.804 3c.63 1.091.81 2.346.564 3.524.408.29.842.541 1.297.75A4.993 4.993 0 0 1 12 18c1.26 0 2.438.471 3.335 1.274.455-.209.889-.46 1.297-.75A4.993 4.993 0 0 1 17.196 15a4.993 4.993 0 0 1 2.77-2.25 8.126 8.126 0 0 0 0-1.5A4.993 4.993 0 0 1 17.195 9a4.993 4.993 0 0 1-.564-3.524 7.989 7.989 0 0 0-1.297-.75A4.993 4.993 0 0 1 12 6a4.993 4.993 0 0 1-3.335-1.274 7.99 7.99 0 0 0-1.297.75A4.993 4.993 0 0 1 6.804 9a4.993 4.993 0 0 1-2.77 2.25 8.126 8.126 0 0 0 0 1.5A4.993 4.993 0 0 1 6.805 15zM12 15a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0-2a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/> + <path d="M9.954 2.21a9.99 9.99 0 0 1 4.091-.002A3.993 3.993 0 0 0 16 5.07a3.993 3.993 0 0 0 3.457.261A9.99 9.99 0 0 1 21.5 8.876 3.993 3.993 0 0 0 20 12c0 1.264.586 2.391 1.502 3.124a10.043 10.043 0 0 1-2.046 3.543 3.993 3.993 0 0 0-3.456.261 3.993 3.993 0 0 0-1.954 2.86 9.99 9.99 0 0 1-4.091.004A3.993 3.993 0 0 0 8 18.927a3.993 3.993 0 0 0-3.457-.26A9.99 9.99 0 0 1 2.5 15.121 3.993 3.993 0 0 0 4 11.999a3.993 3.993 0 0 0-1.502-3.124 10.043 10.043 0 0 1 2.046-3.543A3.993 3.993 0 0 0 8 5.071a3.993 3.993 0 0 0 1.954-2.86zM12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z"/> </g> </svg> diff --git a/app/Views/_assets/icons/social/castopod.svg b/app/Views/_assets/icons/social/castopod.svg new file mode 100755 index 0000000000000000000000000000000000000000..ff91790c9da64dede52f84a03257b7f0acc64e88 --- /dev/null +++ b/app/Views/_assets/icons/social/castopod.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M17.13,11.69a1.28,1.28,0,0,1-.26.8,2.91,2.91,0,0,0-1.09-.3,2.12,2.12,0,0,0-1.15.35,1.36,1.36,0,0,1-.29-.85,1.4,1.4,0,1,1,2.79,0ZM8.26,10.28a1.39,1.39,0,0,0-1.14,2.2,2.84,2.84,0,0,1,1.09-.3,2.12,2.12,0,0,1,1.15.35,1.36,1.36,0,0,0,.29-.85A1.39,1.39,0,0,0,8.26,10.28ZM22,7.19V17.8a1.34,1.34,0,0,1-1.34,1.35H17.17s-.36-.65-.49-.86a.57.57,0,0,0-.45-.19H7.75a.54.54,0,0,0-.46.19c-.17.23-.5.86-.5.86H3.35A1.35,1.35,0,0,1,2,17.81V7.2A1.35,1.35,0,0,1,3.34,5.85H20.65A1.35,1.35,0,0,1,22,7.19Zm-2.6,4.39a2.82,2.82,0,0,0-2.84-2.86H7.43a2.85,2.85,0,0,0,0,5.7h9.13A2.84,2.84,0,0,0,19.4,11.58Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/discord.svg b/app/Views/_assets/icons/social/discord.svg new file mode 100755 index 0000000000000000000000000000000000000000..ad22eebd4cce0f1dda6ecbeb6f1e73e9427fa86c --- /dev/null +++ b/app/Views/_assets/icons/social/discord.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M10.08,11a1,1,0,1,1,0,2,1,1,0,1,1,0-2Zm3.84,0a1,1,0,1,1-1.07,1A1,1,0,0,1,13.92,11Zm5-9A2.14,2.14,0,0,1,21,4.16V23l-2.21-2-1.25-1.17-1.31-1.25.54,1.94H5.11A2.13,2.13,0,0,1,3,18.36V4.16A2.14,2.14,0,0,1,5.11,2Zm-4,13.71a3.75,3.75,0,0,0,3.15-1.59A14.29,14.29,0,0,0,16.59,8,5,5,0,0,0,13.7,6.89l-.15.17A6.79,6.79,0,0,1,16.11,8.4a8,8,0,0,0-3.09-1,8.52,8.52,0,0,0-2.08,0l-.17,0a7.66,7.66,0,0,0-2.34.66c-.38.18-.61.31-.61.31A7,7,0,0,1,10.53,7l-.1-.13A5,5,0,0,0,7.54,8a14.21,14.21,0,0,0-1.49,6.12,3.73,3.73,0,0,0,3.14,1.59l.69-.87a3.19,3.19,0,0,1-1.8-1.24,2,2,0,0,0,.29.18l0,0,.09.06a7,7,0,0,0,.75.35,7.9,7.9,0,0,0,1.52.45,6.8,6.8,0,0,0,2.66,0,6.56,6.56,0,0,0,1.49-.45,5.2,5.2,0,0,0,1.18-.62,3.24,3.24,0,0,1-1.86,1.25c.31.4.68.85.68.85Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/facebook.svg b/app/Views/_assets/icons/social/facebook.svg new file mode 100755 index 0000000000000000000000000000000000000000..4d215877ebffad45836cbe7c1a9f31bf2d5eec2b --- /dev/null +++ b/app/Views/_assets/icons/social/facebook.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12,2.06a10,10,0,0,0-1.56,19.88V15H7.9V12.06h2.54V9.86A3.53,3.53,0,0,1,14.22,6a15.68,15.68,0,0,1,2.23.19V8.62H15.19a1.45,1.45,0,0,0-1.63,1.56v1.88h2.78L15.89,15H13.56v7A10,10,0,0,0,12,2.06Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/funkwhale.svg b/app/Views/_assets/icons/social/funkwhale.svg new file mode 100755 index 0000000000000000000000000000000000000000..4abbeaade4a178f85603036965e2f1ec2b4bb670 --- /dev/null +++ b/app/Views/_assets/icons/social/funkwhale.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M6.27,3c-.33,0-.66,0-1,0A2.44,2.44,0,0,0,5.7,5.13a4.89,4.89,0,0,0,1.8,1.4c.67.35,1.39.41,2,.79a2.65,2.65,0,0,1,1,.93,2.68,2.68,0,0,1,.39,1.39l0,.85s.33.85,1.05.85,1-.85,1-.85l.05-.85a2.7,2.7,0,0,1,.39-1.39,2.36,2.36,0,0,1,.95-.93c.64-.38,1.37-.44,2-.79a4.77,4.77,0,0,0,1.75-1.4A2.43,2.43,0,0,0,18.62,3a7.71,7.71,0,0,0-3.86.69c-1.56.83-2.51.54-2.79,1.78h0c-.29-1.25-1.22-1-2.8-1.78A6.75,6.75,0,0,0,6.27,3Zm2.45,7.88a.18.18,0,0,0-.18.18,3.46,3.46,0,1,0,6.92,0,.18.18,0,0,0-.18-.18H14a.19.19,0,0,0-.18.18,1.79,1.79,0,0,1-3.58,0,.19.19,0,0,0-.18-.18Zm-6.54,0A.19.19,0,0,0,2,11a10,10,0,0,0,20,0,.19.19,0,0,0-.18-.18H20.51a.18.18,0,0,0-.18.18A8.34,8.34,0,0,1,3.65,11a.19.19,0,0,0-.18-.18Zm3.28,0a.19.19,0,0,0-.18.18,6.72,6.72,0,0,0,13.44,0,.19.19,0,0,0-.18-.18H17.23a.19.19,0,0,0-.18.18A5.06,5.06,0,1,1,6.93,11a.19.19,0,0,0-.18-.18Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/instagram.svg b/app/Views/_assets/icons/social/instagram.svg new file mode 100755 index 0000000000000000000000000000000000000000..a56bb3e90f17ccac6795fea9f815bacd06a801e6 --- /dev/null +++ b/app/Views/_assets/icons/social/instagram.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12,2c2.72,0,3.06,0,4.12.06a7.3,7.3,0,0,1,2.43.47,4.7,4.7,0,0,1,1.77,1.15,4.84,4.84,0,0,1,1.15,1.77,7.3,7.3,0,0,1,.47,2.43C22,8.94,22,9.28,22,12s0,3.06-.06,4.12a7.3,7.3,0,0,1-.47,2.43,5.08,5.08,0,0,1-2.92,2.92,7.3,7.3,0,0,1-2.43.47c-1.06,0-1.4.06-4.12.06s-3.06,0-4.12-.06a7.3,7.3,0,0,1-2.43-.47,4.84,4.84,0,0,1-1.77-1.15,4.84,4.84,0,0,1-1.15-1.77,7.3,7.3,0,0,1-.47-2.43C2,15.06,2,14.72,2,12s0-3.06.06-4.12a7.3,7.3,0,0,1,.47-2.43A4.84,4.84,0,0,1,3.68,3.68,4.84,4.84,0,0,1,5.45,2.53a7.3,7.3,0,0,1,2.43-.47C8.94,2,9.28,2,12,2Zm0,5a5,5,0,1,0,5,5A5,5,0,0,0,12,7Zm6.5-.25A1.25,1.25,0,1,0,17.25,8,1.25,1.25,0,0,0,18.5,6.75ZM12,9a3,3,0,1,1-3,3A3,3,0,0,1,12,9Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/linkedin.svg b/app/Views/_assets/icons/social/linkedin.svg new file mode 100755 index 0000000000000000000000000000000000000000..78000a7a8e5e7ecd92e464e536d066c2142e4c79 --- /dev/null +++ b/app/Views/_assets/icons/social/linkedin.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M18.33,18.34H15.67V14.16c0-1,0-2.28-1.39-2.28s-1.6,1.09-1.6,2.21v4.25H10V9.75h2.56v1.17h0a2.83,2.83,0,0,1,2.53-1.39c2.7,0,3.2,1.78,3.2,4.09v4.72ZM7,8.57A1.55,1.55,0,0,1,5.45,7h0a1.55,1.55,0,0,1,3.1,0A1.54,1.54,0,0,1,7,8.57Zm1.34,9.77H5.67V9.75H8.34v8.59ZM19.67,3H4.33A1.31,1.31,0,0,0,3,4.3V19.7A1.31,1.31,0,0,0,4.33,21H19.67A1.32,1.32,0,0,0,21,19.7V4.3A1.32,1.32,0,0,0,19.67,3Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/mastodon.svg b/app/Views/_assets/icons/social/mastodon.svg new file mode 100755 index 0000000000000000000000000000000000000000..f931556394b56a7535261e3e85c74d3a79e3bda5 --- /dev/null +++ b/app/Views/_assets/icons/social/mastodon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M21.26,14c-.28,1.41-2.46,3-5,3.25a23.66,23.66,0,0,1-4,.24,22.68,22.68,0,0,1-4-.54,4,4,0,0,0,0,.62c.29,2.22,2.19,2.35,4,2.41a11.23,11.23,0,0,0,3.44-.45l.07,1.65a9.21,9.21,0,0,1-3.54.81,14.73,14.73,0,0,1-4.61-.51C3.8,20.43,3.12,16.25,3,12c0-1.26,0-2.45,0-3.44C3,4.23,5.85,3,5.85,3A17.64,17.64,0,0,1,12.3,2h.06a17.64,17.64,0,0,1,6.45,1s2.85,1.27,2.85,5.61A33.59,33.59,0,0,1,21.26,14Zm-3-5.09a3.78,3.78,0,0,0-.82-2.56,2.87,2.87,0,0,0-2.23-1,2.68,2.68,0,0,0-2.4,1.23l-.52.87-.52-.87A2.68,2.68,0,0,0,9.4,5.39a2.83,2.83,0,0,0-2.22,1A3.79,3.79,0,0,0,6.35,8.9v5.26H8.43V9.06c0-1.08.46-1.62,1.36-1.62s1.5.64,1.5,1.92v2.79h2.07V9.36q0-1.92,1.5-1.92c.91,0,1.36.54,1.36,1.62v5.1H18.3V8.9Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/mobilizon.svg b/app/Views/_assets/icons/social/mobilizon.svg new file mode 100755 index 0000000000000000000000000000000000000000..b7fd11a6cc25faf6fbe9f533bee29a74f7434e12 --- /dev/null +++ b/app/Views/_assets/icons/social/mobilizon.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M16,8.17a5.11,5.11,0,0,0-4.11-1.44,4.57,4.57,0,0,0-2.48.42A6.23,6.23,0,0,0,6,11.86a14.48,14.48,0,0,0,.33,5.52,5.8,5.8,0,0,0,4.43,3.83h0a6.17,6.17,0,0,0,5.14-1.35A5.77,5.77,0,0,0,17.8,16.6C18.61,13.41,17.88,10,16,8.17Zm-1.6,8.65a3,3,0,0,1-1.33,2.23,2.09,2.09,0,0,1-2.28,0c-.91-.52-1.35-1.7-1.45-3.86A7.94,7.94,0,0,1,10,11.25,1.85,1.85,0,0,1,11.8,10c1.54-.1,2.2.55,2.63,2.6A10.2,10.2,0,0,1,14.42,16.82ZM10.78,4.73c-.56-.16-.74-.54-.74-1.62s.16-1.42.83-1.63a4.68,4.68,0,0,1,2.52,0c.58.2.8.64.8,1.63s-.22,1.42-.8,1.62a5.48,5.48,0,0,1-2.61,0Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/peertube.svg b/app/Views/_assets/icons/social/peertube.svg new file mode 100755 index 0000000000000000000000000000000000000000..0fb16946e5cfac63a31b51680ae2a6dbf318b117 --- /dev/null +++ b/app/Views/_assets/icons/social/peertube.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M6.1,2V12l7.5-5Zm7.5,5V17l7.5-5Zm0,10L6.1,12V22Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/pixelfed.svg b/app/Views/_assets/icons/social/pixelfed.svg new file mode 100755 index 0000000000000000000000000000000000000000..b34713407e024fd978dee73dc6b82533df3e6453 --- /dev/null +++ b/app/Views/_assets/icons/social/pixelfed.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12,2A10,10,0,1,1,2,12,10,10,0,0,1,12,2Zm1,6.1H10.41A1.76,1.76,0,0,0,8.62,9.83v6.75l2.59-2.47H13a3,3,0,1,0,0-6Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/plume.svg b/app/Views/_assets/icons/social/plume.svg new file mode 100755 index 0000000000000000000000000000000000000000..a1009fa50ab65055c0e347c0994e9f814c6ef19b --- /dev/null +++ b/app/Views/_assets/icons/social/plume.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M2.09,21.87c-.12-.15-.12-.46,0-.92a10.48,10.48,0,0,1,1.26-2.42,18.94,18.94,0,0,0,1.06-2.05C6,12.16,7.64,9.27,10,6.92a10.18,10.18,0,0,1,2.51-2c.15,0,.14.43.09.6s.28-.27.49-.49c1.3-1.39,3.18-2.12,7.18-2.82C21.61,2,21.88,2,22,2.14s0,.23-.32.56A4.51,4.51,0,0,0,20.42,5a6.74,6.74,0,0,1-1.14,2.31l-.72.77.83-.19c.18.17,0,.4-.32,1.06-.93,2.26-4.58,5.76-8.47,7.7A17.29,17.29,0,0,1,7,18l-.44.09L5,19.67C3.24,21.62,2.83,22,2.4,22a.42.42,0,0,1-.31-.11Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/reddit.svg b/app/Views/_assets/icons/social/reddit.svg new file mode 100755 index 0000000000000000000000000000000000000000..a97eb3e230dcdec207e27f19e2e30f423cc46305 --- /dev/null +++ b/app/Views/_assets/icons/social/reddit.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12,22A10,10,0,1,1,22,12,10,10,0,0,1,12,22Zm6.67-10a1.46,1.46,0,0,0-1.51-1.41,1.5,1.5,0,0,0-1,.41,7.15,7.15,0,0,0-3.85-1.23L13,6.65l2.14.45a1,1,0,1,0,.13-.61L12.82,6a.31.31,0,0,0-.37.24h0l-.74,3.47a7.14,7.14,0,0,0-3.9,1.23A1.46,1.46,0,1,0,6.2,13.33a3.23,3.23,0,0,0,0,.44C6.2,16,8.81,17.83,12,17.83s5.83-1.82,5.83-4.06a3.23,3.23,0,0,0,0-.44A1.47,1.47,0,0,0,18.67,12Zm-10,1a1,1,0,1,1,1,1A1,1,0,0,1,8.67,13Zm5.81,2.75a3.84,3.84,0,0,1-2.47.77,3.84,3.84,0,0,1-2.47-.77.27.27,0,0,1,.38-.38A3.3,3.3,0,0,0,12,16a3.25,3.25,0,0,0,2.09-.61.27.27,0,0,1,.4,0,.28.28,0,0,1,0,.39l0,0ZM14.3,14a1,1,0,1,1,1-1,1,1,0,0,1-1,1h-.05Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/slack.svg b/app/Views/_assets/icons/social/slack.svg new file mode 100755 index 0000000000000000000000000000000000000000..03fa2ede306c627ad9d4b9f07913f57adbf36dc9 --- /dev/null +++ b/app/Views/_assets/icons/social/slack.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M6.53,14.51a2,2,0,1,1-2-2h2v2Zm1,0a2,2,0,0,1,3.93,0v4.93a2,2,0,1,1-3.93,0Zm2-8a2,2,0,1,1,2-2v2Zm0,1a2,2,0,0,1,0,3.93H4.56a2,2,0,1,1,0-3.93Zm8,2a2,2,0,1,1,2,2h-2Zm-1,0a2,2,0,0,1-3.93,0V4.56a2,2,0,1,1,3.93,0V9.49Zm-2,8a2,2,0,1,1-2,2v-2Zm0-1a2,2,0,0,1,0-3.93h4.93a2,2,0,1,1,0,3.93Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/tiktok.svg b/app/Views/_assets/icons/social/tiktok.svg new file mode 100755 index 0000000000000000000000000000000000000000..0362bd93bbfcbfbf35b269149eaa02cae86eb49f --- /dev/null +++ b/app/Views/_assets/icons/social/tiktok.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M16.57,2c.33,2.84,1.91,4.53,4.67,4.71V9.9a7.22,7.22,0,0,1-4.62-1.35v6c0,7.59-8.27,10-11.6,4.52-2.13-3.5-.82-9.64,6-9.88v3.36a11.17,11.17,0,0,0-1.59.39c-1.53.52-2.39,1.49-2.15,3.19.46,3.26,6.45,4.23,6-2.15V2h3.31Z" fill-rule="evenodd"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/twitch.svg b/app/Views/_assets/icons/social/twitch.svg new file mode 100755 index 0000000000000000000000000000000000000000..dbc56ddc9708e7e7b3903b5b1ab90a3643fb538a --- /dev/null +++ b/app/Views/_assets/icons/social/twitch.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M21,3V14.74l-4.7,4.69H12.39L10,21.78h-3V19.43H3V6.13L4.23,3ZM19.43,4.57H6.13V16.31H9.26v2.34l2.35-2.35H16.3l3.13-3.13V4.57ZM16.31,7.7v4.69H14.74V7.7h1.57Zm-3.92,0v4.69H10.83V7.7Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/twitter.svg b/app/Views/_assets/icons/social/twitter.svg new file mode 100755 index 0000000000000000000000000000000000000000..c32aa097ab9da1204d2823c9b018ffbeb74c815d --- /dev/null +++ b/app/Views/_assets/icons/social/twitter.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M22.19,5.68a8.31,8.31,0,0,1-2.4.66A4.2,4.2,0,0,0,21.63,4,8.43,8.43,0,0,1,19,5a4.18,4.18,0,0,0-7.12,3.81A11.8,11.8,0,0,1,3.23,4.48a4.19,4.19,0,0,0,1.29,5.59,4.07,4.07,0,0,1-1.89-.53V9.6A4.19,4.19,0,0,0,6,13.7a4.3,4.3,0,0,1-1.89.07A4.19,4.19,0,0,0,8,16.67a8.41,8.41,0,0,1-6.19,1.74,11.89,11.89,0,0,0,18.31-10c0-.18,0-.37,0-.54a8.62,8.62,0,0,0,2.09-2.17Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/writefreely.svg b/app/Views/_assets/icons/social/writefreely.svg new file mode 100755 index 0000000000000000000000000000000000000000..e6a02e09cf5135fda15f0295dc0493fce682b35a --- /dev/null +++ b/app/Views/_assets/icons/social/writefreely.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M6.35,18.83a2.69,2.69,0,0,1-1.47-1.49,4.7,4.7,0,0,1-.23-1.92A26.66,26.66,0,0,1,5,11c.18-1.65.34-3.2.34-3.45,0-1.12-.65-1.51-1.43-.86a4.71,4.71,0,0,0-1,1.82L2.69,9l-.3,0A.91.91,0,0,1,2,8.78,4.69,4.69,0,0,1,2.61,7,4.32,4.32,0,0,1,4.26,5.26a2.39,2.39,0,0,1,2.57.32c.52.52.66,1,.65,2.36,0,.62-.1,2-.22,3.09C6.83,15,6.8,15.32,6.8,15.87c0,.76.12,1.12.46,1.42a.84.84,0,0,0,.65.26c2,0,3.66-2.31,4.41-6a13.11,13.11,0,0,0,.2-3.29c0-1.29,0-2.46-.06-2.61l-.06-.27h2.32l.06.56a31.23,31.23,0,0,1-.56,6.49,13.12,13.12,0,0,0-.17,4.15,1.76,1.76,0,0,0,.4.67c.29.27.3.28,1.06.28a2.26,2.26,0,0,0,1.43-.33C19.29,16,21,12.55,20.79,9.45A3.09,3.09,0,0,0,20,7.12c-.35-.31-.42-.32-.54-.09a1.33,1.33,0,0,1-1.56.29,1.14,1.14,0,0,1-.51-1.07,1.22,1.22,0,0,1,.66-1,1.69,1.69,0,0,1,1-.16,1.91,1.91,0,0,1,1.13.22,3.78,3.78,0,0,1,1.75,2.46,16.69,16.69,0,0,1,0,4.12c-.73,3.46-3.21,6.37-6,7a3.41,3.41,0,0,1-3.12-.61,4.19,4.19,0,0,1-.8-2.78c0-.28,0-.5,0-.5s-.15.29-.32.64c-1,2-2.7,3.38-4.38,3.36a3.91,3.91,0,0,1-1-.13Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/social/youtube.svg b/app/Views/_assets/icons/social/youtube.svg new file mode 100755 index 0000000000000000000000000000000000000000..dca4bf6f97435c0b3035dc8c1f99b89f85f2b2ac --- /dev/null +++ b/app/Views/_assets/icons/social/youtube.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M21.54,6.5A30.83,30.83,0,0,1,22,12a30.83,30.83,0,0,1-.46,5.5,2.78,2.78,0,0,1-1.94,2C17.9,20,12,20,12,20s-5.89,0-7.61-.48a2.8,2.8,0,0,1-1.93-2A30.83,30.83,0,0,1,2,12a30.83,30.83,0,0,1,.46-5.5,2.78,2.78,0,0,1,1.93-2C6.11,4,12,4,12,4s5.9,0,7.6.48A2.79,2.79,0,0,1,21.54,6.5ZM10,15.5,16,12,10,8.5Z"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/icons/star-smile.svg b/app/Views/_assets/icons/star-smile.svg new file mode 100755 index 0000000000000000000000000000000000000000..05014c318fd0a05e60008473d131d9f278abc3d0 --- /dev/null +++ b/app/Views/_assets/icons/star-smile.svg @@ -0,0 +1,6 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <g> + <path fill="none" d="M0 0h24v24H0z"/> + <path d="M12 .5l4.226 6.183 7.187 2.109-4.575 5.93.215 7.486L12 19.69l-7.053 2.518.215-7.486-4.575-5.93 7.187-2.109L12 .5zM10 12H8a4 4 0 0 0 7.995.2L16 12h-2a2 2 0 0 1-3.995.15L10 12z"/> + </g> +</svg> diff --git a/app/Views/_assets/icons/timer.svg b/app/Views/_assets/icons/timer.svg old mode 100644 new mode 100755 index 4f2136e6e9ef1654f4f3e4d151ef7db7921785ec..21ab47678c5c3bab01bbf0dd76f6bff4a67aecf2 --- a/app/Views/_assets/icons/timer.svg +++ b/app/Views/_assets/icons/timer.svg @@ -1 +1,6 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M17.618 5.968l1.453-1.453 1.414 1.414-1.453 1.453a9 9 0 1 1-1.414-1.414zM11 8v6h2V8h-2zM8 1h8v2H8V1z"/></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <g> + <path fill="none" d="M0 0h24v24H0z"/> + <path d="M17.618 5.968l1.453-1.453 1.414 1.414-1.453 1.453a9 9 0 1 1-1.414-1.414zM11 8v6h2V8h-2zM8 1h8v2H8V1z"/> + </g> +</svg> diff --git a/app/Views/_assets/icons/upload-cloud.svg b/app/Views/_assets/icons/upload-cloud.svg new file mode 100755 index 0000000000000000000000000000000000000000..b87c75812172a5138dbc7b944fe529c53b221faf --- /dev/null +++ b/app/Views/_assets/icons/upload-cloud.svg @@ -0,0 +1,6 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <g> + <path fill="none" d="M0 0h24v24H0z"/> + <path d="M12 12.586l4.243 4.242-1.415 1.415L13 16.415V22h-2v-5.587l-1.828 1.83-1.415-1.415L12 12.586zM12 2a7.001 7.001 0 0 1 6.954 6.194 5.5 5.5 0 0 1-.953 10.784L18 17a6 6 0 0 0-11.996-.225L6 17v1.978a5.5 5.5 0 0 1-.954-10.784A7 7 0 0 1 12 2z"/> + </g> +</svg> diff --git a/app/Views/_assets/icons/user-add.svg b/app/Views/_assets/icons/user-add.svg old mode 100644 new mode 100755 index ab808608ffe8b6a0d18fa794d21cd0170603bcd4..2d56227febc113f6cb346afe028c92f7d8e7bbf8 --- a/app/Views/_assets/icons/user-add.svg +++ b/app/Views/_assets/icons/user-add.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0h24v24H0z"/> - <path d="M14 14.252v2.09A6 6 0 0 0 6 22l-2-.001a8 8 0 0 1 10-7.748zM12 13c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6zm0-2c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm6 6v-3h2v3h3v2h-3v3h-2v-3h-3v-2h3z"/> + <path d="M14 14.252V22H4a8 8 0 0 1 10-7.748zM12 13c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6zm6 4v-3h2v3h3v2h-3v3h-2v-3h-3v-2h3z"/> </g> </svg> diff --git a/app/Views/_assets/icons/user.svg b/app/Views/_assets/icons/user.svg old mode 100644 new mode 100755 index 9e64bb5632c084661232f8f069243c32d49b7e7a..f6566c8e4a53ac30fcaac7265eea7b389612ad67 --- a/app/Views/_assets/icons/user.svg +++ b/app/Views/_assets/icons/user.svg @@ -1,6 +1,6 @@ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <g> <path fill="none" d="M0 0h24v24H0z"/> - <path d="M4 22a8 8 0 1 1 16 0h-2a6 6 0 1 0-12 0H4zm8-9c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6zm0-2c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4z"/> + <path d="M4 22a8 8 0 1 1 16 0H4zm8-9c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6z"/> </g> </svg> diff --git a/app/Views/_assets/images/castopod-cover-default.jpg b/app/Views/_assets/images/castopod-cover-default.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9fe87fd67b898475400ed24dc255351dfddf2840 Binary files /dev/null and b/app/Views/_assets/images/castopod-cover-default.jpg differ diff --git a/app/Views/_assets/images/logo-castopod.svg b/app/Views/_assets/images/castopod-logo.svg similarity index 96% rename from app/Views/_assets/images/logo-castopod.svg rename to app/Views/_assets/images/castopod-logo.svg index 0208232af0c03cea02d2bde25bf9c508340e0fbb..444036e3e8123447928d04d6dfb3c2c594656adf 100644 --- a/app/Views/_assets/images/logo-castopod.svg +++ b/app/Views/_assets/images/castopod-logo.svg @@ -1,5 +1,4 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 202.4 137.8" style="enable-background:new 0 0 202.4 137.8;" xml:space="preserve"> <style type="text/css"> diff --git a/app/Views/_assets/images/logo-castopod-circle.svg b/app/Views/_assets/images/logo-castopod-circle.svg deleted file mode 100644 index 562d13facf3f588e1b9542bf7e5562ae9a63ed71..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/logo-castopod-circle.svg +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg width="64" height="64" version="1.1" viewBox="0 0 64 64" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><metadata><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title/></cc:Work></rdf:RDF></metadata> -<style type="text/css"> - .st0{fill:#009486;} - .st1{fill:#E7F9E4;} - .st2{fill:none;} - .st3{fill:#E7FFE3;} -</style> -<circle cx="32" cy="32" r="32" fill="#e7f9e4" stroke-width="2.0334"/><g transform="matrix(.24971 0 0 .24971 6.7291 14.595)"> - <path id="dark_greeen_19_" class="st0" d="m181.9 131.7h-32.5s-1.2-2.5-2.5-4.9-4.4-2.3-4.4-2.3h-82.8s-3-0.4-4.5 2.3c-1.6 2.7-2.6 4.9-2.6 4.9h-32c-6.9 0-12.6-5.6-12.6-12.5v-98.9c0-6.9 5.6-12.6 12.5-12.6h161.3c6.9 0 12.6 5.6 12.6 12.5v98.9c0.1 6.9-5.6 12.6-12.5 12.6z"/> - <path class="st1" d="m143.7 34.5h-85.1c-14.6 0-26.5 12-26.5 26.6s11.9 26.5 26.5 26.5h85.1c14.6 0 26.5-11.9 26.5-26.5 0.1-14.8-11.8-26.7-26.5-26.6zm-75.4 34.2s-3.9-2.9-9.4-2.9c-4.1 0-8.9 2.5-8.9 2.5-1.3-1.9-2.1-4.1-2.1-6.6 0-6.3 5.1-11.4 11.4-11.4s11.4 5.1 11.4 11.4c0 2.7-0.9 5.1-2.4 7zm32.9 6.6c-12.5 0-12-9.6-12-9.6-0.2-1.8 2.1-2.4 2.9-1.3 0.4 0.6 0.4 0.6 0.7 1.7 1.7 5.9 8.4 5.6 8.4 5.6s6.7 0.4 8.4-5.6c0.3-1 0.3-1.1 0.7-1.7 0.8-1 3.1-0.5 2.9 1.3 0 0 0.5 9.6-12 9.6zm51.1-6.9s-4.8-2.5-8.9-2.5c-5.5 0-9.4 2.9-9.4 2.9-1.5-1.9-2.4-4.3-2.4-7 0-6.3 5.1-11.4 11.4-11.4s11.4 5.1 11.4 11.4c0.1 2.4-0.7 4.7-2.1 6.6z"/> - <path class="st2" d="m110.3 64.3c-0.4 0.6-0.4 0.6-0.7 1.7-1.7 5.9-8.4 5.6-8.4 5.6s-6.7 0.4-8.4-5.6c-0.3-1-0.3-1.1-0.7-1.7-0.8-1-3.1-0.5-2.9 1.3 0 0-0.5 9.6 12 9.6s12-9.6 12-9.6c0.2-1.7-2.1-2.3-2.9-1.3z"/> - <path class="st2" d="m143.1 50.4c-6.3 0-11.4 5.1-11.4 11.4 0 2.6 0.9 5 2.4 7 0 0 3.9-2.9 9.4-2.9 4.1 0 8.9 2.5 8.9 2.5 1.3-1.9 2.1-4.1 2.1-6.6 0-6.3-5.1-11.4-11.4-11.4z"/> - <path class="st2" d="m59.3 50.4c-6.3 0-11.4 5.1-11.4 11.4 0 2.5 0.8 4.7 2.1 6.6 0 0 4.8-2.5 8.9-2.5 5.5 0 9.4 2.9 9.4 2.9 1.5-1.9 2.4-4.3 2.4-7 0-6.3-5.1-11.4-11.4-11.4z"/> - - - <path class="st3" d="m47.1 23.3c-6.3-1.7-11.7 2.1-14.7 7.3-0.7 1.2-0.2 2.2 0.5 2.6 1 0.3 1.7 0.1 2.8-1.5 2.2-3.9 5.9-6.1 10.1-5.3 0 0 2.9 0.9 3.3-1 0.3-1.2-0.8-1.8-2-2.1z"/> - - - - - <path class="st3" d="m159.9 27.3c-0.1 1.9 2.9 1.9 2.9 1.9 4.2 0.4 6.8 2.3 7.8 6.7 0.6 1.9 1.2 2.2 2.3 2.2 0.8-0.1 1.6-1 1.2-2.4-1.4-5.8-5.1-9.8-11.7-9.9-1.2-0.1-2.4 0.2-2.5 1.5z"/> - - -</g> -</svg> diff --git a/app/Views/_assets/images/platforms/_default.svg b/app/Views/_assets/images/platforms/_default.svg deleted file mode 100644 index e3b5c641185026c795cb0c1dd8352e033c6012eb..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/_default.svg +++ /dev/null @@ -1,11 +0,0 @@ -<svg width="300" height="300" version="1.1" viewBox="0 0 300 300" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"> -<rect width="300" height="300" rx="67" ry="67" fill="#fff" fill-opacity=".50"/><g transform="matrix(.91201 0 0 .91201 57.704 86.433)"> - <path id="dark_greeen_19_" d="m181.9 131.7h-32.5s-1.2-2.5-2.5-4.9-4.4-2.3-4.4-2.3h-82.8s-3-0.4-4.5 2.3c-1.6 2.7-2.6 4.9-2.6 4.9h-32c-6.9 0-12.6-5.6-12.6-12.5v-98.9c0-6.9 5.6-12.6 12.5-12.6h161.3c6.9 0 12.6 5.6 12.6 12.5v98.9c0.1 6.9-5.6 12.6-12.5 12.6z" fill="#aaa"/> - <path d="m143.7 34.5h-85.1c-14.6 0-26.5 12-26.5 26.6s11.9 26.5 26.5 26.5h85.1c14.6 0 26.5-11.9 26.5-26.5 0.1-14.8-11.8-26.7-26.5-26.6zm-75.4 34.2s-3.9-2.9-9.4-2.9c-4.1 0-8.9 2.5-8.9 2.5-1.3-1.9-2.1-4.1-2.1-6.6 0-6.3 5.1-11.4 11.4-11.4s11.4 5.1 11.4 11.4c0 2.7-0.9 5.1-2.4 7zm32.9 6.6c-12.5 0-12-9.6-12-9.6-0.2-1.8 2.1-2.4 2.9-1.3 0.4 0.6 0.4 0.6 0.7 1.7 1.7 5.9 8.4 5.6 8.4 5.6s6.7 0.4 8.4-5.6c0.3-1 0.3-1.1 0.7-1.7 0.8-1 3.1-0.5 2.9 1.3 0 0 0.5 9.6-12 9.6zm51.1-6.9s-4.8-2.5-8.9-2.5c-5.5 0-9.4 2.9-9.4 2.9-1.5-1.9-2.4-4.3-2.4-7 0-6.3 5.1-11.4 11.4-11.4s11.4 5.1 11.4 11.4c0.1 2.4-0.7 4.7-2.1 6.6z" fill="#ccc"/> - <path d="m110.3 64.3c-0.4 0.6-0.4 0.6-0.7 1.7-1.7 5.9-8.4 5.6-8.4 5.6s-6.7 0.4-8.4-5.6c-0.3-1-0.3-1.1-0.7-1.7-0.8-1-3.1-0.5-2.9 1.3 0 0-0.5 9.6 12 9.6s12-9.6 12-9.6c0.2-1.7-2.1-2.3-2.9-1.3z" fill="#aaa"/> - <path d="m143.1 50.4c-6.3 0-11.4 5.1-11.4 11.4 0 2.6 0.9 5 2.4 7 0 0 3.9-2.9 9.4-2.9 4.1 0 8.9 2.5 8.9 2.5 1.3-1.9 2.1-4.1 2.1-6.6 0-6.3-5.1-11.4-11.4-11.4z" fill="#aaa"/> - <path d="m59.3 50.4c-6.3 0-11.4 5.1-11.4 11.4 0 2.5 0.8 4.7 2.1 6.6 0 0 4.8-2.5 8.9-2.5 5.5 0 9.4 2.9 9.4 2.9 1.5-1.9 2.4-4.3 2.4-7 0-6.3-5.1-11.4-11.4-11.4z" fill="#aaa"/> - <path d="m47.1 23.3c-6.3-1.7-11.7 2.1-14.7 7.3-0.7 1.2-0.2 2.2 0.5 2.6 1 0.3 1.7 0.1 2.8-1.5 2.2-3.9 5.9-6.1 10.1-5.3 0 0 2.9 0.9 3.3-1 0.3-1.2-0.8-1.8-2-2.1z" fill="#ccc"/> - <path d="m159.9 27.3c-0.1 1.9 2.9 1.9 2.9 1.9 4.2 0.4 6.8 2.3 7.8 6.7 0.6 1.9 1.2 2.2 2.3 2.2 0.8-0.1 1.6-1 1.2-2.4-1.4-5.8-5.1-9.8-11.7-9.9-1.2-0.1-2.4 0.2-2.5 1.5z" fill="#ccc"/> -</g> -</svg> diff --git a/app/Views/_assets/images/platforms/funding/gofundme.svg b/app/Views/_assets/images/platforms/funding/gofundme.svg deleted file mode 100644 index 8b6a8b0d1edd0a7d9aba61d410b25b6054f8b5a8..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/funding/gofundme.svg +++ /dev/null @@ -1,19 +0,0 @@ -<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="1050" height="300" rx="150" ry="150" fill="#008648"/> - <g transform="matrix(25.805 0 0 25.805 525 -3846.6)" fill="#fff"> - <path d="m12.765 154.51c0.0337-0.0767 0.0631-0.14717 0.09502-0.2165 0.01373-0.0299 0.06242-0.0446 0.09174-0.0323 0.01685 7e-3 0.01171 0.0207 0.01171 0.0323 0 0.13479 0 0.26957 7.58e-4 0.40393 0 0.0253-0.0079 0.0337-0.0337 0.0337-0.02578 0-0.03369-9e-3 -0.03369-0.0341 1e-3 -0.0954 5.89e-4 -0.1908 0-0.28641 0-0.0147 0.0033-0.0302-0.0062-0.0493-0.02991 0.0724-0.06832 0.1368-0.09123 0.20815-0.0055 0.0169-0.01045 0.0307-0.03193 0.0325-0.02148 2e-3 -0.03201-8e-3 -0.04018-0.0274-0.0235-0.0565-0.04903-0.11229-0.07447-0.16806-0.0049-0.0108-0.0071-0.0243-0.02334-0.0306-0.0089 0.0169-0.0047 0.0352-0.0048 0.0524-5.06e-4 0.0883-9.28e-4 0.1769 0 0.26502 0 0.0259-0.0056 0.0377-0.03471 0.0376-0.02915-8e-5 -0.03024-0.016-0.03024-0.0376 4.22e-4 -0.12905 0-0.25811 6.74e-4 -0.38708 0-0.0169-0.01112-0.0456 0.02022-0.0456 0.02763 0 0.06234-0.0176 0.08028 0.0238 0.02923 0.0674 0.06074 0.13419 0.0914 0.20108 0.0033 7e-3 0.0067 0.0126 0.01272 0.0243z"/> - <path d="m12.28 154.53c0-0.0518-0.0027-0.10379 9.27e-4 -0.15534 0.0029-0.0421-0.01314-0.0548-0.05248-0.0501-0.02207 3e-3 -0.04482-5.9e-4 -0.06739 7.6e-4 -0.02367 1e-3 -0.03546-4e-3 -0.03563-0.0318 0-0.0294 0.01483-0.0307 0.03681-0.0306 0.10226 5.9e-4 0.20453 7.6e-4 0.3068 0 0.02451 0 0.03555 7e-3 0.03521 0.0337-3.37e-4 0.027-0.01381 0.0298-0.03487 0.0292-0.02662-8.4e-4 -0.05341 2e-3 -0.07977-6.7e-4 -0.0326-3e-3 -0.04364 8e-3 -0.04296 0.0417 2e-3 0.10782 0 0.21573 1e-3 0.32356 0 0.0261 5.06e-4 0.0451-0.03614 0.0444-0.03665-6.7e-4 -0.03176-0.0222-0.03176-0.0445 2.78e-4 -0.0536 3.62e-4 -0.10701 2.52e-4 -0.1603z"/> - <path d="m6.289 155.55c0.07194-0.0627 0.13723-0.11962 0.2111-0.16527 0.21211-0.13116 0.44369-0.1716 0.68942-0.15029 0.11549 9e-3 0.22632 0.0367 0.3325 0.083 0.15163 0.0674 0.26434 0.1769 0.35642 0.31169 0.015332 0.0223 0.023166 0.0267 0.040351 1e-3 0.15727-0.23512 0.38228-0.36392 0.65867-0.39778 0.27378-0.0337 0.52852 0.02 0.73971 0.2106 0.10648 0.0963 0.16604 0.22028 0.19122 0.3613 0.01608 0.0941 0.023858 0.18886 0.023334 0.28431 0.00109 0.48286 0 0.9658 0.00152 1.4489 0 0.0412-0.011457 0.0505-0.051471 0.0505-0.25407-2e-3 -0.50816-2e-3 -0.76228 0-0.036896 0-0.047006-9e-3 -0.046837-0.0464 0.00146-0.38042 0.00163-0.76085 5.054e-4 -1.1413 9.199e-4 -0.0914-0.00863-0.18177-0.02864-0.271-0.073457-0.31169-0.42718-0.31362-0.58487-0.16612-0.09696 0.0907-0.12914 0.20647-0.14321 0.33148-0.01213 0.10631-0.00741 0.21296-0.00758 0.31952-5.054e-4 0.31028-3.707e-4 0.62051 4.212e-4 0.93068 0 0.0321-0.00708 0.0433-0.041529 0.043-0.25833-1e-3 -0.51667-1e-3 -0.775 0-0.036139 0-0.043719-0.0112-0.043635-0.0452 0.00118-0.38464 6.739e-4 -0.76928 7.581e-4 -1.1541 0-0.0786-0.0027-0.15694-0.01786-0.23436-0.028136-0.14413-0.11431-0.2341-0.25584-0.26956-0.16688-0.0415-0.33173 0.0213-0.41934 0.15845-0.05265 0.0823-0.064023 0.1769-0.064695 0.27058-0.00298 0.40716-0.00357 0.81431-0.00177 1.2215 0 0.0436-0.011793 0.053-0.053577 0.0526-0.25407-2e-3 -0.50816-2e-3 -0.76228 0-0.035549 0-0.044057-0.01-0.043973-0.0446 8.988e-4 -0.74546 8.988e-4 -1.4909 0-2.2363 0-0.0366 0.011708-0.0435 0.04532-0.0433 0.25693 1e-3 0.51383 1e-3 0.77071 0 0.036308 0 0.044563 0.0114 0.043551 0.0453-0.00253 0.0768-0.0011 0.15408-0.0011 0.24109z"/> - <path d="m3.7061 157.35c-0.052818 0.0513-0.10378 0.10108-0.16132 0.14261-0.13099 0.0951-0.27925 0.14321-0.43922 0.16141-0.24766 0.0281-0.4837-0.0115-0.70197-0.13057-0.3469-0.18912-0.57215-0.47343-0.63415-0.86927-0.050544-0.32441-0.01331-0.63837 0.17387-0.91745 0.20108-0.29897 0.48084-0.48194 0.8413-0.53484 0.26519-0.0391 0.51487 3e-3 0.74586 0.14228 0.061411 0.0369 0.11339 0.0864 0.16974 0.13479 0.010446-0.0169 0.00598-0.0337 0.00598-0.0491 0-0.5179-2.527e-4 -1.0358-7.581e-4 -1.5538 0-0.0427 0.011287-0.0544 0.054082-0.0541 0.25685 2e-3 0.51386 2e-3 0.77054 0 0.032349 0 0.042963 8e-3 0.042963 0.0421-8.988e-4 1.2268-8.988e-4 2.4536 0 3.6803 0 0.0316-0.00615 0.0432-0.041025 0.043-0.26103-2e-3 -0.52217-2e-3 -0.78343 0-0.033696 0-0.043804-0.0106-0.042794-0.0433 0.00177-0.0648 3.369e-4 -0.12931 3.369e-4 -0.19417zm-0.51605-0.40435c0.030832 0 0.062084 3e-3 0.092663-5.1e-4 0.31337-0.0382 0.5249-0.36223 0.43215-0.66658-0.10842-0.35524-0.52919-0.48185-0.82049-0.29392-0.21211 0.13689-0.27133 0.3314-0.23916 0.52995 0.039508 0.24464 0.26898 0.44791 0.53484 0.43106z"/> - <path d="m-8.5416 155.18c0.30874-5e-4 0.56592 0.041 0.80213 0.16848 0.32853 0.17791 0.56044 0.43804 0.64334 0.80996 0.12636 0.56752-0.14733 1.1152-0.67501 1.3652-0.18735 0.0887-0.3859 0.13023-0.59203 0.14447-0.21986 0.0152-0.4372 3e-3 -0.65024-0.0534-0.39011-0.10328-0.68942-0.32559-0.85486-0.69919-0.18373-0.41463-0.13739-0.92116 0.20546-1.2889 0.21447-0.22998 0.47814-0.35987 0.78393-0.41412 0.12594-0.0217 0.25247-0.0334 0.33729-0.0325zm0.023335 0.70761c-0.04217-8.6e-4 -0.084009 2e-3 -0.12552 0.01-0.31514 0.0617-0.55488 0.42398-0.38228 0.76456 0.11642 0.22972 0.35844 0.34395 0.62615 0.29593 0.30267-0.0544 0.49777-0.35481 0.43097-0.6542-0.047342-0.2122-0.27268-0.42684-0.54933-0.4164l5e-7 1.7e-4z"/> - <path d="m-0.42281 155.55c0.059228-0.0707 0.12623-0.13314 0.20099-0.18718 0.12409-0.0883 0.26502-0.12956 0.41513-0.14473 0.19173-0.0193 0.38076-0.012 0.56221 0.059 0.2758 0.10842 0.4372 0.31101 0.48977 0.60214 0.014321 0.0791 0.016848 0.15846 0.016848 0.2384-3.369e-4 0.47444-8.42e-5 0.94884 7.582e-4 1.4232 0 0.0375-0.00986 0.0464-0.046669 0.0462-0.25541-2e-3 -0.51094-2e-3 -0.76658 0-0.042626 0-0.049618-0.0131-0.049534-0.052 0.001461-0.39019 0.001461-0.78036 0-1.1705 2.106e-4 -0.0814-0.007965-0.16198-0.024514-0.24169-0.029567-0.13655-0.11591-0.22121-0.24817-0.25052-0.17446-0.0388-0.33131-6.8e-4 -0.45388 0.13815-0.058968 0.0668-0.078763 0.14952-0.089377 0.23587-0.012299 0.0992-0.006824 0.19889-0.006992 0.29829-7.3288e-4 0.33269-5.644e-4 0.66535 5.0544e-4 0.99798 0 0.0347-0.008424 0.0446-0.044057 0.0445-0.25833-2e-3 -0.51667-2e-3 -0.775 0-0.036055 0-0.043553-0.0109-0.043468-0.045 8.989e-4 -0.7453 8.989e-4 -1.4906 0-2.2359 0-0.0378 0.010362-0.0462 0.046838-0.0459 0.25682 2e-3 0.51366 2e-3 0.77054 0 0.033696 0 0.046416 7e-3 0.045152 0.0434-0.002612 0.0786-5.0544e-4 0.15702-5.0544e-4 0.24632z"/> - <path d="m-1.8386 156.07c0 0.24429 0.00522 0.48858-0.00135 0.73288-0.00842 0.31564-0.14877 0.55724-0.42878 0.71165-0.16924 0.0933-0.35263 0.1379-0.54326 0.16082-0.14793 0.0169-0.29625 0.0216-0.44495 0.0141-0.27209-0.0121-0.53745-0.0569-0.77332-0.20613-0.22503-0.14225-0.35139-0.34636-0.37908-0.61234-0.00555-0.0629-0.00783-0.12584-0.00683-0.18895 1.7e-6 -0.45624 1.7e-6 -0.91256-0.00101-1.3688 0-0.0371 0.00767-0.0497 0.04768-0.0494 0.25693 2e-3 0.51386 2e-3 0.77079 0 0.037992 0 0.049533 8e-3 0.049364 0.0484-0.00152 0.42819-6.739e-4 0.85638-0.00118 1.2846 0 0.0694 0.00741 0.13689 0.035295 0.201 0.049617 0.11414 0.14279 0.17497 0.2592 0.19948 0.10513 0.0221 0.21195 0.0207 0.31506-0.0155 0.14119-0.0497 0.21532-0.1529 0.23469-0.2993 0.00842-0.0642 8e-3 -0.12855 8e-3 -0.193 0-0.39314 5.055e-4 -0.7862-9.266e-4 -1.1794 0-0.0372 0.00935-0.0466 0.046416-0.0463 0.25693 2e-3 0.51386 2e-3 0.77079 0 0.03437 0 0.044984 8e-3 0.044732 0.0437-0.0016 0.25407-8.424e-4 0.50822-8.424e-4 0.76237l-5.055e-4 1.7e-4z"/> - <path d="m11.795 156.58h-0.84644c-0.04878 0-0.05282 5e-3 -0.04642 0.0536 0.0063 0.0471 0.0094 0.0946 0.02182 0.14093 0.03951 0.14641 0.12729 0.24775 0.27403 0.29298 0.1272 0.0393 0.25558 0.0471 0.38489 8e-3 0.09368-0.0278 0.16738-0.0842 0.225-0.16132 0.01685-0.0222 0.03327-0.033 0.06225-0.0329 0.2471 1e-3 0.4942 1e-3 0.74131 0 0.04069 0 0.04288 0.0121 0.03142 0.0461-0.13032 0.38548-0.40603 0.60652-0.79244 0.70323-0.1256 0.0312-0.25348 0.0426-0.38304 0.0448-0.22441 4e-3 -0.44546-0.016-0.65631-0.096-0.41362-0.15702-0.6756-0.44874-0.75436-0.88805-0.060062-0.33494-0.01634-0.65707 0.16907-0.94955 0.14186-0.22391 0.34142-0.37907 0.59304-0.45994 0.3405-0.10952 0.68723-0.11794 1.0308-0.0202 0.42524 0.12046 0.67703 0.41437 0.79261 0.83313 0.04111 0.14868 0.04692 0.30115 0.0449 0.45447 0 0.0337-0.01988 0.0303-0.04136 0.0303l-0.85082 9e-5zm-0.39037-0.46517h0.44647c0.01752 0 0.04044 5e-3 0.03201-0.0263-0.03125-0.11642-0.08298-0.21995-0.18482-0.29198-0.10184-0.072-0.21717-0.0832-0.33696-0.0785-0.21902 8e-3 -0.38438 0.14809-0.43122 0.36223-0.0067 0.0309 0.0015 0.035 0.02881 0.0349 0.14826-7.6e-4 0.29703-3.4e-4 0.44571-3.4e-4z"/> - <path d="m-6.2272 156.76c0-0.25819-6.739e-4 -0.51647 7.582e-4 -0.775 0-0.0346-0.00842-0.0459-0.043889-0.0446-0.075816 3e-3 -0.15163 0-0.22745 1e-3 -0.025693 5.1e-4 -0.033696-8e-3 -0.033696-0.0337 8.427e-4 -0.20487 8.427e-4 -0.40986 0-0.61495 0-0.0289 0.010193-0.0352 0.03656-0.0347 0.074383 2e-3 0.14894-2e-3 0.22315 2e-3 0.039003 2e-3 0.046247-0.0118 0.045489-0.0474-0.00236-0.10244-0.00345-0.20496 0-0.30731 0.00665-0.21363 0.042625-0.42187 0.16317-0.60299 0.16048-0.241 0.38598-0.39398 0.66895-0.458 0.1983-0.0449 0.39365-0.0359 0.58462 0.0403 0.03597 0.0143 0.047427 0.0322 0.047006 0.0707-0.00211 0.20344-9.266e-4 0.40704-9.266e-4 0.61057 0 0.0585 0 0.059-0.050544 0.0337-0.090136-0.0455-0.18389-0.0728-0.28641-0.067-0.14161 8e-3 -0.23781 0.10336-0.25095 0.2443-0.013815 0.14843-0.00691 0.29702-0.010446 0.44545-7.581e-4 0.0302 0.00952 0.0377 0.038329 0.0375 0.17269-1e-3 0.34538 0 0.5179-1e-3 0.032265 0 0.043467 7e-3 0.043216 0.0421-0.00157 0.19785-0.00157 0.39576 0 0.59372 0 0.036-0.00842 0.0487-0.046753 0.0482-0.16561-2e-3 -0.33123-1e-3 -0.49701-7.6e-4 -0.061832 0-0.055009-7e-3 -0.055009 0.0574v1.5285c0 0.0571 0 0.0571-0.05703 0.0571-0.25541 0-0.51091-5.9e-4 -0.76658 7.6e-4 -0.032937 0-0.042709-8e-3 -0.04212-0.0421 2.519e-4 -0.26106-3.378e-4 -0.52211-3.378e-4 -0.78326z"/> - <path d="m13.155 151.67c-0.16452-0.19788-0.55227-0.24665-0.79227-0.13386-0.05054 0.0238-0.10328 0.043-0.14868 0.0758l-1.4398 1.0446c-0.10252 0.0895-0.19535 0.19114-0.20992 0.32322-0.01331 0.12047 0 0.22012 0.10538 0.32769 0.2384 0.24278 0.65926 0.2443 0.85992 0.12198 0.18432-0.11195 1.4019-1.0118 1.6005-1.1585l0.05156-0.0516c0.05888-0.0811 0.1609-0.32364-0.0267-0.54932z"/> - <path d="m7.0985 153.28c0.10555-0.10757 0.11869-0.20723 0.10538-0.32769-0.014573-0.13208-0.10741-0.23376-0.20992-0.32322l-1.4398-1.0446c-0.045404-0.0329-0.098054-0.0521-0.14868-0.0758-0.24-0.11279-0.62775-0.064-0.79185 0.13386-0.1876 0.22568-0.085587 0.46812-0.026284 0.54907l0.051556 0.0516c0.19779 0.14691 1.4154 1.0468 1.5999 1.1587 0.20049 0.12207 0.62135 0.1208 0.85975-0.12198z"/> - <path d="m8.8947 153c0.30739 0 0.56499-0.13992 0.6382-0.39971 0.00956-0.0359 0.014301-0.0724 0.014238-0.10951l0.00691-0.93658c0-8e-3 5.897e-4 -0.0158 5.897e-4 -0.0237 0-0.36004-0.2902-0.52734-0.65462-0.52734-0.36223 0-0.65665 0.19434-0.6596 0.55101l-6.739e-4 0.94416c-5.896e-4 0.0369 0.00303 0.0734 0.010867 0.10951 0.06259 0.27016 0.32702 0.39213 0.6441 0.39213z"/> - <path d="m10.795 153.71c-0.48859-0.24312-1.1344-0.39593-1.9776-0.39593-1.4129 0-2.3603 0.44588-2.8416 1.0939h0.00725l-0.00202 3e-3 5.6862-5.1e-4c-0.20731-0.26855-0.49221-0.5115-0.87213-0.70011z"/> - <path d="m-11.318 157.32c-0.04212 0.0348-0.07641 0.0644-0.11196 0.0927-0.15416 0.12392-0.3303 0.1903-0.52742 0.20773-0.28094 0.0253-0.54503-0.0238-0.78536-0.17479-0.28987-0.18162-0.45203-0.44883-0.5019-0.78461-0.04212-0.28119-0.01441-0.55598 0.1192-0.80971 0.19139-0.36307 0.4912-0.58285 0.90136-0.64333 0.21498-0.0318 0.42457-0.0134 0.6248 0.0772 0.08955 0.0405 0.16477 0.10109 0.23309 0.17034 0.01323 0.0135 0.02451 0.0289 0.03673 0.0435l0.01272-8e-3c0-0.0625 0.0014-0.12509-6.74e-4 -0.18751-1e-3 -0.0316 0.0064-0.0439 0.04136-0.0437 0.25833 2e-3 0.51667 2e-3 0.775 0 0.02889 0 0.03841 7e-3 0.03841 0.0375-1e-3 0.76085 0.0012 1.5217-3e-3 2.2829-1e-3 0.17623-0.02157 0.35271-0.10479 0.51428-0.12316 0.23933-0.31548 0.40519-0.55598 0.51782-0.1876 0.088-0.3875 0.12485-0.59364 0.13773-0.25592 0.016-0.50763-3e-3 -0.74973-0.0881-0.3073-0.10749-0.54857-0.29627-0.70264-0.58774-0.0283-0.0536-0.0438-0.1117-0.05551-0.17117-0.0061-0.0307-0.0012-0.0404 0.03311-0.0402 0.21473 2e-3 0.42962 8.4e-4 0.64426 8.4e-4h0.24429c0.01744 0 0.03193 0 0.03984 0.0214 0.05164 0.13833 0.16208 0.20066 0.29947 0.21802 0.13537 0.0168 0.26906 6e-3 0.39222-0.0621 0.15668-0.0868 0.23427-0.22374 0.25044-0.39879 0.0097-0.10437 0.0076-0.20891 0.0063-0.32221zm-0.50914-0.36771c0.29298 8e-3 0.55109-0.23183 0.55126-0.53778 0-0.29661-0.23174-0.54554-0.54907-0.54562-0.3362 0-0.54545 0.27917-0.54697 0.54309-0.0017 0.27976 0.2405 0.54511 0.54478 0.54031z"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/funding/helloasso.svg b/app/Views/_assets/images/platforms/funding/helloasso.svg deleted file mode 100644 index e8820b38586eec5857d98570f2716fc6598f29c6..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/funding/helloasso.svg +++ /dev/null @@ -1,19 +0,0 @@ -<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg"> - <linearGradient id="SVGID_1_" x1="4.322" x2="24.268" y1="33.651" y2="-.503" gradientTransform="matrix(3.9122 0 0 -3.9122 133.76 239.95)" gradientUnits="userSpaceOnUse"> - <stop stop-color="#498a63" offset="0"/> - <stop stop-color="#61b984" offset=".25"/> - </linearGradient> - <linearGradient id="SVGID_2_" x1="19.889" x2="40.524" y1="3.627" y2="36.697" gradientTransform="matrix(3.9122 0 0 -3.9122 133.76 239.95)" gradientUnits="userSpaceOnUse"> - <stop stop-color="#89356d" offset="0"/> - <stop stop-color="#b94794" offset=".21"/> - </linearGradient> - <linearGradient id="SVGID_3_" x1="3.242" x2="37.689" y1="35.782" y2="23.384" gradientTransform="matrix(3.9122 0 0 -3.9122 133.76 239.95)" gradientUnits="userSpaceOnUse"> - <stop stop-color="#f59c1c" offset=".6"/> - <stop stop-color="#c7702b" offset="1"/> - </linearGradient> - <rect width="1050" height="300" rx="150" ry="150" fill="#2e2f5e"/> - <path d="m411.92 140.44v52.032h-25.821v-46.946c0-5.4771-1.5649-7.042-3.9122-7.042-2.7385 0-5.8683 2.3473-8.6068 7.042v46.946h-25.821v-97.805l25.821-2.7385v36.775c5.8683-6.2595 11.737-8.9981 19.561-8.9981 11.737-.39122 18.779 7.4332 18.779 20.735zm75.114 24.256h-41.861c1.5649 10.172 6.2595 11.737 14.084 11.737 5.0859 0 9.7805-1.9561 15.649-6.2595l10.563 14.475c-7.8244 6.6507-18.387 10.563-28.559 10.563-25.429 0-37.557-16.04-37.557-37.557 0-20.735 11.737-37.948 34.819-37.948 20.343 0 34.036 13.301 34.036 36.775-.39122 1.9561-.78244 5.4771-1.1737 8.2156zm-24.647-15.649c0-7.042-1.5649-12.91-8.2156-12.91-5.4771 0-8.2156 3.1298-9.3893 14.084h17.605zm31.689 23.082v-77.853l25.821-2.7385v79.418c0 2.3473 1.1737 3.521 3.1298 3.521.78244 0 1.9561 0 2.7385-.78244l4.6946 18.387c-4.6946 1.5649-9.3893 2.3473-14.084 2.3473-14.475.78244-22.3-7.8244-22.3-22.3zm39.122 0v-77.853l25.821-2.7385v79.418c0 2.3473 1.1737 3.521 3.1298 3.521.78244 0 1.9561 0 2.7385-.78244l4.6946 18.387c-4.6946 1.5649-9.3893 2.3473-14.084 2.3473-14.475.78244-22.3-7.8244-22.3-22.3zm106.8-14.866c0 23.082-13.693 37.557-35.992 37.557-21.908 0-35.992-13.301-35.992-37.948 0-23.082 13.693-37.557 35.992-37.557 21.908 0 35.992 13.693 35.992 37.948zm-44.99 0c0 14.084 2.7385 19.17 9.3893 19.17 6.2595 0 9.3893-5.4771 9.3893-19.17 0-14.084-2.7385-19.17-9.3893-19.17s-9.7805 5.8683-9.3893 19.17zm116.97 20.735-5.0859 16.822c-8.9981-.78244-14.866-3.1298-18.779-9.7805-5.0859 7.8244-12.91 10.172-21.126 10.172-14.084 0-23.082-9.3893-23.082-22.3 0-15.649 11.737-24.256 33.645-24.256h5.0859v-1.9561c0-7.042-2.3473-8.9981-10.172-8.9981-6.2595.39122-12.128 1.5649-17.996 3.521l-5.4771-16.431c8.6068-3.521 17.996-5.4771 27.385-5.4771 22.3 0 31.298 8.6068 31.298 25.821v24.256c0 5.0859 1.1737 7.4332 4.3034 8.6068zm-29.342-5.4771v-10.563h-2.7385c-7.4332 0-10.563 2.3473-10.563 7.8244 0 3.9122 2.3473 6.6507 5.8683 6.6507 2.7385.39122 5.8683-1.1737 7.4332-3.9122zm91.154-43.817-8.9981 14.084c-5.0859-3.1298-10.563-5.0859-16.431-5.0859-4.3034 0-5.8683 1.1737-5.8683 3.1298 0 2.3473.78244 3.521 14.084 7.4332 13.301 4.3034 20.343 9.7805 20.343 22.691 0 14.475-13.693 24.256-32.862 24.256-12.128 0-23.473-4.3034-30.515-11.345l12.128-13.693c5.0859 3.9122 11.345 7.042 17.605 7.042 4.6946 0 7.4332-1.5649 7.4332-4.3034 0-3.521-1.5649-4.3034-13.301-7.8244-12.91-3.9122-20.343-11.345-20.343-22.691 0-12.519 10.954-22.691 30.124-22.691 10.172-.39122 20.343 3.1298 26.603 8.9981zm64.551 0-8.9981 14.084c-5.0859-3.1298-10.563-5.0859-16.431-5.0859-4.3034 0-5.8683 1.1737-5.8683 3.1298 0 2.3473.78244 3.521 14.084 7.4332 13.301 4.3034 20.343 9.7805 20.343 22.691 0 14.475-13.693 24.256-32.862 24.256-12.128 0-23.473-4.3034-30.515-11.345l12.128-13.693c5.0859 3.9122 11.345 7.042 17.605 7.042 4.6946 0 7.4332-1.5649 7.4332-4.3034 0-3.521-1.5649-4.3034-13.301-7.8244-12.91-3.9122-20.343-11.345-20.343-22.691 0-12.519 10.954-22.691 30.124-22.691 10.172-.39122 19.952 3.1298 26.603 8.9981zm77.853 28.559c0 23.082-13.693 37.557-35.992 37.557-21.908 0-35.992-13.301-35.992-37.948 0-23.082 13.693-37.557 35.992-37.557 21.908 0 35.992 13.693 35.992 37.948zm-44.99 0c0 14.084 2.7385 19.17 9.3893 19.17 6.2595 0 9.3893-5.4771 9.3893-19.17 0-14.084-2.7385-19.17-9.3893-19.17s-9.7805 5.8683-9.3893 19.17z" fill="#fff"/> - <path d="m184.23 201.47c-25.821-29.733-8.6068-104.85 2.3473-104.85-21.126-.78244-57.118 13.301-52.032 63.769 5.8683 46.946 48.12 79.809 94.284 73.941 14.866-1.9561 28.559-7.8244 40.296-16.822-40.687 29.342-68.072 3.1298-84.895-16.04z" fill="url(#SVGID_1_)"/> - <path d="m279.29 150.61c-21.517 43.425-87.633 61.813-95.066 50.467 12.91 19.17 44.99 45.382 85.286 15.649 36.775-28.559 43.425-82.156 14.866-119.32-8.9981-11.737-21.126-20.735-34.819-26.603 45.773 20.735 41.078 57.118 29.733 79.809z" fill="url(#SVGID_2_)"/> - <path d="m186.57 96.623c46.555-5.0859 99.37 43.034 92.719 54.38 12.91-22.691 16.04-59.074-29.342-79.809-43.425-17.605-92.719 3.521-109.93 47.338-5.4771 13.693-7.4332 28.559-5.4771 43.034-3.1298-50.076 34.819-63.378 52.032-64.943z" fill="url(#SVGID_3_)"/> -</svg> diff --git a/app/Views/_assets/images/platforms/funding/indiegogo.svg b/app/Views/_assets/images/platforms/funding/indiegogo.svg deleted file mode 100644 index c701e0bf46c589d23a7a077f0354b824b66914f4..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/funding/indiegogo.svg +++ /dev/null @@ -1,16 +0,0 @@ -<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="1050" height="300" rx="150" ry="150" fill="#eb1478"/> - <g transform="matrix(.2146 0 0 -.2146 125 207.11)" fill="#fff"> - <path d="m138.89 6.3047v519.68h-138.89v-519.68h138.89"/> - <path d="m493.87 285.41-140.27 240.57h-145.88v-519.68h131.84v270l2.105-0.039 159.2-269.96h127.62v519.68h-132.52v-240.57h-2.094"/> - <path d="m974.1 265.8c0-131.17-37.167-139.53-89.066-139.53h-48.418v273.46h42.777c58.946 0 94.707-3.503 94.707-133.93zm-276.31 260.18v-519.68h174.61c164.8 0 242.63 41.387 242.63 260.18 0 214.6-79.22 259.5-244.72 259.5h-172.52"/> - <path d="m1303.6 6.3047v519.68h-138.85v-519.68h138.85"/> - <path d="m2450.9 122.73c-76.43 0-86.96 52.618-86.96 138.14 0 84.867 10.53 137.47 86.96 137.47 75.76 0 86.27-52.602 86.27-137.47 0-85.527-10.51-138.14-86.27-138.14zm0 409.56c-193.54 0-227.91-126.91-227.91-266.49 0-138.87 34.37-265.8 227.91-265.8 192.87 0 227.24 126.93 227.24 265.8 0 139.58-33.69 266.49-227.24 266.49"/> - <path d="m3424.2 122.73c-76.45 0-87 52.618-87 138.14 0 84.867 10.55 137.47 87 137.47 75.68 0 86.23-52.602 86.23-137.47 0-85.527-10.55-138.14-86.23-138.14zm0 409.56c-193.58 0-227.97-126.91-227.97-266.49 0-138.87 34.39-265.8 227.97-265.8 192.83 0 227.18 126.93 227.18 265.8 0 139.58-33.65 266.49-227.18 266.49"/> - <path d="m3696.2 15.27c-20.74 0-25.51 14.648-25.51 33.73 0 19.199 4.77 33.828 25.51 33.828 20.76 0 25.62-14.629 25.62-33.828 0-19.082-4.86-33.73-25.62-33.73zm0 73.262c-25.33 0-31.54-17.109-31.54-39.531 0-22.305 6.21-39.316 31.54-39.316 25.21 0 31.66 17.012 31.66 39.316 0 22.422-6.45 39.531-31.66 39.531"/> - <path d="m3698 50.133h-7.91v14.219h7.91c4.66 0 6.23-1.9727 6.23-7.1485 0-5.0976-1.57-7.0703-6.23-7.0703zm15.66 7.793c0 9.4336-3.11 14.844-15.25 14.844h-17.97v-47.012h9.65v16.602h6.13l7.26-16.602h9.87l-7.89 17.539c6.32 2.0703 8.2 7.2656 8.2 14.629"/> - <path d="m1956.7 206.85h89.59v-9.082c0-57.422 1.79-82.754-66.61-82.754-63.82 0-85.58 29.453-85.58 146.56 0 122.04 36.46 136.77 91.17 136.77 40.65 0 69.43-10.508 93.28-23.867l74.34 115.74c-39.3 25.254-96.8 42.07-161.31 42.07-179.51 0-237.03-86.269-237.03-266.49 0-157.09 42.07-265.8 212.48-265.8 30.19 0 56.13 2.0703 78.48 6.3086h127.71v313.48h-201.19l-15.33-112.93"/> - <path d="m2930 206.85h89.59v-9.082c0-57.422 1.79-82.754-66.6-82.754-63.83 0-85.59 29.453-85.59 146.56 0 122.04 36.46 136.77 91.17 136.77 40.65 0 69.43-10.508 93.28-23.867l74.34 115.74c-39.3 25.254-96.8 42.07-161.31 42.07-179.51 0-237.03-86.269-237.03-266.49 0-157.09 42.07-265.8 212.48-265.8 30.19 0 56.13 2.0703 78.48 6.3086h127.71v313.48h-201.19l-15.33-112.93"/> - <path d="m1718 399.05v126.93h-345.04v-519.68h345.04v123.42h-208.96v77.871h137.24l16.76 123.41h-154v68.047h208.96"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/funding/kickstarter.svg b/app/Views/_assets/images/platforms/funding/kickstarter.svg deleted file mode 100644 index ea1b6cef3df3b36a2a6a7d8808c04f5addd4fc2d..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/funding/kickstarter.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="1050" height="300" rx="150" ry="150" fill="#05ce78"/> - <path d="m200.13 172.35c0 10.244-8.5504 18.827-19.203 18.689-5.8871 0-11.915-2.7686-15.559-8.029l-3.9252-5.5381c-1.8219 8.03-8.8307 13.567-17.801 13.567-10.373 0-18.643-8.3057-18.643-18.551v-46.375c0-10.244 8.1299-18.55 18.643-18.55 9.111 0 16.259 5.9528 17.941 14.12l4.4853-6.0912c3.6445-4.9837 9.5316-7.891 15.419-7.891 10.092 0 18.643 7.891 18.643 18.135 0 3.8759-1.1214 7.7522-3.5042 10.936l-8.9711 12.321 8.9711 12.321c2.3828 3.3219 3.5042 7.0599 3.5042 10.936zm25.809-64.787c11.247 0 20.243 9.1521 20.102 19.968v43.542c0 10.816-8.8558 19.968-20.243 19.968-11.106 0-20.102-9.0136-20.102-19.968v-43.542c0-10.816 8.9965-19.968 20.243-19.968zm98.017 60.535c0 13.407-11.204 22.943-29.185 22.943-24.067 0-41.772-17.829-41.772-41.739 0-23.91 17.705-41.739 41.772-41.739 17.981 0 29.185 9.5365 29.185 22.943 0 8.9834-4.4258 15.064-13.278 18.796 8.8525 3.7322 13.278 9.9512 13.278 18.797zm82.087 4.252c0 10.244-8.5658 18.827-19.098 18.689-5.8983 0-11.937-2.7686-15.588-8.029l-3.9317-5.5381c-1.8258 8.03-8.8475 13.567-17.835 13.567-10.392 0-18.677-8.3057-18.677-18.551v-46.375c0-10.244 8.145-18.55 18.677-18.55 9.1283 0 16.291 5.9528 17.976 14.12l4.3533-6.0912c3.6508-4.9837 9.5492-7.891 15.447-7.891 10.112 0 18.677 7.891 18.677 18.135 0 3.8759-1.1233 7.7522-3.5108 10.936l-8.9875 12.321 8.9875 12.321c2.3875 3.3219 3.5108 7.0599 3.5108 10.936zm70.957-6.9977c0 16.61-12.827 27.08-34.437 27.08-22.028 0-32.346-7.5387-32.346-19.822 0-8.5146 6.5525-13.958 15.893-13.958h0.14l-5.0192-4.6068c-6.2742-5.7232-10.596-11.446-10.596-19.822 0-16.332 11.99-26.661 32.485-26.661 20.913 0 30.812 7.3982 30.812 19.822 0 7.3977-5.0192 12.423-12.547 13.54l5.1583 4.6062c6.2742 5.5836 10.457 11.446 10.457 19.822zm56.732 8.2975c0 10.295-8.7817 18.783-20.072 18.783-10.873 0-19.655-8.4876-19.655-18.783v-28.8c-9.3391-0.55666-17.006-8.209-17.006-17.948 0-10.157 8.085-17.948 17.982-17.948h37.776c9.8975 0 17.982 7.93 17.982 17.948 0 9.7389-7.6667 17.53-17.007 17.948zm48.894 2.8792c-4.7458 9.8128-11.447 14.512-19.544 14.512-14.659 0-25.269-13.406-18.707-28.471l17.172-39.804c4.3283-9.8128 10.61-15.203 21.22-15.203 10.75 0 17.032 5.39 21.221 15.203l17.172 39.804c6.4216 15.065-4.0492 28.471-18.847 28.471-8.2358 0-14.937-4.6989-19.685-14.512zm46.026-46.845c0-13.635 7.2908-20.73 20.33-20.73h24.257c14.722 0 26.219 11.13 26.219 25.46 0 7.7913-3.2258 14.192-8.5533 18.226l7.2908 11.548c1.9625 3.0606 2.8042 6.4004 2.8042 9.8786 0 10.296-8.1325 18.366-18.367 18.366-6.3092 0-12.478-3.2002-15.983-9.0443l-1.9633-3.4782c-2.3833 7.374-8.9733 12.522-17.386 12.522-10.235 0-18.647-8.6266-18.647-19.061zm130.5 43.965c0 10.295-8.6258 18.783-20.174 18.783-10.852 0-19.617-8.4876-19.617-18.783v-28.8c-9.3217-0.55666-16.974-8.209-16.974-17.948 0-10.157 8.07-17.948 17.948-17.948h37.843c9.8783 0 17.947 7.93 17.947 17.948 0 9.7389-7.6517 17.53-16.973 17.948zm87.93 2.7865c0 8.9794-7.1883 16.135-15.898 15.994h-29.032c-13.272 0-20.461-7.0143-20.461-20.764v-41.948c0-13.609 7.1883-20.764 20.461-20.764h29.032c8.71 0 15.898 7.1546 15.898 16.134 0 8.1373-4.9766 14.03-12.166 15.433 3.3183 2.1045 5.1158 5.6116 5.1158 10.241 0 4.6302-1.9358 8.1376-5.1158 10.242 7.0508 1.403 12.166 7.4359 12.166 15.432zm5.5659-46.752c0-13.635 7.1508-20.73 20.33-20.73h24.257c14.722 0 26.218 11.13 26.218 25.46 0 7.7913-3.225 14.192-8.5525 18.226l7.2908 11.548c1.9625 3.0606 2.8042 6.4004 2.8042 9.8786 0 10.296-8.1325 18.366-18.367 18.366-6.3092 0-12.479-3.2002-15.984-9.0443l-1.9625-3.4782c-2.3833 7.374-8.9733 12.522-17.386 12.522-10.236 0-18.647-8.6266-18.647-19.061v-43.687" fill="#fff"/> -</svg> diff --git a/app/Views/_assets/images/platforms/funding/kisskissbankbank.svg b/app/Views/_assets/images/platforms/funding/kisskissbankbank.svg deleted file mode 100644 index fc9fa40dde72ff19d370e31a6e0136937cb54cbc..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/funding/kisskissbankbank.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="1050" height="300" rx="150" ry="150"/> - <path d="m451.53 234.43c-5.1982-1.5812-9.9198-6.0479-11.315-10.704-1.3748-4.5888-0.98625-10.172 0.98296-14.124 3.0594-6.1394 8.3802-8.6365 23.162-10.87 10.665-1.6113 13.347-2.5798 13.469-4.8625 0.14138-2.6542-0.14928-3.481-1.8252-5.1921-1.4683-1.4991-2.1941-1.6804-6.7271-1.6804-4.8892 0-5.1553 0.083-7.0426 2.1952-1.0788 1.2074-1.9614 2.6441-1.9614 3.1929 0 0.83438-1.5333 0.99766-9.3682 0.99766h-9.3682l0.39093-2.5207c1.7348-11.186 11.312-16.972 28.092-16.972 13.434 0 20.84 3.1166 24.755 10.419 1.3598 2.5359 1.4634 3.8918 1.8229 23.862 0.25423 14.121 0.6491 21.804 1.1854 23.066 0.44231 1.0408 0.80423 2.0238 0.80423 2.1846 0 0.16077-4.3723 0.29233-9.7161 0.29233h-9.7161l-0.44137-2.3526c-0.24274-1.294-0.56154-2.3526-0.70845-2.3526-0.1469 0-1.5239 0.91043-3.06 2.0232-1.5361 1.1127-4.3107 2.4739-6.1658 3.0248-3.5444 1.0526-14.254 1.2845-17.249 0.37362zm22.985-14.119c2.1023-2.3108 3.2253-5.8421 3.2306-10.158l4e-3 -3.0592-7.2259 1.7673c-10.34 2.529-11.595 3.4318-11.595 8.3399 0 2.7674 1.7187 4.8447 4.5201 5.4633 1.0261 0.22659 2.1628 0.48458 2.526 0.57331 2.1263 0.51945 6.891-1.1131 8.5406-2.9263zm253.28 14.119c-5.1982-1.5812-9.9198-6.0479-11.315-10.704-1.3748-4.5888-0.98626-10.172 0.98296-14.124 3.0594-6.1394 8.3802-8.6365 23.162-10.87 10.665-1.6113 13.347-2.5798 13.469-4.8625 0.14142-2.6542-0.14928-3.481-1.8252-5.1921-1.4682-1.4991-2.1942-1.6804-6.7271-1.6804-4.8891 0-5.1553 0.083-7.0426 2.1952-1.0788 1.2074-1.9614 2.6441-1.9614 3.1929 0 0.83438-1.5333 0.99766-9.3682 0.99766h-9.3682l0.39094-2.5207c1.7348-11.186 11.312-16.972 28.092-16.972 13.434 0 20.84 3.1166 24.755 10.419 1.3597 2.5359 1.4633 3.8918 1.823 23.862 0.25424 14.121 0.64907 21.804 1.1855 23.066 0.44228 1.0408 0.80418 2.0238 0.80418 2.1846 0 0.16077-4.3722 0.29233-9.7161 0.29233h-9.7161l-0.44138-2.3526c-0.24274-1.294-0.56156-2.3526-0.70846-2.3526-0.14689 0-1.5239 0.91043-3.06 2.0232-1.5361 1.1127-4.3107 2.4739-6.1658 3.0248-3.5444 1.0526-14.254 1.2845-17.249 0.37362zm22.985-14.119c2.1023-2.3108 3.2253-5.8421 3.2306-10.158l5e-3 -3.0592-7.2259 1.7673c-10.34 2.529-11.595 3.4318-11.595 8.3399 0 2.7674 1.7186 4.8447 4.5201 5.4633 1.0261 0.22659 2.1628 0.48458 2.5259 0.57331 2.1263 0.51945 6.8911-1.1131 8.5406-2.9263zm-383.94-26.599v-40.077l24.703 0.22259c23.636 0.21299 24.876 0.28746 28.713 1.7254 5.0079 1.8764 8.184 4.4025 10.776 8.5705 1.831 2.9445 2.015 3.7675 2.0133 9.009-2e-3 4.6318-0.28966 6.3073-1.4623 8.503-1.5411 2.8856-6.3585 7.6636-7.7774 7.7139-0.46106 0.0164 0.37163 0.65469 1.8504 1.4185 3.794 1.9597 6.8888 5.0615 8.9505 8.9705 1.56 2.9579 1.7727 4.1381 1.7738 9.8431 2e-3 6.0751-0.14556 6.77-2.3367 11.066-2.8192 5.5269-6.9837 8.9936-13.429 11.179-4.1333 1.4015-5.7028 1.4937-29.072 1.7073l-24.703 0.22578zm42.397 22.522c3.5348-0.98195 5.4623-3.3796 5.835-7.258 0.38843-4.0423-1.005-7.0321-4.0478-8.6849-1.7461-0.94849-4.2537-1.2265-12.76-1.4148l-10.587-0.23429v18.267l9.5785-4e-3c5.2682-2e-3 10.66-0.30406 11.981-0.67114zm-3.0188-31.674c3.8982-0.98159 5.6576-3.1945 5.6576-7.116 0-2.3834-0.38485-3.3707-1.9072-4.8931-2.336-2.336-5.2934-2.8451-14.897-2.5646l-7.0579 0.20615-0.19383 6.674c-0.10661 3.6707-0.0405 7.0736 0.14695 7.562 0.43657 1.1377 13.871 1.2346 18.252 0.13171zm96.402 19.894v-29.259l18.485 0.37405 0.19857 3.3958 0.19856 3.3958 2.5603-2.4356c4.005-3.8099 8.2829-5.5323 14.628-5.8898 9.8009-0.55218 16.542 2.8789 19.793 10.075 1.5802 3.4972 1.6112 3.9526 1.8086 26.58l0.20085 23.022h-19.501l-0.19673-19.885-0.19674-19.885-2.2763-2.033c-2.1223-1.8954-2.5642-2.0146-6.532-1.762-3.3506 0.21335-4.6362 0.62192-6.0446 1.921-3.4201 3.1547-3.6321 4.5443-3.6321 23.81v17.834h-19.493zm63.857-10.736v-39.995h19.493v39.828l17.607-18.318h10.69c5.8794 0 10.69 0.2074 10.69 0.46089s-4.7136 5.2327-10.475 11.065c-7.0559 7.1431-10.306 10.887-9.9576 11.47 0.28429 0.47644 5.6028 8.4996 11.819 17.829 6.2161 9.3296 11.302 17.118 11.302 17.309 0 0.19019-5.0666 0.33866-11.259 0.32995l-11.259-0.0159-9.4105-14.202-9.4105-14.202-0.18141 14.218-0.18141 14.218h-19.466zm76.628-7e-3v-40.077l24.703 0.2226c23.636 0.21298 24.876 0.28745 28.713 1.7253 5.0079 1.8764 8.1839 4.4025 10.776 8.5705 1.831 2.9445 2.015 3.7674 2.0133 9.009-2e-3 4.6318-0.28966 6.3073-1.4623 8.503-1.5411 2.8856-6.3585 7.6636-7.7774 7.7139-0.46105 0.0164 0.37165 0.65467 1.8504 1.4185 3.794 1.9597 6.8888 5.0615 8.9505 8.9705 1.56 2.9579 1.7727 4.1381 1.7738 9.8431 2e-3 6.0751-0.14557 6.77-2.3367 11.066-2.8192 5.5269-6.9837 8.9936-13.429 11.179-4.1333 1.4015-5.7028 1.4937-29.072 1.7073l-24.703 0.22579zm42.397 22.522c3.5348-0.98192 5.4623-3.3795 5.835-7.258 0.38842-4.0423-1.005-7.0321-4.0478-8.6849-1.7461-0.9485-4.2537-1.2265-12.76-1.4148l-10.587-0.23432v18.267l9.5785-4e-3c5.2682-2e-3 10.66-0.30409 11.981-0.67116zm-2.4847-31.649c3.9275-1.0905 5.7957-3.3074 5.7957-6.8776 0-3.7042-1.8328-6.2059-5.24-7.1522-1.3695-0.38038-6.1955-0.69328-10.724-0.69532l-8.2342-4e-3v15.46l7.8981-4e-3c4.344-2e-3 9.071-0.32942 10.505-0.72747zm95.868 19.869v-29.259l18.485 0.37402 0.19854 3.3958 0.19858 3.3958 2.5604-2.4356c4.005-3.8099 8.2828-5.5323 14.628-5.8898 9.8008-0.55219 16.542 2.8789 19.793 10.075 1.5802 3.4972 1.6112 3.9526 1.8086 26.58l0.20085 23.022h-19.501l-0.19664-19.885-0.19678-19.885-2.2762-2.033c-2.1222-1.8954-2.5643-2.0147-6.532-1.762-3.3505 0.21333-4.6362 0.62192-6.0446 1.921-3.4201 3.1547-3.632 4.5443-3.632 23.81v17.834h-19.493zm63.857-10.736v-39.995h19.493v39.828l17.607-18.318h10.69c5.8794 0 10.69 0.2074 10.69 0.46089 0 0.25351-4.7136 5.2327-10.475 11.065-7.0559 7.1431-10.306 10.887-9.9577 11.47 0.28434 0.47646 5.6029 8.4996 11.819 17.829 6.2161 9.3296 11.302 17.118 11.302 17.309 0 0.19019-5.0666 0.33866-11.259 0.32995l-11.259-0.0159-18.821-28.404-0.18143 14.218-0.1814 14.218h-19.466zm-642.11 20.828c-26.293-4.9828-46.186-23.638-53.389-50.067-0.93564-3.4332-1.1837-6.8892-1.1579-16.132 0.0303-10.859 0.17462-12.228 1.8785-17.813 3.3538-10.993 8.3207-19.61 15.832-27.468 9.8577-10.313 20.972-16.647 34.581-19.708 6.4242-1.445 21.297-1.4479 27.637-0.0057 12.769 2.9053 24.72 9.3451 32.58 17.555l2.3324 2.4363-46.333 46.347 45.701 45.794-2.6887 2.3784c-8.2266 7.2773-18.588 12.902-28.486 15.463-8.253 2.1358-20.815 2.6737-28.488 1.2198zm92.184-21.419c-4.6231-1.6521-7.062-3.7992-26.986-23.758l-20.007-20.042 21.016-20.899c23.924-23.791 23.458-23.466 33.451-23.397 4.8391 0.0331 6.2498 0.31579 9.2176 1.8472 5.0387 2.6001 7.7337 5.2161 10.324 10.021 2.1015 3.8989 2.2782 4.6914 2.2908 10.274 0.0109 4.8022-0.28577 6.6976-1.4388 9.1925-2.0662 4.4708-6.4515 8.9385-11.009 11.216l-3.9213 1.9595 2.9632 1.1317c4.2266 1.6141 9.3165 6.4588 11.537 10.981 1.6383 3.3362 1.8823 4.6175 1.8823 9.8828 0 5.2653-0.24404 6.5466-1.8823 9.8828-2.3569 4.7995-7.4136 9.4298-12.291 11.255-4.2616 1.5945-11.357 1.8064-15.145 0.45248zm197-46.856c-12.5-1.2927-20.822-7.9125-21.953-17.463l-0.3926-3.3149h18.229l0.43212 1.9675c1.3596 6.1901 11.205 8.7528 16.502 4.2954 2.5626-2.1563 2.6811-4.952 0.28962-6.8332-0.95-0.74728-5.0384-2.1135-9.2424-3.0885-12.038-2.792-13.414-3.1894-16.713-4.8267-4.2149-2.0919-7.0761-5.7123-7.9888-10.109-1.4759-7.1094 0.83402-12.968 6.6461-16.855 4.6308-3.0976 9.0073-4.307 17.039-4.7086 17.045-0.85245 27.231 4.6787 29.082 15.792l0.47572 2.8568h-18.099l-0.39749-1.9876c-0.52573-2.6286-3.3868-4.062-8.1078-4.062-6.026 0-8.8639 2.1244-7.1402 5.3451 1.1756 2.1966 4.3602 3.4209 14.263 5.4832 5.1248 1.0673 10.293 2.349 11.484 2.8483 5.4398 2.2795 9.8762 8.6787 9.8896 14.265 0.0341 14.187-13.947 22.501-34.298 20.396zm60.756 0.0496c-10.913-1.1653-17.395-5.027-20.834-12.412-0.86441-1.8562-1.5746-4.5093-1.5782-5.8956l-7e-3 -2.5207h17.936l0.81518 2.7209c0.94331 3.1484 3.5977 5.0936 7.7779 5.6998 5.51 0.79898 11.132-2.8859 10.181-6.6732-0.6693-2.6667-2.7356-3.5852-13.757-6.1155-11.297-2.5935-15.657-4.4525-18.777-8.0058-5.8618-6.6762-4.1666-17.931 3.476-23.077 4.5679-3.0761 9.036-4.2651 17.623-4.6895 17.03-0.84175 26.658 4.5492 28.771 16.11l0.46061 2.5207-17.874-0.029-1.0083-2.167c-1.3016-2.7974-3.4821-3.8337-8.0661-3.8337-4.4282 0-6.9781 1.1367-7.28 3.2453-0.49738 3.474 3.1261 5.2516 15.978 7.8378 10.025 2.0174 14.228 4.1028 17.265 8.5654 3.6021 5.2928 3.5902 12.1-0.0318 18.281-4.5965 7.8434-16.844 11.958-31.072 10.438zm173.98-0.0312c-2.7054-0.27586-6.7888-1.1976-9.0744-2.0482-7.4666-2.7789-13.23-10.276-13.23-17.209v-1.5774l18.401 0.37402 0.55073 2.1289c1.1689 4.5181 7.0067 7.1182 12.6 5.612 3.7565-1.0115 5.553-2.8896 5.2893-5.5295-0.29181-2.9204-2.5385-4.3157-9.6182-5.9733-17.503-4.0981-21.44-5.8817-24.341-11.026-2.0437-3.6247-2.1539-11.282-0.21694-15.079 1.8656-3.6569 6.2135-7.1291 11.027-8.8059 5.0521-1.76 17.045-2.4957 22.87-1.403 10.096 1.8938 16.318 7.3608 17.616 15.479l0.43981 2.7504h-18.153l-0.39752-1.9876c-0.52851-2.6426-3.3881-4.062-8.1836-4.062-4.1625 0-5.9811 0.69702-7.0553 2.7041-1.8925 3.5362 2.2496 5.7774 15.468 8.3698 12.063 2.3657 16.535 5.0898 19.337 11.778 1.3246 3.1615 0.79592 10.242-1.029 13.782-4.5878 8.8988-16.741 13.309-32.302 11.722zm59.938 0.0312c-13.413-1.4323-20.733-7.1858-22.378-17.588l-0.51209-3.2397h18.452l0.40673 2.0337c0.93341 4.6669 6.6965 7.4325 12.558 6.0264 6.5197-1.564 7.9925-7.4317 2.4414-9.727-1.1717-0.48451-5.9115-1.703-10.533-2.7077-13.587-2.954-17.729-5.1016-20.478-10.619-3.9638-7.9542-1.2209-16.844 6.5726-21.303 10.245-5.8612 30.633-5.2248 38.754 1.2096 2.8614 2.2672 6.072 8.2663 6.072 11.346v2.2321l-17.141-0.029-1.0083-2.167c-1.3016-2.7974-3.482-3.8337-8.0661-3.8337-4.6324 0-6.9916 1.1245-7.2646 3.4625-0.41491 3.5547 3.1237 5.1786 17.194 7.8906 8.4906 1.6365 12.944 3.9125 15.841 8.0949 1.8374 2.6534 2.1442 3.7297 2.3586 8.274 0.21678 4.5953 0.0287 5.6682-1.5608 8.9175-4.2886 8.7656-16.646 13.336-31.709 11.728zm-417.66-41.329v-39.995h20.811l0.18142 14.204 0.18141 14.204 26.659-28.409h25.014l-1.6694 1.8485c-1.6683 1.8474-20.046 21.56-24.993 26.808l-2.6182 2.7778 16.069 23.437c8.8379 12.89 16.295 23.815 16.57 24.277 0.39418 0.66024-2.2194 0.84023-12.201 0.84023h-12.703l-30.129-43.896-0.17723 21.948-0.17722 21.948h-20.819zm78.645 10.755v-29.24h18.821v58.48h-18.821zm155.27-10.755v-39.995h20.811l0.18143 14.161 0.18142 14.161 26.614-28.321h25.081l-2.3522 2.5207c-1.2937 1.3864-7.1628 7.6628-13.042 13.948-5.8796 6.2849-11.421 12.236-12.313 13.225l-1.623 1.7977 16.041 23.362c8.8228 12.849 16.283 23.761 16.579 24.249 0.43766 0.72212-1.8326 0.88688-12.22 0.88688h-12.758l-30.006-43.805-0.17723 21.903-0.17724 21.902h-20.819zm78.645 10.755v-29.24h18.821v58.48h-18.821zm-233.92-43.019v-7.73h18.821v15.46h-18.821zm233.92 0v-7.73h18.821v15.46h-18.821z" fill="#fff" stroke-width=".67218"/> -</svg> diff --git a/app/Views/_assets/images/platforms/funding/liberapay.svg b/app/Views/_assets/images/platforms/funding/liberapay.svg deleted file mode 100644 index 21a14fd91284c0dd55a8a9f381e81dea5d6cf973..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/funding/liberapay.svg +++ /dev/null @@ -1,20 +0,0 @@ -<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="1050" height="300" rx="150" ry="150" fill="#f6c915"/> - <g transform="matrix(2.9235 0 0 2.9235 110.03 -24.29)" fill="#1a171b"> - <g transform="matrix(1.5452 0 0 1.5452 -536.72 -207.67)"> - <path d="m410.27 182.21-0.664 2.814h-11.498l4.408-18.401h3.346l-3.733 15.587z"/> - <path d="m415.39 185.03h-3.213l3.347-13.887h3.212zm2.391-15.984c-0.479 0-0.896-0.141-1.249-0.425-0.354-0.283-0.531-0.708-0.531-1.274 0-0.655 0.226-1.195 0.677-1.62s0.97-0.637 1.554-0.637c0.479 0 0.898 0.146 1.262 0.438 0.362 0.292 0.545 0.722 0.545 1.288 0 0.656-0.23 1.191-0.69 1.606-0.461 0.415-0.985 0.624-1.568 0.624z"/> - <path d="m428.49 170.82c0.813 0 1.516 0.137 2.106 0.411 0.593 0.275 1.084 0.65 1.474 1.128 0.389 0.478 0.681 1.04 0.875 1.687s0.291 1.34 0.291 2.084c0 1.221-0.211 2.39-0.638 3.505-0.424 1.115-1.03 2.098-1.817 2.947-0.787 0.85-1.749 1.527-2.882 2.032-1.133 0.504-2.407 0.757-3.823 0.757-0.212 0-0.496-0.01-0.849-0.027-0.355-0.018-0.743-0.063-1.17-0.133-0.424-0.07-0.858-0.168-1.301-0.292s-0.85-0.283-1.221-0.478l4.647-19.49 3.362-0.531-1.707 7.117c0.388-0.195 0.803-0.363 1.246-0.505 0.443-0.141 0.911-0.212 1.407-0.212zm-3.988 11.843c0.813 0 1.562-0.173 2.243-0.518s1.265-0.81 1.752-1.394c0.485-0.585 0.862-1.252 1.129-2.005 0.266-0.751 0.398-1.536 0.398-2.35 0-0.407-0.037-0.783-0.105-1.128-0.071-0.345-0.194-0.646-0.371-0.902-0.178-0.257-0.416-0.461-0.717-0.61-0.3-0.15-0.679-0.227-1.138-0.227-0.389 0-0.813 0.071-1.272 0.213s-0.882 0.363-1.271 0.664l-1.95 8.125c0.159 0.035 0.339 0.066 0.544 0.093 0.203 0.025 0.456 0.039 0.758 0.039z"/> - <path d="m435.15 180.01c0-1.185 0.19-2.331 0.571-3.438 0.38-1.106 0.929-2.088 1.646-2.948 0.716-0.858 1.58-1.543 2.588-2.058 1.01-0.513 2.142-0.77 3.399-0.77 1.345 0 2.39 0.345 3.134 1.036 0.743 0.689 1.114 1.575 1.114 2.655 0 1.115-0.274 2.018-0.822 2.708-0.549 0.69-1.261 1.23-2.138 1.62-0.876 0.39-1.868 0.655-2.975 0.797-1.106 0.142-2.227 0.23-3.358 0.265-0.018 0.036-0.027 0.071-0.027 0.107v0.265c0 1.61 1.02 2.417 3.055 2.417 1.204 0 2.406-0.248 3.609-0.744l0.268 2.603c-0.426 0.195-1.028 0.389-1.806 0.585-0.78 0.194-1.665 0.292-2.655 0.292-0.991 0-1.843-0.143-2.549-0.425-0.709-0.283-1.289-0.672-1.74-1.167-0.451-0.496-0.783-1.067-0.995-1.714s-0.319-1.341-0.319-2.086zm7.728-6.584c-0.53 0-1.035 0.105-1.514 0.318-0.479 0.212-0.903 0.505-1.274 0.876-0.372 0.372-0.695 0.81-0.97 1.314s-0.474 1.048-0.597 1.633c2.124-0.071 3.668-0.328 4.633-0.77 0.965-0.443 1.447-1.106 1.447-1.992 0-0.354-0.128-0.672-0.386-0.956-0.254-0.282-0.702-0.423-1.339-0.423z"/> - <path d="m458.67 173.98c-0.354-0.124-0.735-0.221-1.146-0.292-0.406-0.07-0.887-0.106-1.438-0.106-0.303 0-0.621 0.022-0.96 0.066-0.337 0.045-0.621 0.102-0.853 0.172l-2.667 11.206h-3.212l3.187-13.25c0.743-0.248 1.548-0.464 2.416-0.65 0.866-0.186 1.805-0.279 2.813-0.279 0.213 0 0.452 0.014 0.719 0.041 0.264 0.025 0.524 0.057 0.783 0.092 0.255 0.036 0.494 0.08 0.716 0.132 0.222 0.054 0.412 0.116 0.57 0.186z"/> - <path d="m470.94 179.64c-0.054 0.195-0.107 0.513-0.159 0.956-0.054 0.443-0.079 0.858-0.079 1.248 0 0.514 0.044 1.013 0.131 1.5 0.091 0.487 0.23 0.978 0.427 1.473l-2.869 0.425c-0.212-0.425-0.381-0.877-0.504-1.354-0.442 0.389-0.986 0.74-1.633 1.049s-1.377 0.464-2.191 0.464c-0.832 0-1.545-0.137-2.138-0.412-0.592-0.274-1.075-0.654-1.446-1.142-0.372-0.486-0.647-1.057-0.823-1.712-0.178-0.655-0.265-1.363-0.265-2.125 0-1.291 0.23-2.496 0.69-3.611 0.459-1.115 1.101-2.079 1.924-2.894 0.824-0.814 1.802-1.456 2.935-1.925 1.132-0.469 2.372-0.703 3.718-0.703 0.69 0 1.384 0.058 2.083 0.173s1.404 0.332 2.111 0.65zm-1.747-6.002c-0.337-0.07-0.716-0.106-1.143-0.106-0.797 0-1.532 0.173-2.207 0.518-0.674 0.346-1.253 0.806-1.74 1.38-0.486 0.576-0.863 1.234-1.128 1.979-0.267 0.743-0.399 1.522-0.399 2.336 0 0.408 0.034 0.789 0.107 1.142 0.07 0.354 0.188 0.664 0.356 0.929s0.395 0.478 0.678 0.637c0.282 0.159 0.646 0.24 1.088 0.24 0.567 0 1.066-0.121 1.502-0.359 0.433-0.24 0.837-0.562 1.208-0.969 0.017-0.461 0.057-0.894 0.12-1.301 0.062-0.407 0.146-0.814 0.251-1.221z"/> - <path d="m483.02 166.44c2.213 0 3.906 0.435 5.084 1.301 1.176 0.868 1.766 2.107 1.766 3.718 0 1.274-0.244 2.359-0.73 3.253-0.487 0.894-1.161 1.624-2.021 2.19-0.858 0.566-1.886 0.978-3.082 1.234-1.196 0.257-2.512 0.386-3.945 0.386h-1.437l-1.553 6.505h-3.349l4.327-18.135c0.85-0.177 1.7-0.296 2.549-0.359 0.85-0.061 1.647-0.093 2.391-0.093zm-0.319 2.815c-0.336 0-0.654 9e-3 -0.955 0.026-0.302 0.018-0.604 0.044-0.903 0.079l-1.487 6.346h1.349c0.741 0 1.454-0.062 2.143-0.185 0.688-0.124 1.297-0.332 1.826-0.625 0.529-0.292 0.952-0.689 1.271-1.194 0.317-0.505 0.476-1.146 0.476-1.925 0-0.902-0.332-1.549-0.995-1.938-0.667-0.389-1.575-0.584-2.725-0.584z"/> - <path d="m501.82 179.64c-0.054 0.195-0.107 0.513-0.16 0.956-0.052 0.443-0.079 0.858-0.079 1.248 0 0.514 0.045 1.013 0.132 1.5 0.09 0.487 0.23 0.978 0.427 1.473l-2.869 0.425c-0.212-0.425-0.381-0.877-0.505-1.354-0.44 0.389-0.985 0.74-1.632 1.049s-1.377 0.464-2.191 0.464c-0.832 0-1.545-0.137-2.137-0.412-0.593-0.274-1.075-0.654-1.447-1.142-0.372-0.486-0.647-1.057-0.823-1.712-0.179-0.655-0.266-1.363-0.266-2.125 0-1.291 0.231-2.496 0.691-3.611 0.459-1.115 1.101-2.079 1.924-2.894 0.824-0.814 1.802-1.456 2.935-1.925 1.132-0.469 2.372-0.703 3.718-0.703 0.69 0 1.384 0.058 2.083 0.173s1.404 0.332 2.111 0.65zm-1.747-6.002c-0.337-0.07-0.716-0.106-1.143-0.106-0.798 0-1.532 0.173-2.207 0.518-0.673 0.346-1.253 0.806-1.74 1.38-0.486 0.576-0.863 1.234-1.128 1.979-0.267 0.743-0.399 1.522-0.399 2.336 0 0.408 0.033 0.789 0.107 1.142 0.07 0.354 0.188 0.664 0.356 0.929s0.395 0.478 0.679 0.637c0.281 0.159 0.646 0.24 1.087 0.24 0.567 0 1.066-0.121 1.502-0.359 0.433-0.24 0.837-0.562 1.208-0.969 0.017-0.461 0.057-0.894 0.12-1.301 0.062-0.407 0.146-0.814 0.25-1.221z"/> - <path d="m518.07 171.14c-0.354 1.009-0.745 2.058-1.171 3.146-0.427 1.088-0.901 2.182-1.425 3.28-0.523 1.097-1.088 2.19-1.691 3.279-0.602 1.088-1.249 2.147-1.941 3.173-0.515 0.78-1.046 1.527-1.596 2.244-0.551 0.718-1.147 1.35-1.794 1.898-0.647 0.549-1.36 0.992-2.139 1.328-0.781 0.336-1.668 0.505-2.658 0.505-0.551 0-1.042-0.063-1.478-0.186-0.433-0.125-0.801-0.265-1.104-0.425l1.036-2.576c0.249 0.141 0.528 0.256 0.837 0.346 0.31 0.088 0.65 0.132 1.022 0.132 0.833 0 1.563-0.217 2.192-0.65 0.628-0.434 1.198-1.023 1.712-1.766-0.567-1.965-1.044-4.098-1.435-6.399s-0.646-4.744-0.772-7.329h3.242c0.018 0.743 0.057 1.566 0.12 2.47 0.063 0.902 0.143 1.828 0.243 2.774 0.098 0.948 0.218 1.881 0.362 2.802 0.143 0.919 0.303 1.77 0.481 2.549 0.534-0.85 1.031-1.744 1.491-2.683 0.462-0.938 0.888-1.872 1.279-2.801 0.39-0.929 0.732-1.833 1.025-2.708 0.292-0.877 0.545-1.677 0.759-2.403z"/> - </g> - <g transform="matrix(1.1558 0 0 1.1558 -378.16 -140.8)"> - <path d="m354.34 189.4c-2.479 0-4.424-0.322-5.837-0.969-1.415-0.646-2.427-1.526-3.037-2.644-0.61-1.116-0.906-2.399-0.89-3.848 0.017-1.448 0.217-2.992 0.602-4.632l6.649-27.8 8.114-1.257-7.278 30.156c-0.138 0.628-0.217 1.205-0.233 1.728-0.019 0.523 0.078 0.986 0.287 1.387 0.209 0.402 0.566 0.725 1.072 0.969 0.505 0.245 1.214 0.402 2.122 0.471z"/> - <path d="m383.65 172.07c0 2.548-0.418 4.877-1.256 6.989s-1.997 3.936-3.481 5.471c-1.483 1.537-3.263 2.731-5.341 3.586-2.075 0.855-4.337 1.283-6.779 1.283-1.187 0-2.372-0.104-3.56-0.314l-2.355 9.476h-7.748l8.69-36.229c1.396-0.418 2.992-0.793 4.79-1.125 1.797-0.332 3.743-0.498 5.837-0.498 1.955 0 3.64 0.297 5.053 0.89 1.413 0.594 2.574 1.405 3.481 2.435 0.906 1.029 1.578 2.234 2.015 3.612 0.438 1.379 0.654 2.854 0.654 4.424zm-19.002 10.732c0.592 0.14 1.324 0.209 2.198 0.209 1.361 0 2.599-0.253 3.717-0.759 1.117-0.506 2.068-1.212 2.852-2.12 0.787-0.908 1.397-1.998 1.834-3.272 0.435-1.273 0.654-2.678 0.654-4.214 0-1.5-0.332-2.775-0.994-3.822-0.664-1.047-1.817-1.571-3.456-1.571-1.117 0-2.164 0.104-3.142 0.314z"/> - </g> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/funding/patreon.svg b/app/Views/_assets/images/platforms/funding/patreon.svg deleted file mode 100644 index fba04ee9404658b7acb3eae8a04dfb82adf94021..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/funding/patreon.svg +++ /dev/null @@ -1,24 +0,0 @@ -<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="1050" height="300" rx="150" ry="150" fill="#ff424d"/> - <g transform="translate(-49.245)"> - <g transform="matrix(.019653 0 0 -.019653 447.72 185)"> - <path d="m1863.2 2250.3c0 314.6-212.99 585.63-542.06 585.63h-537.16v-1171.1h537.16c329.07 0 542.06 270.86 542.06 585.46zm-1863.2 1224.4h1417.9c750.16 0 1234.2-566.28 1234.2-1224.4s-484.01-1224.2-1234.2-1224.2h-633.9v-938.93h-783.98v3387.6" fill="#fff"/> - <path d="m4921.7 2506.9-416.21-1393.8h822.66zm730.81-2419.7-130.54 411.34h-1205.1l-130.72-411.34h-837.3l1209.9 3387.6h721.05l1224.4-3387.6h-851.78" fill="#fff"/> - <path d="m7820.6 2797.2h-764.45v677.48h2317.9v-677.48h-769.51v-2710.1h-783.97v2710.1" fill="#fff"/> - <path d="m12457 2250.3c0 314.6-213 585.63-542.1 585.63h-537.2v-1171.1h537.2c329.1 0 542.1 270.86 542.1 585.46zm-1863.2 1224.4h1422.9c750 0 1234-566.28 1234-1224.4 0-474.25-251.7-895.17-672.8-1093.7l677.7-1069.5h-909.8l-600.3 938.93h-367.8v-938.93h-783.9v3387.6" fill="#fff"/> - <g transform="scale(1.0213)"> - <path d="m15044 2786.1v-753.27h1255.6v-601.88h-1255.6v-729.53h1255.6v-616.07h-2023.2v3316.8h2023.2v-616.05h-1255.6" fill="#fff"/> - </g> - <g transform="scale(1.3194)"> - <path d="m15695 1349.8c0 421.79-286.2 814.25-751.9 814.25-469.6 0-752-392.46-752-814.25s282.4-814.26 752-814.26c465.7 0 751.9 392.47 751.9 814.26zm-2112.8 0c0 704.22 506.2 1349.8 1360.9 1349.8 850.8 0 1357-645.56 1357-1349.8 0-704.22-506.2-1349.8-1357-1349.8-854.7 0-1360.9 645.56-1360.9 1349.8" fill="#fff"/> - </g> - <g transform="scale(1.5724)"> - <path d="m15804 806.4v1403.4h495.5v-2154.4h-520.1l-775.7 1385v-1385h-498.6v2154.4h520.1l778.8-1403.4" fill="#fff"/> - </g> - </g> - <g transform="matrix(.027788 0 0 -.027788 197.08 230)" fill="#fff" fill-rule="evenodd"> - <path d="m3844.9 5757.8c-1190.8 0-2159.5-969.65-2159.5-2161.6 0-1188.3 968.78-2155.1 2159.5-2155.1 1187.1 0 2152.8 966.79 2152.8 2155.1 0 1191.9-965.74 2161.6-2152.8 2161.6"/> - <path d="M 0,0 H 1054.41 V 5757.81 H 0 V 0"/> - </g> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/funding/paypal.svg b/app/Views/_assets/images/platforms/funding/paypal.svg deleted file mode 100644 index 33552f57990d663d195fc4ef9d8492c02694506d..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/funding/paypal.svg +++ /dev/null @@ -1,11 +0,0 @@ -<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="1050" height="300" rx="150" ry="150" fill="#f2c40f"/> - <g transform="matrix(5.3019 0 0 5.3019 197.38 70)"> - <path d="m46.211 6.749h-6.839a0.95 0.95 0 0 0-0.939 0.802l-2.766 17.537a0.57 0.57 0 0 0 0.564 0.658h3.265a0.95 0.95 0 0 0 0.939-0.803l0.746-4.73a0.95 0.95 0 0 1 0.938-0.803h2.165c4.505 0 7.105-2.18 7.784-6.5 0.306-1.89 0.013-3.375-0.872-4.415-0.972-1.142-2.696-1.746-4.985-1.746zm0.789 6.405c-0.374 2.454-2.249 2.454-4.062 2.454h-1.032l0.724-4.583a0.57 0.57 0 0 1 0.563-0.481h0.473c1.235 0 2.4 0 3.002 0.704 0.359 0.42 0.469 1.044 0.332 1.906zm19.654-0.079h-3.275a0.57 0.57 0 0 0-0.563 0.481l-0.145 0.916-0.229-0.332c-0.709-1.029-2.29-1.373-3.868-1.373-3.619 0-6.71 2.741-7.312 6.586-0.313 1.918 0.132 3.752 1.22 5.031 0.998 1.176 2.426 1.666 4.125 1.666 2.916 0 4.533-1.875 4.533-1.875l-0.146 0.91a0.57 0.57 0 0 0 0.562 0.66h2.95a0.95 0.95 0 0 0 0.939-0.803l1.77-11.209a0.568 0.568 0 0 0-0.561-0.658zm-4.565 6.374c-0.316 1.871-1.801 3.127-3.695 3.127-0.951 0-1.711-0.305-2.199-0.883-0.484-0.574-0.668-1.391-0.514-2.301 0.295-1.855 1.805-3.152 3.67-3.152 0.93 0 1.686 0.309 2.184 0.892 0.499 0.589 0.697 1.411 0.554 2.317zm22.007-6.374h-3.291a0.954 0.954 0 0 0-0.787 0.417l-4.539 6.686-1.924-6.425a0.953 0.953 0 0 0-0.912-0.678h-3.234a0.57 0.57 0 0 0-0.541 0.754l3.625 10.638-3.408 4.811a0.57 0.57 0 0 0 0.465 0.9h3.287a0.949 0.949 0 0 0 0.781-0.408l10.946-15.8a0.57 0.57 0 0 0-0.468-0.895z" fill="#253B80"/> - <path d="m94.992 6.749h-6.84a0.95 0.95 0 0 0-0.938 0.802l-2.766 17.537a0.569 0.569 0 0 0 0.562 0.658h3.51a0.665 0.665 0 0 0 0.656-0.562l0.785-4.971a0.95 0.95 0 0 1 0.938-0.803h2.164c4.506 0 7.105-2.18 7.785-6.5 0.307-1.89 0.012-3.375-0.873-4.415-0.971-1.142-2.694-1.746-4.983-1.746zm0.789 6.405c-0.373 2.454-2.248 2.454-4.062 2.454h-1.031l0.725-4.583a0.568 0.568 0 0 1 0.562-0.481h0.473c1.234 0 2.4 0 3.002 0.704 0.359 0.42 0.468 1.044 0.331 1.906zm19.653-0.079h-3.273a0.567 0.567 0 0 0-0.562 0.481l-0.145 0.916-0.23-0.332c-0.709-1.029-2.289-1.373-3.867-1.373-3.619 0-6.709 2.741-7.311 6.586-0.312 1.918 0.131 3.752 1.219 5.031 1 1.176 2.426 1.666 4.125 1.666 2.916 0 4.533-1.875 4.533-1.875l-0.146 0.91a0.57 0.57 0 0 0 0.564 0.66h2.949a0.95 0.95 0 0 0 0.938-0.803l1.771-11.209a0.571 0.571 0 0 0-0.565-0.658zm-4.565 6.374c-0.314 1.871-1.801 3.127-3.695 3.127-0.949 0-1.711-0.305-2.199-0.883-0.484-0.574-0.666-1.391-0.514-2.301 0.297-1.855 1.805-3.152 3.67-3.152 0.93 0 1.686 0.309 2.184 0.892 0.501 0.589 0.699 1.411 0.554 2.317zm8.426-12.219-2.807 17.858a0.569 0.569 0 0 0 0.562 0.658h2.822c0.469 0 0.867-0.34 0.939-0.803l2.768-17.536a0.57 0.57 0 0 0-0.562-0.659h-3.16a0.571 0.571 0 0 0-0.562 0.482z" fill="#179BD7"/> - <path d="m7.266 29.154 0.523-3.322-1.165-0.027h-5.563l3.866-24.513a0.316 0.316 0 0 1 0.314-0.268h9.38c3.114 0 5.263 0.648 6.385 1.927 0.526 0.6 0.861 1.227 1.023 1.917 0.17 0.724 0.173 1.589 7e-3 2.644l-0.012 0.077v0.676l0.526 0.298a3.69 3.69 0 0 1 1.065 0.812c0.45 0.513 0.741 1.165 0.864 1.938 0.127 0.795 0.085 1.741-0.123 2.812-0.24 1.232-0.628 2.305-1.152 3.183a6.547 6.547 0 0 1-1.825 2c-0.696 0.494-1.523 0.869-2.458 1.109-0.906 0.236-1.939 0.355-3.072 0.355h-0.73c-0.522 0-1.029 0.188-1.427 0.525a2.21 2.21 0 0 0-0.744 1.328l-0.055 0.299-0.924 5.855-0.042 0.215c-0.011 0.068-0.03 0.102-0.058 0.125a0.155 0.155 0 0 1-0.096 0.035z" fill="#253B80"/> - <path d="m23.048 7.667c-0.028 0.179-0.06 0.362-0.096 0.55-1.237 6.351-5.469 8.545-10.874 8.545h-2.752c-0.661 0-1.218 0.48-1.321 1.132l-1.409 8.936-0.399 2.533a0.704 0.704 0 0 0 0.695 0.814h4.881c0.578 0 1.069-0.42 1.16-0.99l0.048-0.248 0.919-5.832 0.059-0.32c0.09-0.572 0.582-0.992 1.16-0.992h0.73c4.729 0 8.431-1.92 9.513-7.476 0.452-2.321 0.218-4.259-0.978-5.622a4.667 4.667 0 0 0-1.336-1.03z" fill="#179BD7"/> - <path d="m21.754 7.151a9.757 9.757 0 0 0-1.203-0.267 15.284 15.284 0 0 0-2.426-0.177h-7.352a1.172 1.172 0 0 0-1.159 0.992l-1.564 9.906-0.045 0.289a1.336 1.336 0 0 1 1.321-1.132h2.752c5.405 0 9.637-2.195 10.874-8.545 0.037-0.188 0.068-0.371 0.096-0.55a6.594 6.594 0 0 0-1.017-0.429 9.045 9.045 0 0 0-0.277-0.087z" fill="#222D65"/> - <path d="m9.614 7.699a1.169 1.169 0 0 1 1.159-0.991h7.352c0.871 0 1.684 0.057 2.426 0.177a9.757 9.757 0 0 1 1.481 0.353c0.365 0.121 0.704 0.264 1.017 0.429 0.368-2.347-3e-3 -3.945-1.272-5.392-1.399-1.593-3.924-2.275-7.155-2.275h-9.38c-0.66 0-1.223 0.48-1.325 1.133l-3.907 24.765a0.806 0.806 0 0 0 0.795 0.932h5.791l1.454-9.225z" fill="#253B80"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/funding/tipeee.svg b/app/Views/_assets/images/platforms/funding/tipeee.svg deleted file mode 100644 index 72063b9a85f0b0f45167f0260021bbb15e85f37d..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/funding/tipeee.svg +++ /dev/null @@ -1,14 +0,0 @@ -<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="1050" height="300" rx="150" ry="150" fill="#d84759"/> - <g transform="matrix(1.9051 0 0 1.9051 134.44 -488.69)" fill="#fff"> - <path d="m137.87 348.34h-4.17v-42.82c0-0.73-0.59-1.32-1.31-1.32l-22.14 6.65c-1.01 0.25-1.31 1.2-1.31 1.93v12.71c0 0.73 0.59 1.32 1.31 1.32l3.96-1.19v22.72h-4.17c-0.73 0-1.31 0.59-1.31 1.32v13.31c0 0.73 0.59 1.32 1.31 1.32h27.85c0.73 0 1.31-0.59 1.31-1.32v-13.31c-0.02-0.73-0.61-1.32-1.33-1.32z"/> - <path d="m280.02 364.43c5.15 0.51 10.66-1.06 15.48-2.7 11.36-3.87 22.13-10 31.7-17.19 4.18-3.13 8.26-6.5 11.67-10.47 2.53-2.94 5-6.41 5.19-10.43 0.21-4.44-6.68-4.42-6.89 0v0.1c-0.01 0.02-0.01 0.05-0.02 0.08-0.07 0.34-0.18 0.67-0.29 1l-0.03 0.09c-0.05 0.11-0.1 0.21-0.15 0.32-0.22 0.44-0.47 0.87-0.72 1.3-0.24 0.39-0.5 0.78-0.77 1.15-0.14 0.2-0.28 0.39-0.43 0.59-0.02 0.03-0.05 0.06-0.09 0.11-0.75 0.94-1.55 1.83-2.38 2.69-4.05 4.24-8.15 7.36-12.81 10.56-5.33 3.66-10.96 6.91-16.79 9.72-4.98 2.39-10.23 4.47-15.97 5.67-0.59 0.12-1.18 0.23-1.77 0.32-0.06 0.01-0.28 0.04-0.43 0.06-0.21 0.02-0.42 0.05-0.63 0.07-1.19 0.12-2.38 0.15-3.57 0.08-0.08 0-0.41-0.04-0.55-0.06-0.17-0.03-0.34-0.07-0.51-0.1-0.45-0.09-0.88-0.23-1.31-0.38 0.43 0.14-0.68-0.34-0.9-0.47-0.09-0.05-0.18-0.11-0.26-0.17 0.07 0.04-0.41-0.32-0.53-0.43-0.14-0.13-0.65-0.72-0.73-0.78-0.15-0.21-0.29-0.43-0.42-0.66 4.81-3.37 9.28-7.29 13.33-11.5 4.69-4.87 9.03-10.35 12.1-16.4 2.99-5.9 5.25-14.04 0.38-19.6-5.03-5.74-13.35-1.62-17.96 2.26-4.62 3.89-7.93 9.17-10.43 14.6-2.41 5.24-4.27 10.77-5.2 16.47-0.59 3.61-0.94 7.53-0.35 11.23-2.06 1.22-4.18 2.34-6.37 3.31-2.48 1.1-5.7 2.06-8.64 2.52 0.18-0.03-0.69 0.07-0.69 0.07-0.35 0.03-0.71 0.05-1.06 0.07-0.67 0.04-1.35 0.03-2.02 0.01-0.19-0.01-0.38-0.02-0.57-0.04 0.19 0.01-0.41-0.06-0.52-0.08-0.52-0.1-1.03-0.25-1.54-0.42 0.32 0.1-0.73-0.36-0.94-0.48-0.1-0.06-0.19-0.12-0.29-0.18-0.09-0.07-0.26-0.19-0.33-0.25-0.29-0.25-0.55-0.54-0.81-0.83-0.07-0.08-0.14-0.17-0.17-0.22-0.17-0.24-0.32-0.5-0.46-0.75 5.38-3.67 10.33-7.97 14.69-12.8 5.36-5.95 10.2-12.88 13.16-20.35 2.42-6.09 1.73-13.88-5.07-16.52-3.05-1.18-6.49-0.22-9.33 1.01-3.86 1.67-7.12 4.89-9.75 8.08-3.43 4.16-5.81 9.04-7.8 14.01-2.14 5.34-3.57 10.97-4.07 16.7-0.19 2.2-0.2 4.55 0.12 6.84-2.59 1.53-5.27 2.91-8.03 4.12-0.17 0.07-0.9 0.37-1.12 0.46-0.35 0.14-0.7 0.27-1.05 0.4-0.31 0.11-0.62 0.22-0.94 0.32-0.66 0.2-1.32 0.37-1.98 0.53-0.31 0.07-0.62 0.13-0.94 0.19-0.06 0.01-0.42 0.07-0.56 0.09-1.05 0.12-2.11 0.13-3.16 0.04-0.03 0-0.05-0.01-0.09-0.02-0.23-0.04-0.45-0.09-0.68-0.15-0.3-0.07-0.6-0.17-0.89-0.27 0.09 0.02-0.68-0.33-0.87-0.44-0.17-0.1-0.34-0.21-0.5-0.32-0.03-0.03-0.07-0.06-0.12-0.11-0.31-0.27-0.59-0.57-0.86-0.87-0.02-0.02-0.04-0.05-0.06-0.07-0.09-0.13-0.18-0.26-0.27-0.39-0.23-0.36-0.44-0.73-0.63-1.11-0.04-0.07-0.07-0.15-0.11-0.23-0.05-0.13-0.2-0.47-0.24-0.58-0.02-0.07-0.04-0.13-0.07-0.2 8.87-5.58 16.4-13.13 21.91-22.17 3.76-6.17 8.24-14.6 4.51-21.78-3.37-6.49-11.66-4.99-16.71-1.71-9.33 6.07-13.99 17-16.29 27.48-0.96 4.37-1.76 9.76-1.26 14.81-1.58 0.85-3.22 1.59-4.87 2.3-1.72 0.75-2.1 3.24-1.24 4.71 1.03 1.76 2.99 1.99 4.71 1.24 1.04-0.46 2.07-0.94 3.09-1.44 0.82 1.83 1.96 3.5 3.5 4.89 4.54 4.13 10.95 3.88 16.49 2.23 3.99-1.24 7.87-3.09 11.54-5.22 0.15 0.25 0.31 0.49 0.47 0.73 3.24 4.68 8.62 6.11 14.07 5.65 6.42-0.54 12.52-3.04 18.09-6.21 2.33 3.71 6.03 5.8 10.66 6.27zm-69.34-24.23c0.03-0.23 0.07-0.47 0.11-0.7 0.09-0.58 0.2-1.16 0.3-1.74 0.24-1.26 0.53-2.51 0.84-3.75 0.6-2.34 1.34-4.64 2.2-6.89 0.17-0.44 0.35-0.88 0.53-1.32 0.01-0.01 0.42-0.94 0.5-1.12 0.46-1 0.95-1.97 1.49-2.93 0.44-0.8 0.92-1.58 1.44-2.34 0.14-0.21 0.28-0.41 0.43-0.61-0.03 0.05 0.55-0.69 0.53-0.66 0.5-0.61 1.03-1.19 1.57-1.77 2.38-2.55 5.18-4.7 8.29-5.34 0.03-0.01 0.05-0.01 0.07-0.02 0.05 0 0.13 0 0.25-0.01 0.29-0.02 0.58-0.01 0.87 0.01h0.01c0.04 0.01 0.09 0.02 0.17 0.04 0.15 0.03 0.29 0.08 0.43 0.12-0.21-0.06 0.28 0.14 0.41 0.22l0.06 0.03c0.02 0.01 0.03 0.02 0.05 0.04 0.06 0.06 0.24 0.26 0.32 0.34 0.07 0.11 0.15 0.23 0.21 0.35 0.02 0.05 0.19 0.42 0.23 0.52 0.09 0.29 0.15 0.58 0.21 0.88 0.01 0.03 0.01 0.05 0.02 0.07 0 0.06 0 0.15 0.01 0.29 0.02 0.35 0.02 0.69 0.01 1.04-0.03 1.47-0.52 3.09-1.15 4.78-1.48 3.96-3.94 7.75-6.35 11.19-2.23 3.18-4.84 6.08-7.65 8.74-2.1 1.99-4.38 3.8-6.77 5.46 0.02-1.51 0.14-3.03 0.32-4.53-0.01-0.05 0.02-0.24 0.04-0.39zm1.76 14.73c-0.04-0.05-0.05-0.07 0 0zm28.86-11.11c0.02-0.24 0.05-0.48 0.08-0.72 0 0.07 0.11-0.81 0.13-0.91 0.43-2.76 1.13-5.48 1.97-8.15 1.57-5 3.41-9.22 6.47-13.83 0.29-0.44 0.6-0.88 0.92-1.31 0.03-0.04 0.06-0.08 0.08-0.11 0.3-0.38 0.62-0.75 0.93-1.12 1.38-1.63 2.93-3.18 4.68-4.41 1.33-0.94 2.54-1.56 3.79-1.95 0.32-0.1 0.65-0.17 0.98-0.24 0.04-0.01 0.07-0.02 0.1-0.02 0.05 0 0.12-0.01 0.22-0.01 0.29-0.02 0.59-0.01 0.88 0h0.12c0.06 0.02 0.16 0.05 0.32 0.09 0.08 0.02 0.31 0.1 0.43 0.15 0.13 0.07 0.26 0.15 0.38 0.22l0.1 0.1c0.06 0.06 0.21 0.24 0.29 0.33 0.09 0.14 0.17 0.28 0.25 0.42 0.02 0.03 0.03 0.06 0.05 0.08 0.01 0.03 0.02 0.07 0.04 0.12 0.1 0.28 0.16 0.56 0.23 0.85 0.01 0.08 0.02 0.14 0.03 0.19 0.01 0.16 0.03 0.31 0.03 0.47 0.17 3.07-1.48 6.37-3.13 9.38-5.11 9.35-12.24 17.26-20.56 23.43 0.01-0.39 0.02-0.78 0.03-1.18 0.05-0.63 0.1-1.25 0.16-1.87zm32.32 1.56c0.03-0.62 0.09-1.25 0.16-1.87 0.01-0.05 0.06-0.49 0.07-0.61 0.03-0.24 0.07-0.47 0.11-0.71 0.22-1.42 0.52-2.83 0.86-4.23 0.67-2.74 1.55-5.44 2.57-8.07 0.12-0.31 0.25-0.62 0.37-0.93 0.04-0.09 0.06-0.15 0.08-0.2s0.05-0.11 0.09-0.2c0.26-0.6 0.53-1.19 0.81-1.79 0.57-1.23 1.2-2.43 1.86-3.62 0.56-1.01 1.17-1.99 1.8-2.95 0.29-0.44 0.6-0.88 0.92-1.31 0.03-0.04 0.06-0.08 0.08-0.11 0.43-0.54 0.88-1.06 1.33-1.58 2.31-2.64 5.31-5.18 8.31-5.97 0.06-0.02 0.52-0.09 0.62-0.12 0.2-0.01 0.4-0.02 0.6-0.02 0.08 0 0.34 0.03 0.48 0.04 0.16 0.04 0.32 0.08 0.48 0.13 0.01 0 0.02 0.01 0.04 0.01 0.03 0.01 0.05 0.03 0.08 0.04 0.08 0.04 0.3 0.19 0.4 0.25l0.32 0.32c0.08 0.12 0.15 0.23 0.22 0.35 0.04 0.07 0.17 0.35 0.22 0.46 0.06 0.19 0.12 0.39 0.18 0.59 0.07 0.26 0.12 0.53 0.17 0.8-0.09-0.47 0.02 0.5 0.02 0.56 0.08 1.72-0.21 2.92-0.74 4.7-0.87 2.91-2.43 5.61-4.06 8.16-3.69 5.8-8.45 10.92-13.64 15.58-1.56 1.4-3.19 2.74-4.86 4.02 0-0.56 0.02-1.14 0.05-1.72z"/> - <path d="m123.94 302.28c5.39 0 9.76-4.37 9.76-9.76s-4.37-9.76-9.76-9.76-9.76 4.37-9.76 9.76c0.01 5.39 4.37 9.76 9.76 9.76z"/> - <path d="m100.95 304.2h-10.18v-14.24s0.33-3.71-3.62-2.33-13.04 4.02-13.04 4.02-2.11 0.3-2.11 3.04c0 2.31 0.03 3.65 0.07 9.5h-4.82c-0.73 0-1.31 0.59-1.31 1.32v13.31c0 0.73 0.59 1.32 1.31 1.32h4.88c0.01 7.08 0.02 16.45 0.02 29 0 0-1.19 23.5 28.5 11.93 0 0 1.49-0.81 1.61-2.11v-12.89s0.02-1.97-1.83-1.09c0 0-9.66 4.41-9.66-1.91v-22.95h10.19c0.73 0 1.31-0.59 1.31-1.32v-13.31c0-0.7-0.59-1.29-1.32-1.29z"/> - <path d="m174.1 304.2c-3.18 0-6.23 0.65-9.05 1.83v-0.56c0-0.73-0.59-1.32-1.31-1.32h-22.46c-0.73 0-1.31 0.59-1.31 1.32v13.31c0 0.73 0.59 1.32 1.31 1.32h4.27v51.69h-4.27c-0.73 0-1.31 0.59-1.31 1.32v13.31c0 0.73 0.59 1.32 1.31 1.32h27.94c0.73 0 1.31-0.59 1.31-1.32v-13.31c0-0.73-0.59-1.32-1.31-1.32h-4.17v-9.33c2.82 1.18 5.87 1.83 9.05 1.83 14.5 0 26.26-13.45 26.26-30.04s-11.76-30.05-26.26-30.05zm0.3 44.51c-5.2-0.02-9.38-6.52-9.35-14.51 0.04-7.99 4.28-14.45 9.48-14.42 5.2 0.02 9.38 6.52 9.35 14.51-0.04 7.98-4.28 14.44-9.48 14.42z"/> - <path d="m279.41 380.67c-2.18 0-3.37 1.88-3.37 3.4 0 1.58 1.4 3.22 3.37 3.22 2.24 0 3.43-1.43 3.43-3.22 0-1.52-1.25-3.4-3.43-3.4z"/> - <path d="m292.59 383.2c-1.91-0.03-3.07-1.58-3.07-3.52s0.87-3.82 2.62-3.82c1.37 0 1.82 1.7 1.88 3.13h4.39v-6.74h-3.52l-0.51 1.43c-0.51-0.6-1.7-1.7-3.73-1.7-3.82 0-7.34 2.36-7.34 7.64 0 5.31 3.82 7.97 8.2 7.97 3.22 0 5.91-1.52 7.31-3.04l-2.63-3.04c-0.97 1.07-2.02 1.72-3.6 1.69z"/> - <path d="m307.63 371.89c-4.12 0-8.14 2.77-8.17 7.76-0.06 5.28 4.06 7.91 8.32 7.91 4.54 0 8.2-2.83 8.14-7.79-0.09-4.98-3.58-7.82-8.29-7.88zm0.15 11.85c-1.25 0-2.21-1.61-2.21-4.06 0-2.18 0.89-3.91 2.06-3.91 1.4 0.03 2.18 1.76 2.18 4s-0.75 3.97-2.03 3.97z"/> - <path d="m341.43 379.02c0-3.64-0.75-7.16-5.58-7.16-2.06 0-3.46 1.1-4.38 2.15-0.48-0.72-1.43-2.15-4.45-2.15-1.88 0-3.25 1.61-3.73 2.18l-0.66-1.76h-5.64v3.94h1.25v7.04h-1.25v3.91h8.86v-3.91h-1.79v-5.31c0-1.22 0.39-1.79 1.34-1.79 1.19 0 1.25 0.98 1.25 3.4v7.61h7.73v-4h-1.79v-4.83c0-1.28 0.3-2.18 1.58-2.18 1.4 0 1.13 2.27 1.13 3.7v7.31h7.58v-4.03h-1.46v-4.12z"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/funding/ulule.svg b/app/Views/_assets/images/platforms/funding/ulule.svg deleted file mode 100644 index 5d932e426aa562d692b7159d1fdb5da6fb59c5e5..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/funding/ulule.svg +++ /dev/null @@ -1,37 +0,0 @@ -<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg"> - <defs> - <clipPath id="clipPath1961"> - <path d="m0 817.8v-793.72h595.29v793.72z"/> - </clipPath> - <clipPath id="clipPath1967"> - <path d="m595.29 817.8v-793.72h-595.29v793.72z"/> - </clipPath> - <clipPath id="clipPath1973"> - <path d="m0 0h595.29v841.89h-595.29z"/> - </clipPath> - </defs> - <rect width="1050" height="300" rx="150" ry="150" fill="#18a5d6"/> - <g transform="matrix(0 -1.5089 -1.5089 0 1164.3 599.12)"> - <g clip-path="url(#clipPath1961)"> - <g clip-path="url(#clipPath1967)"> - <g clip-path="url(#clipPath1973)"> - <path d="m290.35 431.32c-8.2612 0-11.755 4.0252-11.755 9.9556 0 5.932 3.4935 9.9572 11.755 9.9572h17.056c0.8992 0 1.6053 0.7704 1.527 1.6665l-1.1216 12.82c-0.0697 0.7914-0.7325 1.3991-1.527 1.3991h-15.935c-17.687 0-26.583-10.38-26.583-25.842 0-15.462 9.0014-25.841 26.583-25.841h20.188c0.8999 0 1.6053 0.7704 1.527 1.6665l-1.1216 12.82c-0.069 0.7914-0.7317 1.3991-1.527 1.3991z" fill="#fff"/> - <path d="m290.35 331.14c-8.2612 0-11.755 4.0252-11.755 9.9556 0 5.932 3.4935 9.9572 11.755 9.9572h25.822c0.8991 0 1.6052 0.7712 1.5262 1.6665l-1.1216 12.82c-0.069 0.7914-0.7317 1.3999-1.5262 1.3999h-24.7c-17.687 0-26.583-10.38-26.583-25.843 0-15.462 9.0014-25.841 26.583-25.841h28.953c0.8992 0 1.6053 0.7704 1.527 1.6665l-1.1216 12.82c-0.069 0.7922-0.7317 1.3991-1.527 1.3991z" fill="#fff"/> - <path d="m281.03 305.3h-14.355c-0.8456 0-1.5324-0.6867-1.5324-1.5332v-29.194c0-0.8456 0.6868-1.5324 1.5324-1.5324h12.822c0.8465 0 1.5332 0.6868 1.5332 1.5324v14.84h40.532c0.8991 0 1.6052 0.7705 1.5269 1.6665l-1.1215 12.822c-0.0698 0.7922-0.7325 1.3991-1.527 1.3991z" fill="#fff"/> - <path d="m281.03 405.49h-14.355c-0.8456 0-1.5324-0.6859-1.5324-1.5331v-29.194c0-0.8456 0.6868-1.5324 1.5324-1.5324h12.822c0.8465 0 1.5332 0.6868 1.5332 1.5324v14.84h31.767c0.9 0 1.6053 0.7704 1.527 1.6665l-1.1216 12.822c-0.069 0.7922-0.7317 1.3991-1.527 1.3991z" fill="#fff"/> - <path d="m314.37 224.48h12.876c0.8992 0 1.6053 0.7705 1.527 1.6657l-3.1834 36.381c-0.069 0.7914-0.7317 1.3999-1.527 1.3999h-57.384c-0.8465 0-1.5332-0.6867-1.5332-1.5332v-36.38c0-0.8472 0.6867-1.5332 1.5332-1.5332h12.822c0.8456 0 1.5324 0.686 1.5324 1.5332v22.026h8.6216v-13.397c0-0.8457 0.686-1.5324 1.5324-1.5324h10.707c0.8464 0 1.5324 0.6867 1.5324 1.5324v13.397h7.4783l1.9386-22.16c0.0698-0.7922 0.7325-1.3991 1.527-1.3991" fill="#fff"/> - <path d="m231.37 556.56c0 36.543 29.729 66.272 66.272 66.272h33.386c2.1262 0 4.1268-0.8286 5.6313-2.3323 1.5037-1.5045 2.3323-3.5043 2.3323-5.6312 0-1.8882-0.6527-3.6764-1.851-5.1057 16.783-12.491 26.774-32.312 26.774-53.203s-9.9913-40.712-26.774-53.202c1.1983-1.4309 1.851-3.2191 1.851-5.1065 0-2.1261-0.8278-4.1259-2.3308-5.6297-1.5076-1.5052-3.5082-2.3338-5.6328-2.3338h-33.386c-36.544 0-66.272 29.73-66.272 66.272" fill="#fff"/> - <path d="m332.82 496.46c0.4961 0.4953 0.7433 1.1464 0.7433 1.7944 0 0.6511-0.2472 1.2983-0.7433 1.7944l-4.1663 4.1678c17.858 10.603 29.833 30.072 29.833 52.347 0 22.274-11.975 41.743-29.833 52.346l4.1663 4.1678c0.4961 0.4953 0.7433 1.1433 0.7433 1.7944 0 0.648-0.2472 1.2983-0.7433 1.7944-0.4961 0.496-1.1464 0.7441-1.7944 0.7441h-33.386c-33.604 0-60.847-27.242-60.847-60.847 0-33.605 27.242-60.847 60.847-60.847h33.386c0.648 0 1.2983 0.2472 1.7944 0.7433"/> - <path d="m263.77 530.31c0 10.821 6.1335 20.206 15.112 24.876 1.1239 0.5852 1.1239 2.1641 0 2.7493-8.979 4.6701-15.112 14.055-15.112 24.876 0 16.145 13.651 29.101 30.04 27.957 13.706-0.9565 24.842-11.981 25.925-25.677 0.9487-12.004-5.6762-22.568-15.602-27.442-2.4509 2.1479-5.6498 3.4609-9.165 3.4609-3.8616 0-7.3473-1.5789-9.8719-4.1159-0.2356-0.2364-0.2356-0.6294 0-0.8658 2.5246-2.5369 6.0103-4.1151 9.8719-4.1151 3.5152 0 6.7141 1.3123 9.165 3.4602 9.9254-4.874 16.55-15.437 15.602-27.442-1.0821-13.696-12.219-24.721-25.925-25.677-16.39-1.1441-30.04 11.812-30.04 27.957" fill="#fff"/> - <path d="m313.64 583.81c-0.5868-6.1134-5.7188-10.917-11.99-10.959-6.6986-0.0427-12.167 5.3498-12.214 12.05-0.0457 6.7001 5.3468 12.169 12.047 12.212 6.3242 0.045 11.526-4.7677 12.128-10.94 7e-3 -8e-4 0.0132-2e-3 0.0201-2e-3 -0.6162 9.2991-8.3627 16.628-17.806 16.565-9.8068-0.0667-17.7-8.0713-17.633-17.873 0.0667-9.8067 8.0667-17.697 17.875-17.635 9.3634 0.0635 16.971 7.3798 17.573 16.581" fill="#18a5d6"/> - <path d="m311.45 582.34c-1.01-1.0666-2.0161-1.7704-3.6616-1.7603-2.3711 9e-3 -4.2981 2.0145-4.3089 4.4724 0.0155 2.3455 2.006 4.3259 4.3476 4.3407 1.9138 0.0108 2.9757-1.0953 3.5454-1.6898l0.255-0.262c0.6465-0.6712 1.1627-1.2006 1.9843-1.2626-0.6015 6.1722-5.8033 10.986-12.128 10.94-6.7001-0.0427-12.093-5.5111-12.046-12.211 0.0458-6.7009 5.5142-12.093 12.213-12.05 6.2707 0.0411 11.403 4.8453 11.99 10.958 3e-3 0.0326 3e-3 0.0644 5e-3 0.0969-0.7301-0.0635-1.5184-0.827-2.1951-1.5719" fill="#18a5d6"/> - <path d="m311.45 582.34c-1.01-1.0666-2.0161-1.7704-3.6616-1.7603-2.3711 9e-3 -4.2981 2.0145-4.3089 4.4724 0.0155 2.3455 2.006 4.3259 4.3476 4.3407 1.9138 0.0108 2.9757-1.0953 3.5454-1.6898l0.255-0.262c0.6465-0.6712 1.1627-1.2006 1.9843-1.2626-0.6015 6.1722-5.8033 10.986-12.128 10.94-6.7001-0.0427-12.093-5.5111-12.046-12.211 0.0458-6.7009 5.5142-12.093 12.213-12.05 6.2707 0.0411 11.403 4.8453 11.99 10.958 3e-3 0.0326 3e-3 0.0644 5e-3 0.0969-0.7301-0.0635-1.5184-0.827-2.1951-1.5719" fill="#004e69"/> - <path d="m313.64 527.07c-5e-3 0-0.0101-2e-3 -0.0155-2e-3 -0.5496-6.2257-5.7777-11.096-12.14-11.052-6.7001 0.0427-12.093 5.5119-12.046 12.212 0.0457 6.7001 5.5142 12.093 12.214 12.05 6.2645-0.0411 11.393-4.8375 11.987-10.944h8e-4c-0.6085 9.1944-8.2132 16.502-17.571 16.566-9.8091 0.0635-17.809-7.8264-17.876-17.634-0.0667-9.8014 7.8271-17.806 17.632-17.873 9.482-0.0628 17.253 7.3249 17.814 16.677" fill="#f01446"/> - <path d="m311.45 525.49c-1.01-1.0658-2.0161-1.7696-3.6617-1.7595-2.371 9e-3 -4.2988 2.0145-4.3096 4.4724 0.0155 2.3455 2.0068 4.3259 4.3476 4.3407 1.9138 0.0108 2.9749-1.0961 3.5454-1.6898l0.2558-0.2628c0.6534-0.6774 1.1728-1.213 2.0107-1.265-0.5938 6.1056-5.7227 10.902-11.987 10.943-6.6994 0.0426-12.167-5.3491-12.214-12.05-0.0458-6.7001 5.3467-12.169 12.047-12.211 6.3622-0.0457 11.59 4.8251 12.14 11.051-0.7247-0.0759-1.5037-0.8301-2.1742-1.5688" fill="#f01446"/> - <path d="m311.45 525.49c-1.01-1.0658-2.0161-1.7696-3.6617-1.7595-2.371 9e-3 -4.2988 2.0145-4.3096 4.4724 0.0155 2.3455 2.0068 4.3259 4.3476 4.3407 1.9138 0.0108 2.9749-1.0961 3.5454-1.6898l0.2558-0.2628c0.6534-0.6774 1.1728-1.213 2.0107-1.265-0.5938 6.1056-5.7227 10.902-11.987 10.943-6.6994 0.0426-12.167-5.3491-12.214-12.05-0.0458-6.7001 5.3467-12.169 12.047-12.211 6.3622-0.0457 11.59 4.8251 12.14 11.051-0.7247-0.0759-1.5037-0.8301-2.1742-1.5688" fill="#8b0020"/> - <path d="m313.64 529.32c0 5e-3 -8e-4 0.0101-8e-4 0.0147h-8e-4c0-5e-3 2e-3 -0.0101 2e-3 -0.0147" fill="#fff"/> - </g> - </g> - </g> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/amazon.svg b/app/Views/_assets/images/platforms/podcasting/amazon.svg deleted file mode 100644 index 5d6af71eba28109a0d8a31cab9635baa73b8c7d7..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/amazon.svg +++ /dev/null @@ -1,9 +0,0 @@ -<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="300" height="300" rx="67" fill="#fff"/> - <g transform="matrix(.66677 0 0 .66677 64.525 64.708)" fill-rule="evenodd"> - <path d="m221.5 210.32c-105.24 50.083-170.54 8.18-212.35-17.271-2.587-1.604-6.984 0.375-3.169 4.757 13.928 16.888 59.573 57.593 119.15 57.593 59.621 0 95.09-32.532 99.527-38.207 4.407-5.627 1.294-8.731-3.16-6.872zm29.555-16.322c-2.826-3.68-17.184-4.366-26.22-3.256-9.05 1.078-22.634 6.609-21.453 9.93 0.606 1.244 1.843 0.686 8.06 0.127 6.234-0.622 23.698-2.826 27.337 1.931 3.656 4.79-5.57 27.608-7.255 31.288-1.628 3.68 0.622 4.629 3.68 2.178 3.016-2.45 8.476-8.795 12.14-17.774 3.639-9.028 5.858-21.622 3.71-24.424z" fill="#f90" fill-rule="nonzero"/> - <path d="m150.74 108.13c0 13.141 0.332 24.1-6.31 35.77-5.361 9.489-13.853 15.324-23.341 15.324-12.952 0-20.495-9.868-20.495-24.432 0-28.75 25.76-33.968 50.146-33.968zm34.015 82.216c-2.23 1.992-5.456 2.135-7.97 0.806-11.196-9.298-13.189-13.615-19.356-22.487-18.502 18.882-31.596 24.527-55.601 24.527-28.37 0-50.478-17.506-50.478-52.565 0-27.373 14.85-46.018 35.96-55.126 18.313-8.066 43.884-9.489 63.43-11.718v-4.365c0-8.018 0.616-17.506-4.08-24.432-4.128-6.215-12.003-8.777-18.93-8.777-12.856 0-24.337 6.594-27.136 20.257-0.57 3.037-2.799 6.026-5.835 6.168l-32.735-3.51c-2.751-0.618-5.787-2.847-5.028-7.07 7.543-39.66 43.36-51.616 75.43-51.616 16.415 0 37.858 4.365 50.81 16.795 16.415 15.323 14.849 35.77 14.849 58.02v52.565c0 15.798 6.547 22.724 12.714 31.264 2.182 3.036 2.657 6.69-0.095 8.966-6.879 5.74-19.119 16.415-25.855 22.393l-0.095-0.095"/> - <path d="m221.5 210.32c-105.24 50.083-170.54 8.18-212.35-17.271-2.587-1.604-6.984 0.375-3.169 4.757 13.928 16.888 59.573 57.593 119.15 57.593 59.621 0 95.09-32.532 99.527-38.207 4.407-5.627 1.294-8.731-3.16-6.872zm29.555-16.322c-2.826-3.68-17.184-4.366-26.22-3.256-9.05 1.078-22.634 6.609-21.453 9.93 0.606 1.244 1.843 0.686 8.06 0.127 6.234-0.622 23.698-2.826 27.337 1.931 3.656 4.79-5.57 27.608-7.255 31.288-1.628 3.68 0.622 4.629 3.68 2.178 3.016-2.45 8.476-8.795 12.14-17.774 3.639-9.028 5.858-21.622 3.71-24.424z" fill="#f90" fill-rule="nonzero"/> - <path d="m150.74 108.13c0 13.141 0.332 24.1-6.31 35.77-5.361 9.489-13.853 15.324-23.341 15.324-12.952 0-20.495-9.868-20.495-24.432 0-28.75 25.76-33.968 50.146-33.968zm34.015 82.216c-2.23 1.992-5.456 2.135-7.97 0.806-11.196-9.298-13.189-13.615-19.356-22.487-18.502 18.882-31.596 24.527-55.601 24.527-28.37 0-50.478-17.506-50.478-52.565 0-27.373 14.85-46.018 35.96-55.126 18.313-8.066 43.884-9.489 63.43-11.718v-4.365c0-8.018 0.616-17.506-4.08-24.432-4.128-6.215-12.003-8.777-18.93-8.777-12.856 0-24.337 6.594-27.136 20.257-0.57 3.037-2.799 6.026-5.835 6.168l-32.735-3.51c-2.751-0.618-5.787-2.847-5.028-7.07 7.543-39.66 43.36-51.616 75.43-51.616 16.415 0 37.858 4.365 50.81 16.795 16.415 15.323 14.849 35.77 14.849 58.02v52.565c0 15.798 6.547 22.724 12.714 31.264 2.182 3.036 2.657 6.69-0.095 8.966-6.879 5.74-19.119 16.415-25.855 22.393l-0.095-0.095"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/antennapod.svg b/app/Views/_assets/images/platforms/podcasting/antennapod.svg deleted file mode 100644 index e59072943e73f7cc4d9be358ae660ba4e781f5af..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/antennapod.svg +++ /dev/null @@ -1,14 +0,0 @@ -<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="300" height="300" rx="67" fill="#fff"/> - <g transform="matrix(.18722 0 0 .18722 22.187 22.187)"> - <circle cx="682.67" cy="682.67" r="454" fill="#219dff"/> - <g stroke-width="1.8511"> - <path d="m684.63 369.89c-30.328-0.19072-60.66 3.7865-90.174 11.924-75.664 20.861-141.7 69.154-187.06 136.81-16.702 24.907-35.504 67.624-43.424 98.652-30.406 119.13 10.485 249.64 103.11 329.1 11.68 10.02 35.34 28.056 36.912 28.139 0.4157 0.0219 4.4739-10.608 9.0195-23.623s8.2364-24.263 8.2012-24.996c-0.0352-0.73322-3.7896-4.0326-8.3438-7.332-11.262-8.1592-35.408-31.659-45.889-44.66-41.118-51.006-62.054-110.64-62.012-176.64 0.0281-44.14 9.0261-82.782 28.328-121.65 41.156-82.883 118.3-138.83 210.28-152.51 19.137-2.8445 58.771-2.8282 78.039 0.0332 123.25 18.302 218.67 113.95 236.24 236.8 2.6716 18.681 2.9826 54.435 0.625 71.988-7.2733 54.151-28.808 104.05-62.129 143.98-10.249 12.28-31.548 33.033-43.629 42.512-4.9475 3.8817-8.9941 7.5494-8.9941 8.1504 0 0.60105 3.7748 11.654 8.3887 24.564l8.3887 23.475 9.9336-6.8301c16.268-11.182 27.712-20.847 43.977-37.137 26.937-26.98 44.633-51.564 62.01-86.152 33.563-66.807 42.974-144.94 26.375-218.96-13.261-59.134-42.302-112.25-85.658-156.68-41.938-42.977-95.65-74.155-152.8-88.699-26.188-6.664-52.945-10.078-79.705-10.246zm-3.4902 126.9c-25.617 0.0821-40.596 2.4243-62.699 9.8047-42.582 14.218-82.4 45.34-106.82 83.486-12.014 18.768-24.43 50.892-28.545 73.855-2.8002 15.627-3.1666 49.819-0.68555 63.99 6.1754 35.272 18.553 64.851 38.334 91.607 7.4456 10.071 25.39 29.707 27.148 29.707 0.54638 0 4.9719-11.248 9.834-24.996 4.862-13.748 8.8365-25.609 8.832-26.357-4e-3 -0.74892-2.9144-5.3502-6.4668-10.225-19.334-26.529-28.693-55.995-28.713-90.398-0.0161-27.648 6.2921-51.227 20.021-74.836 41.912-72.071 134.34-96.885 206.39-55.408 69.532 40.028 95.763 125.29 60.779 197.57-3.549 7.3321-9.7238 17.768-13.723 23.193l-7.2715 9.8633 6.2246 16.799c3.4229 9.2394 7.5615 20.85 9.1992 25.799s3.4896 8.998 4.1133 8.998c1.9707 0 22.549-23.129 30.588-34.379 14.862-20.798 27.475-49.854 32.529-74.938 9.0653-44.987 3.9852-87.74-15.162-127.63-11.039-22.999-21.92-38.363-39.934-56.383-23.686-23.694-47.905-38.656-79.863-49.336-23.439-7.833-36.795-9.8707-64.109-9.7832z" fill="#1460cc"/> - <path d="m684.63 353.89c-30.328-0.19072-60.66 3.7865-90.174 11.924-75.664 20.861-141.7 69.154-187.06 136.81-16.702 24.907-35.504 67.624-43.424 98.652-30.406 119.13 10.485 249.64 103.11 329.1 11.68 10.02 35.34 28.056 36.912 28.139 0.4157 0.0219 4.4739-10.608 9.0195-23.623s8.2364-24.263 8.2012-24.996c-0.0352-0.73322-3.7896-4.0326-8.3438-7.332-11.262-8.1592-35.408-31.659-45.889-44.66-41.118-51.006-62.054-110.64-62.012-176.64 0.0281-44.14 9.0261-82.782 28.328-121.65 41.156-82.883 118.3-138.83 210.28-152.51 19.137-2.8445 58.771-2.8282 78.039 0.0332 123.25 18.302 218.67 113.95 236.24 236.8 2.6716 18.681 2.9826 54.435 0.625 71.988-7.2733 54.151-28.808 104.05-62.129 143.98-10.249 12.28-31.548 33.033-43.629 42.512-4.9475 3.8817-8.9941 7.5494-8.9941 8.1504 0 0.60105 3.7748 11.654 8.3887 24.564l8.3887 23.475 9.9336-6.8301c16.268-11.182 27.712-20.847 43.977-37.137 26.937-26.98 44.633-51.564 62.01-86.152 33.563-66.807 42.974-144.94 26.375-218.96-13.261-59.134-42.302-112.25-85.658-156.68-41.938-42.977-95.65-74.155-152.8-88.699-26.188-6.664-52.945-10.078-79.705-10.246zm-3.4902 126.9c-25.617 0.0821-40.596 2.4243-62.699 9.8047-42.582 14.218-82.4 45.34-106.82 83.486-12.014 18.768-24.43 50.892-28.545 73.855-2.8002 15.627-3.1666 49.819-0.68555 63.99 6.1754 35.272 18.553 64.851 38.334 91.607 7.4456 10.071 25.39 29.707 27.148 29.707 0.54638 0 4.9719-11.248 9.834-24.996 4.862-13.748 8.8365-25.609 8.832-26.357-4e-3 -0.74892-2.9144-5.3502-6.4668-10.225-19.334-26.529-28.693-55.995-28.713-90.398-0.0161-27.648 6.2921-51.227 20.021-74.836 41.912-72.071 134.34-96.885 206.39-55.408 69.532 40.028 95.763 125.29 60.779 197.57-3.549 7.3321-9.7238 17.768-13.723 23.193l-7.2715 9.8633 6.2246 16.799c3.4229 9.2394 7.5615 20.85 9.1992 25.799s3.4896 8.998 4.1133 8.998c1.9707 0 22.549-23.129 30.588-34.379 14.862-20.798 27.475-49.854 32.529-74.938 9.0653-44.987 3.9852-87.74-15.162-127.63-11.039-22.999-21.92-38.363-39.934-56.383-23.686-23.694-47.905-38.656-79.863-49.336-23.439-7.833-36.795-9.8707-64.109-9.7832z" fill="#d1edfc" fill-opacity=".87843"/> - </g> - <g> - <path d="m682.03 622.6c-19.36 0.0221-37.97 7.7326-52.885 22.652-16.373 16.378-23.647 35.213-22.15 57.348 1.1862 17.539 6.0532 30.177 16.906 43.912l5.6055 7.0957-4.0566 11.49c-2.2314 6.3194-18.997 53.783-37.256 105.47-18.259 51.692-45.144 128.02-59.746 169.62-8.9313 25.443-16.753 47.261-21.799 60.967a454 454 0 0 0 60.086 20.459l1.2168-3.4649c3.6623-10.421 13.074-37.144 20.916-59.385l14.258-40.436 4.0254 0.5977c2.2145 0.3288 11.823 2.0197 21.352 3.7578 15.561 2.8383 21.124 3.1583 54.639 3.1523 33.586-0.01 38.979-0.3194 53.973-3.1484 9.162-1.7287 18.492-3.4201 20.732-3.7578l4.0742-0.6133 20.82 59.088c6.307 17.9 11.678 33.388 15.406 44.33a454 454 0 0 0 60.4-20.52c-9.5845-26.55-31.781-89.038-57.273-161.32-33.746-95.685-62.366-176.69-63.6-180l-2.2441-6.0312 6.5312-8.6328c18.543-24.511 21.476-53.85 8.1211-81.219-5.7788-11.842-21.191-27.262-33.029-33.043-11.52-5.6256-23.407-8.3804-35.023-8.3672zm0.0352 172.9c0.70363-1.1389 57.584 157.79 57.676 161.15 0.10235 3.7643-60.665 8.6812-79.922 6.4668-15.31-1.7605-34.648-5.1487-34.648-6.0703 0-1.3249 55.809-159.79 56.895-161.54z" fill="#1460cc"/> - <path d="m682.03 606.6c-19.36 0.0221-37.97 7.7326-52.885 22.652-16.373 16.378-23.647 35.213-22.15 57.348 1.1862 17.539 6.0532 30.177 16.906 43.912l5.6055 7.0957-4.0566 11.49c-2.2314 6.3194-18.997 53.783-37.256 105.47-18.259 51.692-45.144 128.02-59.746 169.62-13.273 37.813-24.664 69.294-27.016 74.734 19.531 8.5036 39.636 15.622 60.166 21.303l6.3535-18.076c3.6623-10.421 13.074-37.144 20.916-59.385l14.258-40.436 4.0254 0.5977c2.2145 0.3288 11.823 2.0197 21.352 3.7578 15.561 2.8383 21.124 3.1583 54.639 3.1523 33.586-0.01 38.979-0.3194 53.973-3.1484 9.162-1.7287 18.492-3.4201 20.732-3.7578l4.0742-0.6133 20.82 59.088c10.619 30.139 19.265 55.326 20.275 59.022 20.749-5.7038 41.065-12.876 60.797-21.461-0.0977-0.01-0.17206-0.031-0.21093-0.072-0.53381-0.5652-28.582-79.314-62.328-175-33.746-95.685-62.366-176.69-63.6-180l-2.2441-6.0312 6.5312-8.6328c18.543-24.511 21.476-53.85 8.1211-81.219-5.7788-11.842-21.191-27.262-33.029-33.043-11.52-5.6256-23.407-8.3804-35.023-8.3672zm0.0352 172.9c0.70363-1.1389 57.584 157.79 57.676 161.15 0.10235 3.7643-60.665 8.6812-79.922 6.4668-15.31-1.7605-34.648-5.1487-34.648-6.0703 0-1.3249 55.809-159.79 56.895-161.54z" fill="#fff" fill-opacity=".87843"/> - </g> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/apple.svg b/app/Views/_assets/images/platforms/podcasting/apple.svg deleted file mode 100644 index db1d3e8660a53a21df0616756fbf988f60eddb72..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/apple.svg +++ /dev/null @@ -1,14 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 300"> - <defs> - <linearGradient id="apple-podcasts" x1="150" y1="300" x2="150" gradientUnits="userSpaceOnUse"> - <stop offset="0" stop-color="#822cbe"/> - <stop offset="1" stop-color="#d772fb"/> - </linearGradient> - </defs> - <g id="apple-podcasts-2" data-name="apple-podcasts"> - <rect width="300" height="300" rx="67" fill="url(#apple-podcasts)"/> - <path d="M144.55,233.2c-6.53-2.34-7.94-5.51-10.61-24.11-3.12-21.62-3.8-35-2-39.23,2.39-5.62,8.88-8.81,18-8.85s15.56,3.18,18,8.85c1.81,4.23,1.14,17.61-2,39.23-2.12,15.1-3.28,18.92-6.2,21.49a15,15,0,0,1-15.1,2.63ZM116.65,211c-22.54-11.09-37-29.86-42.24-54.82-1.31-6.44-1.53-21.82-.29-27.73,3.28-15.86,9.56-28.27,20-39.25C109.14,73.38,128.47,65,150,65a74.93,74.93,0,0,1,55.22,23.59c11.17,11.61,17.44,23.88,20.65,40.06,1.1,5.38,1.1,20.06.08,26.12a77.61,77.61,0,0,1-29.55,48.3c-5.55,4.18-19.12,11.49-21.31,11.49-.8,0-.87-.83-.51-4.19.66-5.4,1.32-6.52,4.38-7.81,4.89-2,13.21-8,18.31-13.09a69.77,69.77,0,0,0,18.32-32.24c1.89-7.52,1.67-24.23-.44-32-6.64-24.59-26.71-43.7-51.29-48.81-7.15-1.46-20.14-1.46-27.36,0-24.88,5.11-45.45,25.17-51.73,50.42-1.68,6.85-1.68,23.56,0,30.42,4.16,16.71,15,32,29.11,41.15a62.4,62.4,0,0,0,7.52,4.3c3.06,1.32,3.72,2.41,4.3,7.81.37,3.28.29,4.23-.51,4.23a59.41,59.41,0,0,1-8.17-3.5Zm.3-29.68c-7.59-6.06-14.3-16.8-17.08-27.33-1.67-6.36-1.67-18.46.08-24.81,4.59-17.13,17.21-30.41,34.72-36.64,6-2.12,19.27-2.59,26.63-1,25.39,5.66,43.41,31.08,39.91,56.31a51.41,51.41,0,0,1-11.09,26.26c-3.06,3.92-10.5,10.49-11.82,10.49-.22,0-.43-2.48-.43-5.5v-5.52l3.79-4.52c14.3-17.13,13.28-41.06-2.34-56.76-6-6.11-13-9.7-22.1-11.36-5.84-1.08-7.08-1.08-13.21-.07a40,40,0,0,0-22.91,11.45c-15.68,15.54-16.7,39.6-2.4,56.74l3.76,4.52v5.55c0,3.06-.24,5.54-.54,5.54a26.16,26.16,0,0,1-4.67-3.28Zm25.31-29.79c-6.49-3-10-8.72-10.07-16.15,0-6.67,3.72-12.49,10.14-15.9,4.09-2.15,11.31-2.15,15.4,0A19.81,19.81,0,0,1,167.21,131c4.24,14.39-11,27-24.8,20.55Z" fill="#fff"/> - <circle cx="151.15" cy="136.19" r="18.2" fill="#fff"/> - <path d="M152.89,161.43a36.45,36.45,0,0,1,6.09,1.24,21.89,21.89,0,0,1,6.1,3.05,10.74,10.74,0,0,1,3.51,3.85,16.33,16.33,0,0,1,1.31,6.09,102.7,102.7,0,0,1-.51,14.3c-.66,7.42-2,18.3-3,25.27s-1.75,10.07-2.7,12.33a11.08,11.08,0,0,1-8.1,7.08,17.7,17.7,0,0,1-4.23.36,18.24,18.24,0,0,1-4.23-.36,13.42,13.42,0,0,1-5.48-2.34,11.86,11.86,0,0,1-3.64-5.69c-.88-2.48-1.54-5.47-2.41-11.45s-2-14.89-2.77-21.67-1-11.46-1.08-14.59a22.66,22.66,0,0,1,.43-6.21,12.6,12.6,0,0,1,1.75-4,13.39,13.39,0,0,1,2.92-3,12,12,0,0,1,3.4-1.84,25.47,25.47,0,0,1,4.67-1.31c1.9-.37,4.09-.73,5.21-.88a5.61,5.61,0,0,1,2.38,0Z" fill="#fff"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/blubrry.svg b/app/Views/_assets/images/platforms/podcasting/blubrry.svg deleted file mode 100644 index 56becf31c8df597e47fe519fbcdd12062b8e1d15..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/blubrry.svg +++ /dev/null @@ -1,6 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"> - <g id="blubrry"> - <rect width="300" height="300" rx="67" fill="#b347a3"/> - <path d="M182.68,88.87s7.79-17.79,7.39-18.13-17.85,10.63-17.85,10.63S150.91,65,150.06,65c-1.14,0-19.27,15-19.27,15S111.46,66,111,66.48,117.26,89,117.26,89c-28.14,11.88-47.74,37.74-47.74,69.11,0,42.45,36,76.9,80.48,76.9,45.92,0,80.48-34.45,80.48-76.9C230.48,126.73,210.82,100.87,182.68,88.87Zm7.85,69a37.88,37.88,0,0,0-21.77-33.42l3-7.45a45.85,45.85,0,0,1,27.12,40.87Zm18.24,0a55,55,0,0,0-33.53-49.67l4.26-10.75c24.39,10.52,41.32,33.6,41.32,60.43Z" fill="#fff"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/breaker.svg b/app/Views/_assets/images/platforms/podcasting/breaker.svg deleted file mode 100644 index 27eeadd7408cdbdf523848b3d8f6eb020ab90625..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/breaker.svg +++ /dev/null @@ -1,11 +0,0 @@ -<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="300" height="300" rx="67" fill="#f2f8ff"/> - <g transform="matrix(1.36 0 0 1.36 -45.282 22.882)"> - <path d="m133.88 120.47c4.08 12.49 10.64 23.85 19.12 33.5 15.88-2.06 29.85-10.22 39.46-22.06-7.84 2.07-16.07 3.17-24.56 3.17-6.79 0-13.42-.72-19.81-2.06-6.67-1.36-12.07-6.21-14.21-12.55z" fill="#1269ff"/> - <path d="m145.09 154.47c2.68 0 5.32-.17 7.91-.51-8.48-9.65-15.04-21.01-19.12-33.5-.64-1.91-.99-3.95-.99-6.07 0-4.77 1.76-9.12 4.66-12.46-11.1 12.41-19.02 27.71-22.48 44.64 8.85 5.03 19.1 7.9 30.02 7.9z" fill="#5c9dff"/> - <path d="m85.78 107.8c4 16.61 14.79 30.57 29.28 38.78 3.47-16.95 11.4-32.28 22.52-44.69 3.48-3.98 8.6-6.49 14.3-6.49 1.27 0 2.5.12 3.7.36-6.36-1.33-12.95-2.04-19.71-2.04-18.35-.01-35.5 5.14-50.09 14.08z" fill="#9ec6ff"/> - <path d="m155.59 95.754c-6.36-1.33-12.95-2.04-19.71-2.04-18.36 0-35.51 5.15-50.1 14.09-1.1-4.59-1.69-9.39-1.69-14.33 0-19.02 8.71-36.01 22.35-47.2 29.91 9.03 53.64 32.31 63.39 61.91.09.26.18.52.26.79-.08-.26-.17-.53-.26-.79-2.19-6.29-7.6-11.12-14.24-12.43z" fill="#d1e3ff"/> - <path d="m203.08 82.474c0-27-22.49-50-58-50-14.66 0-28.12 5.18-38.64 13.8 30.18 9.12 54.07 32.7 63.64 62.69.56 1.75 1.07 3.62 1.53 5.42 17.34-.38 31.47-14.48 31.47-31.91z" fill="#fff"/> - <path d="m151.89 98.394c1.12 0 2.06.09 3.12.3 5.56 1.1 10.12 5.14 11.98 10.43.54 1.7 1.25 4.25 1.7 6l.59 2.31 2.38-.05c18.94-.4 34.43-15.81 34.43-34.91 0-28.93-24.13-53-61-53-15.21.05-29.63 5.58-40.55 14.48-14.31 11.73-23.45 29.56-23.45 49.52.01 5.12.63 10.27 1.78 15.03 4.2 17.43 15.52 32.08 30.71 40.68 9.19 5.18 20.18 8.25 31.51 8.28 2.78 0 5.61-.19 8.29-.53 16.67-2.16 31.32-10.73 41.41-23.14l.66-.81-1.28-4.63-2.47.65c-7.66 2.03-15.51 3.08-23.8 3.07-6.63 0-12.95-.68-19.19-2-5.62-1.13-10.19-5.22-11.99-10.56-.58-1.68-.84-3.24-.83-5.11-.06-4.17 1.37-7.6 3.95-10.53 2.94-3.36 7.25-5.48 12.05-5.48zm-6.8-62.92c34.12 0 55 21.92 55 47 0 14.99-11.56 27.3-26.23 28.78-.39-1.39-.81-2.86-1.17-3.98-9.29-29.1-31.41-51.63-59.87-62.03 9.25-6.28 20.16-9.81 32.27-9.77zm-58 58c0-17.51 7.76-33.21 20.03-43.85 23.34 7.48 42.47 23.45 53.64 44.64-1.45-.64-2.98-1.13-4.58-1.45-6.5-1.35-13.39-2.1-20.3-2.1-17.28.03-33.84 4.58-48 12.4-.53-3.13-.79-6.31-.79-9.64zm60.39 42.48c6.53 1.37 13.47 2.12 20.42 2.12 5.31 0 10.59-.44 15.72-1.25-8.1 7.21-18.23 12.17-29.43 13.94-4.26-5-7.96-10.4-11.05-16.17 1.38.59 2.83 1.05 4.34 1.36zm-.45 15.49c-.64.02-1.29.03-1.94.03-9.73.03-18.59-2.26-26.63-6.45 2.31-10.17 6.25-19.6 11.58-28.14.18 1.57.53 3.13.99 4.52 3.57 10.89 9.08 21.14 16 30.04zm-11.69-51.54c-10.42 11.68-18.29 26.2-22.27 41.94-11.43-7.58-20.01-19.1-23.82-32.62 13.79-8.04 29.5-12.54 46.63-12.51.96 0 1.91.01 2.86.04-1.24.93-2.38 1.98-3.4 3.15z" fill="#003dad"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/castbox.svg b/app/Views/_assets/images/platforms/podcasting/castbox.svg deleted file mode 100644 index 48543373b3d373460d03d5a23cd8e22cbc24b098..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/castbox.svg +++ /dev/null @@ -1,17 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 300"> - <defs> - <linearGradient id="castbox" x1="19.62" y1="19.62" x2="280.38" y2="280.38" gradientUnits="userSpaceOnUse"> - <stop offset="0" stop-color="#ffb768"/> - <stop offset="0.19" stop-color="#ff9953"/> - <stop offset="0.57" stop-color="#ff652e"/> - <stop offset="0.85" stop-color="#ff4518"/> - <stop offset="1" stop-color="#ff390f"/> - </linearGradient> - </defs> - <g id="castbox-2" data-name="castbox"> - <rect width="300" height="300" rx="67" fill="url(#castbox)"/> - <path d="M165.11,103c-5.19,0-9.44,3.78-9.44,9v21.72c0,2.83-2.36,4.72-5.67,4.72s-5.67-2.36-5.67-4.72V104.43c0-4.72-4.25-9-9.44-9s-9.45,3.78-9.45,9V128c0,2.84-2.36,4.72-5.66,4.72s-5.67-2.36-5.67-4.72v-8.5c0-4.72-4.25-9-9.44-9s-9.45,3.78-9.45,9v20.31c0,2.83-2.36,4.72-5.66,4.72s-5.67-2.36-5.67-4.72v-2.36a9.45,9.45,0,1,0-18.89,0v28.33a9.45,9.45,0,0,0,18.89,0v-2.36c0-2.83,2.36-4.72,5.67-4.72s5.66,2.36,5.66,4.72v32.11c0,4.72,4.25,9,9.45,9s9.44-3.78,9.44-9V151.65c0-2.83,2.36-4.72,5.67-4.72s5.66,2.36,5.66,4.72v21.72c0,4.73,4.25,9,9.45,9s9.44-3.78,9.44-9V157.32c0-2.83,2.36-4.72,5.67-4.72s5.67,2.36,5.67,4.72v17.47c0,4.72,4.25,9,9.44,9s9.45-3.77,9.45-9V112c0-4.73-4.25-9-9.45-9" fill="#fff" fill-rule="evenodd"/> - <path d="M195.33,127.57c-5.19,0-9.44,3.78-9.44,9v35.89c0,4.72,4.25,9,9.44,9s9.45-3.77,9.45-9V136.54c0-5.19-4.25-9-9.45-9" fill="#fff" fill-rule="evenodd"/> - <path d="M225.56,145.51c-5.2,0-9.45,3.78-9.45,9v9c0,4.72,4.25,9,9.45,9s9.44-3.78,9.44-9v-9c0-5.2-4.25-9-9.44-9" fill="#fff" fill-rule="evenodd"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/castopod.svg b/app/Views/_assets/images/platforms/podcasting/castopod.svg deleted file mode 100644 index 8b349032bfdb42ad18bb4021609028cae15b3bd0..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/castopod.svg +++ /dev/null @@ -1,12 +0,0 @@ -<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="300" height="300" rx="67" fill="#e7f9e4"/> - <g transform="matrix(.91201 0 0 .91201 57.704 86.433)"> - <path fill="#009486" d="m181.9 131.7h-32.5s-1.2-2.5-2.5-4.9-4.4-2.3-4.4-2.3h-82.8s-3-0.4-4.5 2.3c-1.6 2.7-2.6 4.9-2.6 4.9h-32c-6.9 0-12.6-5.6-12.6-12.5v-98.9c0-6.9 5.6-12.6 12.5-12.6h161.3c6.9 0 12.6 5.6 12.6 12.5v98.9c0.1 6.9-5.6 12.6-12.5 12.6z"/> - <path fill="#E7F9E4" d="m143.7 34.5h-85.1c-14.6 0-26.5 12-26.5 26.6s11.9 26.5 26.5 26.5h85.1c14.6 0 26.5-11.9 26.5-26.5 0.1-14.8-11.8-26.7-26.5-26.6zm-75.4 34.2s-3.9-2.9-9.4-2.9c-4.1 0-8.9 2.5-8.9 2.5-1.3-1.9-2.1-4.1-2.1-6.6 0-6.3 5.1-11.4 11.4-11.4s11.4 5.1 11.4 11.4c0 2.7-0.9 5.1-2.4 7zm32.9 6.6c-12.5 0-12-9.6-12-9.6-0.2-1.8 2.1-2.4 2.9-1.3 0.4 0.6 0.4 0.6 0.7 1.7 1.7 5.9 8.4 5.6 8.4 5.6s6.7 0.4 8.4-5.6c0.3-1 0.3-1.1 0.7-1.7 0.8-1 3.1-0.5 2.9 1.3 0 0 0.5 9.6-12 9.6zm51.1-6.9s-4.8-2.5-8.9-2.5c-5.5 0-9.4 2.9-9.4 2.9-1.5-1.9-2.4-4.3-2.4-7 0-6.3 5.1-11.4 11.4-11.4s11.4 5.1 11.4 11.4c0.1 2.4-0.7 4.7-2.1 6.6z"/> - <path fill="#009486" d="m110.3 64.3c-0.4 0.6-0.4 0.6-0.7 1.7-1.7 5.9-8.4 5.6-8.4 5.6s-6.7 0.4-8.4-5.6c-0.3-1-0.3-1.1-0.7-1.7-0.8-1-3.1-0.5-2.9 1.3 0 0-0.5 9.6 12 9.6s12-9.6 12-9.6c0.2-1.7-2.1-2.3-2.9-1.3z"/> - <path fill="#009486" d="m143.1 50.4c-6.3 0-11.4 5.1-11.4 11.4 0 2.6 0.9 5 2.4 7 0 0 3.9-2.9 9.4-2.9 4.1 0 8.9 2.5 8.9 2.5 1.3-1.9 2.1-4.1 2.1-6.6 0-6.3-5.1-11.4-11.4-11.4z"/> - <path fill="#009486" d="m59.3 50.4c-6.3 0-11.4 5.1-11.4 11.4 0 2.5 0.8 4.7 2.1 6.6 0 0 4.8-2.5 8.9-2.5 5.5 0 9.4 2.9 9.4 2.9 1.5-1.9 2.4-4.3 2.4-7 0-6.3-5.1-11.4-11.4-11.4z"/> - <path fill="#E7FFE3" d="m47.1 23.3c-6.3-1.7-11.7 2.1-14.7 7.3-0.7 1.2-0.2 2.2 0.5 2.6 1 0.3 1.7 0.1 2.8-1.5 2.2-3.9 5.9-6.1 10.1-5.3 0 0 2.9 0.9 3.3-1 0.3-1.2-0.8-1.8-2-2.1z"/> - <path fill="#E7FFE3" d="m159.9 27.3c-0.1 1.9 2.9 1.9 2.9 1.9 4.2 0.4 6.8 2.3 7.8 6.7 0.6 1.9 1.2 2.2 2.3 2.2 0.8-0.1 1.6-1 1.2-2.4-1.4-5.8-5.1-9.8-11.7-9.9-1.2-0.1-2.4 0.2-2.5 1.5z"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/castro.svg b/app/Views/_assets/images/platforms/podcasting/castro.svg deleted file mode 100644 index a1f7c73c1e8a2d9f2daebc1eb91e75b3d135cd32..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/castro.svg +++ /dev/null @@ -1,17 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 300"> - <defs> - <linearGradient id="castro" x1="150" x2="150" y2="300" gradientUnits="userSpaceOnUse"> - <stop offset="0" stop-color="#00ccbf"/> - <stop offset="1" stop-color="#00b265"/> - </linearGradient> - <linearGradient id="linear-gradient" x1="-678.11" y1="574.88" x2="-678.11" y2="580.63" gradientTransform="translate(20211.11 -16925.38) scale(29.58 29.55)" gradientUnits="userSpaceOnUse"> - <stop offset="0" stop-color="#151515"/> - <stop offset="1" stop-color="#353535"/> - </linearGradient> - </defs> - <g id="castro-2" data-name="castro"> - <rect width="300" height="300" rx="67" fill="url(#castro)"/> - <path id="path-2" d="M150,65a85,85,0,1,1-85,85A84.95,84.95,0,0,1,150,65Z" fill-rule="evenodd" fill="url(#linear-gradient)"/> - <path id="path-3" d="M185.42,198.64l-14.17-19.83a36.13,36.13,0,1,0-42,0l-14.16,19.83a60.49,60.49,0,1,1,95.86-49.11A62.82,62.82,0,0,1,185.42,198.64ZM150,134.89a14.64,14.64,0,1,1-14.64,14.64A14.71,14.71,0,0,1,150,134.89Z" fill="#fff" fill-rule="evenodd"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/chartable.svg b/app/Views/_assets/images/platforms/podcasting/chartable.svg deleted file mode 100644 index 1a09a99bd9de62648be1769f280191051afc37d0..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/chartable.svg +++ /dev/null @@ -1,5 +0,0 @@ -<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="300" height="300" rx="67" fill="#fff"/> - <circle cx="150" cy="150" r="85" fill="#bddbe8" stroke-dasharray="1.52637, 1.52637" stroke-width="1.5264"/> - <path d="m119.28 196.55c-5.2759-0.41139-9.7186-1.2399-13.653-2.546-6.9248-2.2989-13.222-6.449-17.286-11.393-6.5353-7.949-9.2631-17.839-8.3879-30.411 0.69606-9.9992 2.6547-17.49 6.6052-25.262 2.764-5.4374 5.807-9.5961 9.9143-13.549 6.809-6.5529 15.012-10.554 24.086-11.749 4.0314-0.5307 10.66-0.32651 13.845 0.42647 6.8313 1.6152 11.839 5.4866 14.493 11.204 3.474 7.4848 2.6106 19.176-1.736 23.508-1.4198 1.415-2.8164 2.0178-4.9897 2.1538-2.9275 0.18324-5.0304-0.6543-6.3473-2.5281-0.89207-1.2693-1.0071-3.371-0.38296-6.9966 0.66108-3.8401 0.77076-5.5125 0.48376-7.3769-0.85327-5.5432-4.6866-8.1686-11.469-7.855-13.666 0.63195-24.596 12.949-27.39 30.867-1.1945 7.6596-0.89556 15.506 0.79293 20.81 1.3593 4.2696 3.1725 7.197 6.2806 10.14 5.1317 4.8585 11.858 7.0392 21.7 7.0348 8.6376-4e-3 15.814-1.5049 26.495-5.5418l2.8851-1.0904 0.14272-2.3326c0.0785-1.2829 0.14272-4.0282 0.14272-6.1006 0-9.519 1.416-22.71 3.654-34.039 3.8056-19.265 10.84-34.868 18.012-39.952 3.5656-2.5275 7.4093-3.4892 10.969-2.7444 3.867 0.80906 7.2202 4.5523 8.5708 9.5679 0.35828 1.3305 0.49623 2.6199 0.57664 5.3896 0.42125 14.51-6.9524 28.93-25.438 49.747l-2.4331 2.7399-0.14394 2.435c-0.0792 1.3392-0.11252 3.8008-0.0741 5.4702l0.0698 3.0351 0.96327-2.2644c4.4317-10.418 10.798-18.348 17.357-21.619 5.3814-2.6841 10.575-2.3474 12.763 0.82754 1.8537 2.6898 1.6068 6.521-1.3468 20.904-2.0726 10.093-2.3421 12.548-1.6299 14.847 0.5834 1.8829 2.8235 2.3929 5.2061 1.1853 2.1175-1.0732 5.6588-4.4869 10.01-9.6492 1.8391-2.182 2.612-2.7044 4.0007-2.7044 2.1334 0 3.0319 1.3454 3.1708 4.7478 0.10319 2.5289-0.27738 4.4331-1.2009 6.0091-1.3062 2.2289-6.3345 7.1702-10.394 10.214-3.3075 2.4801-6.686 3.8597-10.679 4.3606-7.3802 0.9259-12.053-1.7734-13.736-7.9354-0.30195-1.1054-0.38626-2.2087-0.37017-4.8446 0.0214-3.5012 0.19513-4.749 1.958-14.061 1.2473-6.5885 1.1942-8.2173-0.27231-8.359-0.60292-0.0583-0.90324 0.11129-1.9499 1.101-3.9066 3.6942-8.8177 13.999-11.538 24.21-0.96881 3.6364-1.719 5.3125-3.0559 6.8279-1.8926 2.1453-4.2493 3.1338-7.5137 3.1517-1.8941 0.0104-2.1889-0.0455-3.1168-0.59101-1.2312-0.72379-1.875-1.9008-2.23-4.0773-0.13331-0.81733-0.25689-1.5112-0.27462-1.5419-0.0177-0.0307-1.2127 0.39274-2.6556 0.94107-6.3414 2.41-12.926 3.9576-20.57 4.8351-2.9227 0.3355-10.723 0.59197-12.882 0.42359zm53.857-55.273c8.9818-11.73 14.266-25.324 13.216-33.999-0.30601-2.5291-0.58398-3.3974-1.3765-4.3001-1.4905-1.6976-3.179-0.61904-5.0729 3.2403-2.4678 5.029-4.9006 13.393-7.0014 24.071-0.65028 3.3054-2.204 13.036-2.1975 13.763 3e-3 0.38751 0.0549 0.32874 2.4321-2.7759z" fill="#30657b" stroke-width=".22021"/> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/deezer.svg b/app/Views/_assets/images/platforms/podcasting/deezer.svg deleted file mode 100644 index 4dbfbabfaa234a12e5a71b2d9af4880f02a5c706..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/deezer.svg +++ /dev/null @@ -1,54 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 300"> - <defs> - <linearGradient id="linear-gradient" x1="121.67" y1="310.68" x2="178.33" y2="-10.68" gradientUnits="userSpaceOnUse"> - <stop offset="0" stop-color="#202122"/> - <stop offset="1" stop-color="#26303c"/> - </linearGradient> - <linearGradient id="linear-gradient-2" x1="89.73" y1="16.18" x2="89.54" y2="4.17" gradientTransform="translate(52.42 116.38) scale(1.83)" gradientUnits="userSpaceOnUse"> - <stop offset="0" stop-color="#358c7b"/> - <stop offset="0.53" stop-color="#33a65e"/> - </linearGradient> - <linearGradient id="linear-gradient-3" x1="79.3" y1="31.76" x2="99.98" y2="21.22" gradientTransform="translate(52.42 116.38) scale(1.83)" gradientUnits="userSpaceOnUse"> - <stop offset="0" stop-color="#222b90"/> - <stop offset="1" stop-color="#367b99"/> - </linearGradient> - <linearGradient id="linear-gradient-4" x1="6.87" y1="42.77" x2="26.93" y2="42.77" gradientTransform="translate(52.42 116.38) scale(1.83)" gradientUnits="userSpaceOnUse"> - <stop offset="0" stop-color="#f90"/> - <stop offset="1" stop-color="#ff8000"/> - </linearGradient> - <linearGradient id="linear-gradient-5" x1="31.12" y1="42.77" x2="51.19" y2="42.77" gradientTransform="translate(52.42 116.38) scale(1.83)" gradientUnits="userSpaceOnUse"> - <stop offset="0" stop-color="#ff8000"/> - <stop offset="1" stop-color="#cc1953"/> - </linearGradient> - <linearGradient id="linear-gradient-6" x1="55.37" y1="42.77" x2="75.44" y2="42.77" gradientTransform="translate(52.42 116.38) scale(1.83)" gradientUnits="userSpaceOnUse"> - <stop offset="0" stop-color="#cc1953"/> - <stop offset="1" stop-color="#241284"/> - </linearGradient> - <linearGradient id="linear-gradient-7" x1="79.6" y1="42.77" x2="99.67" y2="42.77" gradientTransform="translate(52.42 116.38) scale(1.83)" gradientUnits="userSpaceOnUse"> - <stop offset="0" stop-color="#222b90"/> - <stop offset="1" stop-color="#3559a6"/> - </linearGradient> - <linearGradient id="linear-gradient-8" x1="54.58" y1="29.66" x2="76.23" y2="23.33" xlink:href="#linear-gradient-6"/> - <linearGradient id="linear-gradient-9" x1="30.38" y1="22.58" x2="51.88" y2="30.4" gradientTransform="translate(52.42 116.38) scale(1.83)" gradientUnits="userSpaceOnUse"> - <stop offset="0" stop-color="#fc0"/> - <stop offset="1" stop-color="#ce1938"/> - </linearGradient> - <linearGradient id="linear-gradient-10" x1="32.79" y1="2.51" x2="49.48" y2="17.91" gradientTransform="translate(52.42 116.38) scale(1.83)" gradientUnits="userSpaceOnUse"> - <stop offset="0" stop-color="#ffd100"/> - <stop offset="1" stop-color="#fd5a22"/> - </linearGradient> - </defs> - <g id="deezer"> - <rect width="300" height="300" rx="67" fill="url(#linear-gradient)"/> - <rect id="rect8185" x="198.24" y="94.52" width="36.76" height="21.51" fill="#40ab5d"/> - <rect id="rect8192" x="198.24" y="124.34" width="36.76" height="21.51" fill="url(#linear-gradient-2)"/> - <rect id="rect8199" x="198.24" y="154.16" width="36.76" height="21.51" fill="url(#linear-gradient-3)"/> - <rect id="rect8206" x="65" y="183.97" width="36.76" height="21.51" fill="url(#linear-gradient-4)"/> - <rect id="rect8213" x="109.39" y="183.97" width="36.76" height="21.51" fill="url(#linear-gradient-5)"/> - <rect id="rect8220" x="153.86" y="183.97" width="36.76" height="21.51" fill="url(#linear-gradient-6)"/> - <rect id="rect8227" x="198.24" y="183.97" width="36.76" height="21.51" fill="url(#linear-gradient-7)"/> - <rect id="rect8234" x="153.86" y="154.16" width="36.76" height="21.51" fill="url(#linear-gradient-8)"/> - <rect id="rect8241" x="109.39" y="154.16" width="36.76" height="21.51" fill="url(#linear-gradient-9)"/> - <rect id="rect8248" x="109.39" y="124.34" width="36.76" height="21.51" fill="url(#linear-gradient-10)"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/fyyd.svg b/app/Views/_assets/images/platforms/podcasting/fyyd.svg deleted file mode 100644 index e17b8f6bbb8628f7f5923b09dd7c9a62a288ab8b..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/fyyd.svg +++ /dev/null @@ -1,6 +0,0 @@ -<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="300" height="300" rx="67" fill="#fff"/> - <g transform="matrix(.46296 0 0 .46296 64.352 65)" clip-rule="evenodd" fill="#008000" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.4142"> - <path d="m1.4 183.6c0-101.4 82.2-183.6 183.6-183.6 101.3 0 183.6 82.2 183.6 183.6 0 101.3-82.2 183.6-183.6 183.6-101.4-0.1-183.6-82.3-183.6-183.6zm149.9 119.3c6 6 15.5 6 21.5 0l108.5-108.5c6-6 6-15.5 0-21.5l-108.5-108.6c-6-6-15.5-6-21.5 0l-24.4 24.4c-6 6-6 15.5 0 21.5l73.4 73.4-73.4 73.4c-6 6-6 15.5 0 21.5z" fill="#008000"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/google.svg b/app/Views/_assets/images/platforms/podcasting/google.svg deleted file mode 100644 index c158a05db58dad1238a868fa33c104bd8b728176..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/google.svg +++ /dev/null @@ -1,14 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"> - <g id="google-podcasts"> - <rect width="300" height="300" rx="67" fill="#fff"/> - <path id="Shape" d="M75.39,133.66A10.5,10.5,0,0,0,65,144.08v11.84a10.39,10.39,0,1,0,20.78,0V144.08C86.25,138.4,81.53,133.66,75.39,133.66Z" fill="#0066d9"/> - <path d="M224.61,133.66a10.5,10.5,0,0,0-10.39,10.42v11.84a10.39,10.39,0,1,0,20.78,0V144.08A10.5,10.5,0,0,0,224.61,133.66Z" fill="#4285f4"/> - <path d="M112.22,168.7a10.5,10.5,0,0,0-10.39,10.42V191a10.39,10.39,0,1,0,20.78,0V179.12C123.08,173.44,118.36,168.7,112.22,168.7Z" fill="#ea4335"/> - <path d="M112.22,99.09a10.5,10.5,0,0,0-10.39,10.42V147.4h0a10.39,10.39,0,1,0,20.78,0h0V109.51C123.08,103.83,118.36,99.09,112.22,99.09Z" fill="#ea4335"/> - <path d="M187.78,99.09a10.5,10.5,0,0,0-10.39,10.42v11.84a10.39,10.39,0,1,0,20.78,0V109.51A10.5,10.5,0,0,0,187.78,99.09Z" fill="#34a853"/> - <path d="M150,65a10.5,10.5,0,0,0-10.39,10.42V87.26a10.39,10.39,0,1,0,20.78,0V75.42A10.5,10.5,0,0,0,150,65Z" fill="#fab908"/> - <path d="M150,202.33a10.49,10.49,0,0,0-10.39,10.41v11.84a10.39,10.39,0,1,0,20.78,0V212.74A10.81,10.81,0,0,0,150,202.33Z" fill="#fab908"/> - <path d="M187.78,142.66a10.5,10.5,0,0,0-10.39,10.42V191a10.39,10.39,0,1,0,20.78,0V153.08A10.5,10.5,0,0,0,187.78,142.66Z" fill="#34a853"/> - <path d="M160.39,119.46a10.39,10.39,0,1,0-20.78,0h0V182h0a10.39,10.39,0,1,0,20.78,0h0v-62.5Z" fill="#fab908"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/ivoox.svg b/app/Views/_assets/images/platforms/podcasting/ivoox.svg deleted file mode 100644 index 36299c8780d951c801c86e01e179a710ababd536..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/ivoox.svg +++ /dev/null @@ -1,7 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"> - <g id="ivoox"> - <rect width="300" height="300" rx="67" fill="#ff8600"/> - <path d="M136.58,126.88a23.51,23.51,0,0,0,.31-47c-13.32,0-23.66,10.19-23.66,23.35A23,23,0,0,0,136.58,126.88Z" fill="#fff"/> - <path d="M116.52,181.56c0,36.82.16,81.65.16,118.31H159.3V201.62c0-16.45.15-32.91.15-49.52,0-5.32-1.41-10.18-6.11-12.84a20.43,20.43,0,0,0-9.09-2.82c-20.84-.32-41.68-.16-62.36-.16-2.19,0-2.82.78-2.82,3q.24,17.85,0,35.72c0,2.2.63,2.82,2.82,2.82,10.34-.15,20.68,0,31,0C116.52,177.8,116.52,177.8,116.52,181.56Z" fill="#fff"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/listennotes.svg b/app/Views/_assets/images/platforms/podcasting/listennotes.svg deleted file mode 100644 index 9d01f6bbaa024ad83b5df47c886fa24c711f1737..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/listennotes.svg +++ /dev/null @@ -1,10 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"> - <g id="listennotes"> - <rect width="300" height="300" rx="67" fill="#fff"/> - <path d="M178.46,193.16c-15.55,11.36-32.83,16.1-51.88,13.64C108.33,204.44,93.22,196,81.41,182A70.71,70.71,0,1,1,196.05,99.76a69.54,69.54,0,0,1,9.6,26.08,70.58,70.58,0,0,1-13,52.94c.13.08.22.15.32.2a79.82,79.82,0,0,1,12.38,8.13,113.6,113.6,0,0,1,19.26,19.2,69.62,69.62,0,0,1,7.15,10.9,31.83,31.83,0,0,1,2.83,7.19,13.09,13.09,0,0,1,.39,4.18,5.47,5.47,0,0,1-2.22,4.25,6.07,6.07,0,0,1-3.14,1.08,15.69,15.69,0,0,1-5.85-.74,42,42,0,0,1-8.45-3.67,83.54,83.54,0,0,1-12-8.18,115.42,115.42,0,0,1-16.93-16.73,77.74,77.74,0,0,1-7.69-11.09C178.62,193.39,178.54,193.28,178.46,193.16ZM135.77,80.84a55.91,55.91,0,1,0,55.93,55.95A55.9,55.9,0,0,0,135.77,80.84Z"/> - <path d="M108.43,97.91a63.9,63.9,0,0,1,25.67,5.27A66.07,66.07,0,0,1,174,164.05H163.68c0-.21,0-.43,0-.65a55.86,55.86,0,0,0-24.29-45.52,54.44,54.44,0,0,0-17.67-8,52,52,0,0,0-7.62-1.34c-1.59-.16-3.19-.19-4.78-.27l-.86,0Z" fill="#b82f00"/> - <path d="M155.73,165.78h-10.3a37.4,37.4,0,0,0-11.48-27c-7.53-7.37-16.69-10.94-27.23-11.13V117.3a49.2,49.2,0,0,1,42.52,24.31A46.75,46.75,0,0,1,155.73,165.78Z" fill="#b82f00"/> - <path d="M106.71,143.76v-9.5a31.07,31.07,0,0,1,27.45,16.52,28.64,28.64,0,0,1,3.42,14.06c-.45.12-8.82.13-9.41,0a20.92,20.92,0,0,0-6.4-14.93A21.45,21.45,0,0,0,106.71,143.76Z" fill="#b82f00"/> - <path d="M121.11,161a9,9,0,1,1-9.08-9A9,9,0,0,1,121.11,161Z" fill="#b82f00"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/overcast.svg b/app/Views/_assets/images/platforms/podcasting/overcast.svg deleted file mode 100644 index db0bdb49d71374d89d7242541636fdd6982a4eea..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/overcast.svg +++ /dev/null @@ -1,6 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"> - <g id="overcast"> - <rect width="300" height="300" rx="67" fill="#fc7e0f"/> - <path id="overcastCanvas-bezier" d="M150,235a85,85,0,1,1,85-85A84.65,84.65,0,0,1,150,235Zm0-33.53,6.14-6.14L150,170.78l-6.14,24.55Zm-8-.47-3.3,12.28,7.55-7.56ZM158,201l-4.25,4.25,7.55,7.56Zm6.14,21.72L150,208.56l-14.17,14.16A71.77,71.77,0,0,0,150,224.14C154.72,224.14,159.44,224.14,164.17,222.72ZM150,75.39A74.77,74.77,0,0,0,75.39,150a73.52,73.52,0,0,0,50.05,69.89l16.06-59c-3.78-2.36-5.67-6.61-5.67-11.33A14.21,14.21,0,0,1,150,135.36a13.92,13.92,0,0,1,14.17,14.17c0,4.72-2.36,8.5-5.67,11.33l16.06,59A74,74,0,0,0,224.61,150,74.77,74.77,0,0,0,150,75.39Zm48.64,111.44c-1.89,2.36-4.72,2.84-7.56.95-2.36-1.89-2.83-4.72-.94-7.09a54.61,54.61,0,0,0,0-61.38c-1.89-2.37-1.42-5.2.94-7.09s5.67-.94,7.56,1c.94.47,11.8,15.11,11.8,36.83S199.11,186.36,198.64,186.83Zm-26-13.69c-1.89-2.36-1.89-6.14.47-8A23.68,23.68,0,0,0,178.33,150c0-9-5.19-14.64-5.19-15.11-2.36-1.89-2.36-5.67-.47-8a5.29,5.29,0,0,1,7.55-.47,35.56,35.56,0,0,1,0,47.22C177.86,175.5,175,175,172.67,173.14Zm-45.34,0a5.29,5.29,0,0,1-7.55.47,34.37,34.37,0,0,1-9-23.61c0-14.64,8.5-22.67,9-23.61,2.36-1.89,5.66-1.89,7.55.47s1.89,6.14-.47,8c0,.47-5.19,5.67-5.19,15.11a25.31,25.31,0,0,0,5.19,15.11C129.22,167,129.22,170.78,127.33,173.14Zm-18.41,14.64c-2.36,1.89-5.67.94-7.56-.95-.94-.47-11.8-15.11-11.8-36.83s10.86-35.89,11.8-36.83c1.89-2.36,4.72-2.84,7.56-1,2.36,1.89,2.83,4.72.94,7.09a54.61,54.61,0,0,0,0,61.38A4.74,4.74,0,0,1,108.92,187.78Z" fill="#fff" fill-rule="evenodd"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/playerfm.svg b/app/Views/_assets/images/platforms/podcasting/playerfm.svg deleted file mode 100644 index 502b7343b48d0fc54d528e00cdcd198c3faa9e57..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/playerfm.svg +++ /dev/null @@ -1,9 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"> - <g id="playerfm"> - <rect width="300" height="300" rx="67" fill="#c81329"/> - <path d="M144.92,235A79.78,79.78,0,0,1,126,77.7c9-2.36,18.43,3.3,20.79,12.75,2.36,9-3.31,18.42-12.76,20.79-20.31,4.72-34.48,23.14-34.48,44.4A45.36,45.36,0,0,0,144.92,201c21.26,0,39.21-14.17,44.4-35,2.37-9,11.34-15.11,20.79-12.75,9,2.36,15.11,11.34,12.75,20.78A80.3,80.3,0,0,1,144.92,235Z" fill="#fff"/> - <path d="M227.59,139.58a7.1,7.1,0,0,1-7.09-5.2c-12.28-42.51-53.85-55.27-54.32-55.27a7.17,7.17,0,1,1,4.25-13.69c1.89.47,49.6,15.11,64.24,64.71,1,3.78-.94,8-4.72,9A5.17,5.17,0,0,1,227.59,139.58Z" fill="#fff"/> - <path d="M204,144.3a7.1,7.1,0,0,1-7.09-5.19c-8.5-27.4-35.43-36.38-35.43-36.85-3.78-1.42-6.14-5.19-4.72-9s5.2-6.14,9-4.73c1.42.47,34.49,11.34,44.88,46.3.95,3.77-.94,8-4.72,9C205.38,143.83,204.44,144.3,204,144.3Z" fill="#fff"/> - <path d="M179.88,147.14a7.14,7.14,0,0,1-6.62-4.25c-5.19-11.81-16.53-17.48-16.53-17.48a7.39,7.39,0,1,1,6.61-13.23c.47.47,16.06,8,23.62,24.57a6.93,6.93,0,0,1-3.31,9.44A6.29,6.29,0,0,1,179.88,147.14Z" fill="#fff"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/pocketcasts.svg b/app/Views/_assets/images/platforms/podcasting/pocketcasts.svg deleted file mode 100644 index 7cefa63c850ccd06a2fda866110b64dfc9b52691..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/pocketcasts.svg +++ /dev/null @@ -1,6 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"> - <g id="pocketcasts"> - <rect width="300" height="300" rx="67" fill="#f43e37"/> - <path d="M65,150a85,85,0,0,1,170,0H213.75A63.75,63.75,0,1,0,150,213.75V235A85.25,85.25,0,0,1,65,150Zm85,51a51,51,0,1,1,51-51H182.58A32.58,32.58,0,1,0,150,182.58Z" fill="#fff" fill-rule="evenodd"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/podbean.svg b/app/Views/_assets/images/platforms/podcasting/podbean.svg deleted file mode 100644 index ab3710939b37fa847959aa43ac0e6811a064df96..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/podbean.svg +++ /dev/null @@ -1,9 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"> - <g id="podbean"> - <rect width="300" height="300" rx="67" fill="#252027"/> - <path d="M148.57,167.13c6.39-.62,12.72,2.28,17.07,6.87a30.92,30.92,0,0,1,3.62,5.75c1.55,3.56,1.63,7.54,1.39,11.35A20.88,20.88,0,0,1,162,204.85a18.47,18.47,0,0,1-9.54,3.53,28,28,0,0,1-7.26-.28,25.22,25.22,0,0,1-8.1-3.91,22.63,22.63,0,0,1-6.51-9,20.48,20.48,0,0,1,1.5-17.62,20.12,20.12,0,0,1,3.52-4.57,26,26,0,0,1,6.39-4.31A30.54,30.54,0,0,1,148.57,167.13Z" fill="#fff"/> - <path d="M148.25,80.27a82.52,82.52,0,0,1,14.31.74,89.08,89.08,0,0,1,11.79,2.23,97.77,97.77,0,0,1,16.75,5.84,93.84,93.84,0,0,1,18.05,10.77,76.07,76.07,0,0,1,9.17,7.73c1.71,1.74,3.48,3.44,5.17,5.22A91,91,0,0,1,234,126.69a12.09,12.09,0,0,1,1,4.11,10.52,10.52,0,0,1-3.68,8.11,9.54,9.54,0,0,1-5.66,2.22,9.67,9.67,0,0,1-7.44-2.31c-1.95-1.76-3.12-4.14-4.69-6.2a78.41,78.41,0,0,0-20-19,82.9,82.9,0,0,0-11.91-6.53c-1.53-.66-3.11-1.21-4.66-1.83a64.2,64.2,0,0,0-11.13-3.16,82,82,0,0,0-15.15-1.5,71.44,71.44,0,0,0-15.17,1.21,74.6,74.6,0,0,0-11.84,3.24,79,79,0,0,0-35.06,24.66c-1.58,2.07-3.16,4.14-4.59,6.32A13.36,13.36,0,0,1,81,139.45,10.15,10.15,0,0,1,77.26,141a14,14,0,0,1-4.74-.07,9.72,9.72,0,0,1-5.93-4.49,10.1,10.1,0,0,1-1-8.75,16.89,16.89,0,0,1,1.48-2.7,99.33,99.33,0,0,1,35-32.49,109.06,109.06,0,0,1,18-7.7A102.4,102.4,0,0,1,148.25,80.27Z" fill="#8dc742"/> - <path d="M149.23,116.85a61.61,61.61,0,0,1,44.29,17.86,54,54,0,0,1,8.92,11.06,10.64,10.64,0,0,1,.74,8.52,10.28,10.28,0,0,1-5.48,5.79,10.11,10.11,0,0,1-10.29-1.36,13.3,13.3,0,0,1-2.68-3,47.3,47.3,0,0,0-6-7.2A42,42,0,0,0,158.5,138a46.12,46.12,0,0,0-9.6-.81c-8.2,0-16.2,2.92-22.93,7.48a46,46,0,0,0-8,7.36c-1.65,1.92-2.92,4.13-4.6,6a10.14,10.14,0,0,1-16.8-4.67,9.48,9.48,0,0,1-.06-5.12,13,13,0,0,1,2-4,70.45,70.45,0,0,1,7.33-9,66.92,66.92,0,0,1,10.51-8.46,60.35,60.35,0,0,1,11.73-5.93A62.53,62.53,0,0,1,149.23,116.85Z" fill="#8dc742"/> - <path d="M148.52,156.34a31.67,31.67,0,0,1,27.41,13.37,31.25,31.25,0,0,1,5.64,15.71,42.81,42.81,0,0,1-.23,8.16,33,33,0,0,1-10.05,18,31.78,31.78,0,0,1-15,7.55,33.35,33.35,0,0,1-10.64.37,32.19,32.19,0,0,1-11.24-3.84,33.53,33.53,0,0,1-9.36-8,36.17,36.17,0,0,1-4.84-8.67,31.75,31.75,0,0,1-.57-20.13A32,32,0,0,1,132,161.93a31,31,0,0,1,16.5-5.59m.28,15.08a23.89,23.89,0,0,0-5.29,1.21,20.94,20.94,0,0,0-5.13,3.46,16.85,16.85,0,0,0-4,17.79,18.07,18.07,0,0,0,5.21,7.24,20.08,20.08,0,0,0,6.5,3.14,22.67,22.67,0,0,0,5.82.23,14.86,14.86,0,0,0,7.65-2.83,16.76,16.76,0,0,0,7-11,19.55,19.55,0,0,0-1.12-9.1,24.82,24.82,0,0,0-2.9-4.61A17,17,0,0,0,148.8,171.42Z" fill="#8dc742"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/podcastaddict.svg b/app/Views/_assets/images/platforms/podcasting/podcastaddict.svg deleted file mode 100644 index 9544f550d66e1fe3be285fdc5ade8187acf1fd1d..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/podcastaddict.svg +++ /dev/null @@ -1,13 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 300"> - <defs> - <linearGradient id="linear-gradient" x1="142.29" y1="253.24" x2="273.52" y2="121.61" gradientUnits="userSpaceOnUse"> - <stop offset="0.13" stop-color="#e85d27"/> - <stop offset="0.69" stop-color="#f0772b"/> - </linearGradient> - </defs> - <g id="podcast-addict"> - <rect width="300" height="300" rx="67" fill="#f4842d"/> - <path d="M300,233V183.06L217.93,101,147.86,82,85.5,158.53l14,60.86L180.14,300H233A67,67,0,0,0,300,233Z" fill="url(#linear-gradient)"/> - <path d="M234.94,148.07a85,85,0,1,0-124.89,77V149.57a40.42,40.42,0,0,1,32.77-39.63v14.13a26.56,26.56,0,0,0-19,25.5v.23h0v.11a26.6,26.6,0,0,0,52.09,7.27H190a40.33,40.33,0,0,1-66.23,22.67v51A85.77,85.77,0,0,0,150,235a84.59,84.59,0,0,0,47.65-14.59V235H235l-.06-86.93Zm-84.62,17a15.52,15.52,0,1,1,15.51-15.51A15.48,15.48,0,0,1,150.32,165.08Zm40.38-15.4H177v-.11a26.58,26.58,0,0,0-26.6-26.6h-.05V109.24h.05a40.33,40.33,0,0,1,40.33,40.33Zm23.65,0H200.73v-.11a50.36,50.36,0,0,0-50.36-50.36h-.05V85.59h.05a64,64,0,0,1,64,64Z" fill="#fff"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/podcastindex.svg b/app/Views/_assets/images/platforms/podcasting/podcastindex.svg deleted file mode 100644 index f55cb7787f1112aeb492ce7584fadb3407d2c6fa..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/podcastindex.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="300" height="300" rx="67" fill="#a00"/> - <path d="m86.443 74.014-1.164 1.2443c-10.624 11.352-17.086 24.618-19.614 40.264-0.6282 3.889-0.87221 13.034-0.46444 17.395 0.52565 5.6222 1.6382 10.827 3.5778 16.742 2.6825 8.1804 7.1797 16.385 12.617 23.014 2.1481 2.6189 4.9164 5.6404 5.1618 5.6348 0.08123-2e-3 2.4698-2.3265 5.308-5.1661l5.1604-5.1632-1.4277-1.4678c-7.6388-7.8558-12.989-18.745-15.144-30.825-0.70766-3.9654-0.88111-12.413-0.33973-16.557 1.6185-12.39 6.8116-23.696 15.055-32.78l1.7202-1.8964-5.2235-5.2192zm127.11 0.0029-10.444 10.435 1.6513 1.7689c2.2391 2.3976 5.507 6.7796 7.2406 9.7087 8.0172 13.549 10.381 29.552 6.5837 44.577-1.4313 5.6636-3.8657 11.534-6.8129 16.433-1.5633 2.5982-5.4754 7.722-7.263 9.5122l-1.4062 1.4091 5.2091 5.222 5.2091 5.2235 1.1425-1.1138c0.62864-0.61189 1.9098-2.0097 2.8468-3.1077 8.797-10.308 14.719-23.267 16.826-36.816 0.71394-4.5915 0.89257-14.531 0.34547-19.278-0.98586-8.555-3.2874-16.413-7.0613-24.109-3.4164-6.9672-7.6663-13.139-12.66-18.387zm-17.587 17.584-5.0572 5.0586-5.0586 5.0572 0.92311 1.0937c4.507 5.3429 7.067 10.372 8.4301 16.557 0.61235 2.7794 0.74026 8.9539 0.25086 12.091-0.67188 4.3072-2.4127 9.1197-4.5884 12.686-1.0693 1.7527-3.6154 5.1128-4.4236 5.837-0.48933 0.43841-0.48125 0.4479 4.4895 5.5789 2.7385 2.8267 5.0446 5.1114 5.126 5.0787 0.0814-0.0327 0.67246-0.63988 1.313-1.3503 5.4732-6.0703 9.281-13.131 11.33-21.01 3.9908-15.344-0.12986-32.456-10.683-44.363zm-91.754 0.2537c-0.30746-0.06121-0.69429 0.37777-2.1659 2.0785-2.4502 2.8316-3.4895 4.2471-5.2163 7.1112-3.1224 5.179-5.2049 10.824-6.3716 17.263-0.50856 2.8066-0.71317 9.9642-0.36983 12.939 1.187 10.286 5.3538 19.803 11.912 27.202l2.0656 2.3293 5.007-5.1102 5.0084-5.1102-1.1496-1.3302c-4.047-4.6807-6.7034-10.007-8.0774-16.2-0.68545-3.0884-0.7384-9.911-0.10034-13.07 1.2873-6.3732 4.2129-12.347 8.1446-16.632l1.4621-1.5926-4.6673-4.63c-2.5673-2.5468-4.8907-4.8196-5.1632-5.05-0.12226-0.10336-0.21574-0.17885-0.31822-0.19924zm16.644 16.354-0.58771 0.70382c-1.9132 2.2963-4.0928 6.939-5.0457 10.745-0.6866 2.7426-0.86529 8.2349-0.36122 11.128 0.43461 2.4945 1.3262 5.4446 2.2892 7.5754 0.71497 1.5823 3.1697 5.427 3.4646 5.427 0.0953 0 1.4731-1.3158 3.0633-2.9242l2.8912-2.9242-0.47877-0.77406c-4.3296-7.0055-4.2822-15.126 0.12758-22.112l0.58198-0.92311-2.9715-2.9615zm58.352 0.1161c-0.32564 0-5.7194 5.529-5.7194 5.8628 0 0.2031 0.27558 0.77701 0.61351 1.2744 3.8598 5.6802 4.0679 14.341 0.49454 20.594l-1.0163 1.7803 2.831 2.9615c1.5571 1.6292 2.9014 2.9696 2.9873 2.9773 0.0859 8e-3 0.52626-0.49123 0.97907-1.108 1.1824-1.6107 2.6499-4.4136 3.4274-6.5465 2.8302-7.7643 2.1774-16.582-1.7603-23.759-0.84692-1.5436-2.5988-4.0366-2.8368-4.0366zm-28.656 1.5753c-1.4423 4e-3 -2.8916 0.14205-3.9549 0.41426-4.614 1.1814-8.6196 4.4216-10.764 8.708-4.0197 8.0358-0.68308 17.77 7.5172 21.928 2.5055 1.2708 4.4886 1.6762 7.7092 1.5768 2.0654-0.0637 3.2574-0.22545 4.4623-0.60634 4.9195-1.5552 8.8553-5.4521 10.685-10.58 0.74-2.0743 0.93617-6.706 0.37843-8.9346-1.4801-5.914-6.1361-10.567-12.12-12.111-1.0353-0.26722-2.471-0.39908-3.9132-0.39563zm-9.379 39.291-0.65075 4.9898c-0.98758 7.5709-3.0927 23.539-4.2659 32.351-1.3288 9.9815-3.4038 25.731-4.3318 32.88-0.39403 3.0355-0.77054 5.757-0.83571 6.0476l-0.11755 0.52751h18.072l0.12757-0.7626c0.0701-0.41981 0.28334-1.9792 0.47447-3.4646 0.19114-1.4854 0.82221-6.2945 1.4019-10.686 0.57967-4.3918 1.642-12.475 2.3608-17.965 1.7847-13.63 3.4514-26.298 4.7045-35.735 0.57723-4.3475 1.0507-7.9666 1.0507-8.0428 0-0.0766-4.048-0.13904-8.9948-0.13904z" fill="#fff" stroke-width=".36682"/> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/podchaser.svg b/app/Views/_assets/images/platforms/podcasting/podchaser.svg deleted file mode 100644 index b875da9dfec462d78e20607297d612d3b31fea35..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/podchaser.svg +++ /dev/null @@ -1,8 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"> - <g id="podchaser"> - <rect width="300" height="300" rx="67" fill="#293b65"/> - <circle id="Outer-Pink" cx="150" cy="150" r="85" fill="#f70664"/> - <circle id="Outer-White" cx="150" cy="150.14" r="73.19" fill="#fff"/> - <path d="M150,97.25a54.32,54.32,0,0,0-54.31,54.31v47.69a79.45,79.45,0,0,0,30.7,20.31V200.47A54.31,54.31,0,1,0,150,97.25Z" fill="#293b65"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/podcloud.svg b/app/Views/_assets/images/platforms/podcasting/podcloud.svg deleted file mode 100644 index 8bdfccd98f72f8e42de049213513427faa45c788..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/podcloud.svg +++ /dev/null @@ -1,8 +0,0 @@ -<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="300" height="300" rx="67" fill="#fff"/> - <g transform="matrix(.625 0 0 .625 .5364 .11496)"> - <path fill="#fdfdfd" d="m276.6 128.4c-1.18 0.05-2.85 0.16-3.7 0.24-0.85 0.09-3.08 0.38-4.95 0.65-1.87 0.28-4.39 0.71-5.6 0.96s-2.63 0.55-3.15 0.66c-0.52 0.1-1.31 0.3-1.75 0.44-0.44 0.13-1.36 0.38-2.05 0.56-0.69 0.17-1.57 0.43-1.95 0.56-0.39 0.14-1.47 0.51-2.4 0.83-0.94 0.32-2.33 0.81-3.1 1.08s-1.58 0.58-1.8 0.7c-0.22 0.11-0.81 0.36-1.3 0.55-0.5 0.19-1.53 0.64-2.3 0.99s-2.12 1.01-3 1.47c-0.88 0.47-1.89 0.99-2.25 1.16-0.36 0.18-1.1 0.58-1.65 0.9-0.55 0.31-1.38 0.8-1.85 1.07-0.47 0.28-1.12 0.67-1.45 0.86s-1.43 0.91-2.45 1.59-2.28 1.55-2.8 1.94c-0.52 0.38-1.27 0.92-1.65 1.18-0.39 0.26-1.29 0.95-2 1.52-0.72 0.58-1.75 1.41-2.3 1.85-0.55 0.45-1.92 1.67-3.05 2.71s-2.95 2.84-4.05 3.99-2.3 2.43-2.66 2.84-1.03 1.22-1.49 1.8c-0.47 0.58-1.07 1.32-1.35 1.65s-0.97 1.23-1.55 2c-0.57 0.77-1.25 1.69-1.5 2.05s-0.86 1.23-1.35 1.93c-0.65 0.92-0.94 1.26-1.05 1.22-0.08-0.03-0.92-0.11-1.85-0.18-0.94-0.06-3.12-0.11-4.85-0.12-1.73 0-3.85 0.06-4.7 0.13s-2 0.17-2.55 0.23-1.63 0.19-2.4 0.29c-0.77 0.11-1.9 0.28-2.5 0.39-0.61 0.11-1.71 0.32-2.45 0.46-0.74 0.13-2.39 0.52-3.65 0.86-1.27 0.33-2.37 0.64-2.45 0.68-0.08 0.05-1.12 0.41-2.3 0.81-1.18 0.39-2.96 1.05-3.95 1.45-0.99 0.41-2.68 1.16-3.75 1.68-1.07 0.51-2.51 1.25-3.2 1.62-0.69 0.38-1.52 0.84-1.85 1.02-0.33 0.19-1.16 0.68-1.85 1.11-0.69 0.42-1.68 1.06-2.2 1.41s-1.33 0.91-1.8 1.25c-0.47 0.33-1.35 0.99-1.95 1.45-0.61 0.47-1.66 1.33-2.35 1.9-0.69 0.58-1.93 1.66-2.75 2.41-0.83 0.76-2.08 2-2.8 2.76-0.71 0.76-1.5 1.62-1.75 1.89-0.25 0.28-0.58 0.66-0.75 0.85-0.16 0.19-0.75 0.91-1.3 1.6s-1.2 1.51-1.45 1.84c-0.25 0.32-0.68 0.91-0.97 1.3-0.28 0.39-0.85 1.2-1.26 1.81-0.41 0.6-1.08 1.62-1.49 2.25s-1.04 1.67-1.4 2.3-1.03 1.89-1.49 2.8-0.98 1.96-1.14 2.33l-0.3 0.68c-1.32-0.01-2.31 0.04-3.05 0.09-0.74 0.06-2.59 0.27-4.1 0.46s-3.79 0.55-5.05 0.8c-1.27 0.25-3.04 0.66-3.95 0.9s-2.15 0.58-2.75 0.74c-0.61 0.17-1.91 0.58-2.9 0.92-0.99 0.33-2.48 0.87-3.3 1.2-0.83 0.33-2.04 0.85-2.7 1.15-0.66 0.31-1.81 0.86-2.55 1.23s-2.23 1.16-3.3 1.75-2.6 1.49-3.4 2.01c-0.8 0.51-1.86 1.21-2.37 1.56-0.5 0.35-1.6 1.15-2.45 1.79-0.84 0.64-2.16 1.69-2.93 2.33s-2.26 1.98-3.3 2.99c-1.05 1-2.4 2.36-3.01 3.02s-1.47 1.63-1.9 2.15c-0.44 0.52-1.07 1.29-1.4 1.7-0.34 0.41-0.97 1.22-1.4 1.8-0.44 0.58-1.31 1.84-1.95 2.8s-1.41 2.15-1.71 2.65c-0.31 0.49-0.9 1.48-1.31 2.2-0.41 0.71-1.06 1.93-1.44 2.7-0.39 0.77-0.97 2.01-1.3 2.75-0.34 0.74-0.81 1.84-1.06 2.45-0.25 0.6-0.66 1.66-0.9 2.35-0.25 0.69-0.71 2.04-1.02 3s-0.79 2.67-1.07 3.8c-0.27 1.13-0.58 2.45-0.68 2.95-0.1 0.49-0.32 1.75-0.49 2.8-0.17 1.04-0.35 2.3-0.41 2.8-0.06 0.49-0.18 1.64-0.25 2.55-0.1 1.06-0.15 3.06-0.15 5.6 0 2.17 0.05 4.44 0.1 5.05 0.06 0.6 0.2 1.86 0.31 2.8 0.11 0.93 0.34 2.49 0.5 3.45 0.17 0.96 0.45 2.4 0.64 3.2 0.18 0.8 0.5 2.1 0.7 2.9s0.54 2.03 0.76 2.75c0.23 0.71 0.83 2.42 1.34 3.8 0.52 1.37 1.19 3.06 1.5 3.75s1.08 2.26 1.71 3.5c0.64 1.24 1.52 2.86 1.96 3.6s1.24 2 1.77 2.8 1.3 1.92 1.71 2.5 0.97 1.34 1.25 1.7c0.27 0.36 1.03 1.3 1.69 2.1s1.86 2.17 2.66 3.05 1.59 1.7 1.75 1.82c0.17 0.12 0.75 0.67 1.3 1.23s1.51 1.45 2.14 1.98c0.62 0.53 1.64 1.37 2.26 1.87 0.62 0.49 1.77 1.37 2.56 1.95s2.12 1.5 2.95 2.05c0.84 0.55 2.21 1.4 3.06 1.9 0.84 0.49 2.16 1.23 2.93 1.64s2.21 1.12 3.2 1.58c0.99 0.47 2.18 1 2.65 1.2 0.47 0.19 1.07 0.43 1.35 0.53 0.27 0.1 1.02 0.38 1.65 0.63 0.63 0.24 2.05 0.72 3.15 1.06 1.1 0.35 2.79 0.83 3.75 1.07 0.96 0.25 2.15 0.53 2.65 0.64 0.49 0.11 1.64 0.33 2.55 0.49s2.3 0.39 3.1 0.51 2.44 0.28 3.65 0.36 3.28 0.17 4.6 0.21c1.32 0.03 11.62 0 22.9-0.06 11.27-0.06 32.74-0.18 47.7-0.26s52.62-0.28 83.7-0.45c31.07-0.16 57.94-0.31 59.7-0.34 1.88-0.02 3.84-0.11 4.75-0.2 0.85-0.09 2.29-0.25 3.2-0.37s2.14-0.29 2.75-0.4c0.6-0.1 1.73-0.3 2.5-0.44 0.77-0.15 2.52-0.55 3.9-0.9 1.37-0.35 3.11-0.85 3.85-1.11s1.78-0.61 2.3-0.79 1.38-0.49 1.9-0.69 1.51-0.6 2.2-0.89c0.68-0.29 2.39-1.09 3.8-1.79 1.4-0.7 3.2-1.66 4-2.13 0.8-0.48 1.88-1.14 2.4-1.48s1.47-0.95 2.1-1.36c0.63-0.42 1.78-1.23 2.55-1.81s1.76-1.34 2.2-1.69 1.02-0.85 1.3-1.11c0.27-0.27 0.81-0.74 1.2-1.06 0.38-0.33 1.59-1.47 2.68-2.54s2.47-2.49 3.06-3.15 1.4-1.63 1.81-2.15c0.4-0.52 0.94-1.2 1.2-1.5s0.89-1.14 1.4-1.85c0.52-0.72 1.33-1.91 1.82-2.65 0.48-0.74 1.28-2.03 1.77-2.85 0.49-0.83 1.06-1.79 1.25-2.15 0.2-0.36 0.68-1.3 1.07-2.1s0.94-1.95 1.21-2.55c0.27-0.61 0.91-2.16 1.43-3.45 0.51-1.29 1.2-3.23 1.53-4.3s0.74-2.47 0.9-3.1c0.17-0.63 0.49-2.01 0.71-3.05 0.22-1.05 0.47-2.37 0.56-2.95s0.23-1.5 0.31-2.05 0.24-1.83 0.35-2.85c0.11-1.04 0.23-2.93 0.26-4.3 0.03-1.38 0.01-3.54-0.06-4.95-0.07-1.38-0.23-3.49-0.36-4.7-0.14-1.21-0.38-3.01-0.55-4s-0.43-2.34-0.59-3c-0.17-0.66-0.48-1.97-0.71-2.9-0.23-0.94-0.66-2.42-0.95-3.3s-0.86-2.46-1.25-3.5c-0.39-1.05-0.84-2.19-1-2.55s-0.83-1.78-1.5-3.15c-0.67-1.38-1.73-3.36-2.36-4.4-0.63-1.05-1.43-2.33-1.77-2.85-0.34-0.53-1.1-1.63-1.68-2.45-0.59-0.83-1.71-2.31-2.5-3.3s-1.95-2.36-2.58-3.05-1.89-1.98-2.8-2.88-2.09-2.01-2.61-2.46c-0.52-0.46-1.38-1.18-1.91-1.62-0.52-0.43-1.29-1.05-1.7-1.36s-1.03-0.79-1.39-1.06-1.24-0.89-1.95-1.38c-0.72-0.49-1.77-1.19-2.35-1.55-0.58-0.37-1.39-0.87-1.8-1.12-0.41-0.24-1.45-0.83-2.3-1.29-0.85-0.47-2.09-1.12-2.76-1.44-0.66-0.33-1.66-0.79-2.21-1.04l-1.01-0.45c-0.07-2.95-0.14-4.34-0.2-5-0.07-0.66-0.17-1.67-0.23-2.25s-0.22-1.82-0.35-2.75c-0.13-0.94-0.33-2.26-0.43-2.95-0.11-0.69-0.27-1.57-0.35-1.95-0.08-0.39-0.38-1.67-0.66-2.85s-0.6-2.56-0.71-3.05c-0.12-0.5-0.52-1.87-0.91-3.05-0.38-1.18-0.95-2.89-1.25-3.8-0.31-0.91-0.71-2.01-0.9-2.45s-0.48-1.14-0.63-1.55c-0.16-0.41-0.48-1.22-0.73-1.8-0.24-0.58-1.15-2.45-2.01-4.15-0.86-1.71-1.97-3.8-2.47-4.65s-1.07-1.82-1.27-2.15-1.03-1.61-1.85-2.85c-0.83-1.24-1.76-2.59-2.08-3s-1.05-1.38-1.64-2.15c-0.58-0.77-1.31-1.72-1.63-2.1-0.31-0.39-1.13-1.36-1.81-2.15-0.68-0.8-2.62-2.82-4.3-4.5-1.69-1.68-3.43-3.37-3.87-3.75-0.44-0.39-1.2-1.04-1.69-1.45-0.48-0.41-1.23-1.02-1.66-1.35-0.42-0.33-1.15-0.9-1.61-1.26-0.46-0.37-1.35-1.04-1.98-1.5s-2.17-1.51-3.42-2.34-2.48-1.63-2.75-1.78c-0.26-0.15-0.91-0.53-1.43-0.84-0.52-0.3-1.54-0.88-2.25-1.28-0.72-0.4-1.71-0.93-2.2-1.18-0.5-0.24-1.13-0.58-1.4-0.74-0.28-0.16-0.77-0.4-1.1-0.53s-0.89-0.38-1.25-0.56c-0.36-0.17-1.06-0.49-1.55-0.69-0.5-0.2-1.55-0.64-2.35-0.97-0.8-0.34-2.06-0.82-2.8-1.09-0.74-0.26-1.8-0.63-2.35-0.83-0.55-0.19-1.72-0.57-2.6-0.85s-2.46-0.73-3.5-1.01c-1.05-0.28-3.05-0.75-4.45-1.04-1.4-0.3-2.89-0.61-3.3-0.7-0.41-0.08-1.38-0.24-2.15-0.35-0.77-0.12-2.01-0.28-2.75-0.36-0.74-0.09-1.91-0.22-2.6-0.3s-2.17-0.19-3.3-0.24c-1.13-0.06-3.4-0.13-5.05-0.15s-3.97-0.01-5.15 0.04z"/> - <path fill="#21218b" d="m277.3 137.4c-1.24 0.05-2.77 0.14-3.4 0.2s-2.57 0.32-4.3 0.56-4.37 0.69-5.85 0.99c-1.49 0.3-3.04 0.65-3.45 0.76-0.41 0.12-1.4 0.39-2.2 0.6s-1.95 0.56-2.55 0.78c-0.61 0.22-1.64 0.58-2.3 0.81s-1.74 0.61-2.4 0.84c-0.66 0.24-1.83 0.7-2.6 1.03s-1.81 0.78-2.3 1.01c-0.5 0.22-1.4 0.66-2 0.97-0.61 0.32-1.64 0.86-2.3 1.2s-1.63 0.87-2.15 1.17-1.22 0.71-1.55 0.91c-0.33 0.19-0.96 0.57-1.4 0.84-0.43 0.26-1.22 0.77-1.75 1.12-0.52 0.35-1.36 0.93-1.85 1.29-0.5 0.36-1.26 0.92-1.7 1.24s-1.09 0.79-1.44 1.06c-0.36 0.26-1.21 0.94-1.9 1.5-0.7 0.57-1.46 1.2-1.71 1.4-0.24 0.21-1 0.89-1.68 1.52s-1.78 1.69-2.45 2.36c-0.67 0.66-1.69 1.7-2.27 2.3-0.57 0.6-1.29 1.38-1.6 1.74s-1.03 1.23-1.61 1.93c-0.57 0.7-1.21 1.49-1.41 1.75-0.21 0.26-0.77 1.01-1.26 1.67-0.48 0.66-1.18 1.63-1.54 2.15-0.37 0.52-0.76 1.06-0.86 1.2-0.11 0.14-0.43 0.63-0.72 1.1s-0.85 1.39-1.25 2.05c-0.39 0.66-0.83 1.4-0.97 1.65s-0.38 0.55-0.54 0.68c-0.23 0.18-0.41 0.22-0.84 0.22-0.3-0.01-0.78-0.05-1.05-0.11-0.28-0.05-1.45-0.22-2.6-0.38-1.16-0.16-3.11-0.34-4.35-0.41s-3.02-0.1-3.95-0.08c-0.94 0.03-2.31 0.11-3.05 0.17s-1.82 0.16-2.4 0.22-1.61 0.19-2.3 0.29-2.02 0.32-2.95 0.49c-0.94 0.16-2.33 0.46-3.1 0.66s-1.63 0.43-1.9 0.5c-0.28 0.07-1.6 0.51-2.95 0.98-1.35 0.46-3.19 1.14-4.1 1.51s-2.62 1.16-3.8 1.75-2.74 1.41-3.45 1.83c-0.72 0.42-1.55 0.91-1.85 1.1s-1 0.63-1.55 0.99-1.36 0.92-1.81 1.25c-0.44 0.32-1.16 0.86-1.6 1.18-0.43 0.33-1.38 1.09-2.09 1.7-0.72 0.6-1.75 1.51-2.3 2-0.55 0.5-1.29 1.21-1.65 1.57s-1.11 1.15-1.66 1.75c-0.56 0.6-1.26 1.38-1.55 1.73-0.3 0.35-0.83 1.01-1.19 1.45-0.36 0.45-0.99 1.26-1.4 1.81-0.4 0.55-0.9 1.22-1.1 1.5-0.21 0.27-0.68 0.97-1.05 1.55s-0.84 1.3-1.05 1.6c-0.2 0.3-0.54 0.86-0.75 1.25-0.21 0.38-0.46 0.81-0.55 0.95s-0.44 0.79-0.78 1.45c-0.33 0.66-0.88 1.78-1.2 2.5-0.33 0.71-0.92 2.11-1.32 3.1-0.39 0.99-0.81 2-0.93 2.24-0.12 0.25-0.36 0.53-0.52 0.63-0.17 0.1-0.49 0.18-0.75 0.18-0.25 0-0.99-0.07-1.65-0.15s-1.9-0.15-2.75-0.15-2.18 0.05-2.95 0.1c-0.77 0.06-1.72 0.15-2.1 0.21-0.39 0.05-1.43 0.19-2.33 0.3-0.89 0.1-2.51 0.37-3.6 0.58-1.08 0.22-2.56 0.55-3.27 0.74-0.72 0.19-1.86 0.51-2.55 0.7s-2.06 0.63-3.05 0.96c-0.99 0.34-2.05 0.72-2.35 0.85s-0.91 0.38-1.35 0.56c-0.44 0.19-1.54 0.69-2.45 1.13s-2.44 1.22-3.4 1.75c-0.96 0.52-2.04 1.13-2.4 1.35s-1.35 0.86-2.2 1.43-2.18 1.51-2.95 2.1c-0.77 0.58-2.05 1.61-2.85 2.28-0.8 0.66-2.19 1.95-3.11 2.86-0.91 0.91-1.99 2.01-2.4 2.45s-1.25 1.41-1.86 2.15c-0.62 0.74-1.44 1.77-1.82 2.27-0.39 0.51-1.15 1.59-1.69 2.4-0.55 0.82-1.26 1.91-1.58 2.43-0.33 0.52-0.78 1.26-0.99 1.65-0.22 0.38-0.5 0.88-0.63 1.1-0.12 0.22-0.58 1.12-1.02 2-0.43 0.88-1.06 2.25-1.4 3.05s-0.84 2.06-1.12 2.8-0.7 1.96-0.95 2.7c-0.24 0.74-0.7 2.43-1.03 3.75s-0.69 2.96-0.8 3.65c-0.12 0.69-0.3 1.83-0.4 2.55-0.1 0.71-0.26 2.08-0.34 3.02-0.11 1.15-0.16 2.85-0.16 5.05 0 1.83 0.04 3.82 0.1 4.43 0.06 0.6 0.17 1.71 0.26 2.45 0.08 0.74 0.22 1.73 0.3 2.2s0.19 1.12 0.25 1.45c0.05 0.33 0.23 1.21 0.4 1.95s0.48 2.02 0.69 2.85c0.21 0.82 0.51 1.88 0.65 2.35 0.15 0.47 0.63 1.82 1.07 3s0.98 2.58 1.21 3.1c0.22 0.52 0.89 1.89 1.47 3.05 0.58 1.15 1.44 2.73 1.9 3.5s1.22 1.98 1.7 2.7c0.48 0.71 1.11 1.64 1.41 2.05s0.76 1.04 1.04 1.4c0.27 0.36 1.03 1.3 1.69 2.1s2.28 2.53 3.6 3.85c1.33 1.32 2.72 2.66 3.11 2.97 0.38 0.32 1.01 0.84 1.4 1.17 0.38 0.33 0.88 0.73 1.1 0.88 0.23 0.15 0.97 0.69 1.65 1.2 0.69 0.51 1.7 1.23 2.25 1.59 0.55 0.37 1.72 1.1 2.6 1.62s2.07 1.2 2.65 1.5 1.09 0.58 1.15 0.62c0.05 0.04 0.8 0.4 1.65 0.8s1.83 0.83 2.17 0.96c0.35 0.13 0.71 0.28 0.8 0.34 0.1 0.05 0.9 0.37 1.78 0.69 0.88 0.33 2.39 0.84 3.35 1.14s2.56 0.75 3.55 1 2.65 0.61 3.7 0.8c1.04 0.19 2.21 0.39 2.6 0.46 0.38 0.06 1.06 0.15 1.5 0.2 0.44 0.06 2.15 0.18 3.8 0.27 2.81 0.16 4.94 0.16 33.45 0 16.75-0.09 55.15-0.3 85.35-0.46 30.19-0.16 64.06-0.34 75.25-0.4 11.19-0.05 21.34-0.12 22.55-0.15 1.21-0.02 3.1-0.14 4.2-0.25s2.47-0.26 3.05-0.34c0.58-0.09 1.32-0.2 1.65-0.25s1.21-0.21 1.95-0.35 1.98-0.4 2.75-0.59 1.83-0.46 2.35-0.6 1.4-0.42 1.95-0.62c0.55-0.19 1.47-0.51 2.05-0.71 0.58-0.19 1.43-0.51 1.9-0.69 0.47-0.19 1.5-0.62 2.3-0.95 0.8-0.34 2.19-0.99 3.1-1.45s2.23-1.19 2.95-1.61c0.71-0.42 2.11-1.29 3.1-1.93s2.44-1.64 3.22-2.24c0.79-0.59 1.72-1.31 2.07-1.6 0.35-0.28 1.12-0.95 1.72-1.47s1.9-1.76 2.89-2.75c1-0.99 2.19-2.23 2.65-2.76 0.47-0.53 1.1-1.29 1.4-1.69s0.77-0.98 1.03-1.29c0.27-0.31 0.9-1.15 1.41-1.86 0.5-0.72 1.26-1.84 1.68-2.5s1.04-1.67 1.38-2.25c0.35-0.58 1.05-1.86 1.56-2.85s1.24-2.54 1.62-3.45 0.93-2.26 1.22-3 0.75-2.05 1.02-2.9 0.63-2.07 0.79-2.7 0.43-1.76 0.59-2.5c0.17-0.74 0.41-2.03 0.55-2.85 0.13-0.83 0.29-1.84 0.35-2.25s0.17-1.43 0.25-2.25c0.08-0.83 0.18-2.33 0.21-3.35 0.04-1.04 0.02-2.88-0.05-4.2-0.07-1.29-0.16-2.82-0.22-3.4-0.05-0.58-0.14-1.43-0.2-1.9s-0.22-1.55-0.35-2.4c-0.14-0.85-0.33-1.89-0.44-2.3s-0.38-1.52-0.6-2.45c-0.23-0.94-0.53-2.08-0.67-2.55s-0.68-2-1.2-3.4c-0.63-1.69-1.36-3.4-2.16-5.05-0.66-1.38-1.3-2.66-1.42-2.85s-0.39-0.64-0.6-1-0.48-0.81-0.6-1-0.55-0.87-0.95-1.5-1.11-1.69-1.58-2.35-1.26-1.72-1.76-2.35-1.13-1.42-1.41-1.75c-0.27-0.33-1.02-1.16-1.65-1.85s-1.75-1.84-2.5-2.56c-0.74-0.72-1.68-1.6-2.09-1.95s-1.04-0.89-1.4-1.19-1.5-1.18-2.53-1.95-2.65-1.9-3.6-2.51-2.36-1.46-3.13-1.89-2.01-1.09-2.75-1.46-1.87-0.91-2.5-1.19c-0.63-0.29-1.56-0.68-2.05-0.87-0.5-0.19-1.55-0.59-2.35-0.89-0.94-0.35-1.55-0.64-1.73-0.82-0.15-0.15-0.32-0.41-0.39-0.57-0.09-0.23-0.07-0.6 0.06-1.65 0.14-1.08 0.16-1.91 0.13-4.1-0.02-1.51-0.09-3.34-0.16-4.05-0.06-0.72-0.16-1.75-0.22-2.3s-0.17-1.47-0.25-2.05-0.21-1.43-0.29-1.9-0.19-1.19-0.25-1.6-0.27-1.4-0.46-2.2c-0.2-0.8-0.53-2.24-0.75-3.2s-0.59-2.34-0.84-3.05c-0.24-0.72-0.69-2.11-1.01-3.1-0.31-0.99-0.77-2.27-1.02-2.85-0.24-0.58-0.57-1.39-0.72-1.8-0.16-0.41-0.48-1.22-0.73-1.8-0.24-0.58-0.56-1.28-0.71-1.55-0.14-0.28-0.3-0.57-0.35-0.65-0.06-0.08-0.46-0.92-0.91-1.85-0.45-0.94-0.97-1.93-1.15-2.2-0.18-0.28-0.68-1.13-1.11-1.9s-0.97-1.68-1.19-2.01c-0.22-0.34-0.62-0.95-0.89-1.35-0.27-0.41-0.73-1.12-1.04-1.59-0.3-0.47-0.81-1.19-1.14-1.6-0.32-0.41-0.99-1.29-1.48-1.95-0.5-0.66-1.14-1.49-1.43-1.85s-1.08-1.31-1.76-2.1c-0.68-0.8-2.48-2.68-4-4.19-1.52-1.5-3.3-3.19-3.96-3.74-0.66-0.56-1.25-1.06-1.31-1.11-0.06-0.06-0.39-0.34-0.73-0.61-0.35-0.28-0.93-0.74-1.3-1.04-0.36-0.29-1.38-1.06-2.26-1.7-0.88-0.63-2.4-1.68-3.37-2.31-0.98-0.63-2.15-1.38-2.6-1.66-0.46-0.29-1.03-0.62-1.28-0.74s-0.52-0.28-0.6-0.35-0.51-0.32-0.95-0.55c-0.44-0.24-1.27-0.68-1.85-0.97-0.58-0.3-1.3-0.67-1.6-0.83s-1.09-0.54-1.75-0.84-1.7-0.74-2.3-0.99c-0.61-0.25-1.51-0.62-2-0.83-0.5-0.2-1.22-0.48-1.6-0.61-0.39-0.13-1.31-0.46-2.05-0.72-0.74-0.27-2-0.7-2.8-0.95s-2.22-0.66-3.15-0.91c-0.94-0.25-2.2-0.57-2.8-0.7-0.61-0.14-1.96-0.42-3-0.64-1.05-0.22-2.19-0.45-2.55-0.5-0.36-0.06-1.44-0.2-2.4-0.31-0.96-0.12-2.31-0.28-3-0.36s-2.22-0.19-3.4-0.24-3.12-0.11-4.3-0.13c-1.18-0.03-3.16-0.01-4.4 0.03z"/> - <path fill="#fdfdfd" d="m249.9 177.72c1.29-0.01 3.07 0.03 3.95 0.08 0.88 0.06 2.39 0.19 3.35 0.3 0.96 0.1 2.47 0.31 3.35 0.45s2.32 0.41 3.2 0.6 2.3 0.53 3.15 0.75c0.85 0.23 1.64 0.42 1.75 0.44s0.76 0.2 1.45 0.41c0.69 0.2 1.95 0.63 2.8 0.95s2.25 0.85 3.1 1.19c0.85 0.35 1.82 0.74 2.15 0.89 0.33 0.14 1.81 0.87 3.3 1.62 1.48 0.75 3.55 1.9 4.6 2.55 1.04 0.65 2.28 1.44 2.75 1.74 0.47 0.31 1.16 0.79 1.55 1.06 0.38 0.27 1.15 0.83 1.7 1.23 0.55 0.41 1.4 1.09 1.88 1.51 0.49 0.42 1.09 0.93 1.35 1.15 0.26 0.21 1.14 1.01 1.97 1.77 0.82 0.75 2.15 2.07 2.95 2.92 0.8 0.84 1.8 1.94 2.23 2.43s0.91 1.02 1.07 1.19c0.15 0.16 0.83 1.02 1.5 1.9 0.66 0.88 1.72 2.36 2.34 3.3 0.62 0.93 1.42 2.17 1.78 2.75 0.35 0.58 0.94 1.57 1.31 2.2 0.36 0.63 0.66 1.18 0.67 1.22 0 0.05 0.21 0.47 0.48 0.95 0.26 0.49 0.64 1.24 0.84 1.68s0.5 1.1 0.67 1.47c0.17 0.38 0.31 0.7 0.31 0.73s0.14 0.35 0.31 0.72c0.17 0.38 0.43 0.99 0.59 1.38 0.15 0.38 0.42 1.08 0.6 1.55s0.41 1.07 0.52 1.35c0.1 0.27 0.43 1.33 0.73 2.35s0.84 3 1.19 4.4c0.39 1.53 0.81 3.53 1.05 5 0.22 1.35 0.47 2.97 0.55 3.6s0.2 1.76 0.26 2.5c0.07 0.74 0.11 3.19 0.11 5.45-0.01 2.25-0.06 4.64-0.11 5.3-0.06 0.66-0.15 1.56-0.2 2-0.06 0.44-0.15 1.11-0.21 1.5-0.06 0.38-0.29 1.71-0.5 2.95-0.22 1.24-0.62 3.1-0.9 4.15-0.28 1.04-0.71 2.6-0.95 3.45-0.25 0.85-0.65 2.11-0.89 2.8s-0.59 1.65-0.78 2.15c-0.19 0.49-0.71 1.73-1.15 2.75s-1.03 2.32-1.3 2.9c-0.28 0.58-0.8 1.57-1.15 2.2-0.34 0.63-0.82 1.51-1.06 1.95s-0.62 1.09-0.84 1.45-0.83 1.29-1.36 2.08c-0.53 0.78-1.12 1.66-1.31 1.95s-0.71 1-1.15 1.57c-0.43 0.58-0.99 1.3-1.23 1.6-0.23 0.3-0.66 0.84-0.95 1.19-0.29 0.36-0.97 1.14-1.51 1.75-0.55 0.61-1.32 1.45-1.72 1.86-0.39 0.41-1.29 1.31-2 2s-1.78 1.68-2.38 2.2c-0.61 0.52-1.37 1.16-1.7 1.42-0.34 0.26-1.13 0.87-1.76 1.36-0.63 0.48-1.52 1.13-1.98 1.45-0.45 0.31-0.85 0.57-0.9 0.57-0.04 0-0.06-2.62-0.05-11.65l0.24-0.47c0.15-0.3 1.05-1.3 2.5-2.8 1.24-1.28 2.59-2.71 3-3.18s1.08-1.28 1.5-1.8 1.23-1.6 1.8-2.4 1.32-1.9 1.67-2.45 1-1.61 1.44-2.35 1.13-2 1.53-2.8 0.79-1.61 0.88-1.8c0.08-0.19 0.43-0.98 0.77-1.75s0.82-1.94 1.07-2.6 0.61-1.65 0.79-2.2c0.19-0.55 0.48-1.5 0.64-2.1 0.16-0.61 0.45-1.71 0.64-2.45s0.51-2.14 0.7-3.1c0.2-0.96 0.47-2.63 0.6-3.7 0.14-1.07 0.3-2.6 0.36-3.4s0.1-2.67 0.1-4.15c0-1.49-0.04-3.31-0.1-4.05s-0.2-2.09-0.31-3-0.31-2.21-0.44-2.9-0.35-1.77-0.5-2.4c-0.14-0.63-0.46-1.94-0.71-2.9-0.26-0.96-0.64-2.31-0.86-3-0.23-0.69-0.71-2.02-1.08-2.95-0.38-0.94-0.86-2.08-1.07-2.55-0.22-0.47-0.4-0.88-0.41-0.93-0.01-0.04-0.34-0.71-0.74-1.5-0.39-0.78-1.14-2.16-1.65-3.07-0.52-0.91-1.18-2.01-1.46-2.45-0.29-0.44-0.57-0.87-0.64-0.95s-0.6-0.83-1.19-1.65c-0.58-0.83-1.57-2.13-2.19-2.9-0.63-0.77-1.5-1.81-1.96-2.3-0.45-0.5-1.32-1.41-1.93-2.04-0.61-0.62-1.74-1.7-2.51-2.4s-1.76-1.56-2.2-1.92-1.18-0.94-1.65-1.29c-0.46-0.36-1.07-0.81-1.36-1-0.28-0.19-0.85-0.57-1.25-0.85-0.41-0.27-0.92-0.63-1.14-0.8-0.22-0.16-0.78-0.53-1.25-0.81s-1.44-0.82-2.15-1.21c-0.72-0.39-1.82-0.97-2.45-1.31-0.63-0.33-2.03-0.94-3.1-1.37-1.07-0.42-2.36-0.94-2.85-1.15-0.5-0.21-1.78-0.65-2.85-0.98s-3.1-0.85-4.5-1.16c-1.4-0.3-3.05-0.62-3.65-0.71-0.61-0.08-1.98-0.24-3.05-0.35s-3.12-0.25-4.55-0.31c-1.92-0.09-3.24-0.09-5.05-0.01-1.35 0.06-3.35 0.23-4.45 0.37s-2.34 0.32-2.75 0.4-1.67 0.36-2.8 0.61-2.86 0.7-3.85 1-2.36 0.77-3.05 1.04-1.52 0.59-1.85 0.7-0.96 0.37-1.4 0.56c-0.44 0.2-0.96 0.43-1.15 0.51-0.19 0.09-1 0.49-1.8 0.88-0.8 0.4-2.08 1.07-2.85 1.5s-1.64 0.93-1.93 1.11c-0.28 0.19-0.54 0.34-0.57 0.34s-0.24 0.15-0.46 0.32c-0.23 0.18-0.63 0.46-0.9 0.63-0.26 0.16-0.81 0.52-1.21 0.8-0.4 0.27-1.2 0.86-1.78 1.29-0.58 0.44-1.3 1-1.6 1.25-0.3 0.24-0.91 0.75-1.35 1.12s-1.32 1.16-1.95 1.76-1.65 1.6-2.26 2.23-1.63 1.76-2.25 2.51c-0.63 0.75-1.28 1.54-1.45 1.75-0.17 0.22-0.66 0.88-1.1 1.49-0.44 0.6-1.09 1.53-1.44 2.05-0.34 0.52-0.77 1.17-0.95 1.45-0.18 0.27-0.48 0.77-0.68 1.1-0.19 0.33-0.54 0.91-0.77 1.3-0.23 0.38-0.88 1.64-1.45 2.8-0.56 1.15-1.14 2.35-1.28 2.65s-0.52 1.22-0.85 2.05c-0.33 0.82-0.74 1.93-0.92 2.45-0.17 0.52-0.61 1.96-0.96 3.2-0.36 1.24-0.81 2.99-1 3.9s-0.48 2.46-0.64 3.45-0.36 2.56-0.46 3.5c-0.15 1.32-0.19 2.53-0.19 5.45 0 2.33 0.05 4.24 0.13 5.05 0.07 0.71 0.24 2.06 0.37 3 0.14 0.93 0.4 2.49 0.6 3.45 0.19 0.96 0.55 2.49 0.8 3.4s0.69 2.37 0.97 3.25 0.65 1.98 0.83 2.45 0.49 1.2 0.69 1.62c0.2 0.43 0.36 0.8 0.36 0.83s0.32 0.76 0.71 1.62c0.39 0.87 0.93 2.01 1.21 2.53s0.73 1.33 1.01 1.8 0.77 1.3 1.1 1.85 0.96 1.54 1.4 2.2 1.26 1.81 1.81 2.55 1.12 1.47 1.26 1.61c0.14 0.15 0.45 0.51 0.7 0.8s0.88 1 1.41 1.58 1.34 1.44 1.79 1.91c0.46 0.47 1.29 1.27 1.84 1.78 0.56 0.51 1.1 1.08 1.2 1.25 0.19 0.31 0.19 0.38 0.05 2.52-0.08 1.29-0.14 3.77-0.14 9.84l-0.3-0.23c-0.17-0.13-0.62-0.45-1-0.73-0.39-0.27-1.02-0.74-1.41-1.04-0.38-0.3-1.06-0.83-1.5-1.19s-1.09-0.89-1.45-1.19c-0.35-0.29-1.35-1.19-2.22-2-0.87-0.8-2.16-2.07-2.86-2.81-0.69-0.74-1.69-1.84-2.21-2.44s-1.19-1.39-1.48-1.75-1.04-1.34-1.66-2.16c-0.62-0.83-1.51-2.05-1.97-2.73s-1.1-1.62-1.41-2.1c-0.32-0.48-0.64-1.01-0.71-1.17-0.08-0.17-0.36-0.68-0.64-1.15s-0.93-1.66-1.45-2.65-1.11-2.21-1.32-2.7c-0.21-0.5-0.58-1.35-0.82-1.9s-0.65-1.54-0.92-2.2c-0.28-0.66-0.61-1.56-0.75-2s-0.45-1.45-0.71-2.25c-0.25-0.8-0.48-1.59-0.52-1.75-0.04-0.17-0.27-1.04-0.51-1.95s-0.63-2.73-0.88-4.05c-0.24-1.32-0.51-2.87-0.59-3.45-0.09-0.58-0.18-1.46-0.2-1.95-0.03-0.5-0.11-1.6-0.17-2.45-0.08-0.87-0.13-3.17-0.13-5.25 0-2.04 0.05-4.44 0.12-5.35s0.15-2.08 0.17-2.6c0.03-0.52 0.1-1.22 0.16-1.55s0.3-1.61 0.54-2.85 0.57-2.77 0.73-3.4 0.49-1.83 0.72-2.65c0.23-0.83 0.52-1.82 0.65-2.2 0.13-0.39 0.33-1.04 0.45-1.45s0.47-1.38 0.76-2.15c0.3-0.77 0.65-1.65 0.79-1.95 0.13-0.3 0.51-1.18 0.85-1.95s0.9-1.99 1.25-2.7c0.36-0.72 0.95-1.82 1.31-2.45 0.37-0.63 0.79-1.38 0.94-1.65 0.15-0.28 0.55-0.95 0.9-1.5s0.91-1.41 1.25-1.9c0.34-0.5 0.9-1.31 1.25-1.8 0.34-0.5 0.79-1.1 0.98-1.35 0.2-0.25 0.4-0.46 0.44-0.48 0.04-0.01 0.08-0.09 0.08-0.17s0.03-0.15 0.07-0.15c0.05 0 0.28-0.26 0.53-0.57s0.85-1.04 1.33-1.62c0.49-0.58 1.48-1.71 2.2-2.5 0.73-0.8 2.04-2.12 2.92-2.94 0.88-0.83 2.03-1.87 2.55-2.32 0.52-0.44 1.42-1.19 2-1.65s1.06-0.88 1.07-0.92c0.02-0.05 0.1-0.08 0.18-0.08s0.15-0.03 0.15-0.08c0-0.04 0.52-0.46 1.17-0.93s1.47-1.05 1.83-1.29c0.36-0.23 1.17-0.75 1.8-1.15s1.66-1.03 2.27-1.39c0.62-0.36 1.17-0.66 1.23-0.66 0.05 0 0.11-0.04 0.12-0.09 0.02-0.05 1.18-0.66 2.58-1.35 1.4-0.7 2.75-1.34 3-1.43s0.47-0.21 0.5-0.25c0.03-0.05 0.12-0.1 0.2-0.12s0.28-0.08 0.45-0.15c0.16-0.07 1.22-0.48 2.35-0.91s2.68-0.98 3.45-1.23 1.74-0.52 2.15-0.62 0.97-0.24 1.25-0.32c0.27-0.07 1.26-0.31 2.2-0.53 0.93-0.21 2.35-0.5 3.15-0.64s2.51-0.39 3.8-0.55c1.29-0.17 3-0.35 3.8-0.41 0.8-0.05 1.63-0.12 1.85-0.13 0.22-0.02 1.46-0.04 2.75-0.05zm0 26c0.8-0.01 2.08 0.03 2.85 0.08 0.77 0.06 2.19 0.22 3.15 0.35 1.17 0.16 2.53 0.43 4.1 0.84 1.29 0.33 3.07 0.84 3.95 1.15 0.88 0.3 2.3 0.86 3.15 1.24s1.98 0.91 2.5 1.17 1.26 0.66 1.65 0.88c0.38 0.22 1.42 0.88 2.3 1.46s2.16 1.51 2.84 2.06 1.38 1.11 1.56 1.25c0.17 0.14 0.78 0.68 1.34 1.2 0.57 0.52 1.56 1.53 2.21 2.25 0.65 0.71 1.36 1.52 1.59 1.8 0.23 0.27 0.81 1.02 1.29 1.66s1.11 1.52 1.41 1.95c0.3 0.44 0.83 1.25 1.18 1.81 0.34 0.57 1.07 1.92 1.62 3 0.54 1.09 1.24 2.6 1.55 3.35 0.31 0.76 0.65 1.71 0.75 2.1 0.11 0.4 0.35 1.22 0.54 1.83 0.19 0.6 0.42 1.44 0.51 1.85s0.25 1.15 0.35 1.65c0.11 0.49 0.31 1.64 0.45 2.55 0.13 0.91 0.3 2.3 0.37 3.1 0.07 0.9 0.1 2.27 0.06 3.6-0.03 1.32-0.14 2.75-0.27 3.7-0.11 0.85-0.35 2.22-0.51 3.05-0.17 0.82-0.51 2.24-0.76 3.15s-0.6 2.1-0.78 2.65-0.54 1.52-0.8 2.15-0.97 2.16-1.59 3.4c-0.77 1.54-1.5 2.82-2.31 4.05-0.65 0.99-1.51 2.23-1.92 2.75-0.4 0.52-0.83 1.07-1.18 1.49l-0.85-0.82c-0.47-0.45-1.57-1.41-2.45-2.15s-1.67-1.38-1.75-1.42c-0.13-0.07-0.09-0.16 0.18-0.52 0.18-0.24 0.6-0.84 0.92-1.33 0.33-0.5 0.67-1.01 0.77-1.15s0.47-0.72 0.82-1.3 0.99-1.7 1.42-2.5 0.79-1.51 0.79-1.58c0-0.06 0.17-0.49 0.39-0.95 0.21-0.45 0.46-1 0.55-1.22 0.1-0.22 0.41-1.12 0.71-2 0.29-0.88 0.67-2.29 0.84-3.15 0.17-0.85 0.4-2.38 0.52-3.4 0.14-1.3 0.2-2.5 0.21-4.05 0-1.21-0.05-2.74-0.12-3.4s-0.13-1.27-0.15-1.35-0.06-0.38-0.1-0.65c-0.03-0.28-0.13-0.86-0.22-1.3-0.08-0.44-0.26-1.25-0.4-1.8-0.13-0.55-0.47-1.68-0.75-2.5-0.28-0.83-0.75-2.09-1.04-2.8-0.3-0.72-0.78-1.77-1.06-2.35-0.29-0.57-0.94-1.7-1.44-2.5s-1.12-1.77-1.38-2.15c-0.27-0.39-0.65-0.9-0.85-1.14-0.2-0.25-0.43-0.54-0.51-0.66s-0.44-0.56-0.8-0.96c-0.36-0.41-1.1-1.19-1.65-1.74s-1.48-1.41-2.06-1.9c-0.59-0.5-1.33-1.1-1.65-1.35-0.33-0.25-1.11-0.8-1.74-1.21-0.63-0.42-1.42-0.93-1.75-1.15-0.33-0.21-0.69-0.44-0.8-0.5s-0.76-0.4-1.45-0.76-1.57-0.78-1.95-0.93c-0.39-0.15-0.97-0.38-1.3-0.51-0.33-0.12-1.03-0.36-1.55-0.53-0.52-0.16-1.4-0.43-1.95-0.6s-1.56-0.42-2.25-0.55c-0.69-0.14-2.13-0.34-3.2-0.46-1.7-0.19-2.32-0.21-4.8-0.17-2.12 0.03-3.24 0.1-4.35 0.25-0.83 0.12-1.97 0.3-2.55 0.42-0.58 0.11-1.46 0.34-1.95 0.5-0.5 0.16-1.31 0.41-1.8 0.55-0.5 0.15-1.15 0.38-1.45 0.52s-1.05 0.45-1.65 0.7c-0.61 0.24-1.15 0.48-1.2 0.53-0.06 0.05-0.6 0.35-1.2 0.68-0.61 0.32-1.44 0.78-1.85 1.02s-1.18 0.72-1.7 1.08c-0.52 0.35-1.09 0.75-1.25 0.88-0.17 0.13-0.84 0.69-1.5 1.23s-1.69 1.47-2.29 2.07-1.5 1.56-2 2.14-1.06 1.26-1.24 1.5c-0.18 0.25-0.54 0.74-0.8 1.1-0.27 0.36-0.83 1.2-1.25 1.87-0.42 0.68-0.77 1.25-0.77 1.28s-0.15 0.29-0.33 0.57c-0.18 0.29-0.48 0.87-0.67 1.28-0.18 0.41-0.51 1.13-0.72 1.6-0.22 0.47-0.46 1.03-0.53 1.25s-0.34 0.98-0.6 1.7c-0.26 0.71-0.64 2.02-0.85 2.9s-0.46 2.09-0.54 2.7c-0.09 0.6-0.21 1.8-0.27 2.65-0.07 0.85-0.12 2.49-0.12 3.65 0 1.15 0.06 2.71 0.12 3.45 0.07 0.74 0.21 1.8 0.32 2.35s0.34 1.54 0.5 2.2c0.17 0.66 0.43 1.56 0.59 2s0.44 1.2 0.63 1.7c0.19 0.49 0.66 1.59 1.06 2.42 0.39 0.84 0.71 1.55 0.71 1.58s0.28 0.56 0.63 1.17c0.35 0.62 1.09 1.83 1.64 2.68 0.56 0.85 1.19 1.77 1.4 2.04s0.42 0.55 0.48 0.63c0.07 0.1 0.05 0.17-0.1 0.26-0.11 0.06-0.31 0.22-0.45 0.35-0.14 0.14-0.45 0.41-0.7 0.6-0.25 0.2-0.86 0.72-1.35 1.16-0.5 0.44-1.26 1.15-2.5 2.37l-0.92-1.23c-0.51-0.68-1.36-1.91-1.89-2.73-0.53-0.83-1.11-1.75-1.29-2.05s-0.73-1.34-1.22-2.3-1.11-2.25-1.37-2.85c-0.27-0.61-0.66-1.62-0.88-2.25-0.21-0.63-0.61-1.94-0.89-2.9-0.27-0.96-0.63-2.4-0.79-3.2s-0.33-1.79-0.39-2.2-0.16-1.38-0.23-2.15-0.13-2.66-0.13-4.2c0-1.68 0.05-3.22 0.13-3.85 0.07-0.58 0.22-1.61 0.33-2.3s0.38-1.99 0.6-2.9 0.63-2.35 0.9-3.2c0.28-0.85 0.59-1.8 0.7-2.1 0.1-0.3 0.34-0.93 0.54-1.4s0.75-1.64 1.23-2.6c0.47-0.96 1.06-2.11 1.31-2.55s0.82-1.34 1.27-2c0.44-0.66 1.1-1.62 1.45-2.14s0.98-1.33 1.39-1.8 0.91-1.06 1.1-1.31 0.72-0.85 1.19-1.34c0.47-0.48 1.17-1.19 1.56-1.56 0.38-0.37 1.02-0.94 1.42-1.26 0.39-0.33 1-0.82 1.35-1.1 0.34-0.28 1.03-0.78 1.53-1.11 0.49-0.33 1.37-0.92 1.95-1.29 0.58-0.38 1.3-0.83 1.6-0.98 0.3-0.16 0.66-0.37 0.8-0.46s0.79-0.42 1.45-0.72c0.66-0.31 1.76-0.81 2.45-1.11 0.69-0.31 1.83-0.77 2.55-1.02 0.71-0.25 2.06-0.66 3-0.9 0.93-0.23 2.19-0.55 2.8-0.69 0.6-0.14 1.71-0.35 2.45-0.45 0.74-0.11 1.91-0.25 2.6-0.31 0.69-0.05 1.43-0.12 1.65-0.14 0.22-0.01 1.05-0.03 1.85-0.04zm0.65 23.43c1.11 0.02 2.13 0.11 2.92 0.24 0.83 0.14 1.74 0.39 2.8 0.77 0.87 0.31 1.74 0.64 1.93 0.73 0.19 0.1 0.78 0.41 1.3 0.7 0.52 0.28 1.31 0.77 1.76 1.09 0.44 0.31 1.23 0.93 1.74 1.37 0.52 0.44 1.23 1.14 1.6 1.55 0.36 0.41 0.9 1.09 1.21 1.5 0.3 0.41 0.79 1.14 1.07 1.62 0.29 0.49 0.52 0.92 0.52 0.98 0 0.05 0.03 0.11 0.08 0.12 0.04 0.02 0.24 0.39 0.44 0.83s0.52 1.25 0.71 1.8 0.44 1.4 0.55 1.9c0.12 0.49 0.28 1.37 0.37 1.95 0.08 0.58 0.15 1.72 0.15 2.55 0 0.82-0.05 1.88-0.11 2.35-0.05 0.47-0.19 1.3-0.31 1.85-0.11 0.55-0.36 1.47-0.54 2.05-0.19 0.58-0.72 1.81-1.18 2.75-0.54 1.08-1.13 2.1-1.64 2.8-0.43 0.6-1.21 1.53-1.73 2.05s-1.37 1.28-1.89 1.69c-0.52 0.4-1.33 0.96-1.8 1.23-0.47 0.28-1.32 0.74-1.9 1.03s-1.52 0.69-2.1 0.89-1.41 0.46-1.85 0.57-0.98 0.23-1.2 0.25c-0.22 0.03-0.74 0.08-1.15 0.12s-1.49 0.07-2.4 0.07-2.04-0.03-2.53-0.08c-0.48-0.04-1.29-0.16-1.8-0.27-0.5-0.11-1.19-0.29-1.52-0.39-0.33-0.11-0.8-0.27-1.05-0.36-0.25-0.08-1.08-0.47-1.85-0.84-0.77-0.38-1.76-0.93-2.2-1.22-0.44-0.28-1.12-0.77-1.5-1.08-0.39-0.31-1.11-0.97-1.6-1.46-0.5-0.5-1.2-1.29-1.56-1.75-0.37-0.47-0.95-1.32-1.3-1.9-0.34-0.58-0.8-1.43-1.01-1.9-0.22-0.47-0.48-1.03-0.58-1.25s-0.3-0.76-0.43-1.2c-0.14-0.44-0.35-1.27-0.46-1.85-0.12-0.58-0.26-1.59-0.31-2.25s-0.1-1.76-0.1-2.45c0-0.77 0.07-1.71 0.19-2.45 0.11-0.66 0.36-1.76 0.56-2.45s0.62-1.79 0.94-2.45c0.31-0.66 0.86-1.67 1.21-2.25 0.36-0.58 0.92-1.41 1.26-1.85s0.99-1.18 1.45-1.65 1.13-1.1 1.49-1.41 1.03-0.83 1.5-1.16 1.19-0.78 1.6-0.98c0.41-0.21 0.93-0.5 1.15-0.63 0.22-0.14 1.01-0.47 1.75-0.74s1.71-0.58 2.15-0.68 1.23-0.24 1.75-0.29c0.52-0.06 1.13-0.13 1.35-0.15s1.16-0.03 2.1-0.01zm2.05 49.63c7.29 0.01 12.44 0.07 13.05 0.13 0.55 0.06 1.43 0.21 1.95 0.34s1.24 0.36 1.6 0.5 0.94 0.42 1.3 0.61c0.36 0.2 1.01 0.65 1.45 0.99 0.44 0.35 1.21 1.05 1.71 1.57 0.51 0.51 1.18 1.27 1.49 1.68s0.8 1.13 1.07 1.6c0.28 0.47 0.62 1.07 0.76 1.35 0.14 0.27 0.45 0.97 0.69 1.55s0.59 1.61 0.78 2.3 0.45 1.79 0.59 2.45c0.13 0.66 0.27 1.56 0.31 2 0.03 0.44 0.1 1.29 0.15 1.9 0.06 0.6 0.1 1.8 0.1 2.65s-0.05 2.07-0.1 2.7c-0.06 0.63-0.13 1.58-0.16 2.1s-0.21 1.76-0.41 2.75c-0.19 0.99-0.5 2.34-0.69 3s-0.49 1.63-0.66 2.15-0.53 1.56-0.8 2.3-0.69 1.84-0.94 2.45c-0.24 0.6-0.84 1.84-1.32 2.75-0.49 0.91-1.01 1.87-1.16 2.15-0.15 0.27-0.44 0.77-0.64 1.1s-0.61 0.96-0.91 1.4c-0.31 0.44-0.84 1.18-1.2 1.65-0.35 0.47-0.85 1.1-1.1 1.4s-0.8 0.9-1.21 1.34c-0.41 0.45-1.29 1.31-1.95 1.92-0.66 0.62-1.54 1.38-1.95 1.7s-1.2 0.87-1.75 1.22c-0.55 0.36-1.59 0.93-2.3 1.28-0.72 0.34-1.98 0.86-2.8 1.15-0.87 0.3-2.07 0.63-2.85 0.77-1.28 0.25-1.53 0.26-4.85 0.26-3.27 0.01-3.58-0.01-4.75-0.23-0.69-0.13-1.75-0.4-2.35-0.61-0.61-0.2-1.51-0.54-2-0.75-0.5-0.2-1.31-0.58-1.8-0.84-0.5-0.27-1.22-0.68-1.6-0.94-0.39-0.25-1.1-0.74-1.59-1.09s-1.13-0.83-1.41-1.08-0.67-0.59-0.86-0.76c-0.19-0.16-0.41-0.39-0.5-0.5-0.09-0.1-0.36-0.38-0.6-0.6-0.24-0.23-0.54-0.53-0.67-0.68-0.12-0.14-0.28-0.29-0.35-0.34-0.07-0.04-0.35-0.34-0.63-0.67s-0.91-1.14-1.4-1.8c-0.5-0.66-1.08-1.47-1.3-1.8-0.23-0.33-0.68-1.05-1.01-1.6s-0.87-1.47-1.2-2.05-0.81-1.47-1.07-1.98c-0.25-0.5-0.52-1.09-0.6-1.3-0.07-0.2-0.41-1.07-0.76-1.92-0.34-0.85-0.84-2.2-1.1-3s-0.66-2.17-0.88-3.05-0.42-1.85-0.45-2.15-0.15-1.14-0.26-1.85c-0.11-0.72-0.25-1.98-0.32-2.8-0.07-0.97-0.1-2.43-0.06-4.1 0.03-1.44 0.13-3.07 0.21-3.65s0.24-1.64 0.35-2.35c0.11-0.72 0.34-1.75 0.51-2.3 0.18-0.55 0.43-1.27 0.57-1.6s0.41-0.96 0.6-1.4c0.2-0.44 0.63-1.27 0.96-1.85s0.76-1.25 0.96-1.5 0.39-0.46 0.43-0.48c0.04-0.01 0.08-0.07 0.08-0.12 0-0.06 0.42-0.53 0.92-1.06 0.51-0.53 1.31-1.27 1.78-1.65 0.47-0.37 1.28-0.91 1.8-1.18s1.42-0.66 2-0.85 1.43-0.4 1.9-0.46 2.27-0.15 4-0.19c1.73-0.03 8.57-0.05 15.2-0.03z" fill-rule="evenodd"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/podfriend.svg b/app/Views/_assets/images/platforms/podcasting/podfriend.svg deleted file mode 100644 index 5d393afe0fa83d9da1f6a17cd7a303cc313b0342..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/podfriend.svg +++ /dev/null @@ -1,20 +0,0 @@ -<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="300" height="300" rx="67" fill="#00a4ff"/> - <g transform="matrix(.72999 0 0 .72999 304.76 303.22)"> - <path fill="#ff00b7" d="m-322.55-166.48h221.1s-11.256 73.535-110.59 73.535c-99.331 0-110.52-73.535-110.52-73.535z"/> - <path d="m-277.13-107.51c-22.588-10.667-39.639-32.37-44.651-56.836q25.424-1.3916 50.895-1.8896c11.941-0.23145 26.604-2.6191 38.268-0.0439-12.012 6.1934-22.772 10.778-31.348 22.011a64.523 64.523 0 0 0-9.5566 17.646c-0.74121 2.0508-5.6748 18.138-3.6064 19.113z"/> - <path d="m-214.43-124.95c-0.29297 2.2002-0.24024 4.9805 1.7578 5.9766 1.4824 0.75 3.3662 0 4.4443-1.2744 1.0781-1.2744 1.5469-2.9297 2.0361-4.5146 5.1387-16.951 15.431-30.158 28.271-41.938-7.5674 0.74121-17.15-0.52149-22.626 5.7686-8.1182 9.3106-12.237 24.023-13.884 35.982z"/> - <path fill="#fff" d="m-286.12-133.07c6.6826 0 12.847-17.487 14.965-30.747h-27.425c1.1162 13.151 5.9502 30.747 12.46 30.747z"/> - <path fill="#fff" d="m-137.88-133.07c6.5332 0 11.358-17.596 12.463-30.747h-27.434c2.127 13.26 8.2998 30.747 14.971 30.747z"/> - <path d="m-212.04-87.893c-53.282 0-81.832-20.982-96.404-38.596-15.926-19.242-18.987-38.423-19.116-39.223l-0.87891-5.8213h232.88l-0.87891 5.8242c-0.12598 0.8086-3.2227 19.989-19.151 39.226-14.599 17.607-43.175 38.59-96.451 38.59zm-104.12-73.535c4.9453 16.781 25.743 63.404 104.12 63.404 77.531 0 98.941-46.723 104.11-63.404z"/> - <circle fill="#00a397" cx="-212" cy="-244.74" r="53.013"/> - <circle cx="-212" cy="-244.74" r="27.305"/> - <circle fill="#fff" cx="-189" cy="-259.72" r="15.185"/> - <path fill="#fff" d="m-212.71-326.84c90.34 0 96.202 86.845 96.202 86.845s6.3926 47.417-26.106 47.417h-74.722"/> - <path fill="#fff" d="m-211.29-326.84c-90.34 0-96.202 86.845-96.202 86.845s-6.3926 47.417 26.106 47.417h74.725"/> - <circle fill="#00a397" cx="-212" cy="-244.74" r="53.013"/> - <circle cx="-212" cy="-244.74" r="27.305"/> - <circle fill="#fff" cx="-189" cy="-259.72" r="15.185"/> - <path d="m-111.48-240.54c-0.41895-4.793-9.3193-90.439-99.806-91.342v-0.0205h-0.71484-0.71484v0.0205c-90.478 0.90234-99.384 86.54-99.806 91.339-0.29297 2.3877-3.3809 29.106 9.375 43.696 5.4082 6.1875 12.732 9.3252 21.765 9.3252h138.76c9.0322 0 16.354-3.1377 21.765-9.3252 12.756-14.59 9.6797-41.306 9.375-43.693zm-16.992 37.031c-3.4541 3.9492-8.0801 5.8594-14.147 5.8594h-138.76c-6.0586 0-10.682-1.9131-14.133-5.8594-10.058-11.479-6.9902-35.59-6.958-35.827l0.0322-0.33106c0.23437-3.3428 6.7031-81.671 90.439-82.119 83.736 0.44824 90.202 78.776 90.439 82.113l0.0322 0.33692c0.90527 6.7295 1.4238 26.256-6.9434 35.836z"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/podinstall.svg b/app/Views/_assets/images/platforms/podcasting/podinstall.svg deleted file mode 100644 index fb6f3868758057d957256b7eccfb6127aff39c73..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/podinstall.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="300" height="300" rx="67" fill="#1c185b"/> - <path d="m89.047 222.88-12.09-12.122v-145.76h38.496c21.876 0 40.89 0.45403 44.041 1.0516 12.35 2.3421 17.534 5.9045 37.172 25.542 20.305 20.305 23.32 24.884 25.741 39.088 4.3347 25.437-13.949 51.09-39.775 55.808-3.3624 0.61415-11.592 1.1167-18.288 1.1167h-12.174v47.394h-51.032zm46.637-1.7876-9.7472-9.7881h-21.162v19.576h40.656zm-35.03-1.0303v-8.7573h-17.984l8.7117 8.7573c4.7917 4.8166 8.8384 8.7573 8.9922 8.7573 0.15377 0 0.28032-3.9409 0.28032-8.7573zm47.394-24.212v-31.939h-19.576v44.78l9.51 9.5494c5.2304 5.2523 9.6351 9.5494 9.7881 9.5494 0.15286 0 0.27793-14.373 0.27793-31.939zm-47.394-46.642v-57.975l-19.575-19.494v135.44h19.575zm23.697 0.79305v-57.182h-19.576v114.36h19.576zm65.939 30.608c11.361-4.5296 21.383-14.54 26.002-25.971 1.8769-4.6453 2.2934-7.7093 2.3108-17 0.0201-10.675-0.17353-11.745-3.3326-18.415-2.3347-4.9298-5.415-9.1027-10.137-13.732-3.7304-3.6577-6.9882-6.4448-7.2394-6.1936-0.25125 0.25125 0.0894 3.7648 0.75719 7.8076 3.0251 18.318-5.9376 38.414-21.621 48.478-5.1536 3.3071-14.15 6.64-20.997 7.779l-3.8636 0.64265v19.664l16.227-0.39957c13.681-0.33686 17.117-0.75412 21.894-2.659zm-42.243-54.304v-33.485h-19.576v66.97h19.576zm18.659 30.441c11.115-4.1886 21.419-14.499 25.788-25.804 3.0932-8.0031 3.6953-20 1.4245-28.389l-1.7941-6.628-5.2259-1.552c-3.5923-1.0668-9.8376-1.5519-19.978-1.5519h-14.752v67.25l4.4922-0.61573c2.4707-0.33865 6.9912-1.5574 10.045-2.7085zm19.458-70.113c-4.6159-5.828-10.991-10.805-18.098-14.13-5.6804-2.6572-7.1962-2.8816-21.564-3.1922l-15.455-0.33408 19.535 19.722 14.445 0.1219c7.9444 0.0671 15.836 0.47583 17.536 0.90842 6.7179 1.7094 7.1284 1.3564 3.6016-3.0965zm-61.814-7.7217v-9.7881h-40.656l19.494 19.576h21.162zm20.606 9.5061c0-0.15496-3.7091-3.9691-8.2427-8.476l-8.2427-8.194v16.951h8.2427c4.5334 0 8.2427-0.12679 8.2427-0.28174z" fill="#fff" stroke-width="1.3333"/> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/podlink.svg b/app/Views/_assets/images/platforms/podcasting/podlink.svg deleted file mode 100644 index cb779322c6aef8693d0a93d6e49c02e649c30ea0..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/podlink.svg +++ /dev/null @@ -1 +0,0 @@ -<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg"><rect width="300" height="300" rx="67" fill="#db73f5"/><path d="m82.825 212.98 59.131-117.38c4.1141-7.1264 14.395-7.1264 18.51 0l61.264 102.9c4.1141 7.1264-1.0266 16.028-9.2548 16.028l-118.92 18.169c-1.9897 0-3.6068-1.6131-3.6068-3.6068s1.6131-3.6068 3.6068-3.6068l118.52-18.153c2.4613 0 4.0071-2.6635 2.7824-4.7998l-60.693-102.77c-1.2287-2.1443-4.3202-2.1522-5.5568-.01189l-59.088 117.1a3.8664 3.8664 0 01-5.2279 1.4427c-1.8906-1.0503-2.5525-3.4443-1.4705-5.3151z" fill="#fff" stroke="#000" stroke-linecap="round" stroke-miterlimit="10" stroke-width="4.5953"/><path d="m151.66 98.17v-30.872m-80.538 74.419 22.326 14.122m-2.2037-25.739 10.602 17.749m-32.485 17.031 20.475 2.822" fill="#fff" stroke="#000" stroke-linecap="round" stroke-miterlimit="10" stroke-width="4.5953"/><path d="m229.36 116.33-91.085 75.695a3.5977 3.5977 0 01-5.0693-.4677 3.5977 3.5977 0 01.46769-5.0693l91.089-75.695a3.5977 3.5977 0 015.0693.4677c1.2683 1.5299 1.0582 3.801-.47166 5.0693z" fill="#fff" stroke="#000" stroke-linecap="round" stroke-miterlimit="10" stroke-width="4.5953"/></svg> diff --git a/app/Views/_assets/images/platforms/podcasting/podtail.svg b/app/Views/_assets/images/platforms/podcasting/podtail.svg deleted file mode 100644 index acbeb47fc9c36af7a3052d5491bca8237038c3ee..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/podtail.svg +++ /dev/null @@ -1,13 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 300"> - <defs> - <linearGradient id="linear-gradient" x1="98.65" y1="77.34" x2="182.61" y2="222.76" gradientUnits="userSpaceOnUse"> - <stop offset="0" stop-color="#fbdb67"/> - <stop offset="0.5" stop-color="#906a01"/> - <stop offset="1" stop-color="#ab8009"/> - </linearGradient> - </defs> - <g id="podtail"> - <rect y="0.14" width="300" height="300" rx="67"/> - <path d="M150.08,235.14c-1.27-.24-2.55-.45-3.82-.72-8.82-1.82-14.78-6.95-17.8-15.46-1.86-5.25-2.27-10.71-2.36-16.22,0-2.47-.17-2.6-2.63-2.61-3.6,0-7.2,0-10.8,0-2.75,0-4.33-1.68-4.32-4.46s1.61-4.43,4.36-4.45c3.72,0,7.43-.06,11.15,0,1.61,0,2.21-.59,2.18-2.19-.08-3.37-.06-6.73,0-10.09,0-1.41-.58-2-1.93-2.18-15.44-2.55-25-13.85-25-29.49,0-4.53.42-4.1-4.06-4.12-.83,0-1.66,0-2.48,0a5,5,0,0,1-4.37-4.59,4.86,4.86,0,0,1,4.38-4.37c1.3-.1,2.6-.05,3.9-.06,2.53,0,2.62-.08,2.62-2.56q0-18.59,0-37.17c0-14.65,9.25-26,23.65-28.93a8.16,8.16,0,0,0,.84-.26h15.23c5.11,1.19,9.93,3,14,6.5,6.36,5.49,10.11,12.38,10.17,20.81.13,19.18.16,38.37-.1,57.55-.19,13.39-11.09,25-24.42,26.72-3.48.45-3.45,0-3.44,4,0,2.84,0,5.67,0,8.5,0,1.43.58,2,2,2,4.13,0,8.27,0,12.4,0,2.81,0,4.32,1.58,4.34,4.41s-1.51,4.51-4.41,4.52c-4.08,0-8.15,0-12.22,0-1.62,0-2.19.61-2.17,2.2.07,4.56.32,9.08,1.83,13.44a14.53,14.53,0,0,0,12,10.22c8.27,1.47,15.17-.78,20-7.75,3-4.29,5.43-9,8.17-13.45,2.18-3.57,4.13-7.34,6.72-10.58a18.15,18.15,0,0,1,24.66-3.29,12.06,12.06,0,0,1,2.79,2.91,3.66,3.66,0,0,1-.49,5,4.28,4.28,0,0,1-5,.87,8.34,8.34,0,0,1-1.46-1c-4.8-3.75-10.54-3.2-14.16,1.67-2.06,2.78-3.64,5.92-5.47,8.88-3.25,5.25-6.24,10.71-9.88,15.69a24.61,24.61,0,0,1-16.57,10,6.27,6.27,0,0,0-.84.26ZM131,134.07v.06h20.36c2.48,0,2.58-.12,2.6-2.61,0-.3,0-.59,0-.89,0-3.18,0-3.18-3.27-3.18-3.72,0-7.44.07-11.16,0a4.43,4.43,0,0,1-4.45-4.38,4.52,4.52,0,0,1,4.19-4.65,18.77,18.77,0,0,1,2.12-.07c3.49,0,7,0,10.45,0,2,0,2-.23,2.11-2.93,0-1.56-.37-2.25-2.08-2.2q-5.92.13-11.86,0c-3-.06-5-2-4.94-4.63s2-4.46,5.09-4.48c3.77,0,7.55,0,11.33,0,2.34,0,2.42-.1,2.42-2.57s-.07-2.64-2.35-2.65c-4.31,0-8.62,0-12.93,0a4.54,4.54,0,0,1-.48-9,14.59,14.59,0,0,1,2.29-.13c3.66,0,7.32,0,11,0,1.93,0,2.13-.25,1.49-2.06-2.58-7.31-7.67-11.87-15.32-13.07a53.3,53.3,0,0,0-10.94-.3,19.24,19.24,0,0,0-17.4,13.18c-.62,1.91-.44,2.2,1.53,2.22,3.72,0,7.44,0,11.16.07,3,.08,5,2,4.89,4.71s-2.1,4.44-5.12,4.47c-3.6,0-7.2,0-10.8,0-2.53,0-2.63.11-2.64,2.55s.1,2.62,2.56,2.63h12a4.57,4.57,0,0,1,4.36,2.5c1.59,3-.51,6.46-4.15,6.61-4.19.17-8.38.06-12.57.1-2.06,0-2.26.3-2.25,2.63,0,2.16.21,2.39,2.28,2.41,3.89,0,7.79,0,11.68,0,3.34,0,5.47,1.79,5.53,4.48s-2.12,4.66-5.48,4.69-6.62,0-9.92,0c-4.29,0-4.12-.53-4.11,4.12,0,2.31.16,2.46,2.58,2.46Q120.9,134.09,131,134.07Zm.15,9v.06c-6.9,0-13.81,0-20.71,0-1.57,0-2.32.49-2.24,2.13.08,1.47,0,3,.06,4.43a19.21,19.21,0,0,0,18.61,18.27c2.71.08,5.43.11,8.14,0,7.7-.31,13.29-4,16.9-10.76,2-3.67,2.19-7.66,2.07-11.71-.06-2.24-.18-2.4-2.46-2.4Z" fill="url(#linear-gradient)"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/podverse.svg b/app/Views/_assets/images/platforms/podcasting/podverse.svg deleted file mode 100644 index 1cb12e6a6d80412f236ecd0d25f995e548398321..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/podverse.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg"> - <rect width="300" height="300" rx="67" fill="#0d7ab3"/> - <path d="m108.51 232.73c-8.2227-2.8269-17.674-12.373-20.933-21.144-1.4665-3.9465-4.7117-10.21-7.2115-13.92-15.531-23.047-19.28-51.198-10.163-76.316 12.336-33.985 44.034-56.346 79.872-56.346 68.149 0 108 75.842 69.71 132.66-2.4999 3.7094-5.7451 9.973-7.2115 13.92-3.3562 9.032-12.39 17.953-21.395 21.127-3.8172 1.346-7.2108 2.1768-7.5413 1.8463-1.069-1.0689 17.424-64.017 18.807-64.017 0.73594 0 2.9804 1.7721 4.9877 3.9381 2.0073 2.166 4.003 3.9381 4.4348 3.9381s2.0278-3.9506 3.5465-8.7789c2.0748-6.5964 2.6018-12.426 2.1197-23.448-0.57133-13.063-1.2825-15.965-6.4982-26.518-25.161-50.91-96.762-50.91-121.92 0-5.2156 10.553-5.9268 13.456-6.4982 26.518-0.48205 11.022 0.04497 16.851 2.1197 23.448 1.5187 4.8284 3.1146 8.7789 3.5464 8.7789s2.4275-1.7721 4.4348-3.9381c2.0073-2.166 4.2812-3.9381 5.053-3.9381 0.77188 0 3.994 9.3922 7.1604 20.871 3.1664 11.48 7.1234 25.647 8.7936 31.484 1.6701 5.8367 2.5558 10.91 1.9681 11.273-0.58766 0.36319-3.8201-0.28564-7.1833-1.4418zm11.966-2.5793c-0.80948-2.894-5.2598-18.597-9.8898-34.897-7.1225-25.074-8.0649-29.859-6.1239-31.086 3.777-2.3892 10.294-1.6927 13.093 1.3991 2.2627 2.5003 18.343 55.943 18.343 60.964 0 2.6724-4.9172 6.6288-9.732 7.8301-3.7779 0.94269-4.3723 0.50303-5.6902-4.2091zm49.68 3.1452c-2.4441-0.89259-4.7315-3.1626-5.2438-5.204-1.1929-4.7531 13.211-56.734 17.086-61.66 1.8185-2.3119 4.5872-3.7542 7.178-3.7395 9.4435 0.0541 9.4384 0.20748-1.2564 37.644-5.4668 19.136-10.724 34.736-11.684 34.668-0.95949-0.0683-3.6954-0.83679-6.0796-1.7076z" fill="#fff" stroke-width="1.6667"/> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/radiopublic.svg b/app/Views/_assets/images/platforms/podcasting/radiopublic.svg deleted file mode 100644 index 99f072d1ad79d4304f55df4da410d10f9f7d9f23..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/radiopublic.svg +++ /dev/null @@ -1,8 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"> - <g id="podcastrepublic"> - <rect width="300" height="300" rx="67" fill="#ce262f"/> - <path d="M229.23,230.93c-30.4-14.09-60.8,14.09-91.2,0V90c30.4,14.09,60.8-14.09,91.2,0Zm-49.32-75.56V129.44l3.15-.73c3.92-.9,4.3,1.12,4.3,4.45v15.31c0,2.84-.38,5.27-4.3,6.18Zm0,14.94c2.65-.6,5.3-1.23,8-1.83,11.75-2.68,16.42-9.94,16.42-21.35v-18.4c0-11.22-3-18.35-17.3-15.12-8,1.81-15.91,3.84-23.87,4.56v91.88a128,128,0,0,0,16.8-2.94Z" fill="#fff" fill-rule="evenodd"/> - <path d="M163.2,210.13S161.79,218,138,230.93V154.81Z" fill="#c1c1c1" fill-rule="evenodd"/> - <path d="M163.12,210c-30.79-14.09-61.57,14.09-92.35,0V69.07c30.78,14.09,61.56-14.09,92.35,0ZM113,131.73V108.52l3.79-.86c3.41-.78,4.17.29,4.16,4.24v12.47c0,4.32-1.26,5.83-4.66,6.62Zm0,54.46V146.92l3.54-.8c3.41-.78,4.41.11,4.41,4.43v26.8c0,4.07.64,5.9,1.52,6.7a115.06,115.06,0,0,1,16.8-2.67v-.62c-.64-1.07-1.39-2.73-1.39-6.68V142.83c0-6.82-4.55-9.42-7.2-9.92a14.67,14.67,0,0,0,7.45-13.31V104.9c0-9.85-5.17-15.05-15.4-12.78-8.84,1.93-17.68,4.29-26.52,5.09v91.87A131,131,0,0,0,113,186.19Z" fill="#fff" fill-rule="evenodd"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/spotify.svg b/app/Views/_assets/images/platforms/podcasting/spotify.svg deleted file mode 100644 index ed4f435a1f968a83aebe8d2ff87c12f013764d09..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/spotify.svg +++ /dev/null @@ -1,6 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"> - <g id="spotify"> - <rect width="300" height="300" rx="67"/> - <path d="M199.52,140.5c-27-16-71.5-17.5-97.26-9.68a7.83,7.83,0,0,1-4.54-15c29.57-9,78.73-7.24,109.79,11.2a7.83,7.83,0,0,1-8,13.47Zm-.88,23.74a6.54,6.54,0,0,1-9,2.15c-22.5-13.83-56.8-17.84-83.42-9.76a6.53,6.53,0,1,1-3.8-12.49c30.41-9.23,68.21-4.76,94.05,11.12a6.54,6.54,0,0,1,2.15,9ZM188.39,187a5.21,5.21,0,0,1-7.17,1.74c-19.66-12-44.4-14.73-73.55-8.07a5.22,5.22,0,0,1-2.32-10.17c31.89-7.29,59.25-4.16,81.31,9.33a5.21,5.21,0,0,1,1.73,7.17ZM150,66.28A83.72,83.72,0,1,0,233.72,150,83.72,83.72,0,0,0,150,66.28Z" fill="#1ed760"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/spreaker.svg b/app/Views/_assets/images/platforms/podcasting/spreaker.svg deleted file mode 100644 index 7cce4d10630c70800c077e548520ec0e2c4e361e..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/spreaker.svg +++ /dev/null @@ -1,6 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"> - <g id="spreaker"> - <rect width="300" height="300" rx="67" fill="#212322"/> - <path d="M168.52,65l-40,46.32L68.75,98.42l61.48,52.22L69.76,203.5l59.58-14.05L170.14,235l5-60.92,56.08-24.67-56.4-23.59L168.57,65Z" fill="#ffc107"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/stitcher.svg b/app/Views/_assets/images/platforms/podcasting/stitcher.svg deleted file mode 100644 index 327075acce1baa38fbfcf28421d910106d528961..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/stitcher.svg +++ /dev/null @@ -1,10 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"> - <g id="stitcher"> - <rect width="300" height="300" rx="67" fill="#fff"/> - <path d="M168.94,114.31h31V178.8h-31Z" fill="#eb8923"/> - <path d="M134.5,123.39h31v62.3h-31v-62.3Z" fill="#fac712"/> - <path d="M99.75,118.38h31V178.8h-31Z" fill="#612268"/> - <path d="M65,127.77H96.31v55.1H65Z" fill="#3199cd"/> - <path d="M203.69,125.58H235v48.84H203.69V125.58Z" fill="#c33626"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/podcasting/tunein.svg b/app/Views/_assets/images/platforms/podcasting/tunein.svg deleted file mode 100644 index 7e0f073c0c39b45dce49dc6309b80a7917922139..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/podcasting/tunein.svg +++ /dev/null @@ -1,8 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"> - <g id="tunein"> - <rect width="300" height="300" rx="67" fill="#1c203b"/> - <path d="M230.77,92.47h-80.3a4.21,4.21,0,0,0-4.23,4.23V177a4.21,4.21,0,0,0,4.23,4.23h80.3A4.21,4.21,0,0,0,235,177V96.23A4.14,4.14,0,0,0,230.77,92.47ZM200.25,154a1,1,0,0,1-.94.94H181.93A1,1,0,0,1,181,154v-5.16a1,1,0,0,1,.94-.94h4.23c.47,0,.47,0,.47-.47V126.28c0-.47,0-.47-.47-.47H182.4a1,1,0,0,1-.94-.93v-5.17a1,1,0,0,1,.94-.94h16a1,1,0,0,1,.94.94v5.17a1,1,0,0,1-.94.93h-3.76c-.47,0-.47,0-.47.47v21.14c0,.47,0,.47.47.47h4.23a1,1,0,0,1,.94.94l.47,5.16Z" fill="#14d8cc" fill-rule="evenodd"/> - <path d="M145.77,126.75v72.79H73V126.75h72.79m3.76-8H69.23A4.21,4.21,0,0,0,65,123v80.3a4.21,4.21,0,0,0,4.23,4.23h80.3a4.21,4.21,0,0,0,4.23-4.23V122.53a4.52,4.52,0,0,0-4.23-3.76Z" fill="#14d8cc"/> - <path d="M120.88,151.17V146a1,1,0,0,0-.94-.94H98.81a1,1,0,0,0-.94.94v5.16a1,1,0,0,0,.94.94h6.58c.47,0,.47,0,.47.47v27.71a1,1,0,0,0,.94.94H112a1,1,0,0,0,.94-.94V152.58c0-.47,0-.47.47-.47h6.57a1,1,0,0,0,.94-.94Z" fill="#14d8cc" fill-rule="evenodd"/> - </g> -</svg> diff --git a/app/Views/_assets/images/platforms/social/castopod.svg b/app/Views/_assets/images/platforms/social/castopod.svg deleted file mode 100644 index 593e3731fa9cf51dffcb7a067a65168f34065f5b..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/social/castopod.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m3.3417 5.3477c-0.74036 1e-7 -1.3418 0.6112-1.3418 1.3516v10.611c0 0.74036 0.6112 1.3418 1.3516 1.3418h3.4336s0.10762-0.23568 0.2793-0.52539c0.16095-0.28971 0.48242-0.24609 0.48242-0.24609h8.8848s0.33317-0.01142 0.47266 0.24609c0.13949 0.25752 0.26758 0.52539 0.26758 0.52539h3.4863c0.74036 0 1.3525-0.6112 1.3418-1.3516v-10.611c0-0.74036-0.6112-1.3418-1.3516-1.3418zm2.6055 1.6328c0.08117 0.00522 0.16355 0.018215 0.24805 0.041016 0.12876 0.032189 0.24703 0.095851 0.21484 0.22461-0.04292 0.20387-0.35547 0.10742-0.35547 0.10742-0.45065-0.085839-0.84597 0.1499-1.082 0.56836-0.11803 0.17168-0.19348 0.1943-0.30078 0.16211-0.075109-0.042919-0.1298-0.15054-0.054688-0.2793 0.28166-0.48821 0.76192-0.86075 1.3301-0.82422zm12.619 0.30859c0.70817 0.01073 1.1056 0.44017 1.2559 1.0625 0.04292 0.15022-0.04307 0.24708-0.12891 0.25781-0.11803 0-0.18171-0.03246-0.24609-0.23633-0.1073-0.47211-0.38724-0.67583-0.83789-0.71875 0 0-0.32128 7.42e-4 -0.31055-0.20313 0.01073-0.13949 0.13882-0.17284 0.26758-0.16211zm-11.137 0.93359h9.1309c1.5773-0.01073 2.8545 1.2675 2.8438 2.8555 0 1.5666-1.2772 2.8418-2.8438 2.8418h-9.1309c-1.5666 0-2.8437-1.2752-2.8437-2.8418 0-1.5666 1.2772-2.8555 2.8437-2.8555zm0.07422 1.6953c-0.67598 0-1.2227 0.54863-1.2227 1.2246 0 0.26825 0.08512 0.50316 0.22461 0.70703 0 0 0.51516-0.26758 0.95508-0.26758 0.59014 0 1.0098 0.31055 1.0098 0.31055 0.16095-0.20387 0.25586-0.46029 0.25586-0.75 0-0.67598-0.54668-1.2246-1.2227-1.2246zm8.9805 0.01172c-0.67598 0-1.2227 0.54668-1.2227 1.2227 0 0.2897 0.09686 0.54809 0.25781 0.75195 0 0 0.41767-0.3125 1.0078-0.3125 0.43992 0 0.95508 0.26953 0.95508 0.26953 0.15022-0.20387 0.23729-0.45147 0.22656-0.70898 0-0.67598-0.54863-1.2227-1.2246-1.2227zm-5.5488 1.4473c-0.10462-0.02263-0.23875 0.04851-0.22266 0.19336 0 0-0.05412 1.0312 1.2871 1.0312 1.3412 0 1.2871-1.0312 1.2871-1.0312 0.02146-0.19314-0.22471-0.24597-0.31055-0.13867-0.04292 0.06438-0.04398 0.07434-0.07617 0.18164-0.18241 0.64379-0.90039 0.60156-0.90039 0.60156s-0.71994 0.0315-0.90234-0.60156c-0.03219-0.11803-0.0313-0.11726-0.07422-0.18164-0.02146-0.02951-0.05302-0.04714-0.08789-0.05469z" fill="currentColor"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/images/platforms/social/discord.svg b/app/Views/_assets/images/platforms/social/discord.svg deleted file mode 100644 index 043e782fa7cf4baa273d50548dd0817a1e73005a..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/social/discord.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M10.076 11c.6 0 1.086.45 1.075 1 0 .55-.474 1-1.075 1C9.486 13 9 12.55 9 12s.475-1 1.076-1zm3.848 0c.601 0 1.076.45 1.076 1s-.475 1-1.076 1c-.59 0-1.075-.45-1.075-1s.474-1 1.075-1zm4.967-9C20.054 2 21 2.966 21 4.163V23l-2.211-1.995-1.245-1.176-1.317-1.25.546 1.943H5.109C3.946 20.522 3 19.556 3 18.359V4.163C3 2.966 3.946 2 5.109 2H18.89zm-3.97 13.713c2.273-.073 3.148-1.596 3.148-1.596 0-3.381-1.482-6.122-1.482-6.122-1.48-1.133-2.89-1.102-2.89-1.102l-.144.168c1.749.546 2.561 1.334 2.561 1.334a8.263 8.263 0 0 0-3.096-1.008 8.527 8.527 0 0 0-2.077.02c-.062 0-.114.011-.175.021-.36.032-1.235.168-2.335.662-.38.178-.607.305-.607.305s.854-.83 2.705-1.376l-.103-.126s-1.409-.031-2.89 1.103c0 0-1.481 2.74-1.481 6.121 0 0 .864 1.522 3.137 1.596 0 0 .38-.472.69-.871-1.307-.4-1.8-1.24-1.8-1.24s.102.074.287.179c.01.01.02.021.041.031.031.022.062.032.093.053.257.147.514.262.75.357.422.168.926.336 1.513.452a7.06 7.06 0 0 0 2.664.01 6.666 6.666 0 0 0 1.491-.451c.36-.137.761-.337 1.183-.62 0 0-.514.861-1.862 1.25.309.399.68.85.68.85z" fill="currentColor"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/images/platforms/social/facebook.svg b/app/Views/_assets/images/platforms/social/facebook.svg deleted file mode 100644 index 4aee074afb6083c2bbaebf320d9010f993926cfe..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/social/facebook.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M12 2C6.477 2 2 6.477 2 12c0 4.991 3.657 9.128 8.438 9.879V14.89h-2.54V12h2.54V9.797c0-2.506 1.492-3.89 3.777-3.89 1.094 0 2.238.195 2.238.195v2.46h-1.26c-1.243 0-1.63.771-1.63 1.562V12h2.773l-.443 2.89h-2.33v6.989C18.343 21.129 22 16.99 22 12c0-5.523-4.477-10-10-10z" fill="currentColor"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/images/platforms/social/funkwhale.svg b/app/Views/_assets/images/platforms/social/funkwhale.svg deleted file mode 100644 index 863462c3badb30a02129f01622f0d01272ec721e..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/social/funkwhale.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m6.2734 2.9688c-0.33408-0.014496-0.66419-0.012275-0.98242 0.0039062-0.24811 0.72276-0.034084 1.5325 0.4082 2.1582 0.47465 0.62567 1.1339 1.0679 1.8027 1.4023 0.66882 0.3452 1.3918 0.40955 2.0391 0.78711 0.42071 0.24811 0.69032 0.51781 0.94922 0.92773 0.40992 0.61489 0.38867 1.3906 0.38867 1.3906l0.052735 0.85352s0.32411 0.85156 1.0469 0.85156c0.76591 0 1.0469-0.85156 1.0469-0.85156l0.052734-0.85352s-0.021257-0.76495 0.38867-1.3906c0.2589-0.40992 0.51772-0.7012 0.94922-0.92773 0.64725-0.37756 1.3702-0.44191 2.0391-0.78711s1.3155-0.78746 1.7578-1.4023c0.44229-0.61489 0.64748-1.4354 0.41016-2.1582-1.2729-0.064725-2.7394 0.085354-3.8613 0.68945-1.5642 0.83064-2.5144 0.54069-2.7949 1.7812h-0.021485c-0.28048-1.2513-1.218-0.95061-2.793-1.7812-0.84142-0.45307-1.8767-0.64987-2.8789-0.69336zm2.4473 7.8789c-0.097087 0-0.18359 0.086507-0.18359 0.18359 0 1.9202 1.5535 3.4629 3.4629 3.4629s3.4629-1.5535 3.4629-3.4629c0-0.09709-0.086507-0.18359-0.18359-0.18359h-1.3047c-0.09709 0-0.18359 0.086507-0.18359 0.18359 0 0.98166-0.79857 1.791-1.791 1.791-0.98166 0-1.791-0.79857-1.791-1.791 0-0.09709-0.086506-0.18359-0.18359-0.18359h-1.3047zm-6.5371 0.009766c-0.097087 0-0.18359 0.086506-0.18359 0.18359 0 5.5124 4.4876 10 10 10 5.5124 0 10-4.4876 10-10 0-0.09709-0.086507-0.18359-0.18359-0.18359h-1.3047c-0.09709 0-0.18359 0.086506-0.18359 0.18359 0 4.5955-3.7552 8.3398-8.3398 8.3398-4.5955 0-8.3379-3.7336-8.3379-8.3398 0-0.09709-0.086506-0.18359-0.18359-0.18359h-1.2832zm3.2793 0c-0.097087 0-0.18359 0.086506-0.18359 0.18359-0.021575 3.7001 2.999 6.7207 6.7207 6.7207 3.7001 0 6.7207-3.0206 6.7207-6.7207 0-0.09709-0.086507-0.18359-0.18359-0.18359h-1.3047c-0.09709 0-0.18359 0.086506-0.18359 0.18359 0 2.794-2.2666 5.0605-5.0605 5.0605-2.794 0-5.0586-2.2666-5.0586-5.0605 0-0.09709-0.086506-0.18359-0.18359-0.18359h-1.2832z" fill="currentColor"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/images/platforms/social/instagram.svg b/app/Views/_assets/images/platforms/social/instagram.svg deleted file mode 100644 index fcd8831895f37d9147b78f77f78839261813c3af..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/social/instagram.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M12 2c2.717 0 3.056.01 4.122.06 1.065.05 1.79.217 2.428.465.66.254 1.216.598 1.772 1.153a4.908 4.908 0 0 1 1.153 1.772c.247.637.415 1.363.465 2.428.047 1.066.06 1.405.06 4.122 0 2.717-.01 3.056-.06 4.122-.05 1.065-.218 1.79-.465 2.428a4.883 4.883 0 0 1-1.153 1.772 4.915 4.915 0 0 1-1.772 1.153c-.637.247-1.363.415-2.428.465-1.066.047-1.405.06-4.122.06-2.717 0-3.056-.01-4.122-.06-1.065-.05-1.79-.218-2.428-.465a4.89 4.89 0 0 1-1.772-1.153 4.904 4.904 0 0 1-1.153-1.772c-.248-.637-.415-1.363-.465-2.428C2.013 15.056 2 14.717 2 12c0-2.717.01-3.056.06-4.122.05-1.066.217-1.79.465-2.428a4.88 4.88 0 0 1 1.153-1.772A4.897 4.897 0 0 1 5.45 2.525c.638-.248 1.362-.415 2.428-.465C8.944 2.013 9.283 2 12 2zm0 5a5 5 0 1 0 0 10 5 5 0 0 0 0-10zm6.5-.25a1.25 1.25 0 0 0-2.5 0 1.25 1.25 0 0 0 2.5 0zM12 9a3 3 0 1 1 0 6 3 3 0 0 1 0-6z" fill="currentColor"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/images/platforms/social/linkedin.svg b/app/Views/_assets/images/platforms/social/linkedin.svg deleted file mode 100644 index 3052351b66a96d500cbe100e09a977c9d0470907..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/social/linkedin.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M18.335 18.339H15.67v-4.177c0-.996-.02-2.278-1.39-2.278-1.389 0-1.601 1.084-1.601 2.205v4.25h-2.666V9.75h2.56v1.17h.035c.358-.674 1.228-1.387 2.528-1.387 2.7 0 3.2 1.778 3.2 4.091v4.715zM7.003 8.575a1.546 1.546 0 0 1-1.548-1.549 1.548 1.548 0 1 1 1.547 1.549zm1.336 9.764H5.666V9.75H8.34v8.589zM19.67 3H4.329C3.593 3 3 3.58 3 4.297v15.406C3 20.42 3.594 21 4.328 21h15.338C20.4 21 21 20.42 21 19.703V4.297C21 3.58 20.4 3 19.666 3h.003z" fill="currentColor"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/images/platforms/social/mastodon.svg b/app/Views/_assets/images/platforms/social/mastodon.svg deleted file mode 100644 index 91133fee243f2af770f448041c208212c7e69272..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/social/mastodon.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M21.258 13.99c-.274 1.41-2.456 2.955-4.962 3.254-1.306.156-2.593.3-3.965.236-2.243-.103-4.014-.535-4.014-.535 0 .218.014.426.04.62.292 2.215 2.196 2.347 4 2.41 1.82.062 3.44-.45 3.44-.45l.076 1.646s-1.274.684-3.542.81c-1.25.068-2.803-.032-4.612-.51-3.923-1.039-4.598-5.22-4.701-9.464-.031-1.26-.012-2.447-.012-3.44 0-4.34 2.843-5.611 2.843-5.611 1.433-.658 3.892-.935 6.45-.956h.062c2.557.02 5.018.298 6.451.956 0 0 2.843 1.272 2.843 5.61 0 0 .036 3.201-.397 5.424zm-2.956-5.087c0-1.074-.273-1.927-.822-2.558-.567-.631-1.308-.955-2.229-.955-1.065 0-1.871.41-2.405 1.228l-.518.87-.519-.87C11.276 5.8 10.47 5.39 9.405 5.39c-.921 0-1.663.324-2.229.955-.549.631-.822 1.484-.822 2.558v5.253h2.081V9.057c0-1.075.452-1.62 1.357-1.62 1 0 1.501.647 1.501 1.927v2.79h2.07v-2.79c0-1.28.5-1.927 1.5-1.927.905 0 1.358.545 1.358 1.62v5.1h2.08V8.902z" fill="currentColor"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/images/platforms/social/mobilizon.svg b/app/Views/_assets/images/platforms/social/mobilizon.svg deleted file mode 100644 index 7d8cfe8f6a50c03f6d9c662059f19aecd8820c35..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/social/mobilizon.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m10.772 21.903c-2.0216-0.34968-3.6292-1.7403-4.4289-3.8311-0.42576-1.1132-0.61601-4.2232-0.33773-5.5208 0.49543-2.3101 1.643-3.8884 3.4277-4.7141 0.79895-0.36966 1.1046-0.42127 2.48-0.4188 1.9586 0.00358 2.9793 0.36215 4.1063 1.4428 1.8627 1.786 2.591 5.2413 1.7762 8.4272-0.39058 1.5272-0.86524 2.3495-1.8859 3.2671-1.2927 1.1622-3.2467 1.6748-5.1377 1.3477zm2.3192-2.8506c0.77962-0.53061 1.0739-1.0254 1.3296-2.2354 0.29185-1.3811 0.29551-2.838 0.01049-4.1828-0.43453-2.0502-1.0912-2.6996-2.63-2.601-0.99932 0.06407-1.3958 0.32483-1.8472 1.2148-0.48672 0.95961-0.67676 2.2172-0.59606 3.9446 0.10081 2.1579 0.54705 3.3379 1.457 3.8526 0.80649 0.4562 1.6127 0.45873 2.2762 0.0072zm-2.3134-13.627c-0.56056-0.16192-0.73514-0.54879-0.73514-1.629 0-1.1135 0.15651-1.4206 0.82627-1.6213 0.77205-0.23131 1.8695-0.2342 2.5222-0.00666 0.58207 0.20291 0.79656 0.64126 0.79656 1.6279 0 0.98663-0.21449 1.425-0.79656 1.6279-0.5958 0.2077-1.8963 0.20826-2.6134 0.00109z" fill="currentColor"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/images/platforms/social/peertube.svg b/app/Views/_assets/images/platforms/social/peertube.svg deleted file mode 100644 index c616a21c2c227afc4cf6c68e890cbfb69b7a5111..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/social/peertube.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m4.5 2v10l7.5-5-7.5-5zm7.5 5v10l7.5-5-7.5-5zm0 10-7.5-5v10l7.5-5z" fill="currentColor"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/images/platforms/social/pixelfed.svg b/app/Views/_assets/images/platforms/social/pixelfed.svg deleted file mode 100644 index 9a1715e448a1dbe3b2f75c11011b12dcf126f4e1..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/social/pixelfed.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M12 2c5.523 0 10 4.477 10 10s-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2zm1.031 6.099h-2.624c-.988 0-1.789.776-1.789 1.733v6.748l2.595-2.471h1.818c1.713 0 3.101-1.345 3.101-3.005s-1.388-3.005-3.1-3.005z" fill="currentColor"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/images/platforms/social/plume.svg b/app/Views/_assets/images/platforms/social/plume.svg deleted file mode 100644 index aa46e90c8948867904a47b2b2d9bf928b516b485..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/social/plume.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m2.0894 21.866c-0.12089-0.14567-0.11924-0.45058 5e-3 -0.91177 0.11891-0.44159 0.2393-0.67414 1.2572-2.4283 0.46438-0.80031 0.9393-1.7206 1.0554-2.045 1.5446-4.3177 3.2356-7.2127 5.5846-9.5612 0.99215-0.99192 2.2588-2.001 2.5117-2.001 0.14557 0 0.13922 0.43526 0.09112 0.60181-0.01874 0.06489 0.27549-0.27178 0.48394-0.49328 1.3006-1.382 3.1774-2.119 7.1806-2.8195 1.3547-0.23707 1.6192-0.24701 1.7212-0.064676 0.05953 0.10637-0.0065 0.22409-0.31533 0.56197-0.44966 0.492-0.78864 0.7466-1.2482 2.2622-0.3822 1.2605-0.91684 2.0825-1.133 2.3122l-0.72637 0.77204 0.83494-0.18725c0.17638 0.16433-0.04666 0.39769-0.31951 1.0587-0.93186 2.2575-4.5828 5.7549-8.4727 7.6983-1.1955 0.59729-2.7378 1.1696-3.6397 1.3507l-0.44051 0.08845-1.4802 1.6069c-1.7996 1.9535-2.2074 2.3109-2.6433 2.3168-0.11367 0.0015-0.25175-0.05153-0.30685-0.11792z" fill="currentColor"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/images/platforms/social/slack.svg b/app/Views/_assets/images/platforms/social/slack.svg deleted file mode 100644 index b65ba6ee332ab3763825c4f2ec02cc03ebb0be54..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/social/slack.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M6.527 14.514A1.973 1.973 0 0 1 4.56 16.48a1.973 1.973 0 0 1-1.967-1.967c0-1.083.884-1.968 1.967-1.968h1.968v1.968zm.992 0c0-1.083.884-1.968 1.967-1.968 1.083 0 1.968.885 1.968 1.968v4.927a1.973 1.973 0 0 1-1.968 1.967 1.973 1.973 0 0 1-1.967-1.967v-4.927zm1.967-7.987A1.973 1.973 0 0 1 7.52 4.56c0-1.083.884-1.967 1.967-1.967 1.083 0 1.968.884 1.968 1.967v1.968H9.486zm0 .992c1.083 0 1.968.884 1.968 1.967a1.973 1.973 0 0 1-1.968 1.968H4.56a1.973 1.973 0 0 1-1.967-1.968c0-1.083.884-1.967 1.967-1.967h4.927zm7.987 1.967c0-1.083.885-1.967 1.968-1.967s1.967.884 1.967 1.967a1.973 1.973 0 0 1-1.967 1.968h-1.968V9.486zm-.992 0a1.973 1.973 0 0 1-1.967 1.968 1.973 1.973 0 0 1-1.968-1.968V4.56c0-1.083.885-1.967 1.968-1.967s1.967.884 1.967 1.967v4.927zm-1.967 7.987c1.083 0 1.967.885 1.967 1.968a1.973 1.973 0 0 1-1.967 1.967 1.973 1.973 0 0 1-1.968-1.967v-1.968h1.968zm0-.992a1.973 1.973 0 0 1-1.968-1.967c0-1.083.885-1.968 1.968-1.968h4.927c1.083 0 1.967.885 1.967 1.968a1.973 1.973 0 0 1-1.967 1.967h-4.927z" fill="currentColor"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/images/platforms/social/twitch.svg b/app/Views/_assets/images/platforms/social/twitch.svg deleted file mode 100644 index 296d95bc55e9db76597e9ba5f389bb856a6deabf..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/social/twitch.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M21 3v11.74l-4.696 4.695h-3.913l-2.437 2.348H6.913v-2.348H3V6.13L4.227 3H21zm-1.565 1.565H6.13v11.74h3.13v2.347l2.349-2.348h4.695l3.13-3.13V4.565zm-3.13 3.13v4.696h-1.566V7.696h1.565zm-3.914 0v4.696h-1.565V7.696h1.565z" fill="currentColor"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/images/platforms/social/twitter.svg b/app/Views/_assets/images/platforms/social/twitter.svg deleted file mode 100644 index f1a961d2cfe119ec4b79a6059882db50cd9cc71c..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/social/twitter.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M22.162 5.656a8.384 8.384 0 0 1-2.402.658A4.196 4.196 0 0 0 21.6 4c-.82.488-1.719.83-2.656 1.015a4.182 4.182 0 0 0-7.126 3.814 11.874 11.874 0 0 1-8.62-4.37 4.168 4.168 0 0 0-.566 2.103c0 1.45.738 2.731 1.86 3.481a4.168 4.168 0 0 1-1.894-.523v.052a4.185 4.185 0 0 0 3.355 4.101 4.21 4.21 0 0 1-1.89.072A4.185 4.185 0 0 0 7.97 16.65a8.394 8.394 0 0 1-6.191 1.732 11.83 11.83 0 0 0 6.41 1.88c7.693 0 11.9-6.373 11.9-11.9 0-.18-.005-.362-.013-.54a8.496 8.496 0 0 0 2.087-2.165z" fill="currentColor"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/images/platforms/social/writefreely.svg b/app/Views/_assets/images/platforms/social/writefreely.svg deleted file mode 100644 index 7291016c6e9aa9e54836dc57f8770be7b22a6442..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/social/writefreely.svg +++ /dev/null @@ -1 +0,0 @@ -<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m6.3491 18.83c-0.56506-0.17351-1.2138-0.83126-1.4734-1.4939-0.17093-0.43626-0.19937-0.67537-0.22812-1.9179-0.028936-1.2506 0.00766-1.7765 0.30768-4.4207 0.18729-1.6507 0.34052-3.2018 0.34052-3.447 0-1.1215-0.644-1.5097-1.4299-0.8619-0.32115 0.26472-0.79951 1.1107-1.0305 1.8225l-0.14303 0.44074-0.30562-0.05425c-0.16809-0.029842-0.33464-0.080598-0.3701-0.11279-0.097242-0.088266 0.24986-1.1391 0.59364-1.7973 0.37248-0.71307 1.1149-1.4899 1.6503-1.7267 0.89996-0.3981 1.9847-0.26275 2.5678 0.3204 0.51747 0.51747 0.66507 1.0514 0.65349 2.3639-0.0055 0.61997-0.10576 2.0102-0.22286 3.0894-0.42666 3.9321-0.46032 4.2857-0.45986 4.8309 6.68e-4 0.76101 0.11775 1.1208 0.46371 1.4245 0.22985 0.20181 0.37032 0.25736 0.6508 0.25736 1.9687 0 3.6599-2.3064 4.411-6.0156 0.17516-0.86506 0.19365-1.1797 0.19366-3.2944 1e-6 -1.2859-0.02723-2.46-0.06054-2.6093l-0.06053-0.27137h2.3205l0.06024 0.5626c0.11712 1.0936-0.05575 3.1226-0.55321 6.493-0.29127 1.9734-0.35616 3.5194-0.174 4.146 0.06705 0.23062 0.23015 0.50214 0.40125 0.66798 0.28471 0.27595 0.29784 0.27941 1.0603 0.27941 0.72778 0 0.80944-0.01848 1.4243-0.32236 2.3486-1.1607 4.0824-4.6369 3.8581-7.7352-0.08784-1.2134-0.32659-1.8715-0.84372-2.3255-0.35033-0.3076-0.4238-0.32067-0.54363-0.096756-0.2137 0.3993-1.129 0.57346-1.5532 0.29553-0.3671-0.24053-0.54817-0.62213-0.50927-1.0732 0.03969-0.4603 0.24144-0.77523 0.65127-1.0166 0.22411-0.13201 0.43221-0.16675 0.99324-0.16582 0.60378 9.936e-4 0.7723 0.034028 1.1289 0.22129 0.81315 0.42703 1.4572 1.332 1.7512 2.4605 0.17402 0.66809 0.17417 3.2971 2.51e-4 4.124-0.72812 3.4614-3.2088 6.3679-5.9567 6.9793-1.2677 0.28204-2.5047 0.04143-3.1186-0.60664-0.51583-0.54452-0.86384-1.7498-0.80515-2.7885 0.01543-0.27326 0.02285-0.49677 0.01646-0.49669-0.0064 8.4e-5 -0.14831 0.28802-0.31539 0.63985-0.97609 2.0554-2.7004 3.3799-4.3772 3.3624-0.30589-0.0032-0.73971-0.06218-0.96404-0.13105z" fill="currentColor"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/images/platforms/social/youtube.svg b/app/Views/_assets/images/platforms/social/youtube.svg deleted file mode 100644 index 02ff073ae51182750d0dfe7520a7d1eaef5af33f..0000000000000000000000000000000000000000 --- a/app/Views/_assets/images/platforms/social/youtube.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M21.543 6.498C22 8.28 22 12 22 12s0 3.72-.457 5.502c-.254.985-.997 1.76-1.938 2.022C17.896 20 12 20 12 20s-5.893 0-7.605-.476c-.945-.266-1.687-1.04-1.938-2.022C2 15.72 2 12 2 12s0-3.72.457-5.502c.254-.985.997-1.76 1.938-2.022C6.107 4 12 4 12 4s5.896 0 7.605.476c.945.266 1.687 1.04 1.938 2.022zM10 15.5l6-3.5-6-3.5v7z" fill="currentColor"/></svg> \ No newline at end of file diff --git a/app/Views/_assets/modules/Clipboard.ts b/app/Views/_assets/modules/Clipboard.ts index 2b5b0a59acb02a5ee84ee0155316f0443e43cd62..7b4e4ebfecfcb15be066595b413a58dea0698cd2 100644 --- a/app/Views/_assets/modules/Clipboard.ts +++ b/app/Views/_assets/modules/Clipboard.ts @@ -1,7 +1,7 @@ const Clipboard = (): void => { - const buttons: NodeListOf< - HTMLButtonElement - > | null = document.querySelectorAll("button[data-type='clipboard-copy']"); + const buttons: NodeListOf<HTMLButtonElement> | null = document.querySelectorAll( + "button[data-type='clipboard-copy']" + ); if (buttons) { for (let i = 0; i < buttons.length; i++) { diff --git a/app/Views/_assets/modules/Dropdown.ts b/app/Views/_assets/modules/Dropdown.ts index 1958160987e1097448462de240a13c55d09446a3..231e028fca4d5a21c7759365ae6d1400528e4848 100644 --- a/app/Views/_assets/modules/Dropdown.ts +++ b/app/Views/_assets/modules/Dropdown.ts @@ -1,62 +1,81 @@ -import { createPopper, Placement } from "@popperjs/core"; +import { createPopper, Instance, Placement } from "@popperjs/core"; const Dropdown = (): void => { - const dropdownContainers: NodeListOf<HTMLElement> = document.querySelectorAll( - "[data-toggle='dropdown']" + const dropdownButtons: NodeListOf<HTMLButtonElement> = document.querySelectorAll( + "[data-dropdown='button']" ); - for (let i = 0; i < dropdownContainers.length; i++) { - const dropdownContainer = dropdownContainers[i]; + for (let i = 0; i < dropdownButtons.length; i++) { + const button = dropdownButtons[i]; - const button: HTMLElement | null = dropdownContainer.querySelector( - "[data-popper='button']" - ); - const menu: HTMLElement | null = dropdownContainer.querySelector( - "[data-popper='menu']" - ); + if (button.dataset.dropdownTarget) { + const menu: HTMLElement | null = document.getElementById( + button.dataset?.dropdownTarget + ); - if (button && menu) { - const popper = createPopper(button, menu, { - placement: menu.dataset.popperPlacement as Placement, - modifiers: [ - { - name: "offset", - options: { - offset: [menu.dataset.popperOffsetX, menu.dataset.popperOffsetY], - }, - }, - ], - }); + if (menu) { + // place the menu at then end of the body to prevent any overflow cuts + document.body.appendChild(menu); - const dropdownToggle = () => { - const isExpanded = !menu.classList.contains("hidden"); + let popperInstance: Instance | null = null; - if (isExpanded) { - menu.classList.add("hidden"); - menu.classList.remove("flex"); - } else { - menu.classList.add("flex"); - menu.classList.remove("hidden"); - } + const create = () => { + const offsetX = menu.dataset.dropdownOffsetX + ? parseInt(menu.dataset.dropdownOffsetX) + : 0; + const offsetY = menu.dataset.dropdownOffsetY + ? parseInt(menu.dataset.dropdownOffsetY) + : 0; + popperInstance = createPopper(button, menu, { + placement: menu.dataset.dropdownPlacement as Placement, + // strategy: "fixed", + modifiers: [ + { + name: "offset", + options: { + offset: [offsetX, offsetY], + }, + }, + ], + }); + }; - button.setAttribute("aria-expanded", isExpanded.toString()); - popper.update(); - }; + const destroy = () => { + if (popperInstance) { + popperInstance.destroy(); + popperInstance = null; + } + }; - // Toggle dropdown menu on button click event - button.addEventListener("click", dropdownToggle); + const dropdownToggle = () => { + const isExpanded = menu.hasAttribute("data-show"); - // Toggle off when clicking outside of dropdown - document.addEventListener("click", function (event) { - const isExpanded = !menu.classList.contains("hidden"); - const isClickOutside = !dropdownContainer.contains( - event.target as Node - ); + if (isExpanded) { + menu.removeAttribute("data-show"); + button.setAttribute("aria-expanded", "false"); + destroy(); + } else { + menu.setAttribute("data-show", ""); + button.setAttribute("aria-expanded", "true"); + create(); + } + }; - if (isExpanded && isClickOutside) { - dropdownToggle(); - } - }); + // Toggle dropdown menu on button click event + button.addEventListener("click", dropdownToggle); + + // Toggle off when clicking outside of dropdown + document.addEventListener("click", function (event) { + const isExpanded = menu.hasAttribute("data-show"); + const isClickOutside = + !menu.contains(event.target as Node) && + !button.contains(event.target as Node); + + if (isExpanded && isClickOutside) { + dropdownToggle(); + } + }); + } } } }; diff --git a/app/Views/_assets/modules/MarkdownEditor.ts b/app/Views/_assets/modules/MarkdownEditor.ts index 604e948ea38ab2409f33e84d1bdf44bd23bc766c..5e669b48f1c68043cd228202cad48f01ffe59feb 100644 --- a/app/Views/_assets/modules/MarkdownEditor.ts +++ b/app/Views/_assets/modules/MarkdownEditor.ts @@ -59,7 +59,7 @@ class ProseMirrorView { } }, attributes: { - class: "prose-sm px-3 py-2 overflow-y-auto focus:shadow-outline", + class: "prose-sm px-3 py-2 overflow-y-auto focus:ring", style: "min-height: 200px; max-height: 500px", }, }); @@ -83,7 +83,7 @@ const MarkdownEditor = (): void => { const targets: NodeListOf<HTMLTextAreaElement> = document.querySelectorAll( "textarea[data-editor='markdown']" ); - const activeClass = "font-bold"; + const activeClass = "font-semibold"; for (let i = 0; i < targets.length; i++) { const target = targets[i]; @@ -97,7 +97,7 @@ const MarkdownEditor = (): void => { "border", "text-xs", "outline-none", - "focus:shadow-outline" + "focus:ring" ); wysiwygBtn.setAttribute("type", "button"); wysiwygBtn.innerHTML = "Wysiwyg"; @@ -109,7 +109,7 @@ const MarkdownEditor = (): void => { "border", "text-xs", "outline-none", - "focus:shadow-outline" + "focus:ring" ); markdownBtn.setAttribute("type", "button"); markdownBtn.innerHTML = "Markdown"; diff --git a/app/Views/_assets/modules/Modal.ts b/app/Views/_assets/modules/Modal.ts new file mode 100644 index 0000000000000000000000000000000000000000..060540a0cec4e97745cf91c0ae70157c531a04e5 --- /dev/null +++ b/app/Views/_assets/modules/Modal.ts @@ -0,0 +1,34 @@ +const Modal = (): void => { + const modalTriggerElements: NodeListOf<HTMLElement> = document.querySelectorAll( + "[data-modal-target]" + ); + + for (let i = 0; i < modalTriggerElements.length; i++) { + const modalTrigger = modalTriggerElements[i]; + + if (modalTrigger.dataset.modalTarget) { + const modal: HTMLElement | null = document.getElementById( + modalTrigger.dataset.modalTarget + ); + + if (modal) { + modalTrigger.addEventListener("click", () => { + modal.classList.toggle("hidden"); + }); + + const closeButtonsElements: NodeListOf<HTMLElement> = modal.querySelectorAll( + "[data-modal-button]" + ); + + for (let j = 0; j < closeButtonsElements.length; j++) { + const closeButton = closeButtonsElements[j]; + closeButton.addEventListener("click", () => { + modal.classList.toggle("hidden"); + }); + } + } + } + } +}; + +export default Modal; diff --git a/app/Views/_assets/modules/Soundbites.ts b/app/Views/_assets/modules/Soundbites.ts index b8f7ffbf0c33bd6efd27d370f4008d88f0080875..601b2b702094ba44cc52064493362a7d4c209354 100644 --- a/app/Views/_assets/modules/Soundbites.ts +++ b/app/Views/_assets/modules/Soundbites.ts @@ -51,9 +51,9 @@ const Soundbites = (): void => { } } - const soundbitePlayButtons: NodeListOf< - HTMLButtonElement - > | null = document.querySelectorAll("button[data-type='play-soundbite']"); + const soundbitePlayButtons: NodeListOf<HTMLButtonElement> | null = document.querySelectorAll( + "button[data-type='play-soundbite']" + ); if (soundbitePlayButtons) { for (let i = 0; i < soundbitePlayButtons.length; i++) { const soundbitePlayButton: HTMLButtonElement = soundbitePlayButtons[i]; @@ -67,9 +67,9 @@ const Soundbites = (): void => { } } - const inputFields: NodeListOf< - HTMLInputElement - > | null = document.querySelectorAll("input[data-type='soundbite-field']"); + const inputFields: NodeListOf<HTMLInputElement> | null = document.querySelectorAll( + "input[data-type='soundbite-field']" + ); if (inputFields) { for (let i = 0; i < inputFields.length; i++) { const inputField: HTMLInputElement = inputFields[i]; diff --git a/app/Views/_assets/modules/ThemePicker.ts b/app/Views/_assets/modules/ThemePicker.ts index 167f2600206df9cb590573de5af6578ff5b316ae..d495170cd34a45744f706aaf38e283657cd6267c 100644 --- a/app/Views/_assets/modules/ThemePicker.ts +++ b/app/Views/_assets/modules/ThemePicker.ts @@ -1,7 +1,7 @@ const ThemePicker = (): void => { - const buttons: NodeListOf< - HTMLButtonElement - > | null = document.querySelectorAll("button[data-type='theme-picker']"); + const buttons: NodeListOf<HTMLButtonElement> | null = document.querySelectorAll( + "button[data-type='theme-picker']" + ); const iframe: HTMLIFrameElement | null = document.querySelector( `iframe[id="embeddable_player"]` ); diff --git a/app/Views/_assets/modules/Toggler.ts b/app/Views/_assets/modules/Toggler.ts new file mode 100644 index 0000000000000000000000000000000000000000..c726ac1eaa65c7dbc619df5d3c6fa832767cd2c9 --- /dev/null +++ b/app/Views/_assets/modules/Toggler.ts @@ -0,0 +1,31 @@ +const Toggler = (): void => { + const togglerElements: NodeListOf<HTMLElement> = document.querySelectorAll( + "[data-toggle]" + ); + + for (let i = 0; i < togglerElements.length; i++) { + const toggler = togglerElements[i]; + + if (toggler.dataset.toggle) { + const target: HTMLElement | null = document.getElementById( + toggler.dataset.toggle + ); + + if (target && toggler.dataset.toggleClass) { + toggler.addEventListener("click", () => { + toggler.dataset.toggleClass?.split(" ").forEach((className) => { + target.classList.toggle(className); + }); + + if (toggler.dataset.toggleBodyClass) { + toggler.dataset.toggleBodyClass.split(" ").forEach((className) => { + document.body.classList.toggle(className); + }); + } + }); + } + } + } +}; + +export default Toggler; diff --git a/app/Views/_assets/podcast.ts b/app/Views/_assets/podcast.ts index c5e125b3f500ac2640e87f14a812fb198b8e86cc..67235fe7829d31ec8d0f3a9136c9dececd17c0cf 100644 --- a/app/Views/_assets/podcast.ts +++ b/app/Views/_assets/podcast.ts @@ -1,3 +1,9 @@ +import Dropdown from "./modules/Dropdown"; import Time from "./modules/Time"; +import Toggler from "./modules/Toggler"; +import Tooltip from "./modules/Tooltip"; +Dropdown(); Time(); +Toggler(); +Tooltip(); diff --git a/app/Views/_assets/styles/dropdown.css b/app/Views/_assets/styles/dropdown.css new file mode 100644 index 0000000000000000000000000000000000000000..bf3e2ed00fc9033c6582a57ff342fd2641117626 --- /dev/null +++ b/app/Views/_assets/styles/dropdown.css @@ -0,0 +1,8 @@ +@layer base { + [data-dropdown="menu"] { + @apply z-50; + } + [data-dropdown="menu"]:not([data-show]) { + @apply absolute top-0 left-0 invisible pointer-events-none; + } +} diff --git a/app/Views/_assets/styles/fonts.css b/app/Views/_assets/styles/fonts.css new file mode 100644 index 0000000000000000000000000000000000000000..2e3b341f43528da533c55263cd024c6424d5f341 --- /dev/null +++ b/app/Views/_assets/styles/fonts.css @@ -0,0 +1,41 @@ +@layer base { + /* kumbh-sans-regular */ + @font-face { + font-family: "Kumbh Sans"; + font-style: normal; + font-weight: 400; + src: local(""), url("fonts/kumbh-sans-regular.woff2") format("woff2"), + /* Chrome 26+, Opera 23+, Firefox 39+ */ + url("fonts/kumbh-sans-regular.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + } + + /* kumbh-sans-700 */ + @font-face { + font-family: "Kumbh Sans"; + font-style: normal; + font-weight: 700; + src: local(""), url("fonts/kumbh-sans-700.woff2") format("woff2"), + /* Chrome 26+, Opera 23+, Firefox 39+ */ url("fonts/kumbh-sans-700.woff") + format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + } + + /* montserrat-regular */ + @font-face { + font-family: "Montserrat"; + font-style: normal; + font-weight: 400; + src: local(""), url("fonts/montserrat-regular.woff2") format("woff2"), + /* Chrome 26+, Opera 23+, Firefox 39+ */ + url("fonts/montserrat-regular.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + } + + /* montserrat-600 - latin */ + @font-face { + font-family: "Montserrat"; + font-style: normal; + font-weight: 600; + src: local(""), url("fonts/montserrat-600.woff2") format("woff2"), + /* Chrome 26+, Opera 23+, Firefox 39+ */ url("fonts/montserrat-600.woff") + format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + } +} diff --git a/app/Views/_assets/styles/index.css b/app/Views/_assets/styles/index.css index f7737f4f32ddfe48439d99238909a72bbf49aae2..eb98956f1e4ca0dc48be04cce123ca3c94f5f767 100644 --- a/app/Views/_assets/styles/index.css +++ b/app/Views/_assets/styles/index.css @@ -1,7 +1,12 @@ @import "./tailwind.css"; +@import "./fonts.css"; @import "./layout.css"; @import "./breadcrumb.css"; +@import "./dropdown.css"; @import "./multiSelect.css"; @import "./radioBtn.css"; @import "./switch.css"; @import "./charts.css"; +@import "./note.css"; +@import "./tabs.css"; +@import "./radioToggler.css"; diff --git a/app/Views/_assets/styles/layout.css b/app/Views/_assets/styles/layout.css index b613b7473d0c5514e72c81fc6ade8a98427d8ee9..e5535241b59e31606c60077b819a57ad58381ba5 100644 --- a/app/Views/_assets/styles/layout.css +++ b/app/Views/_assets/styles/layout.css @@ -1,9 +1,10 @@ +/* Admin layout */ .holy-grail-grid { @apply grid min-h-screen overflow-y-auto; grid-template: 1fr auto / auto 1fr; & .holy-grail-sidebar { - @apply w-64 col-start-1 col-end-2 row-start-1 row-end-3; + @apply col-start-1 col-end-2 row-start-1 row-end-3 w-80; } & .holy-grail-main { diff --git a/app/Views/_assets/styles/multiSelect.css b/app/Views/_assets/styles/multiSelect.css index 83fe9c76a7ae6f375c098709ced7be10cf432cf7..05fcdc742b4d816a82616aa0c01c4462a0ebc928 100644 --- a/app/Views/_assets/styles/multiSelect.css +++ b/app/Views/_assets/styles/multiSelect.css @@ -1,180 +1,182 @@ -/*=============================== +@layer components { + /*=============================== = MultiSelect = ===============================*/ -.multiselect { - @apply relative; + .multiselect { + @apply relative; - &:focus { - @apply shadow-outline outline-none; - } - &:last-child { - @apply mb-0; - } - &.is-disabled { - &.multiselect__inner, - &.multiselect__input { - @apply bg-gray-300 cursor-not-allowed select-none; + &:focus { + @apply outline-none ring; } - &.multiselect__item { - @apply cursor-not-allowed; + &:last-child { + @apply mb-0; + } + &.is-disabled { + &.multiselect__inner, + &.multiselect__input { + @apply bg-gray-300 cursor-not-allowed select-none; + } + &.multiselect__item { + @apply cursor-not-allowed; + } } - } - - & [hidden] { - @apply hidden; - } -} -.multiselect[data-type*="select-multiple"], -.multiselect[data-type*="text"] { - & .multiselect__inner { - @apply cursor-text; + & [hidden] { + @apply hidden; + } } - & .multiselect__button { - @apply relative inline-block w-2 pl-4 mt-0 mb-0 ml-1 opacity-75; - background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjRkZGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==); - background-size: 8px; - &:hover, - &:focus { - @apply opacity-100; + .multiselect[data-type*="select-multiple"], + .multiselect[data-type*="text"] { + & .multiselect__inner { + @apply cursor-text; + } + & .multiselect__button { + @apply relative inline-block w-2 pl-4 mt-0 mb-0 ml-1 opacity-75; + background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjRkZGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==); + background-size: 8px; + + &:hover, + &:focus { + @apply opacity-100; + } } } -} -.multiselect__inner { - @apply inline-block w-full px-2 pt-2 pb-1 overflow-hidden align-top bg-white border rounded; + .multiselect__inner { + @apply inline-block w-full px-2 pt-2 pb-1 overflow-hidden align-top bg-white border rounded; - &.is-focused, - &.is-open { - @apply shadow-outline; - } - &.is-open { - @apply rounded-b-none; + &.is-focused, + &.is-open { + @apply ring; + } + &.is-open { + @apply rounded-b-none; + } + &.is-flipped.is-open { + @apply rounded-t-none; + } } - &.is-flipped.is-open { - @apply rounded-t-none; + + .multiselect__list { + @apply p-0 m-0 list-none; } -} -.multiselect__list { - @apply p-0 m-0 list-none; -} + .multiselect__list--multiple { + @apply inline; -.multiselect__list--multiple { - @apply inline; + & .multiselect__item { + @apply inline-flex px-2 py-1 mb-1 mr-2 text-sm text-white break-all rounded bg-pine-600; - & .multiselect__item { - @apply inline-flex px-2 py-1 mb-1 mr-2 text-sm text-white break-all bg-green-500 rounded; + &[data-deletable] { + @apply pr-1; + } + & [dir="rtl"] { + @apply ml-2 mr-0; + } + &.is-highlighted { + @apply bg-pine-600; + } + &.is-disabled { + @apply bg-gray-500; + } + } + } + + .multiselect__list--dropdown { + @apply absolute z-10 invisible w-full overflow-hidden break-all bg-white border border-t-0 rounded-b shadow-lg; + top: 100%; + will-change: visibility; - &[data-deletable] { - @apply pr-1; + &.is-active { + @apply visible; } - & [dir="rtl"] { - @apply ml-2 mr-0; + &.is-open { + @apply ring; } - &.is-highlighted { - @apply bg-green-700; + &.is-flipped { + @apply top-auto mt-0 rounded-t; + bottom: 100%; } - &.is-disabled { - @apply bg-gray-500; + & .multiselect__list { + @apply relative overflow-auto; + max-height: 300px; + -webkit-overflow-scrolling: touch; + will-change: scroll-position; } - } -} + & .multiselect__item { + @apply relative p-3; -.multiselect__list--dropdown { - @apply absolute z-10 invisible w-full overflow-hidden break-all bg-white border border-t-0 rounded-b shadow-lg; - top: 100%; - will-change: visibility; - - &.is-active { - @apply visible; - } - &.is-open { - @apply shadow-outline; - } - &.is-flipped { - @apply top-auto mt-0 rounded-t; - bottom: 100%; - } - & .multiselect__list { - @apply relative overflow-auto; - max-height: 300px; - -webkit-overflow-scrolling: touch; - will-change: scroll-position; - } - & .multiselect__item { - @apply relative p-3; - - & [dir="rtl"] { - @apply text-right; - } - } - & .multiselect__item--selectable { - @screen sm { - padding-right: 100px; - &:after { - @apply absolute text-sm transform -translate-y-1/2 opacity-0; - content: attr(data-select-text); - right: 10px; - top: 50%; - } & [dir="rtl"] { @apply text-right; - padding-left: 100px; - padding-right: 10px; + } + } + & .multiselect__item--selectable { + @screen sm { + padding-right: 100px; &:after { - @apply right-auto; - left: 10px; + @apply absolute text-sm transform -translate-y-1/2 opacity-0; + content: attr(data-select-text); + right: 10px; + top: 50%; + } + & [dir="rtl"] { + @apply text-right; + padding-left: 100px; + padding-right: 10px; + &:after { + @apply right-auto; + left: 10px; + } } } - } - &.is-highlighted { - @apply bg-gray-100; - &:after { - @apply opacity-50; + &.is-highlighted { + @apply bg-gray-100; + &:after { + @apply opacity-50; + } } } } -} -.multiselect__item { - @apply cursor-default; -} + .multiselect__item { + @apply cursor-default; + } -.multiselect__item--selectable { - @apply cursor-pointer; -} + .multiselect__item--selectable { + @apply cursor-pointer; + } -.multiselect__item--disabled { - @apply opacity-50 cursor-not-allowed select-none; -} + .multiselect__item--disabled { + @apply opacity-50 cursor-not-allowed select-none; + } -.multiselect__heading { - @apply p-3 font-semibold text-gray-600 border-b; -} + .multiselect__heading { + @apply p-3 font-semibold text-gray-600 border-b; + } -.multiselect__button { - @apply bg-transparent bg-center bg-no-repeat border-0 appearance-none cursor-pointer; - text-indent: -9999px; + .multiselect__button { + @apply bg-transparent bg-center bg-no-repeat border-0 appearance-none cursor-pointer; + text-indent: -9999px; - &:focus { - @apply outline-none; + &:focus { + @apply outline-none; + } } -} -.multiselect__input { - @apply inline-block max-w-full py-1 pl-1 mb-1 align-baseline bg-transparent border-0 rounded-none; - &:focus { - @apply outline-none; + .multiselect__input { + @apply inline-block max-w-full py-1 pl-1 mb-1 align-baseline bg-transparent border-0 rounded-none; + &:focus { + @apply outline-none; + } + & [dir="rtl"] { + @apply pl-0 pr-1; + } } - & [dir="rtl"] { - @apply pl-0 pr-1; + + .multiselect__placeholder { + @apply opacity-50; } -} -.multiselect__placeholder { - @apply opacity-50; + /*===== End of Choices ======*/ } - -/*===== End of Choices ======*/ diff --git a/app/Views/_assets/styles/note.css b/app/Views/_assets/styles/note.css new file mode 100644 index 0000000000000000000000000000000000000000..510bcda243b7dca8e642b80746b0a1bf26698cb9 --- /dev/null +++ b/app/Views/_assets/styles/note.css @@ -0,0 +1,22 @@ +@layer components { + .note-content { + & a { + @apply text-sm font-semibold text-pine-600 hover:underline; + } + } + + .note-replies > * { + @apply relative; + + & img { + @apply z-20; + } + + &:not(:last-child)::before { + @apply absolute z-10 h-full bg-gray-300 top-8; + content: ""; + left: 3rem; + width: 2px; + } + } +} diff --git a/app/Views/_assets/styles/radioBtn.css b/app/Views/_assets/styles/radioBtn.css index 1007c673332115ab6d24a534f6600c98cc49b7e9..0abe1a6e6501b8d4616bff95b0d60da837223697 100644 --- a/app/Views/_assets/styles/radioBtn.css +++ b/app/Views/_assets/styles/radioBtn.css @@ -1,24 +1,26 @@ -.form-radio-btn { - @apply absolute opacity-0; -} +@layer components { + .form-radio-btn { + @apply absolute opacity-0; + } -.form-radio-btn:focus + label { - @apply shadow-outline; -} + .form-radio-btn:focus + label { + @apply ring; + } -.form-radio-btn + label { - @apply inline-block px-2 py-1 text-sm text-black bg-white border rounded cursor-pointer; + .form-radio-btn + label { + @apply inline-block px-2 py-1 text-sm text-black bg-white border rounded cursor-pointer; - &:hover { - @apply bg-green-100; + &:hover { + @apply bg-pine-100; + } } -} -.form-radio-btn:checked + label { - @apply text-white bg-green-500; + .form-radio-btn:checked + label { + @apply text-white bg-pine-600; - &::before { - @apply mr-2 text-green-200; - content: "✓"; + &::before { + @apply mr-2 text-pine-200; + content: "✓"; + } } } diff --git a/app/Views/_assets/styles/radioToggler.css b/app/Views/_assets/styles/radioToggler.css new file mode 100644 index 0000000000000000000000000000000000000000..47e7048a9513b92b854d0eddbdca61ebd9e5dd32 --- /dev/null +++ b/app/Views/_assets/styles/radioToggler.css @@ -0,0 +1,9 @@ +@layer components { + .radio-toggler-element { + @apply hidden; + } + + .radio-toggler > input:checked ~ .radio-toggler-element { + @apply block; + } +} diff --git a/app/Views/_assets/styles/switch.css b/app/Views/_assets/styles/switch.css index be0cbe0f35890519ba966806325c0fe37b6c5315..3d8a7f3d150ef0064e740d93871b444bee8680f5 100644 --- a/app/Views/_assets/styles/switch.css +++ b/app/Views/_assets/styles/switch.css @@ -1,26 +1,28 @@ -.form-switch { - @apply absolute w-0 h-0 opacity-0; +@layer components { + .form-switch { + @apply absolute w-0 h-0 opacity-0; - &:checked + .form-switch-slider { - @apply bg-green-500; - } + &:checked + .form-switch-slider { + @apply bg-pine-600; + } - &:focus + .form-switch-slider { - @apply shadow-outline; - } + &:focus + .form-switch-slider { + @apply ring; + } - &:checked + .form-switch-slider::before { - @apply transform translate-x-5; + &:checked + .form-switch-slider::before { + @apply transform translate-x-5; + } } -} -.form-switch-slider { - @apply relative inset-0 flex-shrink-0 w-10 h-5 transition duration-200 bg-gray-400 rounded-full cursor-pointer; + .form-switch-slider { + @apply relative inset-0 flex-shrink-0 w-10 h-5 transition duration-200 bg-gray-400 rounded-full cursor-pointer; - &::before { - @apply absolute w-4 h-4 transition duration-200 bg-white rounded-full shadow-xs; - content: ""; - left: 2px; - bottom: 2px; + &::before { + @apply absolute w-4 h-4 transition duration-200 bg-white rounded-full ring-1 ring-black ring-opacity-5; + content: ""; + left: 2px; + bottom: 2px; + } } } diff --git a/app/Views/_assets/styles/tabs.css b/app/Views/_assets/styles/tabs.css new file mode 100644 index 0000000000000000000000000000000000000000..4414c5174edb4e4eda94c30b792d0e01c52d4d35 --- /dev/null +++ b/app/Views/_assets/styles/tabs.css @@ -0,0 +1,37 @@ +@layer components { + .tabset { + @apply grid grid-cols-2; + } + + .tabset > input[type="radio"] { + @apply absolute -left-full; + } + + .tab-panel { + @apply hidden; + } + + /* Logic for 2 tabs at most */ + .tabset > input:first-child:checked ~ .tab-panels > .tab-panel:first-child, + .tabset > input:nth-child(3):checked ~ .tab-panels > .tab-panel:nth-child(2) { + @apply block; + } + + /* Styling */ + .tabset > label { + @apply relative inline-block w-full px-4 py-3 text-center cursor-pointer opacity-70 hover:opacity-100; + } + + .tabset > input:checked + label::after { + @apply absolute inset-x-0 bottom-0 w-1/2 h-1 mx-auto bg-pine-700; + content: ""; + } + + .tabset > input:checked + label { + @apply font-semibold opacity-100 text-pine-700; + } + + .tab-panels { + @apply col-span-2 p-6; + } +} diff --git a/app/Views/admin/_layout.php b/app/Views/admin/_layout.php index 6a8d1706679c353851225363792b033cecdfd09b..3ca4c951ba957897d07c48fdd8b882491dc81667 100644 --- a/app/Views/admin/_layout.php +++ b/app/Views/admin/_layout.php @@ -9,12 +9,12 @@ <link rel="shortcut icon" type="image/png" href="/favicon.ico" /> <link rel="stylesheet" href="/assets/admin.css"/> <link rel="stylesheet" href="/assets/index.css"/> - <script src="/assets/admin.js" type="module" defer></script> + <script src="/assets/admin.js" type="module"></script> </head> <body class="relative bg-gray-100 holy-grail-grid"> <div id="sidebar-backdrop" role="button" tabIndex="0" aria-label="Close" class="fixed z-50 hidden w-full h-full bg-gray-900 bg-opacity-50 md:hidden"></div> - <aside id="admin-sidebar" class="sticky top-0 z-50 flex flex-col w-64 max-h-screen transition duration-200 ease-in-out transform -translate-x-full bg-white border-r holy-grail-sidebar md:translate-x-0"> + <aside id="admin-sidebar" class="sticky top-0 z-50 flex flex-col max-h-screen transition duration-200 ease-in-out transform -translate-x-full bg-white border-r w-80 holy-grail-sidebar md:translate-x-0"> <?php if (isset($podcast)): ?> <?= $this->include('admin/podcast/_sidebar') ?> <?php else: ?> @@ -22,16 +22,19 @@ <?php endif; ?> </aside> <main class="overflow-hidden holy-grail-main"> - <header class="text-white bg-gradient-to-tr from-gray-900 to-gray-800"> + <header class="text-white bg-pine-900"> <div class="container flex flex-wrap items-end justify-between px-2 py-10 mx-auto md:px-12 gap-y-6 gap-x-6"> <div class="flex flex-col"> <?= render_breadcrumb('text-gray-300') ?> - <h1 class="text-3xl"><?= $this->renderSection( - 'pageTitle' - ) ?></h1> + <div class="flex flex-wrap items-center"> + <h1 class="text-3xl font-bold font-display"><?= $this->renderSection( + 'pageTitle', + ) ?></h1> + <?= $this->renderSection('headerLeft') ?> + </div> </div> <div class="flex flex-wrap"><?= $this->renderSection( - 'headerRight' + 'headerRight', ) ?></div> </div> </header> @@ -50,6 +53,6 @@ <button type="button" id="sidebar-toggler" - class="fixed bottom-0 left-0 z-50 p-3 mb-3 ml-3 text-xl transition duration-300 ease-in-out bg-white border-2 rounded-full shadow-lg focus:outline-none md:hidden hover:bg-gray-100 focus:shadow-outline" + class="fixed bottom-0 left-0 z-50 p-3 mb-3 ml-3 text-xl transition duration-300 ease-in-out bg-white border-2 rounded-full shadow-lg focus:outline-none md:hidden hover:bg-gray-100 focus:ring" style="transform: translateX(0px);"><?= icon('menu') ?></button> </body> diff --git a/app/Views/admin/_sidebar.php b/app/Views/admin/_sidebar.php index 069dc74243a1623bbfebf0fbb2c38f8524cde36a..59320ba18ae6a71d1fd0324a15d3a1c9e95d2b63 100644 --- a/app/Views/admin/_sidebar.php +++ b/app/Views/admin/_sidebar.php @@ -9,37 +9,40 @@ $navigation = [ 'icon' => 'folder-user', 'items' => ['person-list', 'person-create'], ], + 'fediverse' => [ + 'icon' => 'star-smile', + 'items' => ['fediverse-blocked-actors', 'fediverse-blocked-domains'], + ], 'users' => ['icon' => 'group', 'items' => ['user-list', 'user-create']], 'pages' => ['icon' => 'pages', 'items' => ['page-list', 'page-create']], ]; ?> <a href="<?= route_to( - 'admin' -) ?>" class="inline-flex items-center px-4 py-2 mb-2 text-xl"> - <?= svg('logo-castopod', 'h-8 mr-2') ?> - Castopod + 'admin', +) ?>" class="inline-flex items-baseline px-6 py-2 mb-2 text-2xl font-semibold font-display text-pine-700"> + <?= 'castopod' . svg('castopod-logo', 'h-5 ml-1') ?> </a> <a href="<?= route_to( - 'home' -) ?>" class="inline-flex items-center px-6 py-2 mb-2 text-sm underline outline-none hover:no-underline focus:shadow-outline"> + 'home', +) ?>" class="inline-flex items-center px-6 py-2 mb-2 text-sm underline outline-none hover:no-underline focus:ring"> <?= lang('AdminNavigation.go_to_website') ?> <?= icon('external-link', 'ml-2 text-gray-500') ?> </a> <nav class="flex flex-col flex-1 overflow-y-auto"> <?php foreach ($navigation as $section => $data): ?> <div class="mb-4"> - <button class="inline-flex items-center w-full px-6 py-1 outline-none focus:shadow-outline" type="button"> - <?= icon($data['icon'], 'text-gray-500') ?> - <span class="ml-2"><?= lang('AdminNavigation.' . $section) ?></span> + <button class="inline-flex items-center w-full px-6 py-1 font-semibold text-gray-600 outline-none focus:ring" type="button"> + <?= icon($data['icon'], 'text-gray-400 text-xl mr-3') ?> + <?= lang('AdminNavigation.' . $section) ?> </button> - <ul> + <ul class="flex flex-col"> <?php foreach ($data['items'] as $item): ?> - <?php $isActive = base_url(route_to($item)) == current_url(); ?> - <li> - <a class="block py-1 pl-12 pr-2 text-sm text-gray-600 outline-none hover:text-gray-900 focus:shadow-outline <?= $isActive + <?php $isActive = url_is(route_to($item)); ?> + <li class="inline-flex"> + <a class="w-full py-1 pl-14 pr-2 text-sm text-gray-600 outline-none hover:text-gray-900 focus:ring <?= $isActive ? 'font-semibold text-gray-900' : '' ?>" href="<?= route_to($item) ?>"><?= lang( - 'AdminNavigation.' . $item + 'AdminNavigation.' . $item, ) ?></a> </li> <?php endforeach; ?> @@ -47,21 +50,31 @@ $navigation = [ </div> <?php endforeach; ?> </nav> -<div class="w-full mt-auto border-t" data-toggle="dropdown"> - <button type="button" class="inline-flex items-center w-full px-6 py-2 outline-none focus:shadow-outline" id="my-accountDropdown" data-popper="button" aria-haspopup="true" aria-expanded="false"> - <?= icon('user', 'text-gray-500 mr-2') ?> - <?= user()->username ?> - <?= icon('caret-right', 'ml-auto') ?> - </button> - <nav class="absolute z-50 flex-col hidden py-2 text-black whitespace-no-wrap bg-white border rounded shadow" aria-labelledby="my-accountDropdown" data-popper="menu" data-popper-placement="right-end"> - <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'my-account' - ) ?>"><?= lang('AdminNavigation.account.my-account') ?></a> - <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'change-password' - ) ?>"><?= lang('AdminNavigation.account.change-password') ?></a> - <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'logout' - ) ?>"><?= lang('AdminNavigation.account.logout') ?></a> - </nav> -</div> +<button +type="button" +class="inline-flex items-center w-full px-6 py-2 mt-auto border-t outline-none focus:ring" +id="my-account-dropdown" +data-dropdown="button" +data-dropdown-target="my-account-dropdown-menu" +aria-haspopup="true" +aria-expanded="false"> + <?= icon('user', 'text-gray-500 mr-2') ?> + <?= user()->username ?> + <?= icon('caret-right', 'ml-auto') ?> +</button> +<nav +id="my-account-dropdown-menu" +class="absolute z-50 flex flex-col py-2 text-black whitespace-no-wrap bg-white border rounded shadow" +aria-labelledby="my-accountDropdown" +data-dropdown="menu" +data-dropdown-placement="right-end"> + <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( + 'my-account', + ) ?>"><?= lang('AdminNavigation.account.my-account') ?></a> + <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( + 'change-password', + ) ?>"><?= lang('AdminNavigation.account.change-password') ?></a> + <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( + 'logout', + ) ?>"><?= lang('AdminNavigation.account.logout') ?></a> +</nav> diff --git a/app/Views/admin/contributor/list.php b/app/Views/admin/contributor/list.php index 8d55150c8031a0161bc7894ba441d4640efec3b3..e2b3178e1835bc93e78e31c0e4d6e32c95f7e98c 100644 --- a/app/Views/admin/contributor/list.php +++ b/app/Views/admin/contributor/list.php @@ -10,7 +10,7 @@ <?= $this->section('headerRight') ?> <?= button(lang('Contributor.add'), route_to('contributor-add', $podcast->id), [ - 'variant' => 'primary', + 'variant' => 'accent', 'iconLeft' => 'add', ]) ?> <?= $this->endSection() ?> diff --git a/app/Views/admin/episode/create.php b/app/Views/admin/episode/create.php index 2c5dffda5d16df0d3162d7df82b9da537cb84040..37de291c8d6863ab6cf722f160d2f2f111b00c09 100644 --- a/app/Views/admin/episode/create.php +++ b/app/Views/admin/episode/create.php @@ -141,6 +141,53 @@ </label> <?= form_fieldset_close() ?> +<?= form_fieldset('', ['class' => 'flex mb-6 gap-1']) ?> + <legend> + <?= lang('Episode.form.parental_advisory.label') . + hint_tooltip(lang('Episode.form.parental_advisory.hint'), 'ml-1') ?> + </legend> + <?= form_radio( + [ + 'id' => 'undefined', + 'name' => 'parental_advisory', + 'class' => 'form-radio-btn', + ], + 'undefined', + old('parental_advisory') + ? old('parental_advisory') === 'undefined' + : true + ) ?> + <label for="undefined"><?= lang( + 'Episode.form.parental_advisory.undefined' + ) ?></label> + <?= form_radio( + [ + 'id' => 'clean', + 'name' => 'parental_advisory', + 'class' => 'form-radio-btn', + ], + 'clean', + old('parental_advisory') ? old('parental_advisory') === 'clean' : false + ) ?> + <label for="clean"><?= lang( + 'Episode.form.parental_advisory.clean' + ) ?></label> + <?= form_radio( + [ + 'id' => 'explicit', + 'name' => 'parental_advisory', + 'class' => 'form-radio-btn', + ], + 'explicit', + old('parental_advisory') + ? old('parental_advisory') === 'explicit' + : false + ) ?> + <label for="explicit"><?= lang( + 'Episode.form.parental_advisory.explicit' + ) ?></label> +<?= form_fieldset_close() ?> + <?= form_section_close() ?> @@ -207,89 +254,6 @@ ]) ?> <?= form_section_close() ?> -<?= form_section( - lang('Episode.form.publication_section_title'), - lang('Episode.form.publication_section_subtitle') -) ?> - -<?= form_label( - lang('Episode.form.publication_date'), - 'publication_date', - [], - lang('Episode.form.publication_date_hint') -) ?> -<div class="flex mb-4" data-picker="datetime"> - <?= form_input([ - 'id' => 'publication_date', - 'name' => 'publication_date', - 'class' => 'form-input rounded-r-none flex-1', - 'value' => old('publication_date', date('Y-m-d H:i')), - 'data-input' => '', - ]) ?> - <button - class="p-3 bg-green-100 border border-l-0 focus:outline-none rounded-r-md hover:bg-green-200 focus:shadow-outline" - type="button" - title="<?= lang('Episode.form.publication_date_clear') ?>" - data-clear=""><?= icon('close') ?></button> -</div> - -<?= form_fieldset('', ['class' => 'flex mb-6 gap-1']) ?> - <legend> - <?= lang('Episode.form.parental_advisory.label') . - hint_tooltip(lang('Episode.form.type.hint'), 'ml-1') ?> - </legend> - <?= form_radio( - [ - 'id' => 'undefined', - 'name' => 'parental_advisory', - 'class' => 'form-radio-btn', - ], - 'undefined', - old('parental_advisory') - ? old('parental_advisory') === 'undefined' - : true - ) ?> - <label for="undefined"><?= lang( - 'Episode.form.parental_advisory.undefined' - ) ?></label> - <?= form_radio( - [ - 'id' => 'clean', - 'name' => 'parental_advisory', - 'class' => 'form-radio-btn', - ], - 'clean', - old('parental_advisory') ? old('parental_advisory') === 'clean' : false - ) ?> - <label for="clean"><?= lang( - 'Episode.form.parental_advisory.clean' - ) ?></label> - <?= form_radio( - [ - 'id' => 'explicit', - 'name' => 'parental_advisory', - 'class' => 'form-radio-btn', - ], - 'explicit', - old('parental_advisory') - ? old('parental_advisory') === 'explicit' - : false - ) ?> - <label for="explicit"><?= lang( - 'Episode.form.parental_advisory.explicit' - ) ?></label> -<?= form_fieldset_close() ?> - -<?= form_switch( - lang('Episode.form.block') . - hint_tooltip(lang('Episode.form.block_hint'), 'ml-1'), - ['id' => 'block', 'name' => 'block'], - 'yes', - old('block', false) -) ?> - -<?= form_section_close() ?> - <?= form_section( lang('Episode.form.additional_files_section_title'), lang('Episode.form.additional_files_section_subtitle') @@ -343,6 +307,14 @@ ]) ?> <?= form_section_close() ?> +<?= form_switch( + lang('Episode.form.block') . + hint_tooltip(lang('Episode.form.block_hint'), 'ml-1'), + ['id' => 'block', 'name' => 'block'], + 'yes', + old('block', false) +) ?> + <?= button( lang('Episode.form.submit_create'), null, diff --git a/app/Views/admin/episode/edit.php b/app/Views/admin/episode/edit.php index 710cda7eab43a3f72da2c6372bfeea899455a41a..59d6678e46d69bdc0f7ecfedc34dd628902715d3 100644 --- a/app/Views/admin/episode/edit.php +++ b/app/Views/admin/episode/edit.php @@ -16,7 +16,6 @@ 'class' => 'flex flex-col', ]) ?> <?= csrf_field() ?> -<?= form_hidden('client_timezone', 'UTC') ?> <?= form_section( lang('Episode.form.info_section_title'), @@ -144,6 +143,55 @@ </label> <?= form_fieldset_close() ?> +<?= form_fieldset('', ['class' => 'mb-6']) ?> + <legend> + <?= lang('Episode.form.parental_advisory.label') . + hint_tooltip(lang('Episode.form.parental_advisory.hint'), 'ml-1') ?> + </legend> + <?= form_radio( + [ + 'id' => 'undefined', + 'name' => 'parental_advisory', + 'class' => 'form-radio-btn', + ], + 'undefined', + old('parental_advisory') + ? old('parental_advisory') === 'undefined' + : $episode->parental_advisory === null + ) ?> + <label for="undefined"><?= lang( + 'Episode.form.parental_advisory.undefined' + ) ?></label> + <?= form_radio( + [ + 'id' => 'clean', + 'name' => 'parental_advisory', + 'class' => 'form-radio-btn', + ], + 'clean', + old('parental_advisory') + ? old('parental_advisory') === 'clean' + : $episode->parental_advisory === 'clean' + ) ?> + <label for="clean"><?= lang( + 'Episode.form.parental_advisory.clean' + ) ?></label> + <?= form_radio( + [ + 'id' => 'explicit', + 'name' => 'parental_advisory', + 'class' => 'form-radio-btn', + ], + 'explicit', + old('parental_advisory') + ? old('parental_advisory') === 'explicit' + : $episode->parental_advisory === 'explicit' + ) ?> + <label for="explicit"><?= lang( + 'Episode.form.parental_advisory.explicit' + ) ?></label> +<?= form_fieldset_close() ?> + <?= form_section_close() ?> @@ -210,95 +258,7 @@ ]) ?> <?= form_section_close() ?> -<?= form_section( - lang('Episode.form.publication_section_title'), - lang('Episode.form.publication_section_subtitle') -) ?> - -<?= form_label( - lang('Episode.form.publication_date'), - 'publication_date', - [], - lang('Episode.form.publication_date_hint') -) ?> -<div class="flex mb-4" data-picker="datetime"> - <?= form_input([ - 'id' => 'publication_date', - 'name' => 'publication_date', - 'class' => 'form-input rounded-r-none flex-1', - 'value' => old( - 'publication_date', - $episode->published_at - ? $episode->published_at->format('Y-m-d H:i') - : '' - ), - 'data-input' => '', - ]) ?> - <button - class="p-3 bg-green-100 border border-l-0 focus:outline-none rounded-r-md hover:bg-green-200 focus:shadow-outline" - type="button" - title="<?= lang('Episode.form.publication_date_clear') ?>" - data-clear=""><?= icon('close') ?></button> -</div> - -<?= form_fieldset('', ['class' => 'mb-6']) ?> - <legend> - <?= lang('Episode.form.parental_advisory.label') . - hint_tooltip(lang('Episode.form.type.hint'), 'ml-1') ?> - </legend> - <?= form_radio( - [ - 'id' => 'undefined', - 'name' => 'parental_advisory', - 'class' => 'form-radio-btn', - ], - 'undefined', - old('parental_advisory') - ? old('parental_advisory') === 'undefined' - : $episode->parental_advisory === null - ) ?> - <label for="undefined"><?= lang( - 'Episode.form.parental_advisory.undefined' - ) ?></label> - <?= form_radio( - [ - 'id' => 'clean', - 'name' => 'parental_advisory', - 'class' => 'form-radio-btn', - ], - 'clean', - old('parental_advisory') - ? old('parental_advisory') === 'clean' - : $episode->parental_advisory === 'clean' - ) ?> - <label for="clean"><?= lang( - 'Episode.form.parental_advisory.clean' - ) ?></label> - <?= form_radio( - [ - 'id' => 'explicit', - 'name' => 'parental_advisory', - 'class' => 'form-radio-btn', - ], - 'explicit', - old('parental_advisory') - ? old('parental_advisory') === 'explicit' - : $episode->parental_advisory === 'explicit' - ) ?> - <label for="explicit"><?= lang( - 'Episode.form.parental_advisory.explicit' - ) ?></label> -<?= form_fieldset_close() ?> - -<?= form_switch( - lang('Episode.form.block') . - hint_tooltip(lang('Episode.form.block_hint'), 'ml-1'), - ['id' => 'block', 'name' => 'block'], - 'yes', - old('block', $episode->is_blocked) -) ?> -<?= form_section_close() ?> <?= form_section( lang('Episode.form.additional_files_section_title'), lang('Episode.form.additional_files_section_subtitle', [ @@ -407,6 +367,14 @@ ]) ?> <?= form_section_close() ?> +<?= form_switch( + lang('Episode.form.block') . + hint_tooltip(lang('Episode.form.block_hint'), 'ml-1'), + ['id' => 'block', 'name' => 'block'], + 'yes', + old('block', $episode->is_blocked) +) ?> + <?= button( lang('Episode.form.submit_edit'), null, diff --git a/app/Views/admin/episode/embeddable_player.php b/app/Views/admin/episode/embeddable_player.php index 2144580e1e003acf702f145de1cf68f8a5ae420a..ea5c409bbcbb6daaa64a7131d3f2b2a0ba231a9b 100644 --- a/app/Views/admin/episode/embeddable_player.php +++ b/app/Views/admin/episode/embeddable_player.php @@ -10,57 +10,56 @@ <?= $this->section('content') ?> - <?= form_label(lang('Episode.embeddable_player.label'), 'label') ?> +<?= form_label(lang('Episode.embeddable_player.label'), 'label') ?> - <div class="flex w-full mt-6 mb-6"> - <?php foreach ($themes as $themeKey => $theme): ?> - <button style="<?= $theme[ - 'style' - ] ?>" class="w-12 h-12 mr-1 border-2 border-gray-400 rounded-lg hover:border-white" title="<?= lang("Episode.embeddable_player.{$themeKey}") ?>" data-type="theme-picker" data-url="<?= $episode->getEmbeddablePlayer( - $themeKey +<div class="flex w-full mt-6 mb-6"> + <?php foreach ($themes as $themeKey => $theme): ?> + <button style="<?= $theme[ + 'style' + ] ?>" class="w-12 h-12 mr-1 border-2 border-gray-400 rounded-lg hover:border-white" title="<?= lang( + "Episode.embeddable_player.{$themeKey}", +) ?>" data-type="theme-picker" data-url="<?= $episode->getEmbeddablePlayer( + $themeKey, ) ?>"></button> - <?php endforeach; ?> - </div> + <?php endforeach; ?> +</div> - <iframe name="embeddable_player" id="embeddable_player" width="100%" height="280" frameborder="0" scrolling="no" style="width: 100%; height: 280; overflow: hidden;" src="<?= $episode->embeddable_player ?>"></iframe> +<iframe name="embeddable_player" id="embeddable_player" class="w-full h-48 max-w-xl" frameborder="0" scrolling="no" style="width: 100%; overflow: hidden;" src="<?= $episode->embeddable_player ?>"></iframe> - <div class="flex items-center w-full mt-8"> - <?= form_textarea( - [ - 'id' => 'iframe', - 'name' => 'iframe', - 'class' => 'form-textarea w-full h-20 mr-2', - ], - "<iframe width=\"100%\" height=\"280\" frameborder=\"0\" scrolling=\"no\" style=\"width: 100%; height: 280px; overflow: hidden;\" src=\"{$episode->embeddable_player}\"></iframe>" - ) ?> - <?= icon_button( - 'file-copy', - lang('Episode.embeddable_player.clipboard_iframe'), - null, - ['variant' => 'default'], - [ - 'data-type' => 'clipboard-copy', - 'data-clipboard-target' => 'iframe', - ] - ) ?> - </div> +<div class="flex items-center w-full mt-8"> + <?= form_textarea( + [ + 'id' => 'iframe', + 'name' => 'iframe', + 'class' => 'form-textarea w-full h-20 mr-2', + ], + "<iframe width=\"100%\" height=\"280\" frameborder=\"0\" scrolling=\"no\" style=\"width: 100%; height: 280px; overflow: hidden;\" src=\"{$episode->embeddable_player}\"></iframe>", + ) ?> + <?= icon_button( + 'file-copy', + lang('Episode.embeddable_player.clipboard_iframe'), + null, + ['variant' => 'default'], + ['data-type' => 'clipboard-copy', 'data-clipboard-target' => 'iframe'], + ) ?> +</div> - <div class="flex items-center w-full mt-4"> - <?= form_textarea( - [ - 'id' => 'url', - 'name' => 'url', - 'class' => 'form-textarea w-full h-10 mr-2', - ], - $episode->embeddable_player - ) ?> - <?= icon_button( - 'file-copy', - lang('Episode.embeddable_player.clipboard_url'), - null, - ['variant' => 'default'], - ['data-type' => 'clipboard-copy', 'data-clipboard-target' => 'url'] - ) ?> - </div> +<div class="flex items-center w-full mt-4"> + <?= form_textarea( + [ + 'id' => 'url', + 'name' => 'url', + 'class' => 'form-textarea w-full h-10 mr-2', + ], + $episode->embeddable_player, + ) ?> + <?= icon_button( + 'file-copy', + lang('Episode.embeddable_player.clipboard_url'), + null, + ['variant' => 'default'], + ['data-type' => 'clipboard-copy', 'data-clipboard-target' => 'url'], + ) ?> +</div> <?= $this->endSection() ?> diff --git a/app/Views/admin/episode/list.php b/app/Views/admin/episode/list.php index fc0f61e37348abbffe019f965a91a69c4651e304..ef0650c250e875cb812738edc85633ae5e78fea0 100644 --- a/app/Views/admin/episode/list.php +++ b/app/Views/admin/episode/list.php @@ -11,12 +11,10 @@ <?= $this->endSection() ?> <?= $this->section('headerRight') ?> -<?= button( - lang('Episode.create'), - route_to('episode-create', $podcast->id), - - ['variant' => 'primary', 'iconLeft' => 'add'] -) ?> +<?= button(lang('Episode.create'), route_to('episode-create', $podcast->id), [ + 'variant' => 'accent', + 'iconLeft' => 'add', +]) ?> <?= $this->endSection() ?> @@ -39,62 +37,74 @@ <a class="flex-1 text-sm hover:underline" href="<?= route_to( 'episode-view', $podcast->id, - $episode->id + $episode->id, ) ?>"> - <h2 class="inline-flex justify-between w-full font-bold leading-none group"> + <h2 class="inline-flex justify-between w-full font-semibold leading-none group"> <span class="mr-1 group-hover:underline"><?= $episode->title ?></span> <?= episode_numbering( $episode->number, $episode->season_number, - 'text-xs font-bold text-gray-600', - true + 'text-xs font-semibold text-gray-600', + true, ) ?> </h2> </a> - <div class="relative" data-toggle="dropdown"> - <button type="button" class="inline-flex items-center p-1 outline-none focus:shadow-outline" id="moreDropdown" data-popper="button" aria-haspopup="true" aria-expanded="false"> - <?= icon('more') ?> - </button> - <nav class="absolute z-10 flex-col hidden py-2 text-black whitespace-no-wrap bg-white border rounded shadow" aria-labelledby="moreDropdown" data-popper="menu" data-popper-placement="bottom-end" data-popper-offset-x="0" data-popper-offset-y="-24" > - <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'episode-edit', - $podcast->id, - $episode->id - ) ?>"><?= lang('Episode.edit') ?></a> - <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'embeddable-player-add', - $podcast->id, - $episode->id - ) ?>"><?= lang( - 'Episode.embeddable_player.add' + <button + id="more-dropdown-<?= $episode->id ?>" + type="button" + class="inline-flex items-center p-1 outline-none focus:ring" + data-dropdown="button" + data-dropdown-target="more-dropdown-<?= $episode->id ?>-menu" + aria-haspopup="true" + aria-expanded="false"> + <?= icon('more') ?> + </button> + <nav + id="more-dropdown-<?= $episode->id ?>-menu" + class="flex flex-col py-2 text-black whitespace-no-wrap bg-white border rounded shadow" + aria-labelledby="more-dropdown-<?= $episode->id ?>" + data-dropdown="menu" + data-dropdown-placement="bottom-start" + data-dropdown-offset-x="0" + data-dropdown-offset-y="-24"> + <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( + 'episode-edit', + $podcast->id, + $episode->id, + ) ?>"><?= lang('Episode.edit') ?></a> + <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( + 'embeddable-player-add', + $podcast->id, + $episode->id, + ) ?>"><?= lang( + 'Episode.embeddable_player.add', ) ?></a> - <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'episode-person-manage', - $podcast->id, - $episode->id - ) ?>"><?= lang('Person.persons') ?></a> - <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'soundbites-edit', - $podcast->id, - $episode->id - ) ?>"><?= lang('Episode.soundbites') ?></a> - <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'episode', - $podcast->name, - $episode->slug - ) ?>"><?= lang('Episode.go_to_page') ?></a> - <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'episode-delete', - $podcast->id, - $episode->id - ) ?>"><?= lang('Episode.delete') ?></a> - </nav> - </div> + <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( + 'episode-person-manage', + $podcast->id, + $episode->id, + ) ?>"><?= lang('Person.persons') ?></a> + <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( + 'soundbites-edit', + $podcast->id, + $episode->id, + ) ?>"><?= lang('Episode.soundbites') ?></a> + <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( + 'episode', + $podcast->name, + $episode->slug, + ) ?>"><?= lang('Episode.go_to_page') ?></a> + <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( + 'episode-delete', + $podcast->id, + $episode->id, + ) ?>"><?= lang('Episode.delete') ?></a> + </nav> </div> <div class="mb-2 text-xs"> <?= publication_pill( $episode->published_at, - $episode->publication_status + $episode->publication_status, ) ?> <span class="mx-1">•</span> <time datetime="PT<?= $episode->enclosure_duration ?>S"> diff --git a/app/Views/admin/episode/publish.php b/app/Views/admin/episode/publish.php new file mode 100644 index 0000000000000000000000000000000000000000..f491092b3b5432aa6ad7df9659ffaca4ba0010c7 --- /dev/null +++ b/app/Views/admin/episode/publish.php @@ -0,0 +1,171 @@ +<?= $this->extend('admin/_layout') ?> + +<?= $this->section('title') ?> +<?= lang('Episode.publish') ?> +<?= $this->endSection() ?> + +<?= $this->section('pageTitle') ?> +<?= lang('Episode.publish') ?> +<?= $this->endSection() ?> + + +<?= $this->section('content') ?> + +<?= form_open(route_to('episode-publish', $podcast->id, $episode->id), [ + 'method' => 'post', + 'class' => 'flex flex-col max-w-xl items-start', +]) ?> +<?= csrf_field() ?> +<?= form_hidden('client_timezone', 'UTC') ?> + + +<label for="message" class="text-lg font-semibold"><?= lang( + 'Episode.publish_form.note', +) . hint_tooltip(lang('Episode.publish_form.note_hint'), 'ml-1') ?></label> +<div class="mb-8 overflow-hidden bg-white shadow-md rounded-xl"> + <div class="flex px-4 py-3"> + <img src="<?= $podcast->actor->avatar_image_url ?>" alt="<?= $podcast + ->actor->display_name ?>" class="w-12 h-12 mr-4 rounded-full"/> + <p class="flex items-baseline min-w-0"> + <span class="mr-2 font-semibold truncate"><?= $podcast->actor + ->display_name ?></span> + <span class="text-sm text-gray-500 truncate">@<?= $podcast->actor + ->username ?></span> + </p> + </div> + <div class="px-4 mb-2"> + <?= form_textarea( + [ + 'id' => 'message', + 'name' => 'message', + 'class' => 'form-textarea min-w-0 w-full', + 'required' => 'required', + 'placeholder' => 'Write your message...', + ], + old('message', '', false), + ['rows' => 2], + ) ?> + </div> + <div class="flex"> + <img + src="<?= $episode->image->thumbnail_url ?>" + alt="<?= $episode->title ?>" class="w-24 h-24"/> + <div class="flex flex-col flex-1"> + <a href="<?= $episode->link ?>" class="flex-1 px-4 py-2 bg-gray-100"> + <div class="flex items-baseline"> + <span class="flex-1 w-0 mr-2 text-sm font-semibold truncate"><?= $episode->title ?></span> + <?= episode_numbering( + $episode->number, + $episode->season_number, + 'text-xs font-semibold text-gray-600', + true, + ) ?> + </div> + <div class="text-xs text-gray-600"> + <time datetime="PT<?= $episode->enclosure_duration ?>S"> + <?= format_duration($episode->enclosure_duration) ?> + </time> + </div> + </a> + <audio controls preload="none" class="w-full mt-auto"> + <source + src="<?= $episode->enclosure_web_url ?>" + type="<?= $episode->enclosure_mimetype ?>"> + Your browser does not support the audio tag. + </audio> + </div> + </div> + <footer class="flex justify-around px-6 py-3"> + <span class="inline-flex items-center"><?= icon( + 'chat', + 'text-xl mr-1 text-gray-400', + ) . '0' ?></span> + <span class="inline-flex items-center"><?= icon( + 'repeat', + 'text-xl mr-1 text-gray-400', + ) . '0' ?></span> + <span class="inline-flex items-center"><?= icon( + 'heart', + 'text-xl mr-1 text-gray-400', + ) . '0' ?></span> + </footer> +</div> + +<?= form_fieldset('', ['class' => 'flex flex-col mb-4']) ?> + <legend class="text-lg font-semibold"><?= lang( + 'Episode.publish_form.publication_date', + ) ?></legend> + <label for="now" class="inline-flex items-center"> + <?= form_radio( + [ + 'id' => 'now', + 'name' => 'publication_method', + 'class' => 'text-pine-700', + ], + 'now', + old('publication_method') ? old('publish') === 'now' : true, + ) ?> + <span class="ml-2"><?= lang( + 'Episode.publish_form.publication_method.now', + ) ?></span> + </label> + <div class="inline-flex flex-wrap items-center mb-4 radio-toggler"> + <?= form_radio( + [ + 'id' => 'schedule', + 'name' => 'publication_method', + 'class' => 'text-pine-700', + ], + 'schedule', + old('publication_method') + ? old('publication_method') === 'schedule' + : false, + ) ?> + <label for="schedule" class="ml-2"><?= lang( + 'Episode.publish_form.publication_method.schedule', + ) ?></label> + <div class="w-full mt-2 radio-toggler-element"> + <?= form_label( + lang('Episode.publish_form.scheduled_publication_date'), + 'scheduled_publication_date', + [], + lang('Episode.publish_form.scheduled_publication_date_hint'), + ) ?> + <div class="flex mb-4" data-picker="datetime"> + <?= form_input([ + 'id' => 'scheduled_publication_date', + 'name' => 'scheduled_publication_date', + 'class' => 'form-input rounded-r-none flex-1', + 'value' => old('scheduled_publication_date', ''), + 'data-input' => '', + ]) ?> + <button + class="p-3 border border-l-0 border-gray-500 bg-pine-100 focus:outline-none rounded-r-md hover:bg-pine-200 focus:ring" + type="button" + title="<?= lang( + 'Episode.publish_form.scheduled_publication_date_clear', + ) ?>" + data-clear=""><?= icon('close') ?></button> + </div> + </div> + </div> +<?= form_fieldset_close() ?> + +<div class="self-end"> +<?= anchor( + route_to('episode-view', $podcast->id, $episode->id), + lang('Common.cancel'), + ['class' => 'font-semibold mr-4'], +) ?> + +<?= button( + lang('Episode.publish_form.submit'), + null, + ['variant' => 'primary'], + ['type' => 'submit'], +) ?> +</div> + +<?= form_close() ?> + +<?= $this->endSection() ?> diff --git a/app/Views/admin/episode/publish_edit.php b/app/Views/admin/episode/publish_edit.php new file mode 100644 index 0000000000000000000000000000000000000000..64246aef0d27497d87775c52fbdafb24082fba47 --- /dev/null +++ b/app/Views/admin/episode/publish_edit.php @@ -0,0 +1,186 @@ +<?= $this->extend('admin/_layout') ?> + +<?= $this->section('title') ?> +<?= lang('Episode.publish') ?> +<?= $this->endSection() ?> + +<?= $this->section('pageTitle') ?> +<?= lang('Episode.publish') ?> +<?= $this->endSection() ?> + + +<?= $this->section('content') ?> + +<?= form_open(route_to('episode-publish_edit', $podcast->id, $episode->id), [ + 'method' => 'post', + 'class' => 'flex flex-col max-w-xl items-start', +]) ?> +<?= csrf_field() ?> +<?= form_hidden('client_timezone', 'UTC') ?> +<?= form_hidden('note_id', $note->id) ?> + + +<label for="message" class="text-lg font-semibold"><?= lang( + 'Episode.publish_form.note', +) . hint_tooltip(lang('Episode.publish_form.note_hint'), 'ml-1') ?></label> +<div class="mb-8 overflow-hidden bg-white shadow-md rounded-xl"> + <div class="flex px-4 py-3"> + <img src="<?= $podcast->actor->avatar_image_url ?>" alt="<?= $podcast->actor + ->display_name ?>" class="w-12 h-12 mr-4 rounded-full"/> + <div class="flex flex-col min-w-0"> + <p class="flex items-baseline min-w-0"> + <span class="mr-2 font-semibold truncate"><?= $podcast->actor + ->display_name ?></span> + <span class="text-sm text-gray-500 truncate">@<?= $podcast + ->actor->username ?></span> + </p> + <time class="text-xs text-gray-500" itemprop="published" datetime="<?= $note->published_at->format( + DateTime::ATOM, + ) ?>" title="<?= $note->published_at ?>"><?= lang( + 'Common.mediumDate', + [$note->published_at], +) ?></time> + </div> + </div> + <div class="px-4 mb-2"> + <?= form_textarea( + [ + 'id' => 'message', + 'name' => 'message', + 'class' => 'form-textarea', + 'required' => 'required', + 'placeholder' => 'Write your message...', + ], + old('message', $note->message, false), + ['rows' => 2], + ) ?> + </div> + <div class="flex"> + <img src="<?= $episode->image + ->thumbnail_url ?>" alt="<?= $episode->title ?>" class="w-24 h-24" /> + <div class="flex flex-col flex-1"> + <a href="<?= $episode->link ?>" class="flex-1 px-4 py-2 bg-gray-100"> + <div class="flex items-baseline"> + <span class="flex-1 w-0 mr-2 text-sm font-semibold truncate"><?= $episode->title ?></span> + <?= episode_numbering( + $episode->number, + $episode->season_number, + 'text-xs font-semibold text-gray-600', + true, + ) ?> + </div> + <div class="text-xs text-gray-600"> + <time itemprop="published" datetime="<?= $episode->published_at->format( + DateTime::ATOM, + ) ?>" title="<?= $episode->published_at ?>"> + <?= lang('Common.mediumDate', [ + $episode->published_at, + ]) ?> + </time> + <span class="mx-1">•</span> + <time datetime="PT<?= $episode->enclosure_duration ?>S"> + <?= format_duration($episode->enclosure_duration) ?> + </time> + </div> + </a> + <audio controls preload="none" class="w-full mt-auto"> + <source src="<?= $episode->enclosure_web_url ?>" type="<?= $episode->enclosure_mimetype ?>"> + Your browser does not support the audio tag. + </audio> + </div> + </div> + <footer class="flex justify-around px-6 py-3"> + <span class="inline-flex items-center"><?= icon( + 'chat', + 'text-xl mr-1 text-gray-400', + ) . '0' ?></span> + <span class="inline-flex items-center"><?= icon( + 'repeat', + 'text-xl mr-1 text-gray-400', + ) . '0' ?></span> + <span class="inline-flex items-center"><?= icon( + 'heart', + 'text-xl mr-1 text-gray-400', + ) . '0' ?></span> + </footer> +</div> + +<?= form_fieldset('', ['class' => 'flex flex-col mb-4']) ?> +<legend class="text-lg font-semibold"><?= lang( + 'Episode.publish_form.publication_date', +) ?></legend> +<label for="now" class="inline-flex items-center"> + <?= form_radio( + [ + 'id' => 'now', + 'name' => 'publication_method', + 'class' => 'text-pine-700', + ], + 'now', + old('publication_method') ? old('publish') === 'now' : false, + ) ?> + <span class="ml-2"><?= lang( + 'Episode.publish_form.publication_method.now', + ) ?></span> +</label> +<div class="inline-flex flex-wrap items-center mb-4 radio-toggler"> + <?= form_radio( + [ + 'id' => 'schedule', + 'name' => 'publication_method', + 'class' => 'text-pine-700', + ], + 'schedule', + old('publication_method') + ? old('publication_method') === 'schedule' + : true, + ) ?> + <label for="schedule" class="ml-2"><?= lang( + 'Episode.publish_form.publication_method.schedule', + ) ?></label> + <div class="w-full mt-2 radio-toggler-element"> + <?= form_label( + lang('Episode.publish_form.scheduled_publication_date'), + 'scheduled_publication_date', + [], + lang('Episode.publish_form.scheduled_publication_date_hint'), + ) ?> + <div class="flex mb-4" data-picker="datetime"> + <?= form_input([ + 'id' => 'scheduled_publication_date', + 'name' => 'scheduled_publication_date', + 'class' => 'form-input rounded-r-none flex-1', + 'value' => old( + 'scheduled_publication_date', + $episode->published_at, + ), + 'data-input' => '', + ]) ?> + <button class="p-3 border border-l-0 border-gray-500 bg-pine-100 focus:outline-none rounded-r-md hover:bg-pine-200 focus:ring" type="button" aria-label="<?= lang( + 'Episode.publish_form.scheduled_publication_date_clear', + ) ?>" title="<?= lang( + 'Episode.publish_form.scheduled_publication_date_clear', +) ?>" data-clear=""><?= icon('close') ?></button> + </div> + </div> +</div> +<?= form_fieldset_close() ?> + +<div class="self-end"> + <?= anchor( + route_to('episode-view', $podcast->id, $episode->id), + lang('Common.cancel'), + ['class' => 'font-semibold mr-4'], + ) ?> + + <?= button( + lang('Episode.publish_form.submit_edit'), + null, + ['variant' => 'primary'], + ['type' => 'submit'], + ) ?> +</div> + +<?= form_close() ?> + +<?= $this->endSection() ?> diff --git a/app/Views/admin/episode/unpublish.php b/app/Views/admin/episode/unpublish.php new file mode 100644 index 0000000000000000000000000000000000000000..829808136ef276f1bfed0159b88153136fc4a8f5 --- /dev/null +++ b/app/Views/admin/episode/unpublish.php @@ -0,0 +1,53 @@ +<?= $this->extend('admin/_layout') ?> + +<?= $this->section('title') ?> +<?= lang('Episode.unpublish') ?> +<?= $this->endSection() ?> + +<?= $this->section('pageTitle') ?> +<?= lang('Episode.unpublish') ?> +<?= $this->endSection() ?> + +<?= $this->section('content') ?> + +<?= form_open(route_to('episode-unpublish', $podcast->id, $episode->id), [ + 'class' => 'flex flex-col max-w-xl mx-auto', +]) ?> + +<p class="flex max-w-xl p-2 mb-4 font-semibold text-red-900 bg-red-100 border border-red-300"><?= icon( + 'alert', + 'mr-4 text-2xl flex-shrink-0 text-red-500', +) . lang('Episode.unpublish_form.disclaimer') ?></p> + +<label for="understand" class="inline-flex items-center mb-4"> + <?= form_checkbox( + [ + 'id' => 'understand', + 'name' => 'understand', + 'class' => 'text-pine-700', + 'required' => 'required', + ], + 'yes', + old('understand', false), + ) ?> + <span class="ml-2"><?= lang('Episode.unpublish_form.understand') ?></span> +</label> + +<div class="self-end"> +<?= button( + lang('Common.cancel'), + route_to('episode-view', $podcast->id, $episode->id), +) ?> + +<?= button( + lang('Episode.unpublish_form.submit'), + null, + ['variant' => 'danger'], + ['type' => 'submit'], +) ?> +</div> + + +<?= form_close() ?> + +<?= $this->endSection() ?> diff --git a/app/Views/admin/episode/view.php b/app/Views/admin/episode/view.php index bc2dfd4641148173ef3a8146884949e4969c759a..cd90f1cc00aeeb0204cba4841b0131e357ab7f84 100644 --- a/app/Views/admin/episode/view.php +++ b/app/Views/admin/episode/view.php @@ -5,20 +5,30 @@ <?= $this->endSection() ?> <?= $this->section('pageTitle') ?> -<?= $episode->title . - publication_pill( - $episode->published_at, - $episode->publication_status, - 'text-sm ml-2 align-middle' - ) ?> - <?= location_link( - $episode->location_name, - $episode->location_geo, - $episode->location_osmid, - 'ml-2' - ) ?> +<?= $episode->title ?> +<?= $this->endSection() ?> + +<?= $this->section('headerLeft') ?> +<?= publication_pill( + $episode->published_at, + $episode->publication_status, + 'text-sm ml-2 align-middle', +) ?> <?= $this->endSection() ?> +<?= $this->section('headerRight') ?> +<?= publication_button( + $podcast->id, + $episode->id, + $episode->publication_status, + lang('Episode.publish'), + route_to('episode-publish', $podcast->id, $episode->id), + ['variant' => 'accent', 'iconLeft' => 'upload'], + ['class' => 'mr-2'], +) ?> +<?= $this->endSection() ?> + + <?= $this->section('content') ?> <div class="flex flex-wrap"> @@ -37,22 +47,28 @@ <?= button( lang('Episode.edit'), route_to('episode-edit', $podcast->id, $episode->id), - ['variant' => 'info', 'iconLeft' => 'edit'] + ['variant' => 'info', 'iconLeft' => 'edit'], ) ?> <?= button( lang('Episode.go_to_page'), route_to('episode', $podcast->name, $episode->slug), - ['variant' => 'secondary', 'iconLeft' => 'external-link'] + ['variant' => 'secondary', 'iconLeft' => 'external-link'], ) ?> <?= button( lang('Episode.delete'), route_to('episode-delete', $podcast->id, $episode->id), - ['variant' => 'danger', 'iconLeft' => 'delete-bin'] + ['variant' => 'danger', 'iconLeft' => 'delete-bin'], ) ?> </div> </div> <section class="w-full max-w-sm prose"> + <?= location_link( + $episode->location_name, + $episode->location_geo, + $episode->location_osmid, + 'text-sm', + ) ?> <?= $episode->description_html ?> </section> </div> @@ -62,19 +78,19 @@ lang('Episode.embeddable_player.add'), route_to('embeddable-player-add', $podcast->id, $episode->id), ['variant' => 'info', 'iconLeft' => 'movie'], - ['class' => 'mb-4'] + ['class' => 'mb-4'], ) ?> <?= button( lang('Episode.soundbites_form.title'), route_to('soundbites-edit', $podcast->id, $episode->id), ['variant' => 'info', 'iconLeft' => 'edit'], - ['class' => 'mb-4'] + ['class' => 'mb-4'], ) ?> <?= button( lang('Person.episode_form.title'), route_to('episode-person-manage', $podcast->id, $episode->id), ['variant' => 'info', 'iconLeft' => 'folder-user'], - ['class' => 'mb-4'] + ['class' => 'mb-4'], ) ?> <?php if (count($episode->soundbites) > 0): ?> <?= data_table( @@ -93,7 +109,7 @@ 'data-soundbite-start-time' => $soundbite->start_time, 'data-soundbite-duration' => $soundbite->duration, - ] + ], ); }, ], @@ -116,7 +132,7 @@ }, ], ], - $episode->soundbites + $episode->soundbites, ) ?> <?php endif; ?> </div> @@ -128,7 +144,7 @@ $podcast->id, 'PodcastByEpisode', 'ByDay', - $episode->id + $episode->id, ) ?>"></div> </div> @@ -139,7 +155,7 @@ $podcast->id, 'PodcastByEpisode', 'ByMonth', - $episode->id + $episode->id, ) ?>"></div> </div> diff --git a/app/Views/admin/fediverse/blocked_actors.php b/app/Views/admin/fediverse/blocked_actors.php new file mode 100644 index 0000000000000000000000000000000000000000..40505748e7430beff487fd015267a1f0c8e7ee5e --- /dev/null +++ b/app/Views/admin/fediverse/blocked_actors.php @@ -0,0 +1,83 @@ +<?= $this->extend('admin/_layout') ?> + +<?= $this->section('title') ?> +<?= lang('Fediverse.blocked_actors') ?> +<?= $this->endSection() ?> + +<?= $this->section('pageTitle') ?> +<?= lang('Fediverse.blocked_actors') ?> +<?= $this->endSection() ?> + + +<?= $this->section('content') ?> + +<?= form_open(route_to('fediverse-attempt-block-actor'), [ + 'method' => 'post', + 'class' => 'flex flex-col max-w-md mb-8', +]) ?> + +<?= form_label( + lang('Fediverse.block_lists_form.handle'), + 'blocked_users', + [], + lang('Fediverse.block_lists_form.handle_hint'), +) ?> +<?= form_input( + [ + 'id' => 'handle', + 'name' => 'handle', + 'class' => 'form-input mb-4', + 'type' => 'text', + ], + old('handle', ''), +) ?> + +<?= button( + lang('Fediverse.block_lists_form.submit'), + null, + ['variant' => 'primary'], + ['type' => 'submit', 'class' => 'self-end'], +) ?> + +<?= form_close() ?> + + +<?= data_table( + [ + [ + 'header' => lang('Fediverse.list.actor'), + 'cell' => function ($blockedActor) { + return $blockedActor->username; + }, + ], + [ + 'header' => lang('Common.actions'), + 'cell' => function ($blockedActor) { + return '<form action="' . + route_to('fediverse-attempt-unblock-actor') . + '" method="POST">' . + '<input name="actor_id" type="hidden" value="' . + $blockedActor->id . + '" />' . + csrf_field() . + button( + lang('Fediverse.list.unblock'), + route_to( + 'fediverse-unblock-actor', + $blockedActor->username, + ), + ['variant' => 'info', 'size' => 'small'], + [ + 'class' => 'mr-2', + 'type' => 'submit', + ], + ) . + '</form>'; + }, + ], + ], + $blockedActors, +) ?> + + +<?= $this->endSection() ?> diff --git a/app/Views/admin/fediverse/blocked_domains.php b/app/Views/admin/fediverse/blocked_domains.php new file mode 100644 index 0000000000000000000000000000000000000000..c6a440ddd21849a79260b8ac8b9442a2f0d3a59d --- /dev/null +++ b/app/Views/admin/fediverse/blocked_domains.php @@ -0,0 +1,80 @@ +<?= $this->extend('admin/_layout') ?> + +<?= $this->section('title') ?> +<?= lang('Fediverse.blocked_domains') ?> +<?= $this->endSection() ?> + +<?= $this->section('pageTitle') ?> +<?= lang('Fediverse.blocked_domains') ?> +<?= $this->endSection() ?> + + +<?= $this->section('content') ?> + +<?= form_open(route_to('fediverse-attempt-block-domain'), [ + 'method' => 'post', + 'class' => 'flex flex-col max-w-md mb-8', +]) ?> + +<?= form_label( + lang('Fediverse.block_lists_form.domain'), + 'blocked_users', + [], +) ?> +<?= form_input( + [ + 'id' => 'domain', + 'name' => 'domain', + 'class' => 'form-input mb-4', + 'type' => 'text', + ], + old('domain', ''), +) ?> + +<?= button( + lang('Fediverse.block_lists_form.submit'), + null, + ['variant' => 'primary'], + ['type' => 'submit', 'class' => 'self-end'], +) ?> + +<?= form_close() ?> + +<?= data_table( + [ + [ + 'header' => lang('Fediverse.list.actor'), + 'cell' => function ($blockedDomain) { + return $blockedDomain->name; + }, + ], + [ + 'header' => lang('Common.actions'), + 'cell' => function ($blockedDomain) { + return '<form action="' . + route_to('fediverse-attempt-unblock-domain') . + '" method="POST">' . + '<input name="domain" type="hidden" value="' . + $blockedDomain->name . + '" />' . + csrf_field() . + button( + lang('Fediverse.list.unblock'), + route_to( + 'fediverse-unblock-domain', + $blockedDomain->name, + ), + ['variant' => 'info', 'size' => 'small'], + [ + 'class' => 'mr-2', + 'type' => 'submit', + ], + ) . + '</form>'; + }, + ], + ], + $blockedDomains, +) ?> + +<?= $this->endSection() ?> diff --git a/app/Views/admin/page/list.php b/app/Views/admin/page/list.php index 1db15fd73b28de88bc563caade74b31c64e34512..745ddc5ef87c22336578b44557669d4dc12bd300 100644 --- a/app/Views/admin/page/list.php +++ b/app/Views/admin/page/list.php @@ -10,7 +10,7 @@ <?= $this->section('headerRight') ?> <?= button(lang('Page.create'), route_to('page-create'), [ - 'variant' => 'primary', + 'variant' => 'accent', 'iconLeft' => 'add', ]) ?> <?= $this->endSection() ?> diff --git a/app/Views/admin/page/view.php b/app/Views/admin/page/view.php index 7a64d6f13d1e346e43bfc9e80220478d1355469e..029b9587a428129285bb34ebba9d3f04af32e793 100644 --- a/app/Views/admin/page/view.php +++ b/app/Views/admin/page/view.php @@ -10,7 +10,7 @@ <?= $this->section('headerRight') ?> <?= button(lang('Page.edit'), route_to('page-edit', $page->id), [ - 'variant' => 'primary', + 'variant' => 'accent', 'iconLeft' => 'add', ]) ?> <?= $this->endSection() ?> diff --git a/app/Views/admin/podcast/_sidebar.php b/app/Views/admin/podcast/_sidebar.php index ffa8fe3c44370cd066448988ece8f2016eacc295..5cf21393078994ee76bd5696b85efb0168641fe5 100644 --- a/app/Views/admin/podcast/_sidebar.php +++ b/app/Views/admin/podcast/_sidebar.php @@ -29,7 +29,7 @@ $podcastNavigation = [ 'items' => ['contributor-list', 'contributor-add'], ], 'platforms' => [ - 'icon' => 'links', + 'icon' => 'link', 'items' => [ 'platforms-podcasting', 'platforms-social', @@ -39,11 +39,12 @@ $podcastNavigation = [ ]; ?> <a href="<?= route_to( - 'admin' + 'admin', ) ?>" class="inline-flex items-center px-4 py-2 border-b"> - <?= icon('arrow-left', 'mr-4') ?> - <?= svg('logo-castopod', 'h-8 mr-2') ?> - Castopod + <?= icon('arrow-left', 'mr-4 text-xl') ?> + <span class="inline-flex items-baseline text-2xl font-semibold font-display text-pine-700"> <?= 'castopod' . + svg('castopod-logo', 'h-5 ml-1') ?></span> + </a> <div class="flex items-center border-b"> <img @@ -54,11 +55,11 @@ $podcastNavigation = [ <div class="flex flex-col items-start flex-1 w-48 px-2"> <span class="w-40 text-sm font-semibold truncate" title="<?= $podcast->title ?>"><?= $podcast->title ?></span> <a href="<?= route_to( - 'podcast', - $podcast->name - ) ?>" class="inline-flex items-center text-xs underline outline-none hover:no-underline focus:shadow-outline" + 'podcast-activity', + $podcast->name, + ) ?>" class="inline-flex items-center text-xs underline outline-none hover:no-underline focus:ring" data-toggle="tooltip" data-placement="bottom" title="<?= lang( - 'PodcastNavigation.go_to_page' + 'PodcastNavigation.go_to_page', ) ?>">@<?= $podcast->name ?> <?= icon('external-link', 'ml-1 text-gray-500') ?> </a> @@ -67,22 +68,19 @@ $podcastNavigation = [ <nav class="flex flex-col flex-1 py-6 overflow-y-auto"> <?php foreach ($podcastNavigation as $section => $data): ?> <div class="mb-4"> - <button class="inline-flex items-center w-full px-6 py-1 outline-none focus:shadow-outline" type="button"> - <?= icon($data['icon'], 'text-gray-500') ?> - <span class="ml-2"><?= lang( - 'PodcastNavigation.' . $section - ) ?></span> + <button class="inline-flex items-center w-full px-6 py-1 outline-none focus:ring" type="button"> + <?= icon($data['icon'], 'text-gray-400 text-xl mr-3') . + lang('PodcastNavigation.' . $section) ?> </button> - <ul> + <ul class="flex flex-col"> <?php foreach ($data['items'] as $item): ?> - <?php $isActive = - base_url(route_to($item, $podcast->id)) == current_url(); ?> - <li> - <a class="block py-1 pl-12 pr-2 text-sm text-gray-600 outline-none hover:text-gray-900 focus:shadow-outline <?= $isActive + <?php $isActive = url_is(route_to($item, $podcast->id)); ?> + <li class="inline-flex"> + <a class="w-full py-1 pl-14 pr-2 text-sm text-gray-600 outline-none hover:text-gray-900 focus:ring <?= $isActive ? 'font-semibold text-gray-900' : '' ?>" href="<?= route_to( $item, - $podcast->id + $podcast->id, ) ?>"><?= lang('PodcastNavigation.' . $item) ?></a> </li> <?php endforeach; ?> @@ -90,21 +88,32 @@ $podcastNavigation = [ </div> <?php endforeach; ?> </nav> -<div class="w-full mt-auto border-t" data-toggle="dropdown"> - <button type="button" class="inline-flex items-center w-full px-6 py-2 outline-none focus:shadow-outline" id="my-accountDropdown" data-popper="button" aria-haspopup="true" aria-expanded="false"> + <button + type="button" + class="inline-flex items-center w-full px-6 py-2 mt-auto border-t outline-none focus:ring" + id="my-account-dropdown" + data-dropdown="button" + data-dropdown-target="my-account-dropdown-menu" + aria-haspopup="true" + aria-expanded="false"> <?= icon('user', 'text-gray-500 mr-2') ?> <?= user()->username ?> <?= icon('caret-right', 'ml-auto') ?> </button> - <nav class="absolute z-50 flex-col hidden py-2 text-black whitespace-no-wrap bg-white border rounded shadow" aria-labelledby="my-accountDropdown" data-popper="menu" data-popper-placement="right-end"> + <nav + id="my-account-dropdown-menu" + class="flex flex-col py-2 text-black whitespace-no-wrap bg-white border rounded shadow" + aria-labelledby="my-account-dropdown" + data-dropdown="menu" + data-dropdown-placement="right-end"> <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'my-account' + 'my-account', ) ?>"><?= lang('AdminNavigation.account.my-account') ?></a> <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'change-password' + 'change-password', ) ?>"><?= lang('AdminNavigation.account.change-password') ?></a> <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'logout' + 'logout', ) ?>"><?= lang('AdminNavigation.account.logout') ?></a> </nav> </div> diff --git a/app/Views/admin/podcast/edit.php b/app/Views/admin/podcast/edit.php index 749f995f083c5609d1484f25faa3b3088a1c4808..cd520c101017e8add0601501315e88d0e1b4ac9d 100644 --- a/app/Views/admin/podcast/edit.php +++ b/app/Views/admin/podcast/edit.php @@ -18,7 +18,7 @@ <?= form_section( lang('Podcast.form.identity_section_title'), - lang('Podcast.form.identity_section_subtitle') + lang('Podcast.form.identity_section_subtitle'), ) ?> <?= form_label(lang('Podcast.form.image'), 'image') ?> @@ -35,31 +35,18 @@ 'accept' => '.jpg,.jpeg,.png', ]) ?> <small class="mb-4 text-gray-600"><?= lang( - 'Common.forms.image_size_hint' + 'Common.forms.image_size_hint', ) ?></small> <?= form_label(lang('Podcast.form.title'), 'title') ?> <?= form_input([ 'id' => 'title', 'name' => 'title', - 'class' => 'form-input mb-4', + 'class' => 'form-input mb-1', 'value' => old('title', $podcast->title), 'required' => 'required', ]) ?> - -<?= form_label( - lang('Podcast.form.name'), - 'name', - [], - lang('Podcast.form.name_hint') -) ?> -<?= form_input([ - 'id' => 'name', - 'name' => 'name', - 'class' => 'form-input mb-4', - 'value' => old('name', $podcast->name), - 'required' => 'required', -]) ?> +<span class="mb-4 text-sm"><?= $podcast->link ?></span> <?= form_fieldset('', ['class' => 'mb-4']) ?> <legend><?= lang('Podcast.form.type.label') . @@ -68,13 +55,13 @@ <?= form_radio( ['id' => 'episodic', 'name' => 'type', 'class' => 'form-radio-btn'], 'episodic', - old('type') ? old('type') == 'episodic' : $podcast->type == 'episodic' + old('type') ? old('type') == 'episodic' : $podcast->type == 'episodic', ) ?> <label for="episodic"><?= lang('Podcast.form.type.episodic') ?></label> <?= form_radio( ['id' => 'serial', 'name' => 'type', 'class' => 'form-radio-btn'], 'serial', - old('type') ? old('type') == 'serial' : $podcast->type == 'serial' + old('type') ? old('type') == 'serial' : $podcast->type == 'serial', ) ?> <label for="serial"><?= lang('Podcast.form.type.serial') ?></label> <?= form_fieldset_close() ?> @@ -89,7 +76,7 @@ 'required' => 'required', ], old('description', $podcast->description_markdown, false), - 'data-editor="markdown"' + 'data-editor="markdown"', ) ?> </div> @@ -98,7 +85,7 @@ <?= form_section( lang('Podcast.form.classification_section_title'), - lang('Podcast.form.classification_section_subtitle') + lang('Podcast.form.classification_section_subtitle'), ) ?> <?= form_label(lang('Podcast.form.language'), 'language') ?> @@ -110,7 +97,7 @@ 'id' => 'language', 'class' => 'form-select mb-4', 'required' => 'required', - ] + ], ) ?> <?= form_label(lang('Podcast.form.category'), 'category') ?> @@ -122,7 +109,7 @@ 'id' => 'category', 'class' => 'form-select mb-4', 'required' => 'required', - ] + ], ) ?> <?= form_label( @@ -130,7 +117,7 @@ 'other_categories', [], '', - true + true, ) ?> <?= form_multiselect( 'other_categories[]', @@ -140,7 +127,7 @@ 'id' => 'other_categories', 'class' => 'mb-4', 'data-max-item-count' => '2', - ] + ], ) ?> <?= form_fieldset('', ['class' => 'mb-4']) ?> @@ -156,10 +143,10 @@ 'undefined', old('parental_advisory') ? old('parental_advisory') === 'undefined' - : $podcast->parental_advisory === null + : $podcast->parental_advisory === null, ) ?> <label for="undefined"><?= lang( - 'Podcast.form.parental_advisory.undefined' + 'Podcast.form.parental_advisory.undefined', ) ?></label> <?= form_radio( [ @@ -170,10 +157,10 @@ 'clean', old('parental_advisory') ? old('parental_advisory') === 'clean' - : $podcast->parental_advisory === 'clean' + : $podcast->parental_advisory === 'clean', ) ?> <label for="clean"><?= lang( - 'Podcast.form.parental_advisory.clean' + 'Podcast.form.parental_advisory.clean', ) ?></label> <?= form_radio( [ @@ -184,10 +171,10 @@ 'explicit', old('parental_advisory') ? old('parental_advisory') === 'explicit' - : $podcast->parental_advisory === 'explicit' + : $podcast->parental_advisory === 'explicit', ) ?> <label for="explicit"><?= lang( - 'Podcast.form.parental_advisory.explicit' + 'Podcast.form.parental_advisory.explicit', ) ?></label> <?= form_fieldset_close() ?> @@ -195,14 +182,14 @@ <?= form_section( lang('Podcast.form.author_section_title'), - lang('Podcast.form.author_section_subtitle') + lang('Podcast.form.author_section_subtitle'), ) ?> <?= form_label( lang('Podcast.form.owner_name'), 'owner_name', [], - lang('Podcast.form.owner_name_hint') + lang('Podcast.form.owner_name_hint'), ) ?> <?= form_input([ 'id' => 'owner_name', @@ -216,7 +203,7 @@ lang('Podcast.form.owner_email'), 'owner_email', [], - lang('Podcast.form.owner_email_hint') + lang('Podcast.form.owner_email_hint'), ) ?> <?= form_input([ 'id' => 'owner_email', @@ -232,7 +219,7 @@ 'publisher', [], lang('Podcast.form.publisher_hint'), - true + true, ) ?> <?= form_input([ 'id' => 'publisher', @@ -253,7 +240,7 @@ <?= form_section( lang('Podcast.form.location_section_title'), - lang('Podcast.form.location_section_subtitle') + lang('Podcast.form.location_section_subtitle'), ) ?> <?= form_label( @@ -261,7 +248,7 @@ 'location_name', [], lang('Podcast.form.location_name_hint'), - true + true, ) ?> <?= form_input([ 'id' => 'location_name', @@ -273,7 +260,7 @@ <?= form_section( lang('Podcast.form.monetization_section_title'), - lang('Podcast.form.monetization_section_subtitle') + lang('Podcast.form.monetization_section_subtitle'), ) ?> <?= form_label( @@ -281,7 +268,7 @@ 'payment_pointer', [], lang('Podcast.form.payment_pointer_hint'), - true + true, ) ?> <?= form_input([ 'id' => 'payment_pointer', @@ -298,7 +285,7 @@ 'partner_id', [], lang('Podcast.form.partner_id_hint'), - true + true, ) ?> <?= form_input([ 'id' => 'partner_id', @@ -313,7 +300,7 @@ 'partner_link_url', [], lang('Podcast.form.partner_link_url_hint'), - true + true, ) ?> <?= form_input([ 'id' => 'partner_link_url', @@ -328,7 +315,7 @@ 'partner_image_url', [], lang('Podcast.form.partner_image_url_hint'), - true + true, ) ?> <?= form_input([ 'id' => 'partner_image_url', @@ -342,14 +329,14 @@ <?= form_section( lang('Podcast.form.advanced_section_title'), - lang('Podcast.form.advanced_section_subtitle') + lang('Podcast.form.advanced_section_subtitle'), ) ?> <?= form_label( lang('Podcast.form.custom_rss'), 'custom_rss', [], lang('Podcast.form.custom_rss_hint'), - true + true, ) ?> <?= form_textarea([ 'id' => 'custom_rss', @@ -361,7 +348,7 @@ <?= form_section( lang('Podcast.form.status_section_title'), - lang('Podcast.form.status_section_subtitle') + lang('Podcast.form.status_section_subtitle'), ) ?> <?= form_switch( @@ -369,7 +356,7 @@ ['id' => 'block', 'name' => 'block'], 'yes', old('block', $podcast->is_blocked), - 'mb-2' + 'mb-2', ) ?> <?= form_switch( @@ -377,7 +364,7 @@ ['id' => 'complete', 'name' => 'complete'], 'yes', old('complete', $podcast->is_completed), - 'mb-2' + 'mb-2', ) ?> <?= form_switch( @@ -385,7 +372,7 @@ hint_tooltip(lang('Podcast.form.lock_hint'), 'ml-1'), ['id' => 'lock', 'name' => 'lock'], 'yes', - old('lock', $podcast->is_locked) + old('lock', $podcast->is_locked), ) ?> <?= form_section_close() ?> @@ -394,7 +381,7 @@ lang('Podcast.form.submit_edit'), null, ['variant' => 'primary'], - ['type' => 'submit', 'class' => 'self-end'] + ['type' => 'submit', 'class' => 'self-end'], ) ?> <?= form_close() ?> diff --git a/app/Views/admin/podcast/import.php b/app/Views/admin/podcast/import.php index e6f484c8495a21d0547176031a94142e6a6ec7bf..7bffc4a6cbf170abd9e149f7bd98f1f069340aa7 100644 --- a/app/Views/admin/podcast/import.php +++ b/app/Views/admin/podcast/import.php @@ -22,14 +22,14 @@ icon('scales', 'mr-2 text-lg flex-shrink-0') . lang('PodcastImport.old_podcast_section_subtitle'), [], - 'inline-flex text-xs p-2 text-teal-800 font-semibold bg-teal-100 border border-teal-300 rounded' + 'inline-flex text-xs p-2 text-blue-800 font-semibold bg-blue-100 border border-blue-300 rounded', ) ?> <?= form_label( lang('PodcastImport.imported_feed_url'), 'imported_feed_url', [], - lang('PodcastImport.imported_feed_url_hint') + lang('PodcastImport.imported_feed_url_hint'), ) ?> <?= form_input([ 'id' => 'imported_feed_url', @@ -50,7 +50,7 @@ lang('PodcastImport.name'), 'name', [], - lang('PodcastImport.name_hint') + lang('PodcastImport.name_hint'), ) ?> <?= form_input([ 'id' => 'name', @@ -79,7 +79,7 @@ <?= form_section( lang('PodcastImport.advanced_params_section_title'), - lang('PodcastImport.advanced_params_section_subtitle') + lang('PodcastImport.advanced_params_section_subtitle'), ) ?> <?= form_fieldset('', ['class' => 'flex flex-col mb-4']) ?> @@ -89,10 +89,10 @@ [ 'id' => 'link', 'name' => 'slug_field', - 'class' => 'form-radio text-green-500', + 'class' => 'form-radio text-pine-700', ], 'link', - old('slug_field') ? old('slug_field') == 'link' : true + old('slug_field') ? old('slug_field') == 'link' : true, ) ?> <span class="ml-2"><?= lang('PodcastImport.slug_field.link') ?></span> </label> @@ -101,10 +101,10 @@ [ 'id' => 'title', 'name' => 'slug_field', - 'class' => 'form-radio text-green-500', + 'class' => 'form-radio text-pine-700', ], 'title', - old('slug_field') ? old('slug_field') == 'title' : false + old('slug_field') ? old('slug_field') == 'title' : false, ) ?> <span class="ml-2"><?= lang('PodcastImport.slug_field.title') ?></span> </label> @@ -117,12 +117,12 @@ [ 'id' => 'description', 'name' => 'description_field', - 'class' => 'form-radio text-green-500', + 'class' => 'form-radio text-pine-700', ], 'description', old('description_field') ? old('description_field') == 'description' - : true + : true, ) ?> <span class="ml-2"><description></span> </label> @@ -131,12 +131,12 @@ [ 'id' => 'summary', 'name' => 'description_field', - 'class' => 'form-radio text-green-500', + 'class' => 'form-radio text-pine-600', ], 'summary', old('description_field') ? old('description_field') == 'summary' - : false + : false, ) ?> <span class="ml-2"><itunes:summary></span> </label> @@ -145,12 +145,12 @@ [ 'id' => 'subtitle_summary', 'name' => 'description_field', - 'class' => 'form-radio text-green-500', + 'class' => 'form-radio text-pine-700', ], 'subtitle_summary', old('description_field') ? old('description_field') == 'subtitle_summary' - : false + : false, ) ?> <span class="ml-2"><itunes:subtitle> + <itunes:summary></span> </label> @@ -159,12 +159,12 @@ [ 'id' => 'content', 'name' => 'description_field', - 'class' => 'form-radio text-green-500', + 'class' => 'form-radio text-pine-700', ], 'content', old('description_field') ? old('description_field') == 'content' - : false + : false, ) ?> <span class="ml-2"><content:encoded></span> </label> @@ -176,10 +176,10 @@ [ 'id' => 'force_renumber', 'name' => 'force_renumber', - 'class' => 'form-checkbox text-green-500', + 'class' => 'form-checkbox text-pine-700', ], 'yes', - old('force_renumber', false) + old('force_renumber', false), ) ?> <span class="ml-2"><?= lang('PodcastImport.force_renumber') ?></span> <?= hint_tooltip(lang('PodcastImport.force_renumber_hint'), 'ml-1') ?> @@ -189,7 +189,7 @@ lang('PodcastImport.season_number'), 'season_number', [], - lang('PodcastImport.season_number_hint') + lang('PodcastImport.season_number_hint'), ) ?> <?= form_input([ 'id' => 'season_number', @@ -203,7 +203,7 @@ lang('PodcastImport.max_episodes'), 'max_episodes', [], - lang('PodcastImport.max_episodes_hint') + lang('PodcastImport.max_episodes_hint'), ) ?> <?= form_input([ 'id' => 'max_episodes', @@ -215,7 +215,7 @@ <?= form_section_close() ?> -<div class="inline-flex w-full p-2 mb-4 text-sm font-semibold text-yellow-800 bg-orange-100 border border-orange-300 rounded" role="alert"> +<div class="inline-flex w-full p-2 mb-4 text-sm font-semibold text-yellow-800 bg-red-100 border border-red-300 rounded" role="alert"> <?= icon('alert', 'mr-2 text-lg flex-shrink-0') . lang('PodcastImport.warning') ?> </div> @@ -224,7 +224,7 @@ lang('PodcastImport.submit'), null, ['variant' => 'primary'], - ['type' => 'submit', 'class' => 'self-end'] + ['type' => 'submit', 'class' => 'self-end'], ) ?> <?= form_close() ?> diff --git a/app/Views/admin/podcast/latest_episodes.php b/app/Views/admin/podcast/latest_episodes.php index 71ec4389ba174c73e91791158a0b7944f5ec28d1..4bf5ac7df4c1454a80bf7e830cd60d023417b74f 100644 --- a/app/Views/admin/podcast/latest_episodes.php +++ b/app/Views/admin/podcast/latest_episodes.php @@ -3,42 +3,42 @@ <h1 class="text-xl"><?= lang('Podcast.latest_episodes') ?></h1> <a href="<?= route_to( 'episode-list', - $podcast->id + $podcast->id, ) ?>" class="inline-flex items-center text-sm underline hover:no-underline"> <?= lang('Podcast.see_all_episodes') ?> <?= icon('chevron-right', 'ml-2') ?> </a> </header> <?php if ($episodes): ?> - <div class="flex p-2 space-x-4 overflow-x-auto"> + <div class="flex justify-between p-2 space-x-4 overflow-x-auto"> <?php foreach ($episodes as $episode): ?> - <article class="flex flex-col w-56 bg-white border rounded shadow" style="min-width: 12rem;"> + <article class="flex flex-col flex-shrink-0 w-56 overflow-hidden bg-white border shadow rounded-xl"> <img src="<?= $episode->image->thumbnail_url ?>" alt="<?= $episode->title ?>" class="object-cover" /> - <div class="flex justify-between p-2"> - <div class="flex flex-col"> + <div class="flex items-start justify-between p-2"> + <div class="flex flex-col min-w-0"> <a href="<?= route_to( 'episode-view', $podcast->id, - $episode->id + $episode->id, ) ?>" - class="text-sm font-semibold hover:underline" + class="text-sm font-semibold truncate hover:underline" ><?= $episode->title ?> </a> <div class="text-xs"> <?= episode_numbering( $episode->number, $episode->season_number, - 'font-bold text-gray-600', - true + 'font-semibold text-gray-600', + true, ) ?> <?php if ($episode->published_at): ?> <span class="mx-1">•</span> <time pubdate datetime="<?= $episode->published_at->format( - DateTime::ATOM + DateTime::ATOM, ) ?>" title="<?= $episode->published_at ?>"> <?= lang('Common.mediumDate', [ @@ -48,45 +48,51 @@ <?php endif; ?> </div> </div> - <div class="relative" data-toggle="dropdown"> - <button type="button" class="inline-flex items-center p-1 outline-none focus:shadow-outline" id="moreDropdown" data-popper="button" aria-haspopup="true" aria-expanded="false"> - <?= icon('more') ?> - </button> - <nav class="absolute z-10 flex-col hidden py-2 text-black whitespace-no-wrap bg-white border rounded shadow" aria-labelledby="moreDropdown" data-popper="menu" data-popper-placement="top-end" data-popper-offset-x="0" data-popper-offset-y="-24" > - <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'episode-edit', - $podcast->id, - $episode->id - ) ?>"><?= lang('Episode.edit') ?></a> - <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'embeddable-player-add', - $podcast->id, - $episode->id - ) ?>"><?= lang( - 'Episode.embeddable_player.add' + <button + type="button" + class="inline-flex items-center p-1 outline-none focus:ring" + id="more-dropdown-<?= $episode->id ?>" + data-dropdown="button" + data-dropdown-target="more-dropdown-<?= $episode->id ?>-menu" + aria-label="<?= lang('Common.more') ?>" + aria-haspopup="true" + aria-expanded="false" + ><?= icon('more') ?></button> + <nav + id="more-dropdown-<?= $episode->id ?>-menu" + class="z-50 flex flex-col py-2 text-black whitespace-no-wrap bg-white border rounded shadow" + aria-labelledby="more-dropdown-<?= $episode->id ?>" + data-dropdown="menu" + data-dropdown-placement="bottom"> + <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( + 'episode-edit', + $podcast->id, + $episode->id, + ) ?>"><?= lang('Episode.edit') ?></a> + <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( + 'embeddable-player-add', + $podcast->id, + $episode->id, + ) ?>"><?= lang( + 'Episode.embeddable_player.add', ) ?></a> - <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'episode-person-manage', - $podcast->id, - $episode->id - ) ?>"><?= lang('Person.persons') ?></a> - <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'soundbites-edit', - $podcast->id, - $episode->id - ) ?>"><?= lang('Episode.soundbites') ?></a> - <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'episode', - $podcast->name, - $episode->slug - ) ?>"><?= lang('Episode.go_to_page') ?></a> - <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( - 'episode-delete', - $podcast->id, - $episode->id - ) ?>"><?= lang('Episode.delete') ?></a> - </nav> - </div> + <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( + 'episode-person-manage', + $podcast->id, + $episode->id, + ) ?>"><?= lang('Person.persons') ?></a> + <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to( + 'episode', + $podcast->name, + $episode->slug, + ) ?>"><?= lang('Episode.go_to_page') ?></a> + <hr class="my-2 border border-gray-100"> + <a class="px-4 py-1 font-semibold text-red-600 hover:bg-gray-100" href="<?= route_to( + 'episode-delete', + $podcast->id, + $episode->id, + ) ?>"><?= lang('Episode.delete') ?></a> + </nav> </div> </article> <?php endforeach; ?> diff --git a/app/Views/admin/podcast/list.php b/app/Views/admin/podcast/list.php index 28aa7ef6259c09576fb3cd548548cb448da357b7..5a22b06e5c90b8e9c23ead14cc36656b80079c46 100644 --- a/app/Views/admin/podcast/list.php +++ b/app/Views/admin/podcast/list.php @@ -12,8 +12,8 @@ <?= button( lang('Podcast.create'), route_to('podcast-create'), - ['variant' => 'primary', 'iconLeft' => 'add'], - ['class' => 'mr-2'] + ['variant' => 'accent', 'iconLeft' => 'add'], + ['class' => 'mr-2'], ) ?> <?= button(lang('Podcast.import'), route_to('podcast-import'), [ 'variant' => 'primary', @@ -24,35 +24,33 @@ <?= $this->section('content') ?> -<div class="flex flex-wrap"> +<div class="grid gap-4 grid-cols-podcasts"> <?php if (!empty($podcasts)): ?> <?php foreach ($podcasts as $podcast): ?> - <article class="w-48 h-full mb-4 mr-4 overflow-hidden bg-white border rounded shadow"> + <article class="h-full overflow-hidden bg-white border shadow rounded-xl"> <img alt="<?= $podcast->title ?>" src="<?= $podcast->image - ->thumbnail_url ?>" class="object-cover w-full h-40" /> - <div class="p-2"> - <a href="<?= route_to( - 'podcast-view', - $podcast->id - ) ?>" class="hover:underline"> - <h2 class="font-semibold"><?= $podcast->title ?></h2> - </a> + ->medium_url ?>" class="object-cover w-full h-48" /> + <a href="<?= route_to( + 'podcast-view', + $podcast->id, + ) ?>" class="flex flex-col p-2 hover:underline"> + <h2 class="font-semibold truncate"><?= $podcast->title ?></h2> <p class="text-gray-600">@<?= $podcast->name ?></p> - </div> + </a> <footer class="flex items-center justify-end p-2"> - <a class="inline-flex p-2 mr-2 text-teal-700 bg-teal-100 rounded-full shadow-xs hover:bg-teal-200" href="<?= route_to( + <a class="inline-flex p-2 mr-2 text-blue-700 bg-blue-100 rounded-full shadow-xs hover:bg-blue-200" href="<?= route_to( 'podcast-edit', - $podcast->id + $podcast->id, ) ?>" data-toggle="tooltip" data-placement="bottom" title="<?= lang( - 'Podcast.edit' + 'Podcast.edit', ) ?>"><?= icon('edit') ?></a> <a class="inline-flex p-2 text-gray-700 bg-gray-100 rounded-full shadow-xs hover:bg-gray-200" href="<?= route_to( 'podcast-view', - $podcast->id + $podcast->id, ) ?>" data-toggle="tooltip" data-placement="bottom" title="<?= lang( - 'Podcast.view' + 'Podcast.view', ) ?>"><?= icon('eye') ?></a> </footer> </article> diff --git a/app/Views/admin/podcast/platforms.php b/app/Views/admin/podcast/platforms.php index 88365ad8bd4203a3463da18271c37e626ba5be2c..b41f8d5114d8e42295a0a7102262f8e6d8281d2d 100644 --- a/app/Views/admin/podcast/platforms.php +++ b/app/Views/admin/podcast/platforms.php @@ -18,13 +18,12 @@ <?php foreach ($platforms as $platform): ?> <div class="relative flex items-start mb-8"> - <div class="flex flex-col w-12 mr-4"> + <div class="flex flex-col items-center w-12 mr-4"> <?= anchor( $platform->submit_url, - platform_icon( - $platform->type, - $platform->slug, - $platform->type == 'social' ? 'text-gray-800' : null + icon( + $platform->type . '/' . $platform->slug, + 'text-gray-600 text-4xl', ), [ 'class' => 'mb-1 text-gray-600 hover:text-gray-900', @@ -35,7 +34,7 @@ 'title' => lang('Platforms.submit_url', [ 'platformName' => $platform->label, ]), - ] + ], ) ?> <div class="inline-flex bg-gray-200"> <?= anchor($platform->home_url, icon('external-link', 'mx-auto'), [ @@ -49,7 +48,7 @@ ]), ]) ?> <?= $platform->submit_url - ? anchor($platform->submit_url, icon('add-box', 'mx-auto'), [ + ? anchor($platform->submit_url, icon('add', 'mx-auto'), [ 'class' => 'flex-1 text-gray-600 hover:text-gray-900', 'target' => '_blank', 'rel' => 'noopener noreferrer', @@ -68,7 +67,7 @@ route_to( 'podcast-platform-remove', $podcast->id, - $platform->slug + $platform->slug, ), icon('delete-bin', 'mx-auto'), [ @@ -79,7 +78,7 @@ 'title' => lang('Platforms.remove', [ 'platformName' => $platform->label, ]), - ] + ], ) : '' ?> <?= form_label($platform->label, $platform->slug, [ @@ -99,7 +98,7 @@ 'class' => 'form-input mb-1 w-full', 'value' => old( $platform->slug . '_link_content', - $platform->link_content + $platform->link_content, ), 'type' => 'text', 'placeholder' => lang("Platforms.description.{$platform->type}"), @@ -113,9 +112,9 @@ 'yes', old( $platform->slug . '_visible', - $platform->is_visible ? $platform->is_visible : false + $platform->is_visible ? $platform->is_visible : false, ), - 'text-sm mb-1' + 'text-sm mb-1', ) ?> <?= form_switch( lang('Platforms.on_embeddable_player'), @@ -129,9 +128,9 @@ $platform->slug . '_on_embeddable_player', $platform->is_on_embeddable_player ? $platform->is_on_embeddable_player - : false + : false, ), - 'text-sm' + 'text-sm', ) ?> </div> </div> @@ -142,7 +141,7 @@ lang('Platforms.submit'), null, ['variant' => 'primary'], - ['type' => 'submit', 'class' => 'self-end'] + ['type' => 'submit', 'class' => 'self-end'], ) ?> <?= form_close() ?> diff --git a/app/Views/admin/podcast/view.php b/app/Views/admin/podcast/view.php index c21870e4be75817f3a3357d1bad5533d18dd5b7e..cc7d48652ba4266d3be53133031b2d677b356c32 100644 --- a/app/Views/admin/podcast/view.php +++ b/app/Views/admin/podcast/view.php @@ -6,11 +6,14 @@ <?= $this->section('pageTitle') ?> <?= $podcast->title ?> +<?= $this->endSection() ?> + +<?= $this->section('headerLeft') ?> <?= location_link( $podcast->location_name, $podcast->location_geo, $podcast->location_osmid, - 'ml-4' + 'ml-4 text-sm', ) ?> <?= $this->endSection() ?> @@ -18,11 +21,11 @@ <?= button( lang('Podcast.edit'), route_to('podcast-edit', $podcast->id), - ['variant' => 'secondary', 'iconLeft' => 'edit'], - ['class' => 'mr-2'] + ['variant' => 'primary', 'iconLeft' => 'edit'], + ['class' => 'mr-2'], ) ?> <?= button(lang('Episode.create'), route_to('episode-create', $podcast->id), [ - 'variant' => 'primary', + 'variant' => 'accent', 'iconLeft' => 'add', ]) ?> <?= $this->endSection() ?> diff --git a/app/Views/admin/user/list.php b/app/Views/admin/user/list.php index 9f409dc126e03f5786bee55f02ae42c2931c866e..ebaed87d7464405445d9566b0eff30d5779e82a5 100644 --- a/app/Views/admin/user/list.php +++ b/app/Views/admin/user/list.php @@ -10,7 +10,7 @@ <?= $this->section('headerRight') ?> <?= button(lang('User.create'), route_to('user-create'), [ - 'variant' => 'primary', + 'variant' => 'accent', 'iconLeft' => 'user-add', ]) ?> <?= $this->endSection() ?> diff --git a/app/Views/auth/_layout.php b/app/Views/auth/_layout.php index 04fa70884454bfa84edaaba61c4ccdb9ef23a4e7..4af7f3b70be17d4a2b2459c54d89a5a0630ef337 100644 --- a/app/Views/auth/_layout.php +++ b/app/Views/auth/_layout.php @@ -13,12 +13,16 @@ <body class="flex flex-col items-center justify-center min-h-screen mx-auto bg-gray-100"> <header class="mb-4"> - <a href="<?= route_to('home') ?>" class="inline-flex items-center"> - <?= svg('logo-castopod', 'h-10 mr-2') ?><span class="text-xl">Castopod</span> + <a href="<?= route_to( + 'home', + ) ?>" class="inline-flex items-baseline text-4xl font-bold font-display text-pine-700"> + <?= 'castopod' . svg('castopod-logo', 'h-8 ml-2') ?> </a> </header> <main class="w-full max-w-md px-6 py-4 mx-auto bg-white rounded-lg shadow"> - <h1 class="mb-2 text-2xl text-center"><?= $this->renderSection('title') ?></h1> + <h1 class="mb-6 text-2xl font-bold text-center font-display"><?= $this->renderSection( + 'title', + ) ?></h1> <?= view('_message_block') ?> <?= $this->renderSection('content') ?> </main> diff --git a/app/Views/credits.php b/app/Views/credits.php index 97152c0be232e6249c51b111b9aa2a59c0176302..f85ddb070bac6793cab1fdc8605e107be52ef8d2 100644 --- a/app/Views/credits.php +++ b/app/Views/credits.php @@ -8,42 +8,44 @@ <div class="grid w-full grid-cols-1 gap-4 md:grid-cols-2"> <?php foreach ($credits as $groupSlug => $groups): ?> - <?php if ( - $groupSlug - ): ?><div class="col-span-1 mt-12 mb-2 text-xl font-bold text-gray-500 md:text-2xl md:col-span-2 "><?= $groups[ - 'group_label' -] ?></div><?php endif; ?> + <?php if ($groupSlug): ?> + <div class="col-span-1 mt-12 mb-2 text-xl font-semibold text-gray-500 md:text-2xl md:col-span-2 "><?= $groups[ + 'group_label' + ] ?></div> + <?php endif; ?> <?php foreach ($groups['persons'] as $personId => $persons): ?> <div class="flex mt-2 mb-2"> - <img src="<?= $persons['thumbnail_url'] ?>" alt="<?= $persons[ - 'full_name' -] ?>" class="object-cover w-16 h-16 border-4 rounded-full md:h-24 md:w-24 border-gray" /> - <div class="flex flex-col ml-3 mr-4"><span class="text-lg font-bold text-gray-700 md:text-xl"><?= $persons[ - 'full_name' - ] ?></span> - <?php if ( - !empty($persons['information_url']) - ): ?><a href="<?= $persons[ - 'information_url' -] ?>" class="text-sm text-blue-800 hover:underline" target="_blank" rel="noreferrer noopener"><?= $persons[ - 'information_url' -] ?></a><?php endif; ?></div> + <img + src="<?= $persons['thumbnail_url'] ?>" + alt="<?= $persons['full_name'] ?>" + class="object-cover w-16 h-16 border-4 rounded-full md:h-24 md:w-24 border-gray" /> + <div class="flex flex-col ml-3 mr-4"> + <span class="text-lg font-semibold text-gray-700 md:text-xl"> + <?= $persons['full_name'] ?> + </span> + <?php if (!empty($persons['information_url'])): ?> + <a href="<?= $persons['information_url'] ?>" + class="text-sm text-blue-800 hover:underline" target="_blank" rel="noreferrer noopener"><?= $persons[ + 'information_url' + ] ?></a> + <?php endif; ?> + </div> </div> <div class="flex flex-col"> <?php foreach ($persons['roles'] as $role_slug => $role_array): ?> <?= $role_array['role_label'] ?> <?php foreach ($role_array['is_in'] as $isIn): ?> - <a href="<?= $isIn[ - 'link' - ] ?>" class="text-sm text-gray-500 hover:underline"><?= $isIn[ - 'title' -] ?></a> + <a + href="<?= $isIn['link'] ?>" + class="text-sm text-gray-500 hover:underline"><?= $isIn[ + 'title' + ] ?></a> <?php endforeach; ?> - <?php endforeach; ?> </div> <?php endforeach; ?> <?php endforeach; ?> </div> + <?php $this->endSection(); ?> diff --git a/app/Views/embeddable_player.php b/app/Views/embeddable_player.php index a20367325969bed877b8961db872259b8231414a..b9d9365a370e22548a36b5e9867b717f85760895 100644 --- a/app/Views/embeddable_player.php +++ b/app/Views/embeddable_player.php @@ -1,214 +1,63 @@ <!DOCTYPE html> <html lang="<?= service('request')->getLocale() ?>"> + <head> <meta charset="UTF-8" /> <title><?= $episode->title ?></title> - <meta name="description" - content="<?= htmlspecialchars($episode->description) ?>"/> + <meta name="description" content="<?= htmlspecialchars( + $episode->description, + ) ?>" /> <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" /> <link rel="stylesheet" href="/assets/index.css" /> <link rel="canonical" href="<?= $episode->link ?>" /> </head> -<body> - <div class="flex w-full p-1 md:p-2"style="background: <?= $theme[ - 'background' - ] ?>; color: <?= $theme['text'] ?>;"> - <img src="<?= $episode->image - ->medium_url ?>" alt="<?= $episode->title ?>" class="w-32 h-32 md:w-64 md:h-64" /> - <div class="flex-grow pl-4"> - <div class="flex"> - <a href="<?= route_to('podcast', $podcast->name) ?>" - style="color: <?= $theme['text'] ?>;" - class="flex flex-col text-base leading-tight opacity-50 md:text-lg hover:opacity-100" target="_blank"> - <?= $podcast->title ?> - </a> - <address class="ml-2 text-xs opacity-50 md:text-sm"> - <?= lang('Podcast.by', [ - 'publisher' => $podcast->publisher, - ]) ?></address> - </div> - <div class="flex mt-1 space-x-2 md:space-x-4 md:mt-3 md:top-0 md:mr-4 md:right-0 md:absolute "> - <?php if ($podcast->has_social_platforms): ?> - <div class="flex space-x-1"> - <?php foreach ( - $podcast->social_platforms - as $socialPlatform - ): ?> - <?php if ( - $socialPlatform->is_on_embeddable_player - ): ?> - <?= anchor( - $socialPlatform->link_url, - platform_icon( - $socialPlatform->type, - $socialPlatform->slug, - 'h-4 md:h-6' - ), - [ - 'target' => '_blank', - 'rel' => 'noopener noreferrer', - 'title' => $socialPlatform->label, - 'class' => - 'opacity-50 hover:opacity-100', - ] - ) ?> - <?php endif; ?> - <?php endforeach; ?> - </div> - <?php endif; ?> - <?php if ($podcast->has_funding_platforms): ?> - <div class="flex space-x-1"> - <?php foreach ( - $podcast->funding_platforms - as $fundingPlatform - ): ?> - <?php if ( - $fundingPlatform->is_on_embeddable_player - ): ?> - <?= anchor( - $fundingPlatform->link_url, - platform_icon( - $fundingPlatform->type, - $fundingPlatform->slug, - 'h-4 md:h-6' - ), - [ - 'target' => '_blank', - 'rel' => 'noopener noreferrer', - 'title' => $fundingPlatform->label, - 'class' => - 'opacity-50 hover:opacity-100', - ] - ) ?> - <?php endif; ?> - <?php endforeach; ?> - </div> - <?php endif; ?> - <div class="flex space-x-1"> - <?php foreach ( - $podcast->podcasting_platforms - as $podcastingPlatform - ): ?> - <?php if ($podcastingPlatform->is_on_embeddable_player): ?> - <?= anchor( - $podcastingPlatform->link_url, - platform_icon( - $podcastingPlatform->type, - $podcastingPlatform->slug, - 'h-4 md:h-6' - ), - [ - 'target' => '_blank', - 'rel' => 'noopener noreferrer', - 'title' => $podcastingPlatform->label, - 'class' => 'opacity-50 hover:opacity-100', - ] - ) ?> - <?php endif; ?> - <?php endforeach; ?> - <?= anchor( - route_to('podcast_feed', $podcast->name), - icon('rss', 'mr-2') . lang('Podcast.feed'), - [ - 'target' => '_blank', - 'class' => - 'text-white h-4 md:h-6 md:text-sm text-xs bg-gradient-to-r from-orange-400 to-red-500 hover:to-orange-500 hover:bg-orange-500 inline-flex items-center px-2 py-1 font-semibold rounded-md md:rounded-lg shadow-md hover:bg-orange-600', - ] - ) ?> - </div> - </div> - <h1 class="mt-2 text-xl font-semibold opacity-100 md:text-3xl hover:opacity-75"> - <a href="<?= $episode->link ?>" - style="color: <?= $theme['text'] ?>;" - target="_blank"> - <?= $episode->title ?> - </a> - </h1> - <div class="flex w-full"> - <div - style="color: <?= $theme['text'] ?>;" - class="text-sm opacity-50 md:text-base"> - <?= episode_numbering( - $episode->number, - $episode->season_number - ) ?> - <div> - <time - pubdate - datetime="<?= $episode->published_at->format( - DateTime::ATOM - ) ?>" - title="<?= $episode->published_at ?>"> - <?= lang('Common.mediumDate', [ - $episode->published_at, - ]) ?> - </time> - <span>•</span> - <time datetime="PT<?= $episode->enclosure_duration ?>S"> - <?= format_duration($episode->enclosure_duration) ?> - </time> - </div> - </div> - <?php if ($episode->location_name): ?> - <a href="<?= location_url( - $episode->location_name, - $episode->location_geo, - $episode->location_osmid - ) ?>" - style="color: <?= $theme['inverted'] ?>; background: <?= $theme[ +<body class="flex w-full h-screen" style="background: <?= $theme[ + 'background' +] ?>; color: <?= $theme['text'] ?>;"> + <img src="<?= $episode->image + ->medium_url ?>" alt="<?= $episode->title ?>" class="flex-shrink h-full" /> + <div class="flex flex-col flex-1 min-w-0 p-4"> + <div class="flex items-center"> + <a href="<?= route_to( + 'podcast', + $podcast->name, + ) ?>" style="color: <?= $theme[ 'text' -] ?>;" class="inline-flex items-center px-3 py-1 mt-1 ml-4 text-xs align-middle rounded-full shadow-xs outline-none opacity-50 md:mt-2 md:text-sm hover:opacity-75 focus:shadow-outline" target="_blank" rel="noreferrer noopener"><?= icon( - 'map-pin' -) ?> - <?= $episode->location_name ?> - </a> - <?php endif; ?> - </div> - - <?php if (!empty($persons)): ?> - <div class="flex my-2 space-x-1 md:my-4 md:space-x-2"> - <?php foreach ($persons as $person): ?> - <?php if (!empty($person['information_url'])): ?> - <a href="<?= $person['information_url'] ?>" - class="hover:opacity-50" - target="_blank" - rel="noreferrer noopener"> - <?php endif; ?> - <img src="<?= $person['thumbnail_url'] ?>" - alt="<?= $person['full_name'] ?>" - title="[<?= $person[ - 'full_name' - ] ?>] <?= $person['roles'] ?>" - class="object-cover h-8 rounded-full md:h-12 md:w-12" /> - <?php if (!empty($person['information_url'])): ?> - </a> - <?php endif; ?> - <?php endforeach; ?> - </div> - <?php endif; ?> - <audio controls preload="none" class="flex w-full mt-2 md:mt-4"> - <source - src="<?= $episode->enclosure_url . - (isset($_SERVER['HTTP_REFERER']) - ? '?_from=' . - parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) - : '') ?>" - type="<?= $episode->enclosure_type ?>" /> - Your browser does not support the audio tag. - </audio> +] ?>;" class="mr-2 text-xs tracking-wider uppercase truncate opacity-75 hover:opacity-100" target="_blank"> + <?= $podcast->title ?> + </a> + <a href="https://castopod.org/" class="ml-auto text-xl text-pine-700 hover:opacity-75" title="<?= lang( + 'Common.powered_by', + [ + 'castopod' => 'Castopod', + ], + ) ?>" target="_blank" rel="noopener noreferrer"> + <?= icon('podcasting/castopod') ?> + </a> </div> - - - <a href="https://castopod.org/" - class="absolute bottom-0 right-0 mb-4 mr-4 hover:opacity-75" - title="<?= lang('Common.powered_by', [ - 'castopod' => 'Castopod', - ]) ?>" - target="_blank" - rel="noopener noreferrer"> - <?= platform_icon('podcasting', 'castopod', 'h-6') ?> + <a href="<?= $episode->link ?>" class="flex items-center mb-2" style="color: <?= $theme[ + 'text' +] ?>;" target="_blank"> + <h1 class="mr-2 text-lg font-semibold truncate opacity-100 hover:opacity-75"> + <?= $episode->title ?> + </h1> + <?= episode_numbering( + $episode->number, + $episode->season_number, + 'text-xs', + true, + ) ?> </a> + <audio controls preload="none" class="flex w-full mt-auto"> + <source src="<?= $episode->enclosure_url . + (isset($_SERVER['HTTP_REFERER']) + ? '?_from=' . + parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) + : '') ?>" type="<?= $episode->enclosure_type ?>" /> + Your browser does not support the audio tag. + </audio> </div> </body> + </html> \ No newline at end of file diff --git a/app/Views/episode.php b/app/Views/episode.php deleted file mode 100644 index 2f5ec6840856e5fe7fe6b12955a0a657d40468e6..0000000000000000000000000000000000000000 --- a/app/Views/episode.php +++ /dev/null @@ -1,149 +0,0 @@ -<?= helper('page') ?> -<!DOCTYPE html> -<html lang="<?= service('request')->getLocale() ?>"> - -<head> - <meta charset="UTF-8"/> - <title><?= $episode->title ?></title> - <meta name="description" - content="<?= htmlspecialchars($episode->description) ?>" /> - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> -<?php if ( - !empty($podcast->payment_pointer) -): ?> <meta name="monetization" content="<?= $podcast->payment_pointer ?>" /> -<?php endif; ?> - <link rel="shortcut icon" type="image/png" href="/favicon.ico" /> - <link rel="stylesheet" href="/assets/index.css"/> - <link rel="canonical" href="<?= $episode->link ?>" /> - <script src="/assets/podcast.js" type="module" defer></script> - <meta property="og:title" content="<?= $episode->title ?>" /> - <meta property="og:locale" content="<?= $podcast->language_code ?>" /> - <meta property="og:site_name" content="<?= $podcast->title ?>" /> - <meta property="og:url" content="<?= current_url() ?>" /> - <meta property="article:published_time" content="<?= $episode->published_at ?>" /> - <meta property="article:modified_time" content="<?= $episode->updated_at ?>" /> - <meta property="og:image" content="<?= $episode->image->large_url ?>" /> - <meta property="og:image:width" content="<?= config('Images') - ->largeSize ?>" /> - <meta property="og:image:height" content="<?= config('Images') - ->largeSize ?>" /> - <meta property="og:audio" content="<?= $episode->enclosure_opengraph_url ?>" /> - <meta property="og:audio:type" content="<?= $episode->enclosure_mimetype ?>" /> - <meta property="og:description" content="<?= $episode->description ?>" /> - <meta name="twitter:card" content="summary_large_image" /> -</head> - -<body class="flex flex-col min-h-screen mx-auto"> - <header class="border-b bg-gradient-to-tr from-gray-900 to-gray-800"> - <div class="container flex items-start px-2 py-2 mx-auto"> - <img - class="w-12 h-12 mr-2 rounded cover" - src="<?= $podcast->image->thumbnail_url ?>" - alt="<?= $podcast->title ?>" - /> - <a - href="<?= route_to('podcast', $podcast->name) ?>" - class="flex flex-col text-lg leading-tight text-white" - title="<?= lang('Episode.back_to_podcast') ?>"> - <?= $podcast->title ?> - <span class="text-sm text-gray-300"> - @<?= $podcast->name ?> - </span> - </a> - </div> - </header> - <main class="container flex-1 mx-auto"> - <nav class="flex items-center px-2 py-4"> - <?php if ($previousEpisode): ?> - <a class="flex items-center text-xs leading-snug text-gray-600 hover:text-gray-900" href="<?= $previousEpisode->link ?>" title="<?= $previousEpisode->title ?>"> - <?= icon('chevron-left', 'mr-2') ?> - <div class="flex flex-col"> - <?= $previousEpisode->season_number == - $episode->season_number - ? lang('Episode.previous_episode') - : lang('Episode.previous_season') ?> - <span class="w-40 font-semibold truncate"><?= $previousEpisode->title ?></span> - </div> - </a> - <?php endif; ?> - <?php if ($nextEpisode): ?> - <a class="flex items-center ml-auto text-xs leading-snug text-right text-gray-600 hover:text-gray-900" href="<?= $nextEpisode->link ?>" title="<?= $nextEpisode->title ?>"> - <div class="flex flex-col"> - <?= $nextEpisode->season_number == - $episode->season_number - ? lang('Episode.next_episode') - : lang('Episode.next_season') ?> - <span class="w-40 font-semibold truncate"><?= $nextEpisode->title ?></span> - </div> - <?= icon('chevron-right', 'ml-2') ?> - </a> - <?php endif; ?> - </nav> - <header class="flex flex-col items-center px-4 md:items-stretch md:justify-center md:flex-row"> - <img src="<?= $episode->image->medium_url ?>" - alt="<?= $episode->title ?>" class="object-cover w-full max-w-xs mb-2 rounded-lg md:mb-0 md:mr-4" /> - <div class="flex flex-col w-full max-w-sm"> - <h1 class="text-lg font-semibold md:text-2xl"><?= $episode->title ?></h1> - <?= episode_numbering( - $episode->number, - $episode->season_number, - 'text-gray-600' - ) ?> - <div class="text-sm"> - <time - pubdate - datetime="<?= $episode->published_at->format(DateTime::ATOM) ?>" - title="<?= $episode->published_at ?>"> - <?= lang('Common.mediumDate', [$episode->published_at]) ?> - </time> - <span class="mx-1">•</span> - <time datetime="PT<?= $episode->enclosure_duration ?>S"> - <?= format_duration($episode->enclosure_duration) ?> - </time> - </div> - <div class="flex mt-2 mb-1 space-x-2"> - <?php foreach ($persons as $person): ?> - <?php if (!empty($person['information_url'])): ?> - <a href="<?= $person[ - 'information_url' - ] ?>" target="_blank" rel="noreferrer noopener"> - <?php endif; ?> - <img src="<?= $person['thumbnail_url'] ?>" alt="<?= $person[ - 'full_name' -] ?>" title="[<?= $person['full_name'] ?>] <?= $person[ - 'roles' -] ?>" class="object-cover w-12 h-12 rounded-full" /> - <?php if (!empty($person['information_url'])): ?> - </a> - <?php endif; ?> - <?php endforeach; ?> - </div> - <?= location_link( - $episode->location_name, - $episode->location_geo, - $episode->location_osmid, - 'self-start mt-2 mb-2' - ) ?> - <audio controls preload="none" class="w-full mt-auto"> - <source src="<?= $episode->enclosure_web_url ?>" type="<?= $episode->enclosure_type ?>"> - Your browser does not support the audio tag. - </audio> - </div> - </header> - <section class="w-full max-w-3xl px-2 py-6 mx-auto prose md:px-6"> - <?= $episode->getDescriptionHtml('-+Website+-') ?> - </section> - </main> - <footer class="px-2 py-4 border-t "> - <div class="container flex flex-col items-center justify-between mx-auto text-xs md:flex-row "> - <?= render_page_links('inline-flex mb-4 md:mb-0') ?> - <div class="flex flex-col items-end"> - <p><?= $podcast->copyright ?></p> - <p><?= lang('Common.powered_by', [ - 'castopod' => - '<a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>', - ]) ?></p> - </div> - </div> - </footer> -</body> \ No newline at end of file diff --git a/app/Views/errors/cli/error_exception.php b/app/Views/errors/cli/error_exception.php index c161311cc505a63a428402d3db7bc617cbf02c8d..f9ebc35a21c33c799486b29bd64b7a0de35ee415 100644 --- a/app/Views/errors/cli/error_exception.php +++ b/app/Views/errors/cli/error_exception.php @@ -1,24 +1,77 @@ -An uncaught Exception was encountered - -Type: <?= get_class($exception), "\n" ?> -Message: <?= $message, "\n" ?> -Filename: <?= $exception->getFile(), "\n" ?> -Line Number: <?= $exception->getLine() ?> - -<?php if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE === true): ?> - Backtrace: - <?php foreach ($exception->getTrace() as $error): ?> - <?php if (isset($error['file'])): ?> - <?= trim( - '-' . - $error['line'] . - ' - ' . - $error['file'] . - '::' . - $error['function'] - ) . "\n" ?> - <?php endif; ?> - <?php endforeach; ?> - -<?php endif; -?> +<?php + +use CodeIgniter\CLI\CLI; + +// The main Exception +CLI::newLine(); +CLI::write('[' . get_class($exception) . ']', 'light_gray', 'red'); +CLI::newLine(); +CLI::write($message); +CLI::newLine(); +CLI::write( + 'at ' . + CLI::color( + clean_path($exception->getFile()) . ':' . $exception->getLine(), + 'green' + ) +); +CLI::newLine(); + +// The backtrace +if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE) { + $backtraces = $exception->getTrace(); + + if ($backtraces) { + CLI::write('Backtrace:', 'green'); + } + + foreach ($backtraces as $i => $error) { + $padFile = ' '; // 4 spaces + $padClass = ' '; // 7 spaces + $c = str_pad($i + 1, 3, ' ', STR_PAD_LEFT); + + if (isset($error['file'])) { + $filepath = clean_path($error['file']) . ':' . $error['line']; + + CLI::write($c . $padFile . CLI::color($filepath, 'yellow')); + } else { + CLI::write( + $c . $padFile . CLI::color('[internal function]', 'yellow') + ); + } + + $function = ''; + + if (isset($error['class'])) { + $type = + $error['type'] === '->' + ? '()' . $error['type'] + : $error['type']; + $function .= + $padClass . $error['class'] . $type . $error['function']; + } elseif (!isset($error['class']) && isset($error['function'])) { + $function .= $padClass . $error['function']; + } + + $args = implode( + ', ', + array_map(function ($value) { + switch (true) { + case is_object($value): + return 'Object(' . get_class($value) . ')'; + case is_array($value): + return count($value) ? '[...]' : '[]'; + case is_null($value): + return 'null'; // return the lowercased version + default: + return var_export($value, true); + } + }, array_values($error['args'] ?? [])) + ); + + $function .= '(' . $args . ')'; + + CLI::write($function); + CLI::newLine(); + } +} diff --git a/app/Views/errors/html/debug.css b/app/Views/errors/html/debug.css index 6595eedb325d9b818e1b57d448bc0ce2222ed6f4..ec6dc81fea0fd31dff3122e3e0d5fa27f6803005 100644 --- a/app/Views/errors/html/debug.css +++ b/app/Views/errors/html/debug.css @@ -64,6 +64,7 @@ p.lead { border-radius: 5px; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; margin: 0; + overflow-x: scroll; } .source span.line { line-height: 1.4; diff --git a/app/Views/errors/html/error_404.php b/app/Views/errors/html/error_404.php index 089a67bb412aac63bc0f01e87ee7f0021b185195..ae4d553d88c2e14ece0aeca1a7d3e54cd33660f8 100644 --- a/app/Views/errors/html/error_404.php +++ b/app/Views/errors/html/error_404.php @@ -10,7 +10,7 @@ <body class="flex flex-col items-center justify-center min-h-screen px-2 text-center bg-gray-100"> <?= svg('castopod-mascot_confused', 'h-64') ?> - <h1 class="text-3xl font-bold md:text-4xl lg:text-5xl">404 - File Not Found</h1> + <h1 class="text-3xl font-bold font-display md:text-4xl lg:text-5xl">404 - File Not Found</h1> <p class="mb-6 text-lg text-gray-600 md:text-xl lg:text-2xl"> <?php if (!empty($message) && $message !== '(null)'): ?> @@ -20,7 +20,7 @@ <?php endif; ?> </p> - <?= button('Go back', previous_url(), [ + <?= button(lang('Common.go_back'), previous_url(), [ 'variant' => 'primary', 'iconLeft' => 'arrow-left', ]) ?> diff --git a/app/Views/errors/html/error_exception.php b/app/Views/errors/html/error_exception.php index 5101f1e16246d4b75e009479b6e02565f03009f9..7a1c053cd27814a67cb96c4039f3ad741ac6eee5 100644 --- a/app/Views/errors/html/error_exception.php +++ b/app/Views/errors/html/error_exception.php @@ -1,535 +1,423 @@ <?php $error_id = uniqid('error', true); ?> <!doctype html> <html> - <head> - <meta charset="UTF-8"> - <meta name="robots" content="noindex"> - - <title><?= htmlspecialchars($title, ENT_SUBSTITUTE, 'UTF-8') ?></title> - <style type="text/css"> - <?= preg_replace( - '#[\r\n\t ]+#', - ' ', - file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css') - ) ?> - </style> - - <script type="text/javascript"> - <?= file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.js') ?> - </script> + <meta charset="UTF-8"> + <meta name="robots" content="noindex"> + + <title><?= esc($title) ?></title> + <style type="text/css"> + <?= preg_replace( + '#[\r\n\t ]+#', + ' ', + file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css') + ) ?> + </style> + + <script type="text/javascript"> + <?= file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.js') ?> + </script> </head> - <body onload="init()"> - <!-- Header --> - <div class="header"> - <div class="container"> - <h1><?= htmlspecialchars($title, ENT_SUBSTITUTE, 'UTF-8'), - $exception->getCode() - ? ' #' . $exception->getCode() - : '' ?></h1> - <p> - <?= $exception->getMessage() ?> - <a href="https://www.google.com/search?q=<?= urlencode( - $title . - ' ' . - preg_replace( - '#\'.*\'|".*"#Us', - '', - $exception->getMessage() - ) - ) ?>" rel="noreferrer" target="_blank">search →</a> - </p> - </div> - </div> - - <!-- Source --> - <div class="container"> - <p><b><?= static::cleanPath( - $file, - $line - ) ?></b> at line <b><?= $line ?></b></p> - - <?php if (is_file($file)): ?> - <div class="source"> - <?= static::highlightFile($file, $line, 15) ?> - </div> - <?php endif; ?> - </div> - - <div class="container"> - - <ul class="tabs" id="tabs"> - <li><a href="#backtrace">Backtrace</a></li> - <li><a href="#server">Server</a></li> - <li><a href="#request">Request</a></li> - <li><a href="#response">Response</a></li> - <li><a href="#files">Files</a></li> - <li><a href="#memory">Memory</a></li> - </li> - </ul> - - <div class="tab-content"> - - <!-- Backtrace --> - <div class="content" id="backtrace"> - - <ol class="trace"> - <?php foreach ($trace as $index => $row): ?> - <li> - <p> - <!-- Trace info --> - <?php if ( - isset($row['file']) && - is_file($row['file']) - ): ?> - <?php if ( - isset($row['function']) && - in_array($row['function'], [ - 'include', - 'include_once', - 'require', - 'require_once', - ]) - ) { - echo $row['function'] . - ' ' . - static::cleanPath($row['file']); - } else { - echo static::cleanPath($row['file']) . - ' : ' . - $row['line']; - } ?> - <?php else: ?> - {PHP internal code} - <?php endif; ?> - - <!-- Class/Method --> - <?php if (isset($row['class'])): ?> - — <?= $row[ - 'class' - ] . - $row['type'] . - $row['function'] ?> - <?php if (!empty($row['args'])): ?> - <?php $args_id = - $error_id . 'args' . $index; ?> - ( <a href="#" onclick="return toggle('<?= $args_id ?>');">arguments</a> ) - <div class="args" id="<?= $args_id ?>"> - <table cellspacing="0"> - - <?php - $params = null; - // Reflection by name is not available for closure function - if ( - substr( - $row['function'], - -1 - ) !== '}' - ) { - $mirror = isset( - $row['class'] - ) - ? new \ReflectionMethod( - $row['class'], - $row['function'] - ) - : new \ReflectionFunction( - $row['function'] - ); - $params = $mirror->getParameters(); - } - foreach ( - $row['args'] - as $key => $value - ): ?> - <tr> - <td><code><?= htmlspecialchars( - isset($params[$key]) - ? '$' . - $params[ - $key - ]->name - : "#$key", - ENT_SUBSTITUTE, - 'UTF-8' - ) ?></code></td> - <td> - <pre><?= print_r( - $value, - true - ) ?></pre> - </td> - </tr> - <?php endforeach; - ?> - - </table> - </div> - <?php else: ?> - () - <?php endif; ?> - <?php endif; ?> - - <?php if ( - !isset($row['class']) && - isset($row['function']) - ): ?> - — <?= $row[ - 'function' - ] ?>() - <?php endif; ?> - </p> - - <!-- Source? --> - <?php if ( - isset($row['file']) && - is_file($row['file']) && - isset($row['class']) - ): ?> - <div class="source"> - <?= static::highlightFile( - $row['file'], - $row['line'] - ) ?> - </div> - <?php endif; ?> - </li> - - <?php endforeach; ?> - </ol> - - </div> - - <!-- Server --> - <div class="content" id="server"> - <?php foreach (['_SERVER', '_SESSION'] as $var): ?> - <?php if ( - empty($GLOBALS[$var]) || - !is_array($GLOBALS[$var]) - ) { - continue; - } ?> - - <h3>$<?= $var ?></h3> - - <table> - <thead> - <tr> - <th>Key</th> - <th>Value</th> - </tr> - </thead> - <tbody> - <?php foreach ($GLOBALS[$var] as $key => $value): ?> - <tr> - <td><?= htmlspecialchars( - $key, - ENT_IGNORE, - 'UTF-8' - ) ?></td> - <td> - <?php if (is_string($value)): ?> - <?= htmlspecialchars( - $value, - ENT_SUBSTITUTE, - 'UTF-8' - ) ?> - <?php else: ?> - <?= '<pre>' . - print_r($value, true) ?> - <?php endif; ?> - </td> - </tr> - <?php endforeach; ?> - </tbody> - </table> - - <?php endforeach; ?> - - <!-- Constants --> - <?php $constants = get_defined_constants(true); ?> - <?php if (!empty($constants['user'])): ?> - <h3>Constants</h3> - - <table> - <thead> - <tr> - <th>Key</th> - <th>Value</th> - </tr> - </thead> - <tbody> - <?php foreach ( - $constants['user'] - as $key => $value - ): ?> - <tr> - <td><?= htmlspecialchars( - $key, - ENT_IGNORE, - 'UTF-8' - ) ?></td> - <td> - <?php if ( - !is_array($value) && - !is_object($value) - ): ?> - <?= htmlspecialchars( - $value, - ENT_SUBSTITUTE, - 'UTF-8' - ) ?> - <?php else: ?> - <?= '<pre>' . - print_r($value, true) ?> - <?php endif; ?> - </td> - </tr> - <?php endforeach; ?> - </tbody> - </table> - <?php endif; ?> - </div> - - <!-- Request --> - <div class="content" id="request"> - <?php $request = \Config\Services::request(); ?> - - <table> - <tbody> - <tr> - <td style="width: 10em">Path</td> - <td><?= $request->uri ?></td> - </tr> - <tr> - <td>HTTP Method</td> - <td><?= $request->getMethod(true) ?></td> - </tr> - <tr> - <td>IP Address</td> - <td><?= $request->getIPAddress() ?></td> - </tr> - <tr> - <td style="width: 10em">Is AJAX Request?</td> - <td><?= $request->isAJAX() ? 'yes' : 'no' ?></td> - </tr> - <tr> - <td>Is CLI Request?</td> - <td><?= $request->isCLI() ? 'yes' : 'no' ?></td> - </tr> - <tr> - <td>Is Secure Request?</td> - <td><?= $request->isSecure() ? 'yes' : 'no' ?></td> - </tr> - <tr> - <td>User Agent</td> - <td><?= $request - ->getUserAgent() - ->getAgentString() ?></td> - </tr> - - </tbody> - </table> - - - <?php $empty = true; ?> - <?php foreach (['_GET', '_POST', '_COOKIE'] as $var): ?> - <?php if ( - empty($GLOBALS[$var]) || - !is_array($GLOBALS[$var]) - ) { - continue; - } ?> - - <?php $empty = false; ?> - - <h3>$<?= $var ?></h3> - - <table style="width: 100%"> - <thead> - <tr> - <th>Key</th> - <th>Value</th> - </tr> - </thead> - <tbody> - <?php foreach ($GLOBALS[$var] as $key => $value): ?> - <tr> - <td><?= htmlspecialchars( - $key, - ENT_IGNORE, - 'UTF-8' - ) ?></td> - <td> - <?php if ( - !is_array($value) && - !is_object($value) - ): ?> - <?= htmlspecialchars( - $value, - ENT_SUBSTITUTE, - 'UTF-8' - ) ?> - <?php else: ?> - <?= '<pre>' . - print_r($value, true) ?> - <?php endif; ?> - </td> - </tr> - <?php endforeach; ?> - </tbody> - </table> - - <?php endforeach; ?> - - <?php if ($empty): ?> - <div class="alert"> - No $_GET, $_POST, or $_COOKIE Information to show. - </div> - - <?php endif; ?> - - <?php $headers = $request->getHeaders(); ?> - <?php if (!empty($headers)): ?> - <h3>Headers</h3> - - <table> - <thead> - <tr> - <th>Header</th> - <th>Value</th> - </tr> - </thead> - <tbody> - <?php foreach ($headers as $value): ?> - <?php if (empty($value)) { - continue; - } ?> - <?php if (!is_array($value)) { - $value = [$value]; - } ?> - <?php foreach ($value as $h): ?> - <tr> - <td><?= esc( - $h->getName(), - 'html' - ) ?></td> - <td><?= esc( - $h->getValueLine(), - 'html' - ) ?></td> - </tr> - <?php endforeach; ?> - <?php endforeach; ?> - </tbody> - </table> - - <?php endif; ?> - </div> - - <!-- Response --> - <?php - $response = \Config\Services::response(); - $response->setStatusCode(http_response_code()); - ?> - <div class="content" id="response"> - <table> - <tr> - <td style="width: 15em">Response Status</td> - <td><?= $response->getStatusCode() . - ' - ' . - $response->getReason() ?></td> - </tr> - </table> - - <?php $headers = $response->getHeaders(); ?> - <?php if (!empty($headers)): ?> - <?php natsort($headers); ?> - - <h3>Headers</h3> - - <table> - <thead> - <tr> - <th>Header</th> - <th>Value</th> - </tr> - </thead> - <tbody> - <?php foreach ($headers as $name => $value): ?> - <tr> - <td><?= esc($name, 'html') ?></td> - <td><?= esc( - $response->getHeaderLine($name), - 'html' - ) ?></td> - </tr> - <?php endforeach; ?> - </tbody> - </table> - - <?php endif; ?> - </div> - - <!-- Files --> - <div class="content" id="files"> - <?php $files = get_included_files(); ?> - - <ol> - <?php foreach ($files as $file): ?> - <li><?= htmlspecialchars( - static::cleanPath($file), - ENT_SUBSTITUTE, - 'UTF-8' - ) ?></li> - <?php endforeach; ?> - </ol> - </div> - - <!-- Memory --> - <div class="content" id="memory"> - - <table> - <tbody> - <tr> - <td>Memory Usage</td> - <td><?= static::describeMemory( - memory_get_usage(true) - ) ?></td> - </tr> - <tr> - <td style="width: 12em">Peak Memory Usage:</td> - <td><?= static::describeMemory( - memory_get_peak_usage(true) - ) ?></td> - </tr> - <tr> - <td>Memory Limit:</td> - <td><?= ini_get('memory_limit') ?></td> - </tr> - </tbody> - </table> - - </div> - - </div> <!-- /tab-content --> - - </div> <!-- /container --> - - <div class="footer"> - <div class="container"> - - <p> - Displayed at <?= date('H:i:sa') ?> — - PHP: <?= phpversion() ?> — - CodeIgniter: <?= \CodeIgniter\CodeIgniter::CI_VERSION ?> - </p> - - </div> - </div> + <!-- Header --> + <div class="header"> + <div class="container"> + <h1><?= esc($title), + esc($exception->getCode() ? ' #' . $exception->getCode() : '') ?></h1> + <p> + <?= esc($exception->getMessage()) ?> + <a href="https://www.google.com/search?q=<?= urlencode( + $title . + ' ' . + preg_replace('#\'.*\'|".*"#Us', '', $exception->getMessage()) + ) ?>" + rel="noreferrer" target="_blank">search →</a> + </p> + </div> + </div> + + <!-- Source --> + <div class="container"> + <p><b><?= esc(static::cleanPath($file, $line)) ?></b> at line <b><?= esc( + $line +) ?></b></p> + + <?php if (is_file($file)): ?> + <div class="source"> + <?= static::highlightFile($file, $line, 15) ?> + </div> + <?php endif; ?> + </div> + + <div class="container"> + + <ul class="tabs" id="tabs"> + <li><a href="#backtrace">Backtrace</a></li> + <li><a href="#server">Server</a></li> + <li><a href="#request">Request</a></li> + <li><a href="#response">Response</a></li> + <li><a href="#files">Files</a></li> + <li><a href="#memory">Memory</a></li> + </li> + </ul> + + <div class="tab-content"> + + <!-- Backtrace --> + <div class="content" id="backtrace"> + + <ol class="trace"> + <?php foreach ($trace as $index => $row): ?> + + <li> + <p> + <!-- Trace info --> + <?php if (isset($row['file']) && is_file($row['file'])): ?> + <?php if ( + isset($row['function']) && + in_array( + $row['function'], + ['include', 'include_once', 'require', 'require_once'], + true + ) + ) { + echo esc($row['function'] . ' ' . static::cleanPath($row['file'])); + } else { + echo esc(static::cleanPath($row['file']) . ' : ' . $row['line']); + } ?> + <?php else: ?> + {PHP internal code} + <?php endif; ?> + + <!-- Class/Method --> + <?php if (isset($row['class'])): ?> + — <?= esc( + $row['class'] . $row['type'] . $row['function'] + ) ?> + <?php if (!empty($row['args'])): ?> + <?php $args_id = $error_id . 'args' . $index; ?> + ( <a href="#" onclick="return toggle('<?= esc( + $args_id, + 'attr' + ) ?>');">arguments</a> ) + <div class="args" id="<?= esc($args_id, 'attr') ?>"> + <table cellspacing="0"> + + <?php + $params = null; + // Reflection by name is not available for closure function + if (substr($row['function'], -1) !== '}') { + $mirror = isset($row['class']) + ? new \ReflectionMethod($row['class'], $row['function']) + : new \ReflectionFunction($row['function']); + $params = $mirror->getParameters(); + } + foreach ($row['args'] as $key => $value): ?> + <tr> + <td><code><?= esc( + isset($params[$key]) ? '$' . $params[$key]->name : "#$key" + ) ?></code></td> + <td><pre><?= esc(print_r($value, true)) ?></pre></td> + </tr> + <?php endforeach; + ?> + + </table> + </div> + <?php else: ?> + () + <?php endif; ?> + <?php endif; ?> + + <?php if (!isset($row['class']) && isset($row['function'])): ?> + — <?= esc($row['function']) ?>() + <?php endif; ?> + </p> + + <!-- Source? --> + <?php if ( + isset($row['file']) && + is_file($row['file']) && + isset($row['class']) + ): ?> + <div class="source"> + <?= static::highlightFile($row['file'], $row['line']) ?> + </div> + <?php endif; ?> + </li> + + <?php endforeach; ?> + </ol> + + </div> + + <!-- Server --> + <div class="content" id="server"> + <?php foreach (['_SERVER', '_SESSION'] as $var): ?> + <?php if (empty($GLOBALS[$var]) || !is_array($GLOBALS[$var])) { + continue; + } ?> + + <h3>$<?= esc($var) ?></h3> + + <table> + <thead> + <tr> + <th>Key</th> + <th>Value</th> + </tr> + </thead> + <tbody> + <?php foreach ($GLOBALS[$var] as $key => $value): ?> + <tr> + <td><?= esc($key) ?></td> + <td> + <?php if (is_string($value)): ?> + <?= esc($value) ?> + <?php else: ?> + <pre><?= esc(print_r($value, true)) ?></pre> + <?php endif; ?> + </td> + </tr> + <?php endforeach; ?> + </tbody> + </table> + + <?php endforeach; ?> + + <!-- Constants --> + <?php $constants = get_defined_constants(true); ?> + <?php if (!empty($constants['user'])): ?> + <h3>Constants</h3> + + <table> + <thead> + <tr> + <th>Key</th> + <th>Value</th> + </tr> + </thead> + <tbody> + <?php foreach ($constants['user'] as $key => $value): ?> + <tr> + <td><?= esc($key) ?></td> + <td> + <?php if (is_string($value)): ?> + <?= esc($value) ?> + <?php else: ?> + <pre><?= esc(print_r($value, true)) ?></pre> + <?php endif; ?> + </td> + </tr> + <?php endforeach; ?> + </tbody> + </table> + <?php endif; ?> + </div> + + <!-- Request --> + <div class="content" id="request"> + <?php $request = \Config\Services::request(); ?> + + <table> + <tbody> + <tr> + <td style="width: 10em">Path</td> + <td><?= esc($request->uri) ?></td> + </tr> + <tr> + <td>HTTP Method</td> + <td><?= esc($request->getMethod(true)) ?></td> + </tr> + <tr> + <td>IP Address</td> + <td><?= esc($request->getIPAddress()) ?></td> + </tr> + <tr> + <td style="width: 10em">Is AJAX Request?</td> + <td><?= $request->isAJAX() ? 'yes' : 'no' ?></td> + </tr> + <tr> + <td>Is CLI Request?</td> + <td><?= $request->isCLI() ? 'yes' : 'no' ?></td> + </tr> + <tr> + <td>Is Secure Request?</td> + <td><?= $request->isSecure() ? 'yes' : 'no' ?></td> + </tr> + <tr> + <td>User Agent</td> + <td><?= esc($request->getUserAgent()->getAgentString()) ?></td> + </tr> + + </tbody> + </table> + + + <?php $empty = true; ?> + <?php foreach (['_GET', '_POST', '_COOKIE'] as $var): ?> + <?php if (empty($GLOBALS[$var]) || !is_array($GLOBALS[$var])) { + continue; + } ?> + + <?php $empty = false; ?> + + <h3>$<?= esc($var) ?></h3> + + <table style="width: 100%"> + <thead> + <tr> + <th>Key</th> + <th>Value</th> + </tr> + </thead> + <tbody> + <?php foreach ($GLOBALS[$var] as $key => $value): ?> + <tr> + <td><?= esc($key) ?></td> + <td> + <?php if (is_string($value)): ?> + <?= esc($value) ?> + <?php else: ?> + <pre><?= esc(print_r($value, true)) ?></pre> + <?php endif; ?> + </td> + </tr> + <?php endforeach; ?> + </tbody> + </table> + + <?php endforeach; ?> + + <?php if ($empty): ?> + + <div class="alert"> + No $_GET, $_POST, or $_COOKIE Information to show. + </div> + + <?php endif; ?> + + <?php $headers = $request->getHeaders(); ?> + <?php if (!empty($headers)): ?> + + <h3>Headers</h3> + + <table> + <thead> + <tr> + <th>Header</th> + <th>Value</th> + </tr> + </thead> + <tbody> + <?php foreach ($headers as $value): ?> + <?php if (empty($value)) { + continue; + } ?> + <?php if (!is_array($value)) { + $value = [$value]; + } ?> + <?php foreach ($value as $h): ?> + <tr> + <td><?= esc($h->getName(), 'html') ?></td> + <td><?= esc($h->getValueLine(), 'html') ?></td> + </tr> + <?php endforeach; ?> + <?php endforeach; ?> + </tbody> + </table> + + <?php endif; ?> + </div> + + <!-- Response --> + <?php + $response = \Config\Services::response(); + $response->setStatusCode(http_response_code()); + ?> + <div class="content" id="response"> + <table> + <tr> + <td style="width: 15em">Response Status</td> + <td><?= esc($response->getStatusCode() . ' - ' . $response->getReason()) ?></td> + </tr> + </table> + + <?php $headers = $response->getHeaders(); ?> + <?php if (!empty($headers)): ?> + <?php natsort($headers); ?> + + <h3>Headers</h3> + + <table> + <thead> + <tr> + <th>Header</th> + <th>Value</th> + </tr> + </thead> + <tbody> + <?php foreach ($headers as $name => $value): ?> + <tr> + <td><?= esc($name, 'html') ?></td> + <td><?= esc($response->getHeaderLine($name), 'html') ?></td> + </tr> + <?php endforeach; ?> + </tbody> + </table> + + <?php endif; ?> + </div> + + <!-- Files --> + <div class="content" id="files"> + <?php $files = get_included_files(); ?> + + <ol> + <?php foreach ($files as $file): ?> + <li><?= esc(static::cleanPath($file)) ?></li> + <?php endforeach; ?> + </ol> + </div> + + <!-- Memory --> + <div class="content" id="memory"> + + <table> + <tbody> + <tr> + <td>Memory Usage</td> + <td><?= esc(static::describeMemory(memory_get_usage(true))) ?></td> + </tr> + <tr> + <td style="width: 12em">Peak Memory Usage:</td> + <td><?= esc(static::describeMemory(memory_get_peak_usage(true))) ?></td> + </tr> + <tr> + <td>Memory Limit:</td> + <td><?= esc(ini_get('memory_limit')) ?></td> + </tr> + </tbody> + </table> + + </div> + + </div> <!-- /tab-content --> + + </div> <!-- /container --> + + <div class="footer"> + <div class="container"> + + <p> + Displayed at <?= esc(date('H:i:sa')) ?> — + PHP: <?= esc(phpversion()) ?> — + CodeIgniter: <?= esc(\CodeIgniter\CodeIgniter::CI_VERSION) ?> + </p> + + </div> + </div> </body> - </html> \ No newline at end of file diff --git a/app/Views/errors/html/production.php b/app/Views/errors/html/production.php index a74ac74b128fa24cb5598ef7b3ce371d35d8f6dd..4125e0c9d82fa09e33832cbbc0494ae1b73c0a42 100644 --- a/app/Views/errors/html/production.php +++ b/app/Views/errors/html/production.php @@ -12,7 +12,7 @@ <body class="flex flex-col items-center justify-center min-h-screen px-2 text-center bg-gray-100"> <?= svg('castopod-mascot_confused', 'h-64') ?> - <h1 class="text-3xl font-bold md:text-4xl lg:text-5xl">Whoops!</h1> + <h1 class="text-3xl font-bold font-display md:text-4xl lg:text-5xl">Whoops!</h1> <p class="mb-6 text-lg text-gray-600 md:text-xl lg:text-2xl">We seem to have hit a snag. Please try again later...</p> </body> diff --git a/app/Views/home.php b/app/Views/home.php index 4a8fe348691d8f2693bac808a928dc7e7d85f26a..3adbcac5f4c5c44a05d9b1dd36d764d846acefd6 100644 --- a/app/Views/home.php +++ b/app/Views/home.php @@ -1,29 +1,52 @@ -<?= $this->extend('_layout') ?> +<?= helper('page') ?> +<!DOCTYPE html> +<html lang="<?= service('request')->getLocale() ?>"> -<?= $this->section('title') ?>Castopod<?= $this->endSection() ?> +<head> + <meta charset="UTF-8"/> + <title>Castopod</title> + <meta name="description" content="Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience."/> + <meta name="viewport" content="width=device-width, initial-scale=1.0"/> + <link rel="shortcut icon" type="image/png" href="/favicon.ico" /> + <link rel="stylesheet" href="/assets/index.css"/> +</head> -<?= $this->section('content') ?> - -<h1 class="mb-2 text-xl"><?= lang('Home.all_podcasts') ?> (<?= count( - $podcasts +<body class="flex flex-col min-h-screen mx-auto bg-pine-50"> + <header class="py-8 text-white border-b bg-pine-900"> + <div class="container flex items-center justify-between px-2 py-4 mx-auto"> + <a href="<?= route_to( + 'home', + ) ?>" class="inline-flex items-baseline text-3xl font-semibold font-display"><?= 'castopod' . + svg('castopod-logo', 'h-6 ml-2') ?></a> + </div> + </header> + <main class="container flex-1 px-4 py-10 mx-auto"> + <h1 class="mb-2 text-xl"><?= lang('Home.all_podcasts') ?> (<?= count( + $podcasts, ) ?>)</h1> -<section class="flex flex-wrap"> - <?php if ($podcasts): ?> - <?php foreach ($podcasts as $podcast): ?> - <a href="<?= route_to('podcast', $podcast->name) ?>"> - <article class="w-48 h-full p-2 mb-4 mr-4 border shadow-sm hover:bg-gray-100 hover:shadow"> - <img alt="<?= $podcast->title ?>" - src="<?= $podcast->image->thumbnail_url ?>" - class="object-cover w-full h-40 mb-2" /> - <h2 class="font-semibold leading-tight"><?= $podcast->title ?></h2> - <p class="text-gray-600">@<?= $podcast->name ?></p> - </article> - </a> - <?php endforeach; ?> - <?php else: ?> - <p class="italic"><?= lang('Home.no_podcast') ?></p> - <?php endif; ?> -</section> - -<?= $this->endSection() -?> + <section class="grid gap-4 grid-cols-podcasts"> + <?php if ($podcasts): ?> + <?php foreach ($podcasts as $podcast): ?> + <a href="<?= $podcast->link ?>" class="w-full"> + <article class="w-full h-full overflow-hidden bg-white border shadow rounded-xl hover:bg-gray-100 hover:shadow"> + <img alt="<?= $podcast->title ?>" + src="<?= $podcast->image->medium_url ?>" + class="object-cover w-full h-48 mb-2" /> + <h2 class="px-2 font-semibold leading-tight truncate"><?= $podcast->title ?></h2> + <p class="px-2 pb-2 text-gray-600">@<?= $podcast->name ?></p> + </article> + </a> + <?php endforeach; ?> + <?php else: ?> + <p class="italic"><?= lang('Home.no_podcast') ?></p> + <?php endif; ?> + </section> + </main> + <footer class="container flex justify-between px-2 py-4 mx-auto text-sm text-right border-t"> + <?= render_page_links() ?> + <small><?= lang('Common.powered_by', [ + 'castopod' => + '<a class="underline hover:no-underline" href="https://castopod.org/" target="_blank" rel="noreferrer noopener">Castopod</a>', + ]) ?></small> + </footer> +</body> diff --git a/app/Views/install/_layout.php b/app/Views/install/_layout.php index 6cd4cb1e5a918fe3c4deb7f2653c01235b3e2237..3277106b058cd6c9af71f5ec9c841ac3e16eae7d 100644 --- a/app/Views/install/_layout.php +++ b/app/Views/install/_layout.php @@ -8,7 +8,7 @@ <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <link rel="shortcut icon" type="image/png" href="/favicon.ico" /> <link rel="stylesheet" href="/assets/index.css"/> - <script src="/assets/install.js" type="module" defer></script> + <script src="/assets/install.js" type="module"></script> </head> <body class="flex flex-col min-h-screen mx-auto"> diff --git a/app/Views/install/cache_config.php b/app/Views/install/cache_config.php index ddd95d8e4b27962c62e05d35d31bcd5230f380d7..44f01018fa432f86f10af01ffc7c5d8b716d96cc 100644 --- a/app/Views/install/cache_config.php +++ b/app/Views/install/cache_config.php @@ -7,12 +7,12 @@ ]) ?> <?= csrf_field() ?> -<h1 class="mb-4 text-xl"><span class="inline-flex items-center justify-center w-12 h-12 mr-2 text-sm font-semibold tracking-wider text-green-700 border-4 border-green-500 rounded-full">3/4</span><?= lang( - 'Install.form.cache_config' +<h1 class="mb-4 text-xl font-bold font-display"><span class="inline-flex items-center justify-center w-12 h-12 mr-2 text-sm font-semibold tracking-wider border-4 rounded-full text-pine-700 border-pine-700 font-body">3/4</span><?= lang( + 'Install.form.cache_config', ) ?></h1> <p class="mb-4 text-sm text-gray-600"><?= lang( - 'Install.form.cache_config_hint' + 'Install.form.cache_config_hint', ) ?></p> <?= form_label(lang('Install.form.cache_handler'), 'db_prefix') ?> @@ -29,14 +29,14 @@ 'name' => 'cache_handler', 'class' => 'form-select mb-6', 'value' => config('Database')->default['DBPrefix'], - ] + ], ) ?> <?= button( lang('Install.form.next') . icon('arrow-right', 'ml-2'), null, ['variant' => 'primary'], - ['type' => 'submit', 'class' => 'self-end'] + ['type' => 'submit', 'class' => 'self-end'], ) ?> <?= form_close() ?> diff --git a/app/Views/install/create_superadmin.php b/app/Views/install/create_superadmin.php index 6a560773329604f2ec20b6611a6835f4d900235a..9bf89683c17da2a8fcd2210c3fe5a0b2b70f3ab0 100644 --- a/app/Views/install/create_superadmin.php +++ b/app/Views/install/create_superadmin.php @@ -7,8 +7,8 @@ ]) ?> <?= csrf_field() ?> -<h1 class="mb-4 text-xl"><span class="inline-flex items-center justify-center w-12 h-12 mr-2 text-sm font-semibold tracking-wider text-green-700 border-4 border-green-500 rounded-full">4/4</span><?= lang( - 'Install.form.create_superadmin' +<h1 class="mb-4 text-xl font-bold font-display"><span class="inline-flex items-center justify-center w-12 h-12 mr-2 text-sm font-semibold tracking-wider border-4 rounded-full text-pine-700 border-pine-700 font-body">4/4</span><?= lang( + 'Install.form.create_superadmin', ) ?></h1> <?= form_label(lang('Install.form.email'), 'email') ?> @@ -44,7 +44,7 @@ icon('check', 'mr-2') . lang('Install.form.submit'), null, ['variant' => 'primary'], - ['type' => 'submit', 'class' => 'self-end'] + ['type' => 'submit', 'class' => 'self-end'], ) ?> <?= form_close() ?> diff --git a/app/Views/install/database_config.php b/app/Views/install/database_config.php index 169419576d033373bef739ae9ae01f2ba064c460..e50d584e693edef2e025395ad2d9e585c31a3941 100644 --- a/app/Views/install/database_config.php +++ b/app/Views/install/database_config.php @@ -8,12 +8,12 @@ ]) ?> <?= csrf_field() ?> -<h1 class="mb-2 text-xl"><span class="inline-flex items-center justify-center w-12 h-12 mr-2 text-sm font-semibold tracking-wider text-green-700 border-4 border-green-500 rounded-full">2/4</span><?= lang( - 'Install.form.database_config' +<h1 class="mb-2 text-xl font-bold font-display"><span class="inline-flex items-center justify-center w-12 h-12 mr-2 text-sm font-semibold tracking-wider border-4 rounded-full text-pine-700 border-pine-700 font-body">2/4</span><?= lang( + 'Install.form.database_config', ) ?></h1> <p class="mb-4 text-sm text-gray-600"><?= lang( - 'Install.form.database_config_hint' + 'Install.form.database_config_hint', ) ?></p> <?= form_label(lang('Install.form.db_hostname'), 'db_hostname') ?> @@ -59,7 +59,7 @@ lang('Install.form.db_prefix'), 'db_prefix', [], - lang('Install.form.db_prefix_hint') + lang('Install.form.db_prefix_hint'), ) ?> <?= form_input([ 'id' => 'db_prefix', @@ -72,7 +72,7 @@ lang('Install.form.next') . icon('arrow-right', 'ml-2'), null, ['variant' => 'primary'], - ['type' => 'submit', 'class' => 'self-end'] + ['type' => 'submit', 'class' => 'self-end'], ) ?> <?= form_close() ?> diff --git a/app/Views/install/instance_config.php b/app/Views/install/instance_config.php index ef6d64289599057db1495ee5b77e2b4b3315d5a5..4c7ff578a31748590b3c82a032add420facd7363 100644 --- a/app/Views/install/instance_config.php +++ b/app/Views/install/instance_config.php @@ -7,8 +7,8 @@ '/instance-config' ?>" class="flex flex-col w-full max-w-sm" method="post" accept-charset="utf-8"> <?= csrf_field() ?> -<h1 class="mb-4 text-xl"><span class="inline-flex items-center justify-center w-12 h-12 mr-2 text-sm font-semibold tracking-wider text-green-700 border-4 border-green-500 rounded-full">1/4</span><?= lang( - 'Install.form.instance_config' +<h1 class="mb-4 text-xl font-bold font-display"><span class="inline-flex items-center justify-center w-12 h-12 mr-2 text-sm font-semibold tracking-wider border-4 rounded-full text-pine-700 border-pine-700 font-body">1/4</span><?= lang( + 'Install.form.instance_config', ) ?></h1> <?= form_label(lang('Install.form.hostname'), 'hostname') ?> <?= form_input([ @@ -17,7 +17,7 @@ 'class' => 'form-input mb-4', 'value' => old( 'hostname', - empty(host_url()) ? config('App')->baseURL : host_url() + empty(host_url()) ? config('App')->baseURL : host_url(), ), 'required' => 'required', ]) ?> @@ -28,7 +28,7 @@ 'media_base_url', [], lang('Install.form.media_base_url_hint'), - true + true, ) ?> <?= form_input([ 'id' => 'media_base_url', @@ -41,7 +41,7 @@ lang('Install.form.admin_gateway'), 'admin_gateway', [], - lang('Install.form.admin_gateway_hint') + lang('Install.form.admin_gateway_hint'), ) ?> <?= form_input([ 'id' => 'admin_gateway', @@ -55,7 +55,7 @@ lang('Install.form.auth_gateway'), 'auth_gateway', [], - lang('Install.form.auth_gateway_hint') + lang('Install.form.auth_gateway_hint'), ) ?> <?= form_input([ 'id' => 'auth_gateway', @@ -66,15 +66,10 @@ ]) ?> <?= button( - lang('Install.form.next') . - icon( - 'arrow-right', - - 'ml-2' - ), + lang('Install.form.next') . icon('arrow-right', 'ml-2'), null, ['variant' => 'primary'], - ['type' => 'submit', 'class' => 'self-end'] + ['type' => 'submit', 'class' => 'self-end'], ) ?> <?= form_close() ?> diff --git a/app/Views/install/manual_config.php b/app/Views/install/manual_config.php index 446eee8631d4f9edb9d70c8f6f4a03ffa1bc4976..26fb5ed12d4adaf009644b19e912eb0d51c6e605 100644 --- a/app/Views/install/manual_config.php +++ b/app/Views/install/manual_config.php @@ -2,12 +2,14 @@ <?= $this->section('content') ?> -<h1 class="mb-2 text-xl font-bold"><?= lang('Install.manual_config') ?></h1> +<h1 class="mb-2 text-xl font-bold font-display"><?= lang( + 'Install.manual_config', +) ?></h1> <div class="inline-flex items-baseline max-w-2xl px-4 py-2 mb-4 font-semibold text-red-900 bg-red-200 border border-red-700"> <?= icon('alert', 'mr-2 flex-shrink-0') . lang('Install.messages.writeError') ?> </div> <p class="mb-4 font-semibold text-gray-600"><?= lang( - 'Install.manual_config_subtitle' + 'Install.manual_config_subtitle', ) ?></p> <?= $this->endSection() diff --git a/app/Views/page.php b/app/Views/page.php index aa6b502e9d5bec0c7df9115e87b229697f4cd798..d8aef5572b39905bc5993b1b886f51793351e3b4 100644 --- a/app/Views/page.php +++ b/app/Views/page.php @@ -1,11 +1,36 @@ -<?= $this->extend('_layout') ?> +<?= helper('page') ?> +<!DOCTYPE html> +<html lang="<?= service('request')->getLocale() ?>"> -<?= $this->section('title') ?> -<?= $page->title ?> -<?= $this->endSection() ?> +<head> + <meta charset="UTF-8"/> + <title><?= $page->title ?></title> + <meta name="viewport" content="width=device-width, initial-scale=1.0"/> + <link rel="shortcut icon" type="image/png" href="/favicon.ico" /> + <link rel="stylesheet" href="/assets/index.css"/> +</head> -<?= $this->section('content') ?> -<div class="prose"> - <?= $page->content_html ?> -</div> -<?= $this->endSection() ?> +<body class="flex flex-col min-h-screen mx-auto"> + <header class="py-8 text-white border-b bg-pine-900"> + <div class="container flex flex-col px-2 py-4 mx-auto"> + <a href="<?= route_to('home') ?>" + class="inline-flex items-center mb-2"><?= icon( + 'arrow-left', + 'mr-2' + ) . lang('Page.back_to_home') ?></a> + <h1 class="text-3xl font-semibold"><?= $page->title ?></h1> + </div> + </header> + <main class="container flex-1 px-4 py-10 mx-auto"> + <div class="prose"> + <?= $page->content_html ?> + </div> + </main> + <footer class="container flex justify-between px-2 py-4 mx-auto text-sm text-right border-t"> + <?= render_page_links() ?> + <small><?= lang('Common.powered_by', [ + 'castopod' => + '<a class="underline hover:no-underline" href="https://castopod.org/" target="_blank" rel="noreferrer noopener">Castopod</a>', + ]) ?></small> + </footer> +</body> diff --git a/app/Views/pager/default_full.php b/app/Views/pager/default_full.php index e2a065d0c10a9fd3173d8895a66e410484ce215f..ab90a46fc68dd8f35ed2e6fd0e309842d8873062 100644 --- a/app/Views/pager/default_full.php +++ b/app/Views/pager/default_full.php @@ -34,7 +34,7 @@ $pager->setSurroundCount(2); ?> <?php foreach ($pager->links() as $link): ?> <li> <?php if ($link['active']): ?> - <span class="block px-4 py-2 font-semibold text-white bg-green-500 rounded-full"> + <span class="block px-4 py-2 font-semibold text-white rounded-full bg-pine-600"> <?= $link['title'] ?> </span> <?php else: ?> diff --git a/app/Views/podcast.php b/app/Views/podcast.php deleted file mode 100644 index 2b42958621db83b0a74be42ae8fa9d2531c9ec85..0000000000000000000000000000000000000000 --- a/app/Views/podcast.php +++ /dev/null @@ -1,261 +0,0 @@ -<?= helper('page') ?> - -<!DOCTYPE html> -<html lang="<?= service('request')->getLocale() ?>"> - -<head> - <meta charset="UTF-8"/> - <title><?= $podcast->title ?></title> - <meta name="description" - content="<?= htmlspecialchars($podcast->description) ?>" /> - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> -<?php if ( - !empty($podcast->payment_pointer) -): ?> <meta name="monetization" content="<?= $podcast->payment_pointer ?>" /> -<?php endif; ?> - <link rel="shortcut icon" type="image/png" href="/favicon.ico" /> - <link rel="stylesheet" href="/assets/index.css"/> - <link rel="canonical" href="<?= current_season_url() ?>" /> - <link type="application/rss+xml" rel="alternate" title="<?= $podcast->title ?>" href="<?= $podcast->feed_url ?>"/> - <script src="/assets/podcast.js" type="module" defer></script> - <meta property="og:title" content="<?= $podcast->title ?>" /> - <meta property="og:locale" content="<?= $podcast->language_code ?>" /> - <meta property="og:site_name" content="<?= $podcast->title ?>" /> - <meta property="og:url" content="<?= current_season_url() ?>" /> - <meta property="og:image" content="<?= $podcast->image->large_url ?>" /> - <meta property="og:image:width" content="<?= config('Images') - ->largeSize ?>" /> - <meta property="og:image:height" content="<?= config('Images') - ->largeSize ?>" /> - <meta property="og:description" content="<?= $podcast->description ?>" /> - <meta name="twitter:card" content="summary_large_image" /> -</head> - -<body class="flex flex-col min-h-screen"> - <main class="flex-1 bg-gray-200"> - <header class="border-b bg-gradient-to-tr from-gray-900 to-gray-800"> - <div class="flex flex-col items-center justify-center md:items-stretch md:mx-auto md:container md:py-12 md:flex-row "> - <img src="<?= $podcast->image->medium_url ?>" - alt="<?= $podcast->title ?>" class="object-cover w-full max-w-xs m-4 rounded-lg shadow-xl" /> - <div class="w-full p-4 bg-white md:max-w-md md:text-white md:bg-transparent"> - <h1 class="text-2xl font-semibold leading-tight"><?= $podcast->title ?> <span class="text-lg font-normal opacity-75">@<?= $podcast->name ?></span></h1> - <div class="flex items-center mb-4"> - <address> - <?= lang('Podcast.by', [ - 'publisher' => $podcast->publisher, - ]) ?> - </address> - <?= $podcast->parental_advisory === 'explicit' - ? '<span class="px-1 ml-2 text-xs font-semibold leading-tight tracking-wider uppercase border-2 border-gray-700 rounded md:border-white">' . - lang('Common.explicit') . - '</span>' - : '' ?> - <?= location_link( - $podcast->location_name, - $podcast->location_geo, - $podcast->location_osmid, - 'ml-4' - ) ?> - </div> - <div class="flex mb-2 space-x-2"> - <?= anchor( - route_to('podcast_feed', $podcast->name), - icon('rss', 'mr-2') . lang('Podcast.feed'), - [ - 'class' => - 'text-white bg-gradient-to-r from-orange-400 to-red-500 hover:to-orange-500 hover:bg-orange-500 inline-flex items-center px-2 py-1 font-semibold rounded-lg shadow-md hover:bg-orange-600', - ] - ) ?> - <?php foreach ( - $podcast->podcastingPlatforms - as $podcastingPlatform - ): ?> - <?php if ($podcastingPlatform->is_visible): ?> - <a href="<?= $podcastingPlatform->link_url ?>" title="<?= $podcastingPlatform->label ?>" target="_blank" rel="noopener noreferrer"> - <?= platform_icon( - $podcastingPlatform->type, - $podcastingPlatform->slug, - 'h-8' - ) ?> - </a> - <?php endif; ?> - <?php endforeach; ?> - </div> - - <div class="flex mb-2 space-x-2"> - <?php foreach ( - $podcast->socialPlatforms - as $socialPlatform - ): ?> - <?php if ($socialPlatform->is_visible): ?> - <a href="<?= $socialPlatform->link_url ?>" title="<?= $socialPlatform->label ?>" target="_blank" rel="noopener noreferrer"> - <?= platform_icon( - $socialPlatform->type, - $socialPlatform->slug, - 'h-8 text-black md:text-white' - ) ?> - </a> - <?php endif; ?> - <?php endforeach; ?> - </div> - - <div class="flex mb-2 space-x-2"> - <?php foreach ( - $podcast->fundingPlatforms - as $fundingPlatform - ): ?> - <?php if ($fundingPlatform->is_visible): ?> - <a href="<?= $fundingPlatform->link_url ?>" title="<?= $fundingPlatform->link_content ?>" target="_blank" rel="noopener noreferrer"> - <?= platform_icon( - $fundingPlatform->type, - $fundingPlatform->slug, - 'h-8' - ) ?> - </a> - <?php endif; ?> - <?php endforeach; ?> - </div> - - <div class="flex mb-2 space-x-2"> - <?php foreach ($personArray as $person): ?> - <?php if (!empty($person['information_url'])): ?> - <a href="<?= $person[ - 'information_url' - ] ?>" target="_blank" rel="noreferrer noopener"> - <?php endif; ?> - <img src="<?= $person[ - 'thumbnail_url' - ] ?>" alt="<?= $person[ - 'full_name' -] ?>" title="[<?= $person['full_name'] ?>] <?= $person[ - 'roles' -] ?>" class="object-cover w-12 h-12 rounded-full" /> - <?php if (!empty($person['information_url'])): ?> - </a> - <?php endif; ?> - <?php endforeach; ?> - </div> - - <div class="mb-2 opacity-75"> - <?= $podcast->description_html ?> - </div> - <span class="px-2 py-1 mb-2 mr-2 text-sm text-gray-700 bg-gray-200 rounded"> - <?= lang( - 'Podcast.category_options.' . - $podcast->category->code - ) ?> - </span> - <?php foreach ( - $podcast->other_categories - as $other_category - ): ?> - <span class="px-2 py-1 mb-2 mr-2 text-sm text-gray-700 bg-gray-200 rounded"> - <?= lang( - 'Podcast.category_options.' . - $other_category->code - ) ?> - </span> - <?php endforeach; ?> - </div> - </div> - </header> - - <section class="flex flex-col"> - <nav class="inline-flex justify-center px-4 bg-gray-100 border-b"> - <?php foreach ($episodesNav as $link): ?> - <?= anchor( - $link['route'], - $link['label'] . - ' (' . - $link['number_of_episodes'] . - ')', - [ - 'class' => - 'px-2 py-1 font-semibold ' . - ($link['is_active'] - ? 'border-b-2 border-gray-600' - : 'text-gray-600 hover:text-gray-900'), - ] - ) ?> - <?php endforeach; ?> - </nav> - <div class="container py-6 mx-auto"> - <?php if ($episodes): ?> - <h1 class="px-4 mb-2 text-xl text-center"> - <?php if ($activeQuery['type'] == 'year'): ?> - <?= lang('Podcast.list_of_episodes_year', [ - 'year' => $activeQuery['value'], - ]) ?> (<?= count($episodes) ?>) - <?php elseif ($activeQuery['type'] == 'season'): ?> - <?= lang('Podcast.list_of_episodes_season', [ - 'seasonNumber' => $activeQuery['value'], - ]) ?> (<?= count($episodes) ?>) - <?php endif; ?> - </h1> - <?php foreach ($episodes as $episode): ?> - <article class="flex w-full max-w-lg p-4 mx-auto"> - <img - loading="lazy" - src="<?= $episode->image->thumbnail_url ?>" - alt="<?= $episode->title ?>" class="object-cover w-20 h-20 mr-2 rounded-lg" /> - <div class="flex flex-col flex-1"> - <a class="text-sm hover:underline" href="<?= $episode->link ?>"> - <h2 class="inline-flex justify-between w-full font-bold leading-none group"> - <span class="mr-1 group-hover:underline"><?= $episode->title ?></span> - <?= episode_numbering( - $episode->number, - $episode->season_number, - 'text-xs font-bold text-gray-600', - true - ) ?> - </h2> - </a> - <div class="mb-2 text-xs"> - <time - pubdate - datetime="<?= $episode->published_at->format( - DateTime::ATOM - ) ?>" - title="<?= $episode->published_at ?>"> - <?= lang('Common.mediumDate', [ - $episode->published_at, - ]) ?> - </time> - <span class="mx-1">•</span> - <time datetime="PT<?= $episode->enclosure_duration ?>S"> - <?= format_duration( - $episode->enclosure_duration - ) ?> - </time> - </div> - <audio controls preload="none" class="w-full mt-auto"> - <source src="<?= $episode->enclosure_web_url ?>" type="<?= $episode->enclosure_type ?>"> - Your browser does not support the audio tag. - </audio> - </div> - </article> - <?php endforeach; ?> - <?php else: ?> - <h1 class="px-4 mb-2 text-xl text-center"><?= lang( - 'Podcast.no_episode' - ) ?></h1> - <p class="italic text-center"><?= lang( - 'Podcast.no_episode_hint' - ) ?></p> - <?php endif; ?> - </div> - </section> - </main> - <footer class="px-2 py-4 border-t "> - <div class="container flex flex-col items-center justify-between mx-auto text-xs md:flex-row "> - <?= render_page_links('inline-flex mb-4 md:mb-0') ?> - <div class="flex flex-col items-center md:items-end"> - <p><?= $podcast->copyright ?></p> - <p><?= lang('Common.powered_by', [ - 'castopod' => - '<a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>', - ]) ?></p> - </div> - </div> - </footer> -</body> diff --git a/app/Views/podcast/_layout.php b/app/Views/podcast/_layout.php new file mode 100644 index 0000000000000000000000000000000000000000..0a88b6de5c82f7c2c835b3b2cc93bc0fd8101c38 --- /dev/null +++ b/app/Views/podcast/_layout.php @@ -0,0 +1,120 @@ +<?= helper('page') ?> + +<!DOCTYPE html> +<html lang="<?= service('request')->getLocale() ?>"> + +<head> + <meta charset="UTF-8"/> + <meta name="viewport" content="width=device-width, initial-scale=1.0"/> + <link rel="shortcut icon" type="image/png" href="/favicon.ico" /> + + <?= $this->renderSection('meta-tags') ?> + <?php if ($podcast->payment_pointer): ?> + <meta name="monetization" content="<?= $podcast->payment_pointer ?>" /> + <?php endif; ?> + + <link rel="stylesheet" href="/assets/index.css"/> + <script src="/assets/podcast.js" type="module"></script> +</head> + +<body class="flex w-full min-h-screen pb-20 overflow-x-hidden lg:mx-auto lg:container bg-pine-50 sm:pb-0"> + <?= $this->include('podcast/_partials/header') ?> + + <main class="flex-shrink-0 w-full min-w-0 sm:w-auto sm:flex-1 sm:flex-shrink"> + <?= $this->renderSection('content') ?> + </main> + + <?= $this->include('podcast/_partials/sidebar') ?> + <nav class="fixed bottom-0 left-0 z-50 flex items-center w-full px-4 py-4 sm:hidden"> + <div class="flex items-center w-full p-2 rounded-full shadow-2xl bg-pine-900"> + <button + data-toggle="main-header" + data-toggle-class="sticky -translate-x-full" + class="flex-shrink-0 mr-3 overflow-hidden rounded-full focus:ring-2 focus:outline-none focus:ring-pine-50"> + <img src="<?= $podcast->image + ->thumbnail_url ?>" alt="<?= $podcast->title ?>" class="h-14"/> + </button> + <p class="flex flex-col flex-1 min-w-0 mr-2 text-white"> + <span class="text-sm font-semibold truncate"><?= $podcast->title ?></span> + <span class="text-xs">@<?= $podcast->name ?></span> + </p> + <?= anchor_popup( + route_to('follow', $podcast->name), + icon( + 'social/castopod', + 'mr-2 text-xl text-pink-200 group-hover:text-pink-50', + ) . lang('Podcast.follow'), + [ + 'width' => 420, + 'height' => 620, + 'class' => + 'group inline-flex items-center px-4 py-2 text-xs tracking-wider font-semibold text-white uppercase rounded-full shadow focus:outline-none focus:ring bg-rose-600', + ], + ) ?> + <button + data-toggle="main-sidebar" + data-toggle-class="translate-x-full" + data-toggle-body-class="-ml-64" + class="p-4 text-xl rounded-full focus:outline-none focus:ring-2 focus:ring-pine-600 text-pine-200 hover:text-pine-50"><?= icon( + 'menu', + ) ?><span class="sr-only"><?= lang( + 'Podcast.toggle_podcast_sidebar', +) ?></span></button> + </div> + </nav> + + <button + data-toggle="main-sidebar" + data-toggle-class="translate-x-full" + data-toggle-body-class="-ml-64" + class="fixed z-40 hidden p-4 text-xl rounded-full shadow-2xl sm:block lg:hidden bottom-4 left-4 bg-pine-900 focus:outline-none focus:ring-2 focus:ring-pine-600 text-pine-200 hover:text-pine-50"><?= icon( + 'menu', + ) ?><span class="sr-only"><?= lang( + 'Podcast.toggle_podcast_sidebar', +) ?></span></button> + + <!-- Funding links modal --> + <div id="funding-links" class="fixed top-0 left-0 z-50 flex items-center justify-center hidden w-screen h-screen"> + <div + class="absolute w-full h-full bg-pine-900 bg-opacity-90" + role="button" + data-toggle="funding-links" + data-toggle-class="hidden" + aria-label="<?= lang('Common.close') ?>"></div> + <div class="z-10 w-full max-w-xl bg-white rounded-lg shadow-2xl"> + <div class="flex justify-between px-4 py-2 border-b"> + <h3 class="self-center text-lg"><?= lang( + 'Podcast.funding_links', + ['podcastTitle' => $podcast->title], + ) ?></h3> + <button + data-toggle="funding-links" + data-toggle-class="hidden" + aria-label="<?= lang('Common.close') ?>" + class="self-start p-1 text-2xl"><?= icon('close') ?></button> + </div> + <div class="flex flex-col items-start p-4 space-y-4"> + <?php foreach ( + $podcast->fundingPlatforms + as $fundingPlatform + ): ?> + <?php if ($fundingPlatform->is_visible): ?> + <a + href="<?= $fundingPlatform->link_url ?>" + title="<?= $fundingPlatform->link_content ?>" + target="_blank" + rel="noopener noreferrer" + class="inline-flex items-center font-semibold text-pine-900"> + <?= icon( + $fundingPlatform->type . + '/' . + $fundingPlatform->slug, + 'mr-2', + ) . $fundingPlatform->link_url ?> + </a> + <?php endif; ?> + <?php endforeach; ?> + </div> + </div> + </div> +</body> diff --git a/app/Views/podcast/_layout_authenticated.php b/app/Views/podcast/_layout_authenticated.php new file mode 100644 index 0000000000000000000000000000000000000000..102929606da18bbe56305ddfdc31bae2aa980bc6 --- /dev/null +++ b/app/Views/podcast/_layout_authenticated.php @@ -0,0 +1,147 @@ +<?= helper('page') ?> + +<!DOCTYPE html> +<html lang="<?= service('request')->getLocale() ?>"> + +<head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <link rel="shortcut icon" type="image/png" href="/favicon.ico" /> + + <?= $this->renderSection('meta-tags') ?> + <?php if ($podcast->payment_pointer): ?> + <meta name="monetization" content="<?= $podcast->payment_pointer ?>" /> + <?php endif; ?> + + <link rel="stylesheet" href="/assets/index.css" /> + <script src="/assets/podcast.js" type="module"></script> +</head> + +<body class="flex w-full min-h-screen pt-12 pb-20 overflow-x-hidden bg-pine-50 lg:mx-auto lg:container sm:pb-0"> + <div class="fixed top-0 left-0 z-50 flex items-center justify-between w-full h-12 px-4 text-white shadow bg-pine-900"> + <?= anchor( + route_to('admin'), + 'castopod' . svg('castopod-logo', 'h-5 ml-1'), + [ + 'class' => + 'text-2xl inline-flex items-baseline font-bold font-display', + ], + ) ?> + <?php if (user()->podcasts): ?> + <button type="button" class="inline-flex items-center px-6 py-2 mt-auto font-semibold outline-none focus:ring" id="interact-as-dropdown" data-dropdown="button" data-dropdown-target="interact-as-dropdown-menu" aria-haspopup="true" aria-expanded="false"> + <img src="<?= interact_as_actor() + ->avatar_image_url ?>" class="w-8 h-8 mr-2 rounded-full" /> + <?= '@' . interact_as_actor()->username ?> + <?= icon('caret-down', 'ml-auto') ?> + </button> + <nav id="interact-as-dropdown-menu" class="absolute z-50 flex flex-col py-2 text-black whitespace-no-wrap bg-white border rounded shadow" aria-labelledby="my-accountDropdown" data-dropdown="menu" data-dropdown-placement="bottom-end"> + <span class="px-4 text-xs tracking-wider text-gray-700 uppercase"><?= lang( + 'Admin.choose_interact', + ) ?></span> + <form action="<?= route_to( + 'interact-as-actor', + ) ?>" method="POST" class="flex flex-col"> + <?= csrf_field() ?> + <?php foreach (user()->podcasts as $userPodcast): ?> + <button class="inline-flex items-center w-full px-4 py-1 hover:bg-gray-100" id="<?= "interact-as-actor-{$userPodcast->id}" ?>" name="actor_id" value="<?= $userPodcast->actor_id ?>"> + <span class="inline-flex items-center flex-1"> + <img src="<?= $userPodcast->image + ->thumbnail_url ?>" class="w-8 h-8 mr-2 rounded-full" /><?= $userPodcast->title ?> + <?php if ( + interact_as_actor()->id === + $userPodcast->actor_id + ): ?> + </span> + <?= icon( + 'check', + 'ml-4 bg-pine-900 text-white rounded-full', + ) ?> + <?php endif; ?> + </button> + <?php endforeach; ?> + </form> + </nav> + <?php endif; ?> + </div> + <?= $this->include('podcast/_partials/header') ?> + + <main class="flex-shrink-0 w-full min-w-0 sm:w-auto sm:flex-1 sm:flex-shrink"> + <?= $this->renderSection('content') ?> + </main> + + <?= $this->include('podcast/_partials/sidebar') ?> + + <nav class="fixed bottom-0 left-0 z-50 flex items-center w-full px-4 py-4 sm:hidden"> + <div class="flex items-center w-full p-2 rounded-full shadow-2xl bg-pine-900"> + <button data-toggle="main-header" data-toggle-class="sticky -translate-x-full" class="flex-shrink-0 mr-3 overflow-hidden rounded-full focus:ring-2 focus:outline-none focus:ring-pine-50"> + <img src="<?= $podcast->image + ->thumbnail_url ?>" alt="<?= $podcast->title ?>" class="h-14" /> + </button> + <p class="flex flex-col flex-1 min-w-0 mr-2 text-white"> + <span class="text-sm font-semibold truncate"><?= $podcast->title ?></span> + <span class="text-xs">@<?= $podcast->name ?></span> + </p> + <?= anchor_popup( + route_to('follow', $podcast->name), + icon( + 'social/castopod', + 'mr-2 text-xl text-pink-200 group-hover:text-pink-50', + ) . lang('Podcast.follow'), + [ + 'width' => 420, + 'height' => 620, + 'class' => + 'group inline-flex items-center px-4 py-2 text-xs tracking-wider font-semibold text-white uppercase rounded-full shadow focus:outline-none focus:ring bg-rose-600', + ], + ) ?> + <button data-toggle="main-sidebar" data-toggle-class="translate-x-full" data-toggle-body-class="-ml-64" class="p-4 text-xl rounded-full focus:outline-none focus:ring-2 focus:ring-pine-600 text-pine-200 hover:text-pine-50"><?= icon( + 'menu', + ) ?><span class="sr-only"><?= lang( + 'Podcast.toggle_podcast_sidebar', +) ?></span></button> + </div> + </nav> + + <button data-toggle="main-sidebar" data-toggle-class="translate-x-full" data-toggle-body-class="-ml-64" class="fixed z-40 hidden p-4 text-xl rounded-full shadow-2xl sm:block lg:hidden bottom-4 left-4 bg-pine-900 focus:outline-none focus:ring-2 focus:ring-pine-600 text-pine-200 hover:text-pine-50"><?= icon( + 'menu', + ) ?><span class="sr-only"><?= lang( + 'Podcast.toggle_podcast_sidebar', +) ?></span></button> + + <!-- Funding links modal --> + <div id="funding-links" class="fixed top-0 left-0 z-50 flex items-center justify-center hidden w-screen h-screen"> + <div class="absolute w-full h-full bg-pine-900 bg-opacity-90" role="button" data-toggle="funding-links" data-toggle-class="hidden" aria-label="<?= lang( + 'Common.close', + ) ?>"></div> + <div class="z-10 w-full max-w-xl bg-white rounded-lg shadow-2xl"> + <div class="flex justify-between px-4 py-2 border-b"> + <h3 class="self-center text-lg"><?= lang( + 'Podcast.funding_links', + ['podcastTitle' => $podcast->title], + ) ?></h3> + <button data-toggle="funding-links" data-toggle-class="hidden" aria-label="<?= lang( + 'Common.close', + ) ?>" class="self-start p-1 text-2xl"> + <?= icon('close') ?> + </button> + </div> + <div class="flex flex-col items-start p-4 space-y-4"> + <?php foreach ( + $podcast->fundingPlatforms + as $fundingPlatform + ): ?> + <?php if ($fundingPlatform->is_visible): ?> + <a href="<?= $fundingPlatform->link_url ?>" title="<?= $fundingPlatform->link_content ?>" target="_blank" rel="noopener noreferrer" class="inline-flex items-center font-semibold text-pine-900"> + <?= icon( + $fundingPlatform->type . + '/' . + $fundingPlatform->slug, + 'text-2xl text-gray-400 mr-2', + ) . $fundingPlatform->link_url ?> + </a> + <?php endif; ?> + <?php endforeach; ?> + </div> + </div> + </div> +</body> \ No newline at end of file diff --git a/app/Views/podcast/_partials/episode_card.php b/app/Views/podcast/_partials/episode_card.php new file mode 100644 index 0000000000000000000000000000000000000000..a3bec75b23e8faddb7d9c93499a7d13eb1d6fbc5 --- /dev/null +++ b/app/Views/podcast/_partials/episode_card.php @@ -0,0 +1,36 @@ +<div class="flex"> + <img + src="<?= $episode->image->thumbnail_url ?>" + alt="<?= $episode->title ?>" class="w-24 h-24"/> + <div class="flex flex-col flex-1"> + <a href="<?= $episode->link ?>" class="flex-1 px-4 py-2 bg-gray-100"> + <div class="flex items-baseline"> + <span class="flex-1 w-0 mr-2 font-semibold leading-none truncate"><?= $episode->title ?></span> + <?= episode_numbering( + $episode->number, + $episode->season_number, + 'text-xs font-semibold text-gray-600', + true, + ) ?> + </div> + <div class="text-xs text-gray-800"> + <time + itemprop="published" + datetime="<?= $episode->published_at->format(DateTime::ATOM) ?>" + title="<?= $episode->published_at ?>"> + <?= lang('Common.mediumDate', [$episode->published_at]) ?> + </time> + <span class="mx-1">•</span> + <time datetime="PT<?= $episode->enclosure_duration ?>S"> + <?= format_duration($episode->enclosure_duration) ?> + </time> + </div> + </a> + <audio controls preload="none" class="w-full mt-auto"> + <source + src="<?= $episode->enclosure_web_url ?>" + type="<?= $episode->enclosure_mimetype ?>"> + Your browser does not support the audio tag. + </audio> + </div> +</div> diff --git a/app/Views/podcast/_partials/header.php b/app/Views/podcast/_partials/header.php new file mode 100644 index 0000000000000000000000000000000000000000..9e706df1b61139571e9a0173e496d7e2bfdf8f83 --- /dev/null +++ b/app/Views/podcast/_partials/header.php @@ -0,0 +1,95 @@ +<header id="main-header" class="fixed top-0 left-0 flex-col flex-shrink-0 h-screen transform -translate-x-full sm:left-auto sm:-translate-x-0 sm:sticky w-80 sm:w-64 lg:w-80 xl:w-112 sm:flex"> + <?php if ($podcast->actor->cover_image_url): ?> + <img src="<?= $podcast->actor + ->cover_image_url ?>" alt="" class="object-cover w-full h-48 bg-pine-900"/> + <?php else: ?> + <div class="w-full h-48 bg-pine-900"></div> + <?php endif; ?> + <div class="flex items-center justify-between px-4 py-2 mb-4 lg:px-6 -mt-14 lg:-mt-16 xl:-mt-20"> + <img src="<?= $podcast->image + ->thumbnail_url ?>" alt="<?= $podcast->title ?>" class="h-24 rounded-full shadow-xl xl:h-36 lg:h-28 ring-4 ring-pine-50" /> + <?= anchor_popup( + route_to('follow', $podcast->name), + icon( + 'social/castopod', + 'mr-2 text-xl text-pink-200 group-hover:text-pink-50', + ) . lang('Podcast.follow'), + [ + 'width' => 420, + 'height' => 620, + 'class' => + 'group inline-flex items-center px-4 py-2 text-xs tracking-wider font-semibold text-white uppercase rounded-full shadow focus:outline-none focus:ring bg-rose-600', + ], + ) ?> + </div> + <div class="px-6"> + <h1 class="inline-flex items-center text-2xl font-bold leading-none font-display"><?= $podcast->title . + ($podcast->parental_advisory === 'explicit' + ? '<span class="px-1 ml-2 text-xs font-semibold leading-tight tracking-wider text-gray-600 uppercase border-2 border-gray-500">' . + lang('Common.explicit') . + '</span>' + : '') ?></h1> + <p class="mb-4 font-semibold text-gray-600">@<?= $podcast->name ?></p> + <div class="mb-2"><?= $podcast->description_html ?></div> + <?php if ($podcast->location_name): ?> + <?= location_link( + $podcast->location_name, + $podcast->location_geo, + $podcast->location_osmid, + 'text-sm mb-4', + ) ?> + <?php endif; ?> + <div class="mb-6 space-x-4"> + <span class="px-2 py-1 text-sm text-gray-800 bg-gray-200"> + <?= lang( + 'Podcast.category_options.' . $podcast->category->code, + ) ?> + </span> + <?php foreach ($podcast->other_categories as $other_category): ?> + <span class="px-2 py-1 text-sm text-gray-800 bg-gray-200"> + <?= lang( + 'Podcast.category_options.' . $other_category->code, + ) ?> + </span> + <?php endforeach; ?> + </div> + <?php if (!empty($persons)): ?> + <div class="flex mb-6 space-x-2"> + <?php foreach ($persons as $person): ?> + <?php if ($person['information_url']): ?> + <a href="<?= $person[ + 'information_url' + ] ?>" target="_blank" rel="noreferrer noopener"> + <img + src="<?= $person['thumbnail_url'] ?>" + alt="<?= $person['full_name'] ?>" + class="object-cover w-12 h-12 rounded-full" + title="[<?= $person['full_name'] ?>] <?= $person[ + 'roles' +] ?>" /> + </a> + <?php else: ?> + <img + src="<?= $person['thumbnail_url'] ?>" + alt="<?= $person['full_name'] ?>" + class="object-cover w-12 h-12 rounded-full" + title="[<?= $person['full_name'] ?>] <?= $person[ + 'roles' +] ?>" /> + <?php endif; ?> + <?php endforeach; ?> + </div> + <?php endif; ?> + <div class="space-x-4"> + <a href="#" class="hover:underline"><?= lang('Podcast.followers', [ + 'numberOfFollowers' => $podcast->actor->followers_count, + ]) ?></a> + <a href="<?= route_to( + 'podcast-activity', + $podcast->name, + ) ?>" class="hover:underline"><?= lang('Podcast.notes', [ + 'numberOfNotes' => $podcast->actor->notes_count, +]) ?></a> + </div> + </div> +</header> \ No newline at end of file diff --git a/app/Views/podcast/_partials/note.php b/app/Views/podcast/_partials/note.php new file mode 100644 index 0000000000000000000000000000000000000000..757f478588cc113749e3c1cf86fc7b9b6c6e9ef2 --- /dev/null +++ b/app/Views/podcast/_partials/note.php @@ -0,0 +1,41 @@ +<article class="relative z-10 w-full bg-white shadow-md rounded-2xl"> + <header class="flex px-6 py-4"> + <img src="<?= $note->actor + ->avatar_image_url ?>" alt="<?= $note->display_name ?>" class="w-12 h-12 mr-4 rounded-full" /> + <div class="flex flex-col min-w-0"> + <a href="<?= $note->actor + ->uri ?>" class="flex items-baseline hover:underline" <?= !$note + ->actor->is_local + ? 'target="_blank" rel="noopener noreferrer"' + : '' ?>> + <span class="mr-2 font-semibold truncate"><?= $note->actor + ->display_name ?></span> + <span class="text-sm text-gray-500 truncate">@<?= $note->actor + ->username . + (!$note->actor->is_local + ? '@' . $note->actor->domain + : '') ?></span> + </a> + <a href="<?= route_to('note', $podcast->name, $note->id) ?>" + class="text-xs text-gray-500"> + <time + itemprop="published" + datetime="<?= $note->published_at->format(DateTime::ATOM) ?>" + title="<?= $note->published_at ?>" + ><?= lang('Common.mediumDate', [$note->published_at]) ?></time> + </a> + </div> + </header> + <div class="px-6 mb-4 note-content"><?= $note->message_html ?></div> + <?php if ($note->preview_card): ?> + <?= view('podcast/_partials/preview_card', [ + 'preview_card' => $note->preview_card, + ]) ?> + <?php endif; ?> + <?php if ($note->episode_id): ?> + <?= view('podcast/_partials/episode_card', [ + 'episode' => $note->episode, + ]) ?> + <?php endif; ?> + <?= $this->include('podcast/_partials/note_actions') ?> +</article> diff --git a/app/Views/podcast/_partials/note_actions.php b/app/Views/podcast/_partials/note_actions.php new file mode 100644 index 0000000000000000000000000000000000000000..ab2f9bf3ac6f98ad1c2e7e82a448535a07167aea --- /dev/null +++ b/app/Views/podcast/_partials/note_actions.php @@ -0,0 +1,36 @@ +<footer class="flex justify-around px-6 py-3"> + <?= anchor( + route_to('note', $podcast->name, $note->id), + icon('chat', 'text-2xl mr-1 text-gray-400') . $note->replies_count, + [ + 'class' => 'inline-flex items-center hover:underline', + 'title' => lang('Note.replies', [ + 'numberOfReplies' => $note->replies_count, + ]), + ], + ) ?> + <?= anchor_popup( + route_to('note-remote-action', $podcast->name, $note->id, 'reblog'), + icon('repeat', 'text-2xl mr-1 text-gray-400') . $note->reblogs_count, + [ + 'class' => 'inline-flex items-center hover:underline', + 'width' => 420, + 'height' => 620, + 'title' => lang('Note.reblogs', [ + 'numberOfReblogs' => $note->reblogs_count, + ]), + ], + ) ?> + <?= anchor_popup( + route_to('note-remote-action', $podcast->name, $note->id, 'favourite'), + icon('heart', 'text-2xl mr-1 text-gray-400') . $note->favourites_count, + [ + 'class' => 'inline-flex items-center hover:underline', + 'width' => 420, + 'height' => 620, + 'title' => lang('Note.favourites', [ + 'numberOfFavourites' => $note->favourites_count, + ]), + ], + ) ?> +</footer> diff --git a/app/Views/podcast/_partials/note_actions_authenticated.php b/app/Views/podcast/_partials/note_actions_authenticated.php new file mode 100644 index 0000000000000000000000000000000000000000..61248ab8b4c581bc5d42d24a453dd7a00edb3894 --- /dev/null +++ b/app/Views/podcast/_partials/note_actions_authenticated.php @@ -0,0 +1,89 @@ +<footer class="px-6 py-3"> + <form action="<?= route_to( + 'note-attempt-action', + interact_as_actor()->username, + $note->id, + ) ?>" method="POST" class="flex justify-around"> + <?= csrf_field() ?> + <?= anchor( + route_to('note', $podcast->name, $note->id), + icon('chat', 'text-2xl mr-1 text-gray-400') . $note->replies_count, + [ + 'class' => 'inline-flex items-center hover:underline', + 'title' => lang('Note.replies', [ + 'numberOfReplies' => $note->replies_count, + ]), + ], + ) ?> + <button type="submit" name="action" value="reblog" class="inline-flex items-center hover:underline" title="<?= lang( + 'Note.reblogs', + [ + 'numberOfReblogs' => $note->reblogs_count, + ], + ) ?>"><?= icon('repeat', 'text-2xl mr-1 text-gray-400') . + $note->reblogs_count ?></button> + <button type="submit" name="action" value="favourite" class="inline-flex items-center hover:underline" title="<?= lang( + 'Note.favourites', + [ + 'numberOfFavourites' => $note->favourites_count, + ], + ) ?>"><?= icon('heart', 'text-2xl mr-1 text-gray-400') . + $note->favourites_count ?></button> + <button id="<?= $note->id . + '-more-dropdown' ?>" type="button" class="px-2 py-1 text-2xl text-gray-500 outline-none focus:ring" data-dropdown="button" data-dropdown-target="<?= $note->id . + '-more-dropdown-menu' ?>" aria-label="<?= lang( + 'Common.more', +) ?>" aria-haspopup="true" aria-expanded="false"><?= icon('more') ?> + </button> + </form> + <nav id="<?= $note->id . + '-more-dropdown-menu' ?>" class="flex flex-col py-2 text-sm bg-white border rounded-lg shadow" aria-labelledby="<?= $note->id . + '-more-dropdown' ?>" data-dropdown="menu" data-dropdown-placement="bottom"> + <?= anchor( + route_to('note', $podcast->name, $note->id), + lang('Note.expand'), + [ + 'class' => 'px-4 py-1 hover:bg-gray-100', + ], + ) ?> + <form action="<?= route_to( + 'note-attempt-block-actor', + interact_as_actor()->username, + $note->id, + ) ?>" method="POST"> + <?= csrf_field() ?> + <button class="w-full px-4 py-1 text-left hover:bg-gray-100"><?= lang( + 'Note.block_actor', + [ + 'actorUsername' => $note->actor->username, + ], + ) ?></button> + </form> + <form action="<?= route_to( + 'note-attempt-block-domain', + interact_as_actor()->username, + $note->id, + ) ?>" method="POST"> + <?= csrf_field() ?> + <button class="w-full px-4 py-1 text-left hover:bg-gray-100"><?= lang( + 'Note.block_domain', + [ + 'actorDomain' => $note->actor->domain, + ], + ) ?></button> + </form> + <?php if ($note->actor->is_local): ?> + <hr class="my-2" /> + <form action="<?= route_to( + 'note-attempt-delete', + $note->actor->username, + $note->id, + ) ?>" method="POST"> + <?= csrf_field() ?> + <button class="w-full px-4 py-1 font-semibold text-left text-red-600 hover:bg-gray-100"><?= lang( + 'Note.delete', + ) ?></button> + </form> + <?php endif; ?> + </nav> +</footer> \ No newline at end of file diff --git a/app/Views/podcast/_partials/note_authenticated.php b/app/Views/podcast/_partials/note_authenticated.php new file mode 100644 index 0000000000000000000000000000000000000000..44279df1dc759af25655ad81e89b29050d65d67b --- /dev/null +++ b/app/Views/podcast/_partials/note_authenticated.php @@ -0,0 +1,41 @@ +<article class="relative z-10 w-full bg-white shadow-md rounded-2xl"> + <header class="flex px-6 py-4"> + <img src="<?= $note->actor + ->avatar_image_url ?>" alt="<?= $note->display_name ?>" class="w-12 h-12 mr-4 rounded-full" /> + <div class="flex flex-col min-w-0"> + <a href="<?= $note->actor + ->uri ?>" class="flex items-baseline hover:underline" <?= !$note + ->actor->is_local + ? 'target="_blank" rel="noopener noreferrer"' + : '' ?>> + <span class="mr-2 font-semibold truncate"><?= $note->actor + ->display_name ?></span> + <span class="text-sm text-gray-500 truncate">@<?= $note->actor + ->username . + (!$note->actor->is_local + ? '@' . $note->actor->domain + : '') ?></span> + </a> + <a href="<?= route_to('note', $podcast->name, $note->id) ?>" + class="text-xs text-gray-500"> + <time + itemprop="published" + datetime="<?= $note->created_at->format(DateTime::ATOM) ?>" + title="<?= $note->created_at ?>" + ><?= lang('Common.mediumDate', [$note->created_at]) ?></time> + </a> + </div> + </header> + <div class="px-6 mb-4 note-content"><?= $note->message_html ?></div> + <?php if ($note->preview_card): ?> + <?= view('podcast/_partials/preview_card', [ + 'preview_card' => $note->preview_card, + ]) ?> + <?php endif; ?> + <?php if ($note->episode_id): ?> + <?= view('podcast/_partials/episode_card', [ + 'episode' => $note->episode, + ]) ?> + <?php endif; ?> + <?= $this->include('podcast/_partials/note_actions_authenticated') ?> +</article> diff --git a/app/Views/podcast/_partials/note_with_replies.php b/app/Views/podcast/_partials/note_with_replies.php new file mode 100644 index 0000000000000000000000000000000000000000..fa9a769dbdf4bfe44e7234c9783b6c9bcd23f0ee --- /dev/null +++ b/app/Views/podcast/_partials/note_with_replies.php @@ -0,0 +1,21 @@ +<?= $this->include('podcast/_partials/note') ?> +<div class="-mt-2 overflow-hidden border-b border-l border-r note-replies rounded-b-xl"> + +<div class="px-6 pt-8 pb-4 bg-gray-50"> +<?= anchor_popup( + route_to('note-remote-action', $podcast->name, $note->id, 'reply'), + lang('Note.reply_to', ['actorUsername' => $note->actor->username]), + [ + 'class' => + 'text-center justify-center font-semibold rounded-full shadow relative z-10 px-4 py-2 w-full bg-rose-600 text-white inline-flex items-center hover:bg-rose-700', + 'width' => 420, + 'height' => 620, + ], +) ?> +</div> + + +<?php foreach ($note->replies as $reply): ?> + <?= view('podcast/_partials/reply', ['reply' => $reply]) ?> +<?php endforeach; ?> +</div> diff --git a/app/Views/podcast/_partials/note_with_replies_authenticated.php b/app/Views/podcast/_partials/note_with_replies_authenticated.php new file mode 100644 index 0000000000000000000000000000000000000000..429d99f3dbd0e651e5827e55ea9bbe71526afbb8 --- /dev/null +++ b/app/Views/podcast/_partials/note_with_replies_authenticated.php @@ -0,0 +1,45 @@ +<?= $this->include('podcast/_partials/note_authenticated') ?> +<div class="-mt-2 overflow-hidden border-b border-l border-r note-replies rounded-b-xl"> +<?= form_open( + route_to('note-attempt-action', interact_as_actor()->username, $note->id), + [ + 'class' => 'bg-gray-50 flex px-6 pt-8 pb-4', + ], +) ?> +<img src="<?= interact_as_actor() + ->avatar_image_url ?>" alt="<?= interact_as_actor() + ->display_name ?>" class="w-12 h-12 mr-4 rounded-full ring-gray-50 ring-2" /> +<div class="flex flex-col flex-1"> +<?= form_textarea( + [ + 'id' => 'message', + 'name' => 'message', + 'class' => 'form-textarea mb-4 w-full', + 'required' => 'required', + 'placeholder' => lang('Note.form.reply_to_placeholder', [ + 'actorUsername' => $note->actor->username, + ]), + ], + old('message', '', false), + [ + 'rows' => 1, + ], +) ?> +<?= button( + lang('Note.form.submit_reply'), + null, + ['variant' => 'primary', 'size' => 'small'], + [ + 'type' => 'submit', + 'class' => 'self-end', + 'name' => 'action', + 'value' => 'reply', + ], +) ?> +</div> +<?= form_close() ?> + +<?php foreach ($note->replies as $reply): ?> + <?= view('podcast/_partials/reply_authenticated', ['reply' => $reply]) ?> +<?php endforeach; ?> +</div> diff --git a/app/Views/podcast/_partials/preview_card.php b/app/Views/podcast/_partials/preview_card.php new file mode 100644 index 0000000000000000000000000000000000000000..cf2b58ba862521574235385bc3dd0829a30f76da --- /dev/null +++ b/app/Views/podcast/_partials/preview_card.php @@ -0,0 +1,45 @@ +<?php if ($preview_card->type === 'image'): ?> +<a href="<?= $preview_card->url ?>" class="flex flex-col bg-gray-100" target="_blank" rel="noopener noreferrer"> + <?php if ($preview_card->image): ?> + <div class="relative group"> + <?= icon( + 'external-link', + 'absolute inset-0 m-auto text-6xl bg-pine-800 ring-4 ring-white bg-opacity-50 group-hover:bg-opacity-75 text-white rounded-full p-2', + ) ?> + <img src="<?= $preview_card->image ?>" alt="<?= $preview_card->title ?>" class="object-cover w-full h-80" /> + </div> + <?php endif; ?> + + <div class="flex flex-col flex-1 px-4 py-2"> + <span class="text-xs tracking-wider text-gray-600 uppercase"><?= $preview_card->provider_name ?></span> + </div> +</a> +<?php elseif ($preview_card->type === 'video'): ?> +<a href="<?= $preview_card->url ?>" class="flex flex-col bg-gray-100" target="_blank" rel="noopener noreferrer"> + <?php if ($preview_card->image): ?> + <div class="relative group"> + <?= icon( + 'play', + 'absolute inset-0 m-auto text-6xl bg-pine-800 ring-4 ring-white bg-opacity-50 group-hover:bg-opacity-75 text-white rounded-full p-2', + ) ?> + <img class="object-cover w-full h-80" src="<?= $preview_card->image ?>" alt="<?= $preview_card->title ?>" /> + </div> + <?php endif; ?> + + <div class="flex flex-col flex-1 px-4 py-2"> + <span class="text-xs tracking-wider text-gray-600 uppercase"><?= $preview_card->provider_name ?></span> + <span class="mb-2 font-semibold truncate"><?= $preview_card->title ?></span> + </div> +</a> +<?php else: ?> +<a href="<?= $preview_card->url ?>" class="flex items-center bg-gray-100"> + <?php if ($preview_card->image): ?> + <img src="<?= $preview_card->image ?>" alt="<?= $preview_card->title ?>" class="object-cover w-20 h-20" /> + <?php endif; ?> + <p class="flex flex-col flex-1 px-4 py-2"> + <span class="text-xs tracking-wider text-gray-600 uppercase"><?= $preview_card->provider_name ?></span> + <span class="mb-2 font-semibold truncate"><?= $preview_card->title ?></span> + </p> +</a> +<?php endif; +?> diff --git a/app/Views/podcast/_partials/reblog.php b/app/Views/podcast/_partials/reblog.php new file mode 100644 index 0000000000000000000000000000000000000000..12077674b1f00083911b5acfac5b27154f351917 --- /dev/null +++ b/app/Views/podcast/_partials/reblog.php @@ -0,0 +1,48 @@ +<article class="relative z-10 w-full bg-white shadow-md rounded-2xl"> + <p class="inline-flex px-6 pt-4 text-xs text-gray-700"><?= icon( + 'repeat', + 'text-lg mr-2 text-gray-400', + ) . + lang('Note.actor_shared', [ + 'actor' => $note->actor->display_name, + ]) ?></p> + <header class="flex px-6 py-4"> + <img src="<?= $note->actor + ->avatar_image_url ?>" alt="<?= $note->display_name ?>" class="w-12 h-12 mr-4 rounded-full" /> + <div class="flex flex-col min-w-0"> + <a href="<?= $note->actor + ->uri ?>" class="flex items-baseline hover:underline" <?= !$note + ->actor->is_local + ? 'target="_blank" rel="noopener noreferrer"' + : '' ?>> + <span class="mr-2 font-semibold truncate"><?= $note->actor + ->display_name ?></span> + <span class="text-sm text-gray-500 truncate">@<?= $note->actor + ->username . + (!$note->actor->is_local + ? '@' . $note->actor->domain + : '') ?></span> + </a> + <a href="<?= route_to('note', $podcast->name, $note->id) ?>" + class="text-xs text-gray-500"> + <time + itemprop="published" + datetime="<?= $note->published_at->format(DateTime::ATOM) ?>" + title="<?= $note->published_at ?>" + ><?= lang('Common.mediumDate', [$note->published_at]) ?></time> + </a> + </div> + </header> + <div class="px-6 mb-4 note-content"><?= $note->message_html ?></div> + <?php if ($note->preview_card): ?> + <?= view('podcast/_partials/preview_card', [ + 'preview_card' => $note->preview_card, + ]) ?> + <?php endif; ?> + <?php if ($note->episode_id): ?> + <?= view('podcast/_partials/episode_card', [ + 'episode' => $note->episode, + ]) ?> + <?php endif; ?> + <?= $this->include('podcast/_partials/note_actions') ?> +</article> diff --git a/app/Views/podcast/_partials/reblog_authenticated.php b/app/Views/podcast/_partials/reblog_authenticated.php new file mode 100644 index 0000000000000000000000000000000000000000..bfb018068da9b851d90e8b6cf878350ab0e5f79f --- /dev/null +++ b/app/Views/podcast/_partials/reblog_authenticated.php @@ -0,0 +1,48 @@ +<article class="relative z-10 w-full bg-white shadow-md rounded-2xl"> + <p class="inline-flex px-6 pt-4 text-xs text-gray-700"><?= icon( + 'repeat', + 'text-lg mr-2 text-gray-400', + ) . + lang('Note.actor_shared', [ + 'actor' => $note->actor->display_name, + ]) ?></p> + <header class="flex px-6 py-4"> + <img src="<?= $note->actor + ->avatar_image_url ?>" alt="<?= $note->display_name ?>" class="w-12 h-12 mr-4 rounded-full" /> + <div class="flex flex-col min-w-0"> + <a href="<?= $note->actor + ->uri ?>" class="flex items-baseline hover:underline" <?= !$note + ->actor->is_local + ? 'target="_blank" rel="noopener noreferrer"' + : '' ?>> + <span class="mr-2 font-semibold truncate"><?= $note->actor + ->display_name ?></span> + <span class="text-sm text-gray-500 truncate">@<?= $note->actor + ->username . + (!$note->actor->is_local + ? '@' . $note->actor->domain + : '') ?></span> + </a> + <a href="<?= route_to('note', $podcast->name, $note->id) ?>" + class="text-xs text-gray-500"> + <time + itemprop="published" + datetime="<?= $note->published_at->format(DateTime::ATOM) ?>" + title="<?= $note->published_at ?>" + ><?= lang('Common.mediumDate', [$note->published_at]) ?></time> + </a> + </div> + </header> + <div class="px-6 mb-4 note-content"><?= $note->message_html ?></div> + <?php if ($note->preview_card): ?> + <?= view('podcast/_partials/preview_card', [ + 'preview_card' => $note->preview_card, + ]) ?> + <?php endif; ?> + <?php if ($note->episode_id): ?> + <?= view('podcast/_partials/episode_card', [ + 'episode' => $note->episode, + ]) ?> + <?php endif; ?> + <?= $this->include('podcast/_partials/note_actions_authenticated') ?> +</article> diff --git a/app/Views/podcast/_partials/reply.php b/app/Views/podcast/_partials/reply.php new file mode 100644 index 0000000000000000000000000000000000000000..2d36a450eb9fc5f610ea00dd92dfc2f36d3b432b --- /dev/null +++ b/app/Views/podcast/_partials/reply.php @@ -0,0 +1,29 @@ +<article class="flex px-6 py-4 bg-gray-50"> + <img src="<?= $reply->actor->avatar_image_url ?>" alt="<?= $reply->actor + ->display_name ?>" class="w-12 h-12 mr-4 rounded-full ring-gray-50 ring-2" /> + <div class="flex flex-col flex-1 min-w-0"> + <header class="flex items-center mb-2"> + <a href="<?= $reply->actor + ->uri ?>" class="mr-2 text-base font-semibold truncate hover:underline" <?= !$reply + ->actor->is_local + ? 'target="_blank" rel="noopener noreferrer"' + : '' ?>><?= $reply->actor + ->display_name ?><span class="ml-1 text-sm font-normal text-gray-600">@<?= $reply + ->actor->username . + (!$reply->actor->is_local ? '@' . $reply->actor->domain : '') ?></span></a> + <time + class="flex-shrink-0 ml-auto text-xs text-gray-600" + itemprop="published" + datetime="<?= $reply->published_at->format(DateTime::ATOM) ?>" + title="<?= $reply->published_at ?>" + ><?= lang('Common.mediumDate', [$reply->published_at]) ?></time> + </header> + <p class="mb-2 note-content"><?= $reply->message_html ?></p> + <?php if ($reply->preview_card): ?> + <?= view('podcast/_partials/preview_card', [ + 'preview_card' => $reply->preview_card, + ]) ?> + <?php endif; ?> + <?= $this->include('podcast/_partials/reply_actions') ?> + </div> +</article> diff --git a/app/Views/podcast/_partials/reply_actions.php b/app/Views/podcast/_partials/reply_actions.php new file mode 100644 index 0000000000000000000000000000000000000000..99895321cd28c1c2977bb35871d1c4db80d16160 --- /dev/null +++ b/app/Views/podcast/_partials/reply_actions.php @@ -0,0 +1,36 @@ +<footer class="mt-2 space-x-6 text-sm"> + <?= anchor( + route_to('note', $podcast->name, $reply->id), + icon('chat', 'text-xl mr-1 text-gray-400') . $reply->replies_count, + [ + 'class' => 'inline-flex items-center hover:underline', + 'title' => lang('Note.replies', [ + 'numberOfReplies' => $reply->replies_count, + ]), + ], + ) ?> + <?= anchor_popup( + route_to('note-remote-action', $podcast->name, $reply->id, 'reblog'), + icon('repeat', 'text-xl mr-1 text-gray-400') . $reply->reblogs_count, + [ + 'class' => 'inline-flex items-center hover:underline', + 'width' => 420, + 'height' => 620, + 'title' => lang('Note.reblogs', [ + 'numberOfReblogs' => $reply->reblogs_count, + ]), + ], + ) ?> + <?= anchor_popup( + route_to('note-remote-action', $podcast->name, $reply->id, 'favourite'), + icon('heart', 'text-xl mr-1 text-gray-400') . $reply->favourites_count, + [ + 'class' => 'inline-flex items-center hover:underline', + 'width' => 420, + 'height' => 620, + 'title' => lang('Note.favourites', [ + 'numberOfFavourites' => $reply->favourites_count, + ]), + ], + ) ?> +</footer> \ No newline at end of file diff --git a/app/Views/podcast/_partials/reply_actions_authenticated.php b/app/Views/podcast/_partials/reply_actions_authenticated.php new file mode 100644 index 0000000000000000000000000000000000000000..4700eaef01f38a3cf7fe4fd062e1dab69b0e57f5 --- /dev/null +++ b/app/Views/podcast/_partials/reply_actions_authenticated.php @@ -0,0 +1,89 @@ +<footer class="mt-2 text-sm"> + <form action="<?= route_to( + 'note-attempt-action', + interact_as_actor()->username, + $reply->id, + ) ?>" method="POST" class="flex items-start"> + <?= csrf_field() ?> + <?= anchor( + route_to('note', $podcast->name, $reply->id), + icon('chat', 'text-xl mr-1 text-gray-400') . $reply->replies_count, + [ + 'class' => 'inline-flex items-center mr-6 hover:underline', + 'title' => lang('Note.replies', [ + 'numberOfReplies' => $reply->replies_count, + ]), + ], + ) ?> + <button type="submit" name="action" value="reblog" class="inline-flex items-center mr-6 hover:underline" title="<?= lang( + 'Note.reblogs', + [ + 'numberOfReblogs' => $reply->reblogs_count, + ], + ) ?>"><?= icon('repeat', 'text-xl mr-1 text-gray-400') . + $reply->reblogs_count ?></button> + <button type="submit" name="action" value="favourite" class="inline-flex items-center mr-6 hover:underline" title="<?= lang( + 'Note.favourites', + [ + 'numberOfFavourites' => $reply->favourites_count, + ], + ) ?>"><?= icon('heart', 'text-xl mr-1 text-gray-400') . + $reply->favourites_count ?></button> + <button id="<?= $reply->id . + '-more-dropdown' ?>" type="button" class="text-xl text-gray-500 outline-none focus:ring" data-dropdown="button" data-dropdown-target="<?= $reply->id . + '-more-dropdown-menu' ?>" aria-label="<?= lang( + 'Common.more', +) ?>" aria-haspopup="true" aria-expanded="false"><?= icon('more') ?> + </button> + </form> + <nav id="<?= $reply->id . + '-more-dropdown-menu' ?>" class="flex flex-col py-2 text-sm bg-white border rounded-lg shadow" aria-labelledby="<?= $reply->id . + '-more-dropdown' ?>" data-dropdown="menu" data-dropdown-placement="bottom"> + <?= anchor( + route_to('note', $podcast->name, $reply->id), + lang('Note.expand'), + [ + 'class' => 'px-4 py-1 hover:bg-gray-100', + ], + ) ?> + <form action="<?= route_to( + 'note-attempt-block-actor', + interact_as_actor()->username, + $reply->id, + ) ?>" method="POST"> + <?= csrf_field() ?> + <button class="w-full px-4 py-1 text-left hover:bg-gray-100"><?= lang( + 'Note.block_actor', + [ + 'actorUsername' => $reply->actor->username, + ], + ) ?></button> + </form> + <form action="<?= route_to( + 'note-attempt-block-domain', + interact_as_actor()->username, + $reply->id, + ) ?>" method="POST"> + <?= csrf_field() ?> + <button class="w-full px-4 py-1 text-left hover:bg-gray-100"><?= lang( + 'Note.block_domain', + [ + 'actorDomain' => $reply->actor->domain, + ], + ) ?></button> + </form> + <?php if ($reply->actor->is_local): ?> + <hr class="my-2" /> + <form action="<?= route_to( + 'note-attempt-delete', + $reply->actor->username, + $reply->id, + ) ?>" method="POST"> + <?= csrf_field() ?> + <button class="w-full px-4 py-1 font-semibold text-left text-red-600 hover:bg-gray-100"><?= lang( + 'Note.delete', + ) ?></button> + </form> + <?php endif; ?> + </nav> +</footer> \ No newline at end of file diff --git a/app/Views/podcast/_partials/reply_authenticated.php b/app/Views/podcast/_partials/reply_authenticated.php new file mode 100644 index 0000000000000000000000000000000000000000..739986fab06d3c34c0b1e4d03300dab7c159c298 --- /dev/null +++ b/app/Views/podcast/_partials/reply_authenticated.php @@ -0,0 +1,29 @@ +<article class="flex px-6 py-4 bg-gray-50"> + <img src="<?= $reply->actor->avatar_image_url ?>" alt="<?= $reply->actor + ->display_name ?>" class="w-12 h-12 mr-4 rounded-full ring-gray-50 ring-2" /> + <div class="flex flex-col flex-1 min-w-0"> + <header class="flex items-center mb-2"> + <a href="<?= $reply->actor + ->uri ?>" class="mr-2 text-base font-semibold truncate hover:underline" <?= !$reply + ->actor->is_local + ? 'target="_blank" rel="noopener noreferrer"' + : '' ?>><?= $reply->actor + ->display_name ?><span class="ml-1 text-sm font-normal text-gray-600">@<?= $reply + ->actor->username . + (!$reply->actor->is_local ? '@' . $reply->actor->domain : '') ?></span></a> + <time + class="flex-shrink-0 ml-auto text-xs text-gray-600" + itemprop="published" + datetime="<?= $reply->created_at->format(DateTime::ATOM) ?>" + title="<?= $reply->created_at ?>" + ><?= lang('Common.mediumDate', [$reply->created_at]) ?></time> + </header> + <p class="mb-2 note-content"><?= $reply->message_html ?></p> + <?php if ($reply->preview_card): ?> + <?= view('podcast/_partials/preview_card', [ + 'preview_card' => $reply->preview_card, + ]) ?> + <?php endif; ?> + <?= $this->include('podcast/_partials/reply_actions_authenticated') ?> + </div> +</article> diff --git a/app/Views/podcast/_partials/sidebar.php b/app/Views/podcast/_partials/sidebar.php new file mode 100644 index 0000000000000000000000000000000000000000..a66854e241d8c75ea417fe074609b520aac7a55c --- /dev/null +++ b/app/Views/podcast/_partials/sidebar.php @@ -0,0 +1,91 @@ +<aside id="main-sidebar" class="fixed top-0 right-0 flex flex-col items-start flex-shrink-0 w-64 h-screen px-6 py-4 overflow-y-auto transform translate-x-full lg:sticky lg:translate-x-0"> + <?php if ( + array_search( + true, + array_column($podcast->fundingPlatforms, 'is_visible'), + ) !== false + ): ?> + <h2 class="mb-2 text-sm font-semibold"><?= lang( + 'Podcast.sponsor_title', + ) ?></h2> + <button + class="inline-flex items-center px-2 py-1 mb-8 text-sm font-semibold text-gray-600 border rounded-full shadow-sm focus:outline-none focus:ring focus:ring-pine-600 hover:bg-rose-200 hover:text-gray-800 border-rose-600 bg-rose-100" + data-toggle="funding-links" + data-toggle-class="hidden"><?= icon('heart', 'mr-2 text-rose-600') . + lang('Podcast.sponsor') ?></button> + <?php endif; ?> + + <?php if ( + array_search( + true, + array_column($podcast->socialPlatforms, 'is_visible'), + ) !== false + ): ?> + <h2 class="mb-2 text-sm font-semibold"> <?= lang('Podcast.find_on', [ + 'podcastTitle' => $podcast->title, + ]) ?></h2> + <div class="grid items-center justify-center grid-cols-5 gap-3 mb-8"> + <?php foreach ($podcast->socialPlatforms as $socialPlatform): ?> + <?php if ($socialPlatform->is_visible): ?> + <?= anchor( + $socialPlatform->link_url, + icon($socialPlatform->type . '/' . $socialPlatform->slug), + [ + 'class' => 'text-2xl text-gray-500 hover:text-gray-700', + 'target' => '_blank', + 'rel' => 'noopener noreferrer', + 'data-toggle' => 'tooltip', + 'data-placement' => 'bottom', + 'title' => $socialPlatform->label, + ], + ) ?> + <?php endif; ?> + <?php endforeach; ?> + </div> + <?php endif; ?> + + <h2 class="mb-2 text-sm font-semibold"><?= lang('Podcast.listen_on') ?></h2> + <div class="grid items-center justify-center grid-cols-5 gap-3 mb-8"> + <?= anchor(route_to('podcast_feed', $podcast->name), icon('rss'), [ + 'class' => + 'bg-yellow-500 text-xl text-yellow-900 hover:bg-yellow-600 w-8 h-8 inline-flex items-center justify-center rounded-lg', + 'target' => '_blank', + 'rel' => 'noopener noreferrer', + 'data-toggle' => 'tooltip', + 'data-placement' => 'bottom', + 'title' => lang('Podcast.feed'), + ]) ?> + <?php foreach ($podcast->podcastingPlatforms as $podcastingPlatform): ?> + <?php if ($podcastingPlatform->is_visible): ?> + <?= anchor( + $podcastingPlatform->link_url, + icon( + $podcastingPlatform->type . + '/' . + $podcastingPlatform->slug, + ), + [ + 'class' => 'text-2xl text-gray-500 hover:text-gray-700', + 'target' => '_blank', + 'rel' => 'noopener noreferrer', + 'data-toggle' => 'tooltip', + 'data-placement' => 'bottom', + 'title' => $podcastingPlatform->label, + ], + ) ?> + <?php endif; ?> + <?php endforeach; ?> + </div> + <footer class="px-2 py-4 mt-auto text-gray-600 border-t"> + <div class="container flex flex-col justify-between mx-auto text-xs"> + <?= render_page_links('inline-flex mb-2') ?> + <div class="flex flex-col"> + <p><?= $podcast->copyright ?></p> + <p><?= lang('Common.powered_by', [ + 'castopod' => + '<a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>', + ]) ?></p> + </div> + </div> + </footer> +</aside> diff --git a/app/Views/podcast/activity.php b/app/Views/podcast/activity.php new file mode 100644 index 0000000000000000000000000000000000000000..45832393b8b9efe41ceeb05d6cf29884c36cfe95 --- /dev/null +++ b/app/Views/podcast/activity.php @@ -0,0 +1,53 @@ +<?= $this->extend('podcast/_layout') ?> + +<?= $this->section('meta-tags') ?> +<link type="application/rss+xml" rel="alternate" title="<?= $podcast->title ?>" href="<?= $podcast->feed_url ?>"/> + +<title><?= $podcast->title ?></title> +<meta name="description" content="<?= htmlspecialchars( + $podcast->description, +) ?>" /> +<link rel="shortcut icon" type="image/png" href="/favicon.ico" /> +<link rel="stylesheet" href="/assets/index.css"/> +<link rel="canonical" href="<?= current_url() ?>" /> +<meta property="og:title" content="<?= $podcast->title ?>" /> +<meta property="og:description" content="<?= $podcast->description ?>" /> +<meta property="og:locale" content="<?= $podcast->language_code ?>" /> +<meta property="og:site_name" content="<?= $podcast->title ?>" /> +<meta property="og:url" content="<?= current_url() ?>" /> +<meta property="og:image" content="<?= $podcast->image->large_url ?>" /> +<meta property="og:image:width" content="<?= config('Images')->largeSize ?>" /> +<meta property="og:image:height" content="<?= config('Images')->largeSize ?>" /> +<meta name="twitter:card" content="summary_large_image" /> +<?= $this->endSection() ?> + +<?= $this->section('content') ?> + +<nav class="sticky top-0 z-20 flex justify-center pt-2 text-lg bg-pine-50"> +<a href="<?= route_to( + 'podcast-activity', + $podcast->name, +) ?>" class="px-4 py-1 mr-8 font-semibold border-b-4 text-pine-800 border-pine-800"><?= lang( + 'Podcast.activity', +) ?></a> + <a href="<?= route_to( + 'podcast-episodes', + $podcast->name, + ) ?>" class="px-4 py-1 rounded-full hover:bg-pine-100"><?= lang( + 'Podcast.episodes', +) ?></a> +</nav> + +<section class="max-w-2xl px-6 py-8 mx-auto space-y-8"> +<?php foreach ($notes as $note): ?> + <?php if ($note->is_reblog): ?> + <?= view('podcast/_partials/reblog', [ + 'note' => $note->reblog_of_note, + ]) ?> + <?php else: ?> + <?= view('podcast/_partials/note', ['note' => $note]) ?> + <?php endif; ?> +<?php endforeach; ?> +</section> + +<?= $this->endSection() ?> diff --git a/app/Views/podcast/activity_authenticated.php b/app/Views/podcast/activity_authenticated.php new file mode 100644 index 0000000000000000000000000000000000000000..f64cbc775b9a0c3805f43237f003143f973eaea0 --- /dev/null +++ b/app/Views/podcast/activity_authenticated.php @@ -0,0 +1,99 @@ +<?= $this->extend('podcast/_layout_authenticated') ?> + +<?= $this->section('meta-tags') ?> +<link type="application/rss+xml" rel="alternate" title="<?= $podcast->title ?>" href="<?= $podcast->feed_url ?>"/> + +<title><?= $podcast->title ?></title> +<meta name="description" content="<?= htmlspecialchars( + $podcast->description, +) ?>" /> +<link rel="shortcut icon" type="image/png" href="/favicon.ico" /> +<link rel="stylesheet" href="/assets/index.css"/> +<link rel="canonical" href="<?= current_url() ?>" /> +<meta property="og:title" content="<?= $podcast->title ?>" /> +<meta property="og:description" content="<?= $podcast->description ?>" /> +<meta property="og:locale" content="<?= $podcast->language_code ?>" /> +<meta property="og:site_name" content="<?= $podcast->title ?>" /> +<meta property="og:url" content="<?= current_url() ?>" /> +<meta property="og:image" content="<?= $podcast->image->large_url ?>" /> +<meta property="og:image:width" content="<?= config('Images')->largeSize ?>" /> +<meta property="og:image:height" content="<?= config('Images')->largeSize ?>" /> +<meta name="twitter:card" content="summary_large_image" /> +<?= $this->endSection() ?> + +<?= $this->section('content') ?> + +<nav class="sticky top-0 z-20 flex justify-center pt-2 text-lg bg-pine-50"> +<a href="<?= route_to( + 'podcast-activity', + $podcast->name, +) ?>" class="px-4 py-1 mr-8 font-semibold border-b-4 text-pine-800 border-pine-800"><?= lang( + 'Podcast.activity', +) ?></a> + <a href="<?= route_to( + 'podcast-episodes', + $podcast->name, + ) ?>" class="px-4 py-1 rounded-full hover:bg-pine-100"><?= lang( + 'Podcast.episodes', +) ?></a> +</nav> + +<section class="max-w-2xl px-6 py-8 mx-auto"> +<?= form_open(route_to('note-attempt-create', interact_as_actor()->username), [ + 'class' => 'flex p-4 bg-white shadow rounded-xl', +]) ?> + <?= csrf_field() ?> + + <?= view('_message_block') ?> + + <img src="<?= interact_as_actor() + ->avatar_image_url ?>" alt="<?= interact_as_actor() + ->display_name ?>" class="w-12 h-12 mr-4 rounded-full" /> + <div class="flex flex-col flex-1 min-w-0"> + <?= form_textarea( + [ + 'id' => 'message', + 'name' => 'message', + 'class' => 'form-textarea', + 'required' => 'required', + 'placeholder' => lang('Note.form.message_placeholder'), + ], + old('message', '', false), + ['rows' => 2], + ) ?> + <?= form_input([ + 'id' => 'episode_url', + 'name' => 'episode_url', + 'class' => 'form-input mb-2', + 'placeholder' => + lang('Note.form.episode_url_placeholder') . + ' (' . + lang('Common.optional') . + ')', + 'type' => 'url', + ]) ?> + + <?= button( + lang('Note.form.submit'), + null, + ['variant' => 'primary', 'size' => 'small'], + ['type' => 'submit', 'class' => 'self-end'], + ) ?> + </div> +<?= form_close() ?> +<hr class="my-4 border-2 border-pine-100"> + +<div class="space-y-8"> +<?php foreach ($notes as $note): ?> + <?php if ($note->is_reblog): ?> + <?= view('podcast/_partials/reblog_authenticated', [ + 'note' => $note->reblog_of_note, + ]) ?> + <?php else: ?> + <?= view('podcast/_partials/note_authenticated', ['note' => $note]) ?> + <?php endif; ?> +<?php endforeach; ?> +</div> +</section> + +<?= $this->endSection() ?> diff --git a/app/Views/podcast/episode.php b/app/Views/podcast/episode.php new file mode 100644 index 0000000000000000000000000000000000000000..33dbffa45015b4e9d880bacc84cc93efebfe9306 --- /dev/null +++ b/app/Views/podcast/episode.php @@ -0,0 +1,186 @@ +<?= $this->extend('podcast/_layout') ?> + +<?= $this->section('meta-tags') ?> +<title><?= $episode->title ?></title> +<meta name="description" content="<?= htmlspecialchars( + $episode->description, +) ?>" /> +<link rel="canonical" href="<?= $episode->link ?>" /> +<meta property="og:title" content="<?= $episode->title ?>" /> +<meta property="og:description" content="<?= $episode->description ?>" /> +<meta property="og:locale" content="<?= $podcast->language_code ?>" /> +<meta property="og:site_name" content="<?= $podcast->title ?>" /> +<meta property="og:url" content="<?= current_url() ?>" /> +<meta property="og:image" content="<?= $episode->image->large_url ?>" /> +<meta property="og:image:width" content="<?= config('Images')->largeSize ?>" /> +<meta property="og:image:height" content="<?= config('Images')->largeSize ?>" /> +<meta property="og:description" content="$description" /> +<meta property="article:published_time" content="<?= $episode->published_at ?>" /> +<meta property="article:modified_time" content="<?= $episode->updated_at ?>" /> +<meta property="og:audio" content="<?= $episode->enclosure_opengraph_url ?>" /> +<meta property="og:audio:type" content="<?= $episode->enclosure_mimetype ?>" /> +<link rel="alternate" type="application/json+oembed" href="<?= base_url( + route_to('episode-oembed-json', $podcast->name, $episode->slug), +) ?>" title="<?= $episode->title ?> oEmbed json" /> +<link rel="alternate" type="text/xml+oembed" href="<?= base_url( + route_to('episode-oembed-xml', $podcast->name, $episode->slug), +) ?>" title="<?= $episode->title ?> oEmbed xml" /> +<meta name="twitter:title" content="<?= $episode->title ?>" /> +<meta name="twitter:description" content="<?= $episode->description ?>" /> +<meta name="twitter:image" content="<?= $episode->image->large_url ?>" /> +<meta name="twitter:card" content="player" /> +<meta property="twitter:audio:partner" content="<?= $podcast->publisher ?>" /> +<meta property="twitter:audio:artist_name" content="<?= $podcast->owner_name ?>" /> +<meta name="twitter:player" content="<?= $episode->getEmbeddablePlayer( + 'light', +) ?>" /> +<meta name="twitter:player:width" content="600" /> +<meta name="twitter:player:height" content="200" /> +<?= $this->endSection() ?> + +<?= $this->section('content') ?> +<div class="max-w-2xl mx-auto"> + <a href="<?= route_to( + 'podcast-episodes', + $podcast->name, + ) ?>" class="inline-flex items-center px-4 py-2 mb-2 text-sm"><?= icon( + 'arrow-left', + 'mr-2 text-lg', +) . lang('Episode.back_to_episodes', ['podcast' => $podcast->title]) ?></a> + <header class="flex flex-col px-6 mb-4 rounded-b-xl"> + <div class="flex flex-wrap items-start"> + <img src="<?= $episode->image + ->medium_url ?>" alt="<?= $episode->title ?>" class="mb-4 mr-6 rounded-xl w-52" /> + <div class="flex flex-col items-start flex-1 mb-4" style="min-width: 14rem"> + <h1 class="text-xl font-bold leading-none font-display line-clamp-2"><?= $episode->title ?></h1> + <?= episode_numbering( + $episode->number, + $episode->season_number, + 'text-gray-700', + ) ?> + <div class="mb-4 text-xs"> + <time pubdate datetime="<?= $episode->published_at->format( + DateTime::ATOM, + ) ?>" title="<?= $episode->published_at ?>"> + <?= lang('Common.mediumDate', [ + $episode->published_at, + ]) ?> + </time> + <span class="mx-1">•</span> + <time datetime="PT<?= $episode->enclosure_duration ?>S"> + <?= format_duration($episode->enclosure_duration) ?> + </time> + </div> + <div class="mb-2 space-x-4 text-sm"> + <?= anchor( + route_to('episode', $podcast->name, $episode->slug), + icon('chat', 'text-xl mr-1 text-gray-400') . + $episode->notes_total, + [ + 'class' => + 'inline-flex items-center hover:underline', + 'title' => lang('Episode.total_notes', [ + 'numberOfTotalNotes' => $episode->notes_total, + ]), + ], + ) ?> + <?= anchor( + route_to('episode', $podcast->name, $episode->slug), + icon('repeat', 'text-xl mr-1 text-gray-400') . + $episode->reblogs_total, + [ + 'class' => + 'inline-flex items-center hover:underline', + 'title' => lang('Episode.total_reblogs', [ + 'numberOfTotalReblogs' => + $episode->reblogs_total, + ]), + ], + ) ?> + <?= anchor( + route_to('episode', $podcast->name, $episode->slug), + icon('heart', 'text-xl mr-1 text-gray-400') . + $episode->favourites_total, + [ + 'class' => + 'inline-flex items-center hover:underline', + 'title' => lang('Episode.total_favourites', [ + 'numberOfTotalFavourites' => + $episode->favourites_total, + ]), + ], + ) ?> + </div> + <?php if ($episode->location_name): ?> + <?= location_link( + $episode->location_name, + $episode->location_geo, + $episode->location_osmid, + 'text-sm mb-4', + ) ?> + <?php endif; ?> + <?php if ($episodePersons): ?> + <div class="flex space-x-2"> + <?php foreach ($episodePersons as $person): ?> + <?php if ($person['information_url']): ?> + <a href="<?= $person[ + 'information_url' + ] ?>" target="_blank" rel="noreferrer noopener"> + <img src="<?= $person[ + 'thumbnail_url' + ] ?>" alt="<?= $person[ + 'full_name' +] ?>" class="object-cover w-12 h-12 rounded-full" title="[<?= $person[ + 'full_name' +] ?>] <?= $person['roles'] ?>" /></a> + <?php else: ?> + <img src="<?= $person[ + 'thumbnail_url' + ] ?>" alt="<?= $person[ + 'full_name' +] ?>" class="object-cover w-12 h-12 rounded-full" title="[<?= $person[ + 'full_name' +] ?>] <?= $person['roles'] ?>" /> + <?php endif; ?> + <?php endforeach; ?> + </div> + <?php endif; ?> + </div> + </div> + <audio controls preload="none" class="w-full mt-auto"> + <source src="<?= $episode->enclosure_web_url ?>" type="<?= $episode->enclosure_type ?>"> + Your browser does not support the audio tag. + </audio> + </header> + + <div class="tabset"> + <?php if ($episode->notes): ?> + + <input type="radio" name="tabset" id="activity" aria-controls="activity" checked="checked" /> + <label for="activity"><?= lang('Episode.activity') ?></label> + <?php endif; ?> + + <input type="radio" name="tabset" id="description" aria-controls="description" <?= $episode->notes + ? '' + : 'checked="checked"' ?> /> + <label for="description" class="<?= $episode->notes + ? '' + : 'col-span-2' ?>"><?= lang('Episode.description') ?></label> + + <div class="tab-panels"> + <?php if ($episode->notes): ?> + <section id="activity" class="space-y-8 tab-panel"> + <?php foreach ($episode->notes as $note): ?> + <?= view('podcast/_partials/note', ['note' => $note]) ?> + <?php endforeach; ?> + </section> + <?php endif; ?> + <section id="description" class="prose tab-panel"> + <?= $episode->getDescriptionHtml('-+Website+-') ?> + </section> + </div> + </div> +</div> + +<?= $this->endSection() +?> diff --git a/app/Views/podcast/episode_authenticated.php b/app/Views/podcast/episode_authenticated.php new file mode 100644 index 0000000000000000000000000000000000000000..8d253e1e0f72841d1b37a69b8a44499cbbc089b2 --- /dev/null +++ b/app/Views/podcast/episode_authenticated.php @@ -0,0 +1,220 @@ +<?= $this->extend('podcast/_layout_authenticated') ?> + +<?= $this->section('meta-tags') ?> +<title><?= $episode->title ?></title> +<meta name="description" content="<?= htmlspecialchars( + $episode->description, +) ?>" /> +<link rel="canonical" href="<?= $episode->link ?>" /> +<meta property="og:title" content="<?= $episode->title ?>" /> +<meta property="og:description" content="<?= $episode->description ?>" /> +<meta property="og:locale" content="<?= $podcast->language_code ?>" /> +<meta property="og:site_name" content="<?= $podcast->title ?>" /> +<meta property="og:url" content="<?= current_url() ?>" /> +<meta property="og:image" content="<?= $episode->image->large_url ?>" /> +<meta property="og:image:width" content="<?= config('Images')->largeSize ?>" /> +<meta property="og:image:height" content="<?= config('Images')->largeSize ?>" /> +<meta property="og:description" content="$description" /> +<meta property="article:published_time" content="<?= $episode->published_at ?>" /> +<meta property="article:modified_time" content="<?= $episode->updated_at ?>" /> +<meta property="og:audio" content="<?= $episode->enclosure_opengraph_url ?>" /> +<meta property="og:audio:type" content="<?= $episode->enclosure_mimetype ?>" /> +<link rel="alternate" type="application/json+oembed" href="<?= base_url( + route_to('episode-oembed-json', $podcast->name, $episode->slug), +) ?>" title="<?= $episode->title ?> oEmbed json" /> +<link rel="alternate" type="text/xml+oembed" href="<?= base_url( + route_to('episode-oembed-xml', $podcast->name, $episode->slug), +) ?>" title="<?= $episode->title ?> oEmbed xml" /> +<meta name="twitter:title" content="<?= $episode->title ?>" /> +<meta name="twitter:description" content="<?= $episode->description ?>" /> +<meta name="twitter:image" content="<?= $episode->image->large_url ?>" /> +<meta name="twitter:card" content="player" /> +<meta property="twitter:audio:partner" content="<?= $podcast->publisher ?>" /> +<meta property="twitter:audio:artist_name" content="<?= $podcast->owner_name ?>" /> +<meta name="twitter:player" content="<?= $episode->getEmbeddablePlayer( + 'light', +) ?>" /> +<meta name="twitter:player:width" content="600" /> +<meta name="twitter:player:height" content="200" /> +<?= $this->endSection() ?> + +<?= $this->section('content') ?> +<div class="max-w-2xl mx-auto"> + <a href="<?= route_to( + 'podcast-episodes', + $podcast->name, + ) ?>" class="inline-flex items-center px-4 py-2 mb-2 text-sm"><?= icon( + 'arrow-left', + 'mr-2 mb- text-lg', +) . lang('Episode.back_to_episodes', ['podcast' => $podcast->title]) ?></a> + <header class="flex flex-col px-6 mb-4 rounded-b-xl"> + <div class="flex flex-wrap items-start"> + <img src="<?= $episode->image + ->medium_url ?>" alt="<?= $episode->title ?>" class="mb-4 mr-6 rounded-xl w-52" /> + <div class="flex flex-col items-start flex-1 mb-4" style="min-width: 14rem"> + <h1 class="text-xl font-bold leading-none font-display line-clamp-2"><?= $episode->title ?></h1> + <?= episode_numbering( + $episode->number, + $episode->season_number, + 'text-gray-700', + ) ?> + <div class="mb-4 text-xs"> + <time pubdate datetime="<?= $episode->published_at->format( + DateTime::ATOM, + ) ?>" title="<?= $episode->published_at ?>"> + <?= lang('Common.mediumDate', [ + $episode->published_at, + ]) ?> + </time> + <span class="mx-1">•</span> + <time datetime="PT<?= $episode->enclosure_duration ?>S"> + <?= format_duration($episode->enclosure_duration) ?> + </time> + </div> + <div class="mb-2 space-x-4 text-sm"> + <?= anchor( + route_to('episode', $podcast->name, $episode->slug), + icon('chat', 'text-xl mr-1 text-gray-400') . + $episode->notes_total, + [ + 'class' => + 'inline-flex items-center hover:underline', + 'title' => lang('Episode.total_notes', [ + 'numberOfTotalNotes' => $episode->notes_total, + ]), + ], + ) ?> + <?= anchor( + route_to('episode', $podcast->name, $episode->slug), + icon('repeat', 'text-xl mr-1 text-gray-400') . + $episode->reblogs_total, + [ + 'class' => + 'inline-flex items-center hover:underline', + 'title' => lang('Episode.total_reblogs', [ + 'numberOfTotalReblogs' => + $episode->reblogs_total, + ]), + ], + ) ?> + <?= anchor( + route_to('episode', $podcast->name, $episode->slug), + icon('heart', 'text-xl mr-1 text-gray-400') . + $episode->favourites_total, + [ + 'class' => + 'inline-flex items-center hover:underline', + 'title' => lang('Episode.total_favourites', [ + 'numberOfTotalFavourites' => + $episode->favourites_total, + ]), + ], + ) ?> + </div> + <?php if ($episode->location_name): ?> + <?= location_link( + $episode->location_name, + $episode->location_geo, + $episode->location_osmid, + 'text-sm mb-4', + ) ?> + <?php endif; ?> + <?php if ($episodePersons): ?> + <div class="flex space-x-2"> + <?php foreach ($episodePersons as $person): ?> + <?php if ($person['information_url']): ?> + <a href="<?= $person[ + 'information_url' + ] ?>" target="_blank" rel="noreferrer noopener"> + <img src="<?= $person[ + 'thumbnail_url' + ] ?>" alt="<?= $person[ + 'full_name' +] ?>" class="object-cover w-12 h-12 rounded-full" title="[<?= $person[ + 'full_name' +] ?>] <?= $person['roles'] ?>" /></a> + <?php else: ?> + <img src="<?= $person[ + 'thumbnail_url' + ] ?>" alt="<?= $person[ + 'full_name' +] ?>" class="object-cover w-12 h-12 rounded-full" title="[<?= $person[ + 'full_name' +] ?>] <?= $person['roles'] ?>" /> + <?php endif; ?> + <?php endforeach; ?> + </div> + <?php endif; ?> + </div> + </div> + <audio controls preload="none" class="w-full mt-auto"> + <source src="<?= $episode->enclosure_web_url ?>" type="<?= $episode->enclosure_type ?>"> + Your browser does not support the audio tag. + </audio> + </header> + + <div class="tabset"> + <input type="radio" name="tabset" id="activity" aria-controls="activity" checked="checked" /> + <label for="activity"><?= lang('Episode.activity') ?></label> + + <input type="radio" name="tabset" id="description" aria-controls="description" /> + <label for="description"><?= lang('Episode.description') ?></label> + + <div class="tab-panels"> + <section id="activity" class="space-y-8 tab-panel"> + <?= form_open(route_to('note-attempt-create', $podcast->name), [ + 'class' => 'flex p-4 bg-white shadow rounded-xl', + ]) ?> + <?= csrf_field() ?> + + <?= view('_message_block') ?> + + <img src="<?= interact_as_actor() + ->avatar_image_url ?>" alt="<?= interact_as_actor() + ->display_name ?>" class="w-12 h-12 mr-4 rounded-full" /> + <div class="flex flex-col flex-1 min-w-0"> + <?= form_textarea( + [ + 'id' => 'message', + 'name' => 'message', + 'class' => 'form-textarea mb-2', + 'required' => 'required', + 'placeholder' => lang( + 'Note.form.episode_message_placeholder', + ), + ], + old('message', '', false), + [ + 'rows' => 2, + ], + ) ?> + <?= form_input([ + 'id' => 'episode_url', + 'name' => 'episode_url', + 'value' => $episode->link, + 'type' => 'hidden', + ]) ?> + <?= button( + lang('Note.form.submit'), + null, + ['variant' => 'primary', 'size' => 'small'], + ['type' => 'submit', 'class' => 'self-end'], + ) ?> + </div> + <?= form_close() ?> + <hr class="my-4 border border-pine-100"> + <?php foreach ($episode->notes as $note): ?> + <?= view('podcast/_partials/note_authenticated', [ + 'note' => $note, + ]) ?> + <?php endforeach; ?> + </section> + <section id="description" class="prose tab-panel"> + <?= $episode->getDescriptionHtml('-+Website+-') ?> + </section> + </div> + </div> +</div> + +<?= $this->endSection() +?> diff --git a/app/Views/podcast/episodes.php b/app/Views/podcast/episodes.php new file mode 100644 index 0000000000000000000000000000000000000000..8e76c01f6e642e771d0430809b604107445e8c9b --- /dev/null +++ b/app/Views/podcast/episodes.php @@ -0,0 +1,171 @@ +<?= $this->extend('podcast/_layout') ?> + +<?= $this->section('meta-tags') ?> +<link type="application/rss+xml" rel="alternate" title="<?= $podcast->title ?>" href="<?= $podcast->feed_url ?>" /> + +<title><?= $podcast->title ?></title> +<meta name="description" content="<?= htmlspecialchars( + $podcast->description, +) ?>" /> +<link rel="shortcut icon" type="image/png" href="/favicon.ico" /> +<link rel="stylesheet" href="/assets/index.css" /> +<link rel="canonical" href="<?= current_url() ?>" /> +<meta property="og:title" content="<?= $podcast->title ?>" /> +<meta property="og:description" content="<?= $podcast->description ?>" /> +<meta property="og:locale" content="<?= $podcast->language_code ?>" /> +<meta property="og:site_name" content="<?= $podcast->title ?>" /> +<meta property="og:url" content="<?= current_url() ?>" /> +<meta property="og:image" content="<?= $podcast->image->large_url ?>" /> +<meta property="og:image:width" content="<?= config('Images')->largeSize ?>" /> +<meta property="og:image:height" content="<?= config('Images')->largeSize ?>" /> +<meta name="twitter:card" content="summary_large_image" /> +<?= $this->endSection() ?> + +<?= $this->section('content') ?> +<nav class="sticky top-0 flex items-center justify-center pt-2 text-lg bg-pine-50"> + <a href="<?= route_to( + 'podcast-activity', + $podcast->name, + ) ?>" class="px-4 py-1 mr-8 rounded-full hover:bg-pine-100"><?= lang( + 'Podcast.activity', +) ?></a> + <a href="<?= route_to( + 'podcast-episodes', + $podcast->name, + ) ?>" class="px-4 py-1 font-semibold border-b-4 text-pine-800 border-pine-800"><?= lang( + 'Podcast.episodes', +) ?></a> + <?php if ($activeQuery): ?> + <button id="episode-lists-dropdown" type="button" class="inline-flex items-center px-2 py-1 text-sm font-semibold outline-none focus:ring" data-dropdown="button" data-dropdown-target="episode-lists-dropdown-menu" aria-label="<?= lang( + 'Common.more', + ) ?>" aria-haspopup="true" aria-expanded="false"> + <?= $activeQuery['label'] . + ' (' . + $activeQuery['number_of_episodes'] . + ')' . + icon('caret-down', 'ml-2 text-xl') ?> + </button> + <nav id="episode-lists-dropdown-menu" class="flex flex-col py-2 text-black bg-white border rounded shadow" aria-labelledby="episode-lists-dropdown" data-dropdown="menu" data-dropdown-placement="bottom-end"> + <?php foreach ($episodesNav as $link): ?> + <?= anchor( + $link['route'], + $link['label'] . ' (' . $link['number_of_episodes'] . ')', + [ + 'class' => + 'px-2 py-1 whitespace-nowrap ' . + ($link['is_active'] + ? 'font-semibold' + : 'text-gray-600 hover:text-gray-900'), + ], + ) ?> + <?php endforeach; ?> + </nav> + <?php endif; ?> +</nav> + +<section class="flex flex-col max-w-2xl px-6 py-8 mx-auto"> + + <?php if ($episodes): ?> + <h1 class="mb-4 text-xl font-semibold"> + <?php if ($activeQuery['type'] == 'year'): ?> + <?= lang('Podcast.list_of_episodes_year', [ + 'year' => $activeQuery['value'], + 'episodeCount' => count($episodes), + ]) ?> + <?php elseif ($activeQuery['type'] == 'season'): ?> + <?= lang('Podcast.list_of_episodes_season', [ + 'seasonNumber' => $activeQuery['value'], + 'episodeCount' => count($episodes), + ]) ?> + <?php endif; ?> + </h1> + <?php foreach ($episodes as $episode): ?> + <article class="w-full mb-4 bg-white rounded-lg shadow"> + <div class="flex px-4 pt-4 pb-2"> + <img loading="lazy" src="<?= $episode->image + ->thumbnail_url ?>" alt="<?= $episode->title ?>" class="object-cover w-20 h-20 mr-2 rounded-lg" /> + <div class="flex flex-col flex-1"> + <a class="text-sm" href="<?= $episode->link ?>"> + <h2 class="inline-flex justify-between w-full font-semibold leading-none group"> + <span class="mr-1 group-hover:underline"><?= $episode->title ?></span> + <?= episode_numbering( + $episode->number, + $episode->season_number, + 'text-xs font-semibold text-gray-600', + true, + ) ?> + </h2> + </a> + <div class="mb-2 text-xs"> + <time itemprop="published" datetime="<?= $episode->published_at->format( + DateTime::ATOM, + ) ?>" title="<?= $episode->published_at ?>"> + <?= lang('Common.mediumDate', [ + $episode->published_at, + ]) ?> + </time> + <span class="mx-1">•</span> + <time datetime="PT<?= $episode->enclosure_duration ?>S"> + <?= format_duration( + $episode->enclosure_duration, + ) ?> + </time> + </div> + <audio controls preload="none" class="w-full mt-auto"> + <source src="<?= $episode->enclosure_web_url ?>" type="<?= $episode->enclosure_mimetype ?>"> + Your browser does not support the audio tag. + </audio> + </div> + </div> + <div class="px-4 py-2 space-x-4 text-sm"> + <?= anchor( + route_to('episode', $podcast->name, $episode->slug), + icon('chat', 'text-xl mr-1 text-gray-400') . + $episode->notes_total, + [ + 'class' => + 'inline-flex items-center hover:underline', + 'title' => lang('Episode.total_notes', [ + 'numberOfTotalNotes' => $episode->notes_total, + ]), + ], + ) ?> + <?= anchor( + route_to('episode', $podcast->name, $episode->slug), + icon('repeat', 'text-xl mr-1 text-gray-400') . + $episode->reblogs_total, + [ + 'class' => + 'inline-flex items-center hover:underline', + 'title' => lang('Episode.total_reblogs', [ + 'numberOfTotalReblogs' => + $episode->reblogs_total, + ]), + ], + ) ?> + + <?= anchor( + route_to('episode', $podcast->name, $episode->slug), + icon('heart', 'text-xl mr-1 text-gray-400') . + $episode->favourites_total, + [ + 'class' => + 'inline-flex items-center hover:underline', + 'title' => lang('Episode.total_favourites', [ + 'numberOfTotalFavourites' => + $episode->favourites_total, + ]), + ], + ) ?> + </div> + </article> + <?php endforeach; ?> + <?php else: ?> + <h1 class="px-4 mb-2 text-xl text-center"><?= lang( + 'Podcast.no_episode', + ) ?></h1> + <p class="italic text-center"><?= lang('Podcast.no_episode_hint') ?></p> + <?php endif; ?> +</section> + +<?= $this->endSection() ?> diff --git a/app/Views/podcast/episodes_authenticated.php b/app/Views/podcast/episodes_authenticated.php new file mode 100644 index 0000000000000000000000000000000000000000..1d37f1a5b89b4c61cae2d2a4edf3cb252d600a48 --- /dev/null +++ b/app/Views/podcast/episodes_authenticated.php @@ -0,0 +1,171 @@ +<?= $this->extend('podcast/_layout_authenticated') ?> + +<?= $this->section('meta-tags') ?> +<link type="application/rss+xml" rel="alternate" title="<?= $podcast->title ?>" href="<?= $podcast->feed_url ?>" /> + +<title><?= $podcast->title ?></title> +<meta name="description" content="<?= htmlspecialchars( + $podcast->description, +) ?>" /> +<link rel="shortcut icon" type="image/png" href="/favicon.ico" /> +<link rel="stylesheet" href="/assets/index.css" /> +<link rel="canonical" href="<?= current_url() ?>" /> +<meta property="og:title" content="<?= $podcast->title ?>" /> +<meta property="og:description" content="<?= $podcast->description ?>" /> +<meta property="og:locale" content="<?= $podcast->language_code ?>" /> +<meta property="og:site_name" content="<?= $podcast->title ?>" /> +<meta property="og:url" content="<?= current_url() ?>" /> +<meta property="og:image" content="<?= $podcast->image->large_url ?>" /> +<meta property="og:image:width" content="<?= config('Images')->largeSize ?>" /> +<meta property="og:image:height" content="<?= config('Images')->largeSize ?>" /> +<meta name="twitter:card" content="summary_large_image" /> +<?= $this->endSection() ?> + +<?= $this->section('content') ?> +<nav class="sticky top-0 flex items-center justify-center pt-2 text-lg bg-pine-50"> + <a href="<?= route_to( + 'podcast-activity', + $podcast->name, + ) ?>" class="px-4 py-1 mr-8 rounded-full hover:bg-pine-100"><?= lang( + 'Podcast.activity', +) ?></a> + <a href="<?= route_to( + 'podcast-episodes', + $podcast->name, + ) ?>" class="px-4 py-1 font-semibold border-b-4 text-pine-800 border-pine-800"><?= lang( + 'Podcast.episodes', +) ?></a> + <?php if ($activeQuery): ?> + <button id="episode-lists-dropdown" type="button" class="inline-flex items-center px-2 py-1 text-sm font-semibold outline-none focus:ring" data-dropdown="button" data-dropdown-target="episode-lists-dropdown-menu" aria-label="<?= lang( + 'Common.more', + ) ?>" aria-haspopup="true" aria-expanded="false"> + <?= $activeQuery['label'] . + ' (' . + $activeQuery['number_of_episodes'] . + ')' . + icon('caret-down', 'ml-2 text-xl') ?> + </button> + <nav id="episode-lists-dropdown-menu" class="flex flex-col py-2 text-black bg-white border rounded shadow" aria-labelledby="episode-lists-dropdown" data-dropdown="menu" data-dropdown-placement="bottom-end"> + <?php foreach ($episodesNav as $link): ?> + <?= anchor( + $link['route'], + $link['label'] . ' (' . $link['number_of_episodes'] . ')', + [ + 'class' => + 'px-2 py-1 whitespace-nowrap ' . + ($link['is_active'] + ? 'font-semibold' + : 'text-gray-600 hover:text-gray-900'), + ], + ) ?> + <?php endforeach; ?> + </nav> + <?php endif; ?> +</nav> + +<section class="flex flex-col max-w-2xl px-6 py-8 mx-auto"> + + <?php if ($episodes): ?> + <h1 class="mb-4 text-xl font-semibold"> + <?php if ($activeQuery['type'] == 'year'): ?> + <?= lang('Podcast.list_of_episodes_year', [ + 'year' => $activeQuery['value'], + 'episodeCount' => count($episodes), + ]) ?> + <?php elseif ($activeQuery['type'] == 'season'): ?> + <?= lang('Podcast.list_of_episodes_season', [ + 'seasonNumber' => $activeQuery['value'], + 'episodeCount' => count($episodes), + ]) ?> + <?php endif; ?> + </h1> + <?php foreach ($episodes as $episode): ?> + <article class="w-full mb-4 bg-white rounded-lg shadow"> + <div class="flex px-4 pt-4 pb-2"> + <img loading="lazy" src="<?= $episode->image + ->thumbnail_url ?>" alt="<?= $episode->title ?>" class="object-cover w-20 h-20 mr-2 rounded-lg" /> + <div class="flex flex-col flex-1"> + <a class="text-sm" href="<?= $episode->link ?>"> + <h2 class="inline-flex justify-between w-full font-semibold leading-none group"> + <span class="mr-1 group-hover:underline"><?= $episode->title ?></span> + <?= episode_numbering( + $episode->number, + $episode->season_number, + 'text-xs font-semibold text-gray-600', + true, + ) ?> + </h2> + </a> + <div class="mb-2 text-xs"> + <time itemprop="published" datetime="<?= $episode->published_at->format( + DateTime::ATOM, + ) ?>" title="<?= $episode->published_at ?>"> + <?= lang('Common.mediumDate', [ + $episode->published_at, + ]) ?> + </time> + <span class="mx-1">•</span> + <time datetime="PT<?= $episode->enclosure_duration ?>S"> + <?= format_duration( + $episode->enclosure_duration, + ) ?> + </time> + </div> + <audio controls preload="none" class="w-full mt-auto"> + <source src="<?= $episode->enclosure_web_url ?>" type="<?= $episode->enclosure_mimetype ?>"> + Your browser does not support the audio tag. + </audio> + </div> + </div> + <div class="px-4 py-2 space-x-4 text-sm"> + <?= anchor( + route_to('episode', $podcast->name, $episode->slug), + icon('chat', 'text-xl mr-1 text-gray-400') . + $episode->notes_total, + [ + 'class' => + 'inline-flex items-center hover:underline', + 'title' => lang('Episode.total_notes', [ + 'numberOfTotalNotes' => $episode->notes_total, + ]), + ], + ) ?> + <?= anchor( + route_to('episode', $podcast->name, $episode->slug), + icon('repeat', 'text-xl mr-1 text-gray-400') . + $episode->reblogs_total, + [ + 'class' => + 'inline-flex items-center hover:underline', + 'title' => lang('Episode.total_reblogs', [ + 'numberOfTotalReblogs' => + $episode->reblogs_total, + ]), + ], + ) ?> + <?= anchor( + route_to('episode', $podcast->name, $episode->slug), + icon('heart', 'text-xl mr-1 text-gray-400') . + $episode->favourites_total, + [ + 'class' => + 'inline-flex items-center hover:underline', + 'title' => lang('Episode.total_favourites', [ + 'numberOfTotalFavourites' => + $episode->favourites_total, + ]), + ], + ) ?> + </div> + </article> + <?php endforeach; ?> + <?php else: ?> + <h1 class="px-4 mb-2 text-xl text-center"><?= lang( + 'Podcast.no_episode', + ) ?></h1> + <p class="italic text-center"><?= lang('Podcast.no_episode_hint') ?></p> + <?php endif; ?> +</section> + +<?= $this->endSection() +?> diff --git a/app/Views/podcast/follow.php b/app/Views/podcast/follow.php new file mode 100644 index 0000000000000000000000000000000000000000..063367661c6aeee2676a12975c06106a8ab1d44a --- /dev/null +++ b/app/Views/podcast/follow.php @@ -0,0 +1,91 @@ +<?= helper('page') ?> + +<!DOCTYPE html> +<html lang="<?= service('request')->getLocale() ?>"> + +<head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <link rel="shortcut icon" type="image/png" href="/favicon.ico" /> + <link rel="stylesheet" href="/assets/index.css" /> + + <title><?= lang('Podcast.follow.title', [ + 'actorDisplayName' => $actor->display_name, + ]) ?></title> + <meta name="description" content="<?= $actor->summary ?>"/> + <meta property="og:title" content="<?= lang('Podcast.follow.title', [ + 'actorDisplayName' => $actor->display_name, + ]) ?>"/> + <meta property="og:locale" content="<?= service( + 'request', + )->getLocale() ?>" /> + <meta property="og:url" content="<?= current_url() ?>" /> + <meta property="og:image" content="<?= $actor->avatar_image_url ?>" /> + <meta property="og:description" content="<?= $actor->summary ?>" /> +</head> + + +<body class="flex flex-col min-h-screen bg-pine-50"> + <header class="flex flex-col items-center mb-8"> + <h1 class="w-full pt-8 pb-32 text-center text-white bg-pine-900"><?= lang( + 'ActivityPub.follow.subtitle', + ) ?></h1> + <div class="flex flex-col w-full max-w-xs -mt-24 overflow-hidden bg-white shadow rounded-xl"> + <?php if ($actor->cover_image_url): ?> + <img src="<?= $actor->cover_image_url ?>" alt="" class="object-cover w-full h-32 bg-pine-800" /> + <?php else: ?> + <div class="w-full h-32 bg-pine-800"></div> + <?php endif; ?> + <div class="flex px-4 py-2"> + <img src="<?= $actor->avatar_image_url ?>" alt="<?= $actor->display_name ?>" + class="w-16 h-16 mr-4 -mt-8 rounded-full shadow-xl ring-2 ring-white" /> + <div class=""> + <p class="font-semibold"><?= $actor->display_name ?></p> + <p class="text-sm text-gray-500">@<?= $actor->username ?></p> + </div> + </div> + </div> + </header> + + <main class="w-full max-w-md px-4 mx-auto"> + <?= form_open(route_to('attempt-follow', $actor->username), [ + 'method' => 'post', + 'class' => 'flex flex-col', + ]) ?> + <?= csrf_field() ?> + <?= view('_message_block') ?> + + <?= form_label( + lang('ActivityPub.your_handle'), + 'handle', + [], + lang('ActivityPub.your_handle_hint'), + ) ?> + <?= form_input([ + 'id' => 'handle', + 'name' => 'handle', + 'class' => 'form-input mb-4', + 'required' => 'required', + 'type' => 'text', + ]) ?> + + <?= button( + lang('ActivityPub.follow.submit'), + null, + ['variant' => 'primary'], + ['type' => 'submit', 'class' => 'self-end'], + ) ?> + <?= form_close() ?> + </main> + + <footer + class="container flex flex-col items-center px-2 py-4 mx-auto mt-auto text-xs border-t md:justify-between md:flex-row"> + <?= render_page_links('inline-flex mb-4 md:mb-0') ?> + <p> + <?= lang('Common.powered_by', [ + 'castopod' => + '<a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>', + ]) ?> + </p> + </footer> +</body> \ No newline at end of file diff --git a/app/Views/podcast/note.php b/app/Views/podcast/note.php new file mode 100644 index 0000000000000000000000000000000000000000..810af1c16ef85c2d066b3e27d06ae9e633e7ce2c --- /dev/null +++ b/app/Views/podcast/note.php @@ -0,0 +1,38 @@ +<?= $this->extend('podcast/_layout') ?> + +<?= $this->section('meta-tags') ?> + <title><?= lang('Note.title', [ + 'actorDisplayName' => $note->actor->display_name, + ]) ?></title> + <meta name="description" content="<?= $note->message ?>"/> + <meta property="og:title" content="<?= lang('Note.title', [ + 'actorDisplayName' => $note->actor->display_name, + ]) ?>"/> + <meta property="og:locale" content="<?= service( + 'request', + )->getLocale() ?>" /> + <meta property="og:site_name" content="<?= $note->actor->display_name ?>" /> + <meta property="og:url" content="<?= current_url() ?>" /> + <meta property="og:image" content="<?= $note->actor->avatar_image_url ?>" /> + <meta property="og:description" content="<?= $note->message ?>" /> +<?= $this->endSection() ?> + +<?= $this->section('content') ?> +<div class="max-w-2xl px-6 mx-auto"> + <nav class="py-3"> + <a href="<?= route_to('podcast-activity', $podcast->name) ?>" + class="inline-flex items-center px-4 py-2 text-sm"><?= icon( + 'arrow-left', + 'mr-2 text-lg', + ) . + lang('Note.back_to_actor_notes', [ + 'actor' => $note->actor->display_name, + ]) ?></a> + </nav> + <div class="pb-12"> + <?= $this->include('podcast/_partials/note_with_replies') ?> + </div> +</div> + +<?= $this->endSection() +?> diff --git a/app/Views/podcast/note_authenticated.php b/app/Views/podcast/note_authenticated.php new file mode 100644 index 0000000000000000000000000000000000000000..2d26d1b0a02fe37b9e7afecb88b2d88b70f3f281 --- /dev/null +++ b/app/Views/podcast/note_authenticated.php @@ -0,0 +1,40 @@ +<?= $this->extend('podcast/_layout_authenticated') ?> + +<?= $this->section('meta-tags') ?> + <title><?= lang('Note.title', [ + 'actorDisplayName' => $note->actor->display_name, + ]) ?></title> + <meta name="description" content="<?= $note->message ?>"/> + <meta property="og:title" content="<?= lang('Note.title', [ + 'actorDisplayName' => $note->actor->display_name, + ]) ?>"/> + <meta property="og:locale" content="<?= service( + 'request', + )->getLocale() ?>" /> + <meta property="og:site_name" content="<?= $note->actor->display_name ?>" /> + <meta property="og:url" content="<?= current_url() ?>" /> + <meta property="og:image" content="<?= $note->actor->avatar_image_url ?>" /> + <meta property="og:description" content="<?= $note->message ?>" /> +<?= $this->endSection() ?> + +<?= $this->section('content') ?> +<div class="max-w-2xl px-6 mx-auto"> + <nav class="py-3"> + <a href="<?= route_to('podcast-activity', $podcast->name) ?>" + class="inline-flex items-center px-4 py-2 text-sm"><?= icon( + 'arrow-left', + 'mr-2 text-lg', + ) . + lang('Note.back_to_actor_notes', [ + 'actor' => $note->actor->display_name, + ]) ?></a> + </nav> + <div class="pb-12"> + <?= $this->include( + 'podcast/_partials/note_with_replies_authenticated', + ) ?> + </div> +</div> + +<?= $this->endSection() +?> diff --git a/app/Views/podcast/note_remote_action.php b/app/Views/podcast/note_remote_action.php new file mode 100644 index 0000000000000000000000000000000000000000..99a4cd92f56ee7f2c5b32c75697d9298c0edc57e --- /dev/null +++ b/app/Views/podcast/note_remote_action.php @@ -0,0 +1,69 @@ +<!DOCTYPE html> +<html lang="<?= service('request')->getLocale() ?>"> + +<head> + <meta charset="UTF-8"/> + <meta name="viewport" content="width=device-width, initial-scale=1.0"/> + <link rel="shortcut icon" type="image/png" href="/favicon.ico" /> + + <title><?= lang('ActivityPub.' . $action . '.title', [ + 'actorDisplayName' => $note->actor->display_name, + ]) ?></title> + <meta name="description" content="<?= $note->message ?>"/> + <meta property="og:title" content="<?= lang( + 'ActivityPub.' . $action . '.title', + [ + 'actorDisplayName' => $note->actor->display_name, + ], + ) ?>"/> + <meta property="og:locale" content="<?= service( + 'request', + )->getLocale() ?>" /> + <meta property="og:site_name" content="<?= $note->actor->display_name ?>" /> + <meta property="og:url" content="<?= current_url() ?>" /> + <meta property="og:image" content="<?= $note->actor->avatar_image_url ?>" /> + <meta property="og:description" content="<?= $note->message ?>" /> + + <link rel="stylesheet" href="/assets/index.css"/> + <script src="/assets/podcast.js" type="module"></script> +</head> + +<body class="min-h-screen mx-auto bg-pine-50"> + <header class="pt-8 pb-32 bg-pine-900"> + <h1 class="text-lg font-semibold text-center text-white"><?= lang( + 'ActivityPub.' . $action . '.subtitle', + ) ?></h1> + </header> + <main class="flex-1 max-w-xl px-4 pb-8 mx-auto -mt-24"> + <?= $this->include('podcast/_partials/note') ?> + + <?= form_open( + route_to('note-attempt-remote-action', $note->id, $action), + ['method' => 'post', 'class' => 'flex flex-col mt-8'], + ) ?> + <?= csrf_field() ?> + <?= view('_message_block') ?> + + <?= form_label( + lang('ActivityPub.your_handle'), + 'handle', + [], + lang('ActivityPub.your_handle_hint'), + ) ?> + <?= form_input([ + 'id' => 'handle', + 'name' => 'handle', + 'class' => 'form-input mb-4', + 'required' => 'required', + 'type' => 'text', + ]) ?> + + <?= button( + lang('ActivityPub.' . $action . '.submit'), + null, + ['variant' => 'primary'], + ['type' => 'submit', 'class' => 'self-end'], + ) ?> + <?= form_close() ?> + </main> +</body> diff --git a/castopod_namespace.json b/castopod_namespace.json new file mode 100644 index 0000000000000000000000000000000000000000..41faccfaeb2428d25ce6ac507261d6f97b79b43a --- /dev/null +++ b/castopod_namespace.json @@ -0,0 +1,31 @@ +{ + "@context": { + "id": "@id", + "type": "@type", + "as": "https://www.w3.org/ns/activitystreams#", + "schema": "http://schema.org#", + "cp": "https://castopod.org/ns#", + "xsd": "http://www.w3.org/2001/XMLSchema#", + "Podcast": "cp:Podcast", + "Episode": "cp:Episode", + "size": { + "@id": "cp:size", + "@type": "xsd:nonNegativeInteger" + }, + "season": { + "@id": "cp:season", + "@type": "xsd:nonNegativeInteger" + }, + "episode": { + "@id": "cp:episode", + "@type": "xsd:nonNegativeInteger" + }, + "cover": { + "@id": "cp:cover", + "@type": "as:Link" + }, + "copyright": "cp:copyright", + "category": "sc:category", + "language": "sc:inLanguage" + } +} diff --git a/composer.json b/composer.json index 94ea12429a98951e5a0e5d0d34f4edf3303b486a..e5a5e9e9d935db895b13b9b3b88cfd87f57bdee4 100644 --- a/composer.json +++ b/composer.json @@ -6,23 +6,35 @@ "homepage": "https://castopod.org", "license": "AGPL-3.0-or-later", "require": { - "php": ">=7.2", + "php": "^7.3||^8.0", "james-heinrich/getid3": "~2.0.0-dev", - "whichbrowser/parser": "^2.0", - "geoip2/geoip2": "~2.0", + "whichbrowser/parser": "^v2.1.1", + "geoip2/geoip2": "^v2.11.0", "myth/auth": "dev-develop", "codeigniter4/codeigniter4": "dev-develop", - "league/commonmark": "^1.5", - "vlucas/phpdotenv": "^5.2", + "league/commonmark": "^1.5.7", + "vlucas/phpdotenv": "^v5.3.0", "league/html-to-markdown": "^4.10", - "opawg/user-agents-php": "^1.0", - "podlibre/ipcat": "^1.0", - "podlibre/podcast-namespace": "^1.0.6" + "opawg/user-agents-php": "^v1.0", + "podlibre/ipcat": "^v1.0", + "podlibre/podcast-namespace": "^v1.0.6", + "phpseclib/phpseclib": "~2.0.30", + "michalsn/codeigniter4-uuid": "^1.0@beta", + "essence/essence": "^3.5.4" }, "require-dev": { - "mikey179/vfsstream": "1.6.*", - "phpunit/phpunit": "8.5.*", - "squizlabs/php_codesniffer": "3.*" + "mikey179/vfsstream": "^v1.6.8", + "phpunit/phpunit": "^9.5.1", + "squizlabs/php_codesniffer": "3.5.8" + }, + "autoload": { + "psr-4": { + "App\\": "app", + "Config\\": "app/Config" + }, + "exclude-from-classmap": [ + "**/Database/Migrations/**" + ] }, "autoload-dev": { "psr-4": { diff --git a/composer.lock b/composer.lock index 1b9ff8f66f222bd7afed3da7aa130bca510a828f..e79f6d1b58a9c4a021e7e651d7557fecd602c3ff 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,76 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "28acb40506572ff4a0b98ad097a14763", + "content-hash": "0d419d654c43fa6e14f8a96b42258a91", "packages": [ + { + "name": "brick/math", + "version": "0.9.2", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "dff976c2f3487d42c1db75a3b180e2b9f0e72ce0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/dff976c2f3487d42c1db75a3b180e2b9f0e72ce0", + "reference": "dff976c2f3487d42c1db75a3b180e2b9f0e72ce0", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0", + "vimeo/psalm": "4.3.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.9.2" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/brick/math", + "type": "tidelift" + } + ], + "time": "2021-01-20T22:51:39+00:00" + }, { "name": "codeigniter4/codeigniter4", "version": "dev-develop", "source": { "type": "git", "url": "https://github.com/codeigniter4/CodeIgniter4.git", - "reference": "b184bb577376f7d31026ebf93c092f768f5fba38" + "reference": "425bca14c840c08b935d730c73da372f3d4bdef8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/CodeIgniter4/zipball/b184bb577376f7d31026ebf93c092f768f5fba38", - "reference": "b184bb577376f7d31026ebf93c092f768f5fba38", + "url": "https://api.github.com/repos/codeigniter4/CodeIgniter4/zipball/425bca14c840c08b935d730c73da372f3d4bdef8", + "reference": "425bca14c840c08b935d730c73da372f3d4bdef8", "shasum": "" }, "require": { @@ -27,29 +83,37 @@ "ext-mbstring": "*", "kint-php/kint": "^3.3", "laminas/laminas-escaper": "^2.6", - "php": ">=7.2", + "php": "^7.3||^8.0", "psr/log": "^1.1" }, "require-dev": { "codeigniter4/codeigniter4-standard": "^1.0", "fakerphp/faker": "^1.9", + "johnkary/phpunit-speedtrap": "^3.3", "mikey179/vfsstream": "^1.6", - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^8.5", + "phpstan/phpstan": "0.12.82", + "phpunit/phpunit": "^9.1", "predis/predis": "^1.1", - "rector/rector": "^0.8", + "rector/rector": "^0.10", "squizlabs/php_codesniffer": "^3.3" }, + "suggest": { + "ext-fileinfo": "Improves mime type detection for files" + }, "default-branch": true, "type": "project", "autoload": { "psr-4": { "CodeIgniter\\": "system/" - } + }, + "exclude-from-classmap": [ + "**/Database/Migrations/**" + ] }, "autoload-dev": { "psr-4": { - "Utils\\": "utils" + "CodeIgniter\\": "tests/system/", + "Utils\\": "utils/" } }, "scripts": { @@ -75,20 +139,20 @@ "slack": "https://codeigniterchat.slack.com", "issues": "https://github.com/codeigniter4/CodeIgniter4/issues" }, - "time": "2020-11-28T07:23:01+00:00" + "time": "2021-03-25T19:47:47+00:00" }, { "name": "composer/ca-bundle", - "version": "1.2.8", + "version": "1.2.9", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "8a7ecad675253e4654ea05505233285377405215" + "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/8a7ecad675253e4654ea05505233285377405215", - "reference": "8a7ecad675253e4654ea05505233285377405215", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/78a0e288fdcebf92aa2318a8d3656168da6ac1a5", + "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5", "shasum": "" }, "require": { @@ -97,14 +161,15 @@ "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8", + "phpstan/phpstan": "^0.12.55", "psr/log": "^1.0", + "symfony/phpunit-bridge": "^4.2 || ^5", "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-main": "1.x-dev" } }, "autoload": { @@ -134,7 +199,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.2.8" + "source": "https://github.com/composer/ca-bundle/tree/1.2.9" }, "funding": [ { @@ -150,7 +215,204 @@ "type": "tidelift" } ], - "time": "2020-08-23T12:54:47+00:00" + "time": "2021-01-12T12:10:35+00:00" + }, + { + "name": "essence/dom", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/essence/dom.git", + "reference": "e5776d2286f4ccbd048d160c28ac77ccc6d68f3a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/essence/dom/zipball/e5776d2286f4ccbd048d160c28ac77ccc6d68f3a", + "reference": "e5776d2286f4ccbd048d160c28ac77ccc6d68f3a", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Essence\\Dom\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Félix Girault", + "email": "felix.girault@gmail.com", + "homepage": "http://www.felix-girault.fr", + "role": "Developer" + } + ], + "description": "Essence's DOM parser.", + "homepage": "http://github.com/essence/dom", + "keywords": [ + "dom", + "parser" + ], + "support": { + "issues": "https://github.com/essence/dom/issues", + "source": "https://github.com/essence/dom/tree/1.0.0" + }, + "time": "2015-07-23T20:33:17+00:00" + }, + { + "name": "essence/essence", + "version": "3.5.4", + "source": { + "type": "git", + "url": "https://github.com/essence/essence.git", + "reference": "81e889a87603840dadd04b317a51487df1d45933" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/essence/essence/zipball/81e889a87603840dadd04b317a51487df1d45933", + "reference": "81e889a87603840dadd04b317a51487df1d45933", + "shasum": "" + }, + "require": { + "essence/dom": "~1.0.0", + "essence/http": "~1.0.0", + "fg/parkour": "~1.1.0", + "php": ">=5.5.0" + }, + "suggest": { + "ext-curl": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Essence\\": "lib/Essence" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Félix Girault", + "email": "felix.girault@gmail.com", + "homepage": "http://www.felix-girault.fr", + "role": "Developer" + } + ], + "description": "Extracts information about medias on the web, like youtube videos, twitter statuses or blog articles.", + "homepage": "http://github.com/essence/essence", + "keywords": [ + "embed", + "media", + "oembed", + "opengraph" + ], + "support": { + "issues": "https://github.com/essence/essence/issues", + "source": "https://github.com/essence/essence/tree/3.5.4" + }, + "time": "2021-01-21T09:58:10+00:00" + }, + { + "name": "essence/http", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/essence/http.git", + "reference": "ce0e52e0c0f2ed894ce2922ab2fd598dcaac91d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/essence/http/zipball/ce0e52e0c0f2ed894ce2922ab2fd598dcaac91d2", + "reference": "ce0e52e0c0f2ed894ce2922ab2fd598dcaac91d2", + "shasum": "" + }, + "suggest": { + "ext-curl": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Essence\\Http\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Félix Girault", + "email": "felix.girault@gmail.com", + "homepage": "http://www.felix-girault.fr", + "role": "Developer" + } + ], + "description": "Essence's HTTP client.", + "homepage": "http://github.com/essence/http", + "keywords": [ + "client", + "http" + ], + "support": { + "issues": "https://github.com/essence/http/issues", + "source": "https://github.com/essence/http/tree/1.0.0" + }, + "time": "2015-07-23T20:33:50+00:00" + }, + { + "name": "fg/parkour", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/felixgirault/parkour.git", + "reference": "f837eb640fc4aac81b11fe50d2fa04fb4ec71496" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/felixgirault/parkour/zipball/f837eb640fc4aac81b11fe50d2fa04fb4ec71496", + "reference": "f837eb640fc4aac81b11fe50d2fa04fb4ec71496", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "4.3.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Parkour\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Félix Girault", + "email": "felix.girault@gmail.com", + "homepage": "http://www.felix-girault.fr", + "role": "Developer" + } + ], + "description": "A collection of utilities to manipulate arrays.", + "homepage": "http://github.com/felixgirault/parkour", + "keywords": [ + "array", + "manipulation", + "traversing" + ], + "support": { + "issues": "https://github.com/felixgirault/parkour/issues", + "source": "https://github.com/felixgirault/parkour/tree/1.1.1" + }, + "time": "2015-10-03T10:39:22+00:00" }, { "name": "geoip2/geoip2", @@ -499,24 +761,26 @@ }, { "name": "laminas/laminas-zendframework-bridge", - "version": "1.1.1", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642" + "reference": "6cccbddfcfc742eb02158d6137ca5687d92cee32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642", + "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6cccbddfcfc742eb02158d6137ca5687d92cee32", + "reference": "6cccbddfcfc742eb02158d6137ca5687d92cee32", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0 || ^8.0" + "php": "^7.3 || ^8.0" }, "require-dev": { "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", - "squizlabs/php_codesniffer": "^3.5" + "psalm/plugin-phpunit": "^0.15.1", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.6" }, "type": "library", "extra": { @@ -555,7 +819,7 @@ "type": "community_bridge" } ], - "time": "2020-09-14T14:23:00+00:00" + "time": "2021-02-25T21:54:58+00:00" }, { "name": "league/commonmark", @@ -746,27 +1010,28 @@ }, { "name": "maxmind-db/reader", - "version": "v1.8.0", + "version": "v1.10.0", "source": { "type": "git", "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git", - "reference": "b566d429ac9aec10594b0935be8ff38302f8d5c8" + "reference": "07f84d969cfc527ce49388558a366ad376f1f35c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/b566d429ac9aec10594b0935be8ff38302f8d5c8", - "reference": "b566d429ac9aec10594b0935be8ff38302f8d5c8", + "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/07f84d969cfc527ce49388558a366ad376f1f35c", + "reference": "07f84d969cfc527ce49388558a366ad376f1f35c", "shasum": "" }, "require": { "php": ">=7.2" }, "conflict": { - "ext-maxminddb": "<1.8.0,>=2.0.0" + "ext-maxminddb": "<1.10.0,>=2.0.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "2.*", + "friendsofphp/php-cs-fixer": "*", "php-coveralls/php-coveralls": "^2.1", + "phpstan/phpstan": "*", "phpunit/phpcov": ">=6.0.0", "phpunit/phpunit": ">=8.0.0,<10.0.0", "squizlabs/php_codesniffer": "3.*" @@ -804,9 +1069,9 @@ ], "support": { "issues": "https://github.com/maxmind/MaxMind-DB-Reader-php/issues", - "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.8.0" + "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.10.0" }, - "time": "2020-10-01T17:30:21+00:00" + "time": "2021-02-09T17:52:47+00:00" }, { "name": "maxmind/web-service-common", @@ -858,30 +1123,86 @@ }, "time": "2020-11-02T17:00:53+00:00" }, + { + "name": "michalsn/codeigniter4-uuid", + "version": "v1.0.0-beta2", + "source": { + "type": "git", + "url": "https://github.com/michalsn/codeigniter4-uuid.git", + "reference": "a5f9751570a3b27e81deaa7548eef507499be888" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/michalsn/codeigniter4-uuid/zipball/a5f9751570a3b27e81deaa7548eef507499be888", + "reference": "a5f9751570a3b27e81deaa7548eef507499be888", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "ramsey/uuid": "^4.0" + }, + "require-dev": { + "codeigniter4/codeigniter4": "dev-develop", + "phpunit/phpunit": "8.5.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Michalsn\\Uuid\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "michalsn", + "homepage": "https://github.com/michalsn", + "role": "Developer" + } + ], + "description": "UUID package for CodeIgniter 4 with support for Model and Entity.", + "homepage": "https://github.com/michalsn/codeigniter4-uuid", + "keywords": [ + "codeigniter4", + "entity", + "model", + "uuid" + ], + "support": { + "issues": "https://github.com/michalsn/codeigniter4-uuid/issues", + "source": "https://github.com/michalsn/codeigniter4-uuid/tree/develop" + }, + "time": "2020-08-16T07:56:20+00:00" + }, { "name": "myth/auth", "version": "dev-develop", "source": { "type": "git", "url": "https://github.com/lonnieezell/myth-auth.git", - "reference": "26787ff2610089810c2b8e532f426cde1e83ae5e" + "reference": "a11dc6369177c932add936f1be3844c30fe45ed4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lonnieezell/myth-auth/zipball/26787ff2610089810c2b8e532f426cde1e83ae5e", - "reference": "26787ff2610089810c2b8e532f426cde1e83ae5e", + "url": "https://api.github.com/repos/lonnieezell/myth-auth/zipball/a11dc6369177c932add936f1be3844c30fe45ed4", + "reference": "a11dc6369177c932add936f1be3844c30fe45ed4", "shasum": "" }, "require": { - "php": ">=7.2" + "php": "^7.3 || ^8.0" + }, + "provide": { + "codeigniter4/authentication-implementation": "1.0" }, "require-dev": { "codeigniter4/codeigniter4": "dev-develop", "codeigniter4/codeigniter4-standard": "^1.0", - "fzaninotto/faker": "^1.9@dev", + "fakerphp/faker": "^1.9", "mockery/mockery": "^1.0", "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^8.5", + "phpunit/phpunit": "^9.0", "squizlabs/php_codesniffer": "^3.5" }, "default-branch": true, @@ -889,7 +1210,10 @@ "autoload": { "psr-4": { "Myth\\Auth\\": "src" - } + }, + "exclude-from-classmap": [ + "**/Database/Migrations/**" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -924,7 +1248,7 @@ "type": "patreon" } ], - "time": "2020-11-16T15:37:16+00:00" + "time": "2021-03-23T03:55:24+00:00" }, { "name": "opawg/user-agents-php", @@ -1034,42 +1358,151 @@ "time": "2020-07-20T17:29:33+00:00" }, { - "name": "podlibre/ipcat", - "version": "v1.0", + "name": "phpseclib/phpseclib", + "version": "2.0.30", "source": { "type": "git", - "url": "https://github.com/podlibre/ipcat.git", - "reference": "1adfc821be508ddc8a742f6a5d5e6e42fdf28e86" + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "136b9ca7eebef78be14abf90d65c5e57b6bc5d36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/podlibre/ipcat/zipball/1adfc821be508ddc8a742f6a5d5e6e42fdf28e86", - "reference": "1adfc821be508ddc8a742f6a5d5e6e42fdf28e86", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/136b9ca7eebef78be14abf90d65c5e57b6bc5d36", + "reference": "136b9ca7eebef78be14abf90d65c5e57b6bc5d36", "shasum": "" }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phing/phing": "~2.7", + "phpunit/phpunit": "^4.8.35|^5.7|^6.0|^9.4", + "squizlabs/php_codesniffer": "~2.0" + }, + "suggest": { + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, "type": "library", "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], "psr-4": { - "Podlibre\\Ipcat\\": "" + "phpseclib\\": "phpseclib/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "GPL-3.0-only" + "MIT" ], "authors": [ { - "name": "Benjamin Bellamy", - "email": "ben@podlibre.org", - "homepage": "https://podlibre.org/" + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" } ], - "description": "Categorization of IP Addresses forked from https://github.com/client9/ipcat", - "homepage": "https://github.com/podlibre/ipcat", + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], "support": { - "source": "https://github.com/podlibre/ipcat/tree/v1.0" + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/2.0.30" }, - "time": "2020-10-05T17:15:07+00:00" + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2020-12-17T05:42:04+00:00" + }, + { + "name": "podlibre/ipcat", + "version": "v1.0", + "source": { + "type": "git", + "url": "https://github.com/podlibre/ipcat.git", + "reference": "1adfc821be508ddc8a742f6a5d5e6e42fdf28e86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/podlibre/ipcat/zipball/1adfc821be508ddc8a742f6a5d5e6e42fdf28e86", + "reference": "1adfc821be508ddc8a742f6a5d5e6e42fdf28e86", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Podlibre\\Ipcat\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-only" + ], + "authors": [ + { + "name": "Benjamin Bellamy", + "email": "ben@podlibre.org", + "homepage": "https://podlibre.org/" + } + ], + "description": "Categorization of IP Addresses forked from https://github.com/client9/ipcat", + "homepage": "https://github.com/podlibre/ipcat", + "support": { + "source": "https://github.com/podlibre/ipcat/tree/v1.0" + }, + "time": "2020-10-05T17:15:07+00:00" }, { "name": "podlibre/podcast-namespace", @@ -1199,18 +1632,187 @@ }, "time": "2020-03-23T09:12:05+00:00" }, + { + "name": "ramsey/collection", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1", + "reference": "28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8" + }, + "require-dev": { + "captainhook/captainhook": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "ergebnis/composer-normalize": "^2.6", + "fakerphp/faker": "^1.5", + "hamcrest/hamcrest-php": "^2", + "jangregor/phpstan-prophecy": "^0.8", + "mockery/mockery": "^1.3", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^0.12.32", + "phpstan/phpstan-mockery": "^0.12.5", + "phpstan/phpstan-phpunit": "^0.12.11", + "phpunit/phpunit": "^8.5 || ^9", + "psy/psysh": "^0.10.4", + "slevomat/coding-standard": "^6.3", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP 7.2+ library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/1.1.3" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2021-01-21T17:40:04+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.1.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "cd4032040a750077205918c86049aa0f43d22947" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/cd4032040a750077205918c86049aa0f43d22947", + "reference": "cd4032040a750077205918c86049aa0f43d22947", + "shasum": "" + }, + "require": { + "brick/math": "^0.8 || ^0.9", + "ext-json": "*", + "php": "^7.2 || ^8", + "ramsey/collection": "^1.0", + "symfony/polyfill-ctype": "^1.8" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "codeception/aspect-mock": "^3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7.0", + "doctrine/annotations": "^1.8", + "goaop/framework": "^2", + "mockery/mockery": "^1.3", + "moontoast/math": "^1.1", + "paragonie/random-lib": "^2", + "php-mock/php-mock-mockery": "^1.3", + "php-mock/php-mock-phpunit": "^2.5", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^0.17.1", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5", + "psy/psysh": "^0.10.0", + "slevomat/coding-standard": "^6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "3.9.4" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-ctype": "Enables faster processing of character classification using ctype functions.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Uuid\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "homepage": "https://github.com/ramsey/uuid", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "rss": "https://github.com/ramsey/uuid/releases.atom", + "source": "https://github.com/ramsey/uuid" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + } + ], + "time": "2020-08-18T17:17:46+00:00" + }, { "name": "symfony/polyfill-ctype", - "version": "v1.20.0", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41" + "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41", - "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", + "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", "shasum": "" }, "require": { @@ -1222,7 +1824,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.22-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1260,7 +1862,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.20.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1" }, "funding": [ { @@ -1276,20 +1878,20 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-01-07T16:49:33+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.20.0", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" + "reference": "5232de97ee3b75b0360528dae24e73db49566ab1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1", + "reference": "5232de97ee3b75b0360528dae24e73db49566ab1", "shasum": "" }, "require": { @@ -1301,7 +1903,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.22-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1340,7 +1942,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.1" }, "funding": [ { @@ -1356,20 +1958,20 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-01-22T09:19:47+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.20.0", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" + "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", - "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", + "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", "shasum": "" }, "require": { @@ -1378,7 +1980,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.22-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1423,7 +2025,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.20.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1" }, "funding": [ { @@ -1439,20 +2041,20 @@ "type": "tidelift" } ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-01-07T16:49:33+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v5.2.0", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "fba64139db67123c7a57072e5f8d3db10d160b66" + "reference": "b3eac5c7ac896e52deab4a99068e3f4ab12d9e56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/fba64139db67123c7a57072e5f8d3db10d160b66", - "reference": "fba64139db67123c7a57072e5f8d3db10d160b66", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/b3eac5c7ac896e52deab4a99068e3f4ab12d9e56", + "reference": "b3eac5c7ac896e52deab4a99068e3f4ab12d9e56", "shasum": "" }, "require": { @@ -1467,7 +2069,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.4.1", "ext-filter": "*", - "phpunit/phpunit": "^7.5.20 || ^8.5.2 || ^9.0" + "phpunit/phpunit": "^7.5.20 || ^8.5.14 || ^9.5.1" }, "suggest": { "ext-filter": "Required to use the boolean validator." @@ -1475,7 +2077,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.2-dev" + "dev-master": "5.3-dev" } }, "autoload": { @@ -1507,7 +2109,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.2.0" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.3.0" }, "funding": [ { @@ -1519,20 +2121,20 @@ "type": "tidelift" } ], - "time": "2020-09-14T15:57:31+00:00" + "time": "2021-01-20T15:23:13+00:00" }, { "name": "whichbrowser/parser", - "version": "v2.0.42", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/WhichBrowser/Parser-PHP.git", - "reference": "4899110cd2f87b01e04ced62dbb9dec541031dee" + "reference": "da24adc4f4f26002673d236e69b91a10f2fd594c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WhichBrowser/Parser-PHP/zipball/4899110cd2f87b01e04ced62dbb9dec541031dee", - "reference": "4899110cd2f87b01e04ced62dbb9dec541031dee", + "url": "https://api.github.com/repos/WhichBrowser/Parser-PHP/zipball/da24adc4f4f26002673d236e69b91a10f2fd594c", + "reference": "da24adc4f4f26002673d236e69b91a10f2fd594c", "shasum": "" }, "require": { @@ -1540,12 +2142,13 @@ "psr/cache": "^1.0" }, "require-dev": { + "cache/array-adapter": "^1.1", "icomefromthenet/reverse-regex": "0.0.6.3", - "phpunit/php-code-coverage": "^2.2 || ^3.0", - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", - "satooshi/php-coveralls": "^1.0", - "squizlabs/php_codesniffer": "2.5.*", - "symfony/yaml": "~2.8 || ~3.4 || ~4.2 || ~5.0" + "php-coveralls/php-coveralls": "^2.0", + "phpunit/php-code-coverage": "^5.0 || ^7.0", + "phpunit/phpunit": "^6.0 || ^8.0", + "squizlabs/php_codesniffer": "^3.5", + "symfony/yaml": "~3.4 || ~4.0" }, "suggest": { "cache/array-adapter": "Allows testing of the caching functionality" @@ -1580,9 +2183,9 @@ ], "support": { "issues": "https://github.com/WhichBrowser/Parser-PHP/issues", - "source": "https://github.com/WhichBrowser/Parser-PHP/tree/v2.0.42" + "source": "https://github.com/WhichBrowser/Parser-PHP/tree/v2.1.1" }, - "time": "2020-02-12T10:54:23+00:00" + "time": "2021-01-04T16:36:15+00:00" } ], "packages-dev": [ @@ -1764,30 +2367,87 @@ ], "time": "2020-11-13T09:40:50+00:00" }, + { + "name": "nikic/php-parser", + "version": "v4.10.4", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e", + "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4" + }, + "time": "2020-12-20T10:01:03+00:00" + }, { "name": "phar-io/manifest", - "version": "1.0.3", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" + "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", + "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", "shasum": "" }, "require": { "ext-dom": "*", "ext-phar": "*", - "phar-io/version": "^2.0", - "php": "^5.6 || ^7.0" + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -1821,24 +2481,24 @@ "issues": "https://github.com/phar-io/manifest/issues", "source": "https://github.com/phar-io/manifest/tree/master" }, - "time": "2018-07-08T19:23:20+00:00" + "time": "2020-06-27T14:33:11+00:00" }, { "name": "phar-io/version", - "version": "2.0.1", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" + "reference": "bae7c545bef187884426f042434e561ab1ddb182" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", + "reference": "bae7c545bef187884426f042434e561ab1ddb182", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { @@ -1870,9 +2530,9 @@ "description": "Library for handling version information and constraints", "support": { "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/master" + "source": "https://github.com/phar-io/version/tree/3.1.0" }, - "time": "2018-07-08T19:19:57+00:00" + "time": "2021-02-23T14:00:09+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -2034,16 +2694,16 @@ }, { "name": "phpspec/prophecy", - "version": "1.12.1", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d" + "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/8ce87516be71aae9b956f81906aaf0338e0d8a2d", - "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", + "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", "shasum": "" }, "require": { @@ -2055,7 +2715,7 @@ }, "require-dev": { "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0 || ^9.0 <9.3" + "phpunit/phpunit": "^8.0 || ^9.0" }, "type": "library", "extra": { @@ -2095,46 +2755,50 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.12.1" + "source": "https://github.com/phpspec/prophecy/tree/1.13.0" }, - "time": "2020-09-29T09:10:42+00:00" + "time": "2021-03-17T13:42:18+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "7.0.12", + "version": "9.2.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "52f55786aa2e52c26cd9e2db20aff2981e0f7399" + "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/52f55786aa2e52c26cd9e2db20aff2981e0f7399", - "reference": "52f55786aa2e52c26cd9e2db20aff2981e0f7399", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f3e026641cc91909d421802dd3ac7827ebfd97e1", + "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-xmlwriter": "*", - "php": "^7.2", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.1.1", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^4.2.2", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1.3" + "nikic/php-parser": "^4.10.2", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" }, "require-dev": { - "phpunit/phpunit": "^8.2.2" + "phpunit/phpunit": "^9.3" }, "suggest": { - "ext-xdebug": "^2.7.2" + "ext-pcov": "*", + "ext-xdebug": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "7.0-dev" + "dev-master": "9.2-dev" } }, "autoload": { @@ -2162,7 +2826,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.12" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.5" }, "funding": [ { @@ -2170,32 +2834,32 @@ "type": "github" } ], - "time": "2020-11-27T06:08:35+00:00" + "time": "2020-11-28T06:44:49+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "2.0.2", + "version": "3.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "050bedf145a257b1ff02746c31894800e5122946" + "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", - "reference": "050bedf145a257b1ff02746c31894800e5122946", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8", + "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.1" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -2222,28 +2886,46 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" }, - "time": "2018-09-13T20:33:42+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:57:25+00:00" }, { - "name": "phpunit/php-text-template", - "version": "1.2.1", + "name": "phpunit/php-invoker", + "version": "3.1.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -2260,41 +2942,47 @@ "role": "lead" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", "keywords": [ - "template" + "process" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" }, - "time": "2015-06-21T13:50:34+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" }, { - "name": "phpunit/php-timer", - "version": "2.1.2", + "name": "phpunit/php-text-template", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -2313,42 +3001,47 @@ "role": "lead" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ - "timer" + "template" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/master" + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" }, - "time": "2019-06-07T04:22:29+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" }, { - "name": "phpunit/php-token-stream", - "version": "3.1.1", + "name": "phpunit/php-timer", + "version": "5.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": "^7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2363,33 +3056,39 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ - "tokenizer" + "timer" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", - "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1.1" + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" }, - "abandoned": true, - "time": "2019-09-17T06:23:10+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" }, { "name": "phpunit/phpunit", - "version": "8.5.11", + "version": "9.5.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3123601e3b29339b20129acc3f989cfec3274566" + "reference": "c73c6737305e779771147af66c96ca6a7ed8a741" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3123601e3b29339b20129acc3f989cfec3274566", - "reference": "3123601e3b29339b20129acc3f989cfec3274566", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c73c6737305e779771147af66c96ca6a7ed8a741", + "reference": "c73c6737305e779771147af66c96ca6a7ed8a741", "shasum": "" }, "require": { @@ -2400,32 +3099,35 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.0", - "phar-io/manifest": "^1.0.3", - "phar-io/version": "^2.0.1", - "php": "^7.2", - "phpspec/prophecy": "^1.10.3", - "phpunit/php-code-coverage": "^7.0.12", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1.2", - "sebastian/comparator": "^3.0.2", - "sebastian/diff": "^3.0.2", - "sebastian/environment": "^4.2.3", - "sebastian/exporter": "^3.1.2", - "sebastian/global-state": "^3.0.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0.1", - "sebastian/type": "^1.1.3", - "sebastian/version": "^2.0.1" + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.1", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpspec/prophecy": "^1.12.1", + "phpunit/php-code-coverage": "^9.2.3", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.5", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.3", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^2.3", + "sebastian/version": "^3.0.2" }, "require-dev": { - "ext-pdo": "*" + "ext-pdo": "*", + "phpspec/prophecy-phpunit": "^2.0.1" }, "suggest": { "ext-soap": "*", - "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0.0" + "ext-xdebug": "*" }, "bin": [ "phpunit" @@ -2433,12 +3135,15 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "8.5-dev" + "dev-master": "9.5-dev" } }, "autoload": { "classmap": [ "src/" + ], + "files": [ + "src/Framework/Assert/Functions.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2461,7 +3166,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.11" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.4" }, "funding": [ { @@ -2473,32 +3178,32 @@ "type": "github" } ], - "time": "2020-11-27T12:46:45+00:00" + "time": "2021-03-23T07:16:29+00:00" }, { - "name": "sebastian/code-unit-reverse-lookup", + "name": "sebastian/cli-parser", "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.0-dev" } }, "autoload": { @@ -2513,43 +3218,161 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/master" + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" }, - "time": "2017-03-04T06:30:41+00:00" - }, - { - "name": "sebastian/comparator", - "version": "3.0.2", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" + "reference": "55f4261989e546dc112258c7a75935a81a7ce382" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", + "reference": "55f4261989e546dc112258c7a75935a81a7ce382", "shasum": "" }, "require": { - "php": "^7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^7.1" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2562,6 +3385,10 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" @@ -2573,10 +3400,6 @@ { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" } ], "description": "Provides the functionality to compare PHP values for equality", @@ -2588,35 +3411,98 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/master" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" }, - "time": "2018-07-12T15:12:46+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:49:45+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.7", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" }, { "name": "sebastian/diff", - "version": "3.0.2", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2629,13 +3515,13 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], "description": "Diff implementation", @@ -2648,29 +3534,35 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/master" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" }, - "time": "2019-02-04T06:01:07+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:10:38+00:00" }, { "name": "sebastian/environment", - "version": "4.2.3", + "version": "5.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" + "reference": "388b6ced16caa751030f6a69e588299fa09200ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", + "reference": "388b6ced16caa751030f6a69e588299fa09200ac", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.5" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-posix": "*" @@ -2678,7 +3570,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.2-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2705,36 +3597,42 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/4.2.3" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" }, - "time": "2019-11-20T08:46:58+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:52:38+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.2", + "version": "4.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" + "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65", + "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65", "shasum": "" }, "require": { - "php": "^7.0", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2776,32 +3674,38 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/master" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" }, - "time": "2019-09-14T09:02:43+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:24:23+00:00" }, { "name": "sebastian/global-state", - "version": "3.0.0", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" + "reference": "a90ccbddffa067b51f574dea6eb25d5680839455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", - "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/a90ccbddffa067b51f574dea6eb25d5680839455", + "reference": "a90ccbddffa067b51f574dea6eb25d5680839455", "shasum": "" }, "require": { - "php": "^7.2", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^8.0" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-uopz": "*" @@ -2809,7 +3713,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2834,36 +3738,99 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/master" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.2" }, - "time": "2019-02-01T05:30:01+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:55:19+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.6", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" }, { "name": "sebastian/object-enumerator", - "version": "3.0.3", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", "shasum": "" }, "require": { - "php": "^7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2885,34 +3852,40 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/master" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" }, - "time": "2017-08-03T12:35:26+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" }, { "name": "sebastian/object-reflector", - "version": "1.1.1", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -2934,34 +3907,40 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/master" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" }, - "time": "2017-03-29T09:07:27+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" }, { "name": "sebastian/recursion-context", - "version": "3.0.0", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2974,14 +3953,14 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, { "name": "Adam Harvey", "email": "aharvey@php.net" @@ -2991,31 +3970,40 @@ "homepage": "http://www.github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/master" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" }, - "time": "2017-03-03T06:23:57+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:17:30+00:00" }, { "name": "sebastian/resource-operations", - "version": "2.0.1", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -3037,34 +4025,40 @@ "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/master" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" }, - "time": "2018-10-04T04:07:39+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:45:17+00:00" }, { "name": "sebastian/type", - "version": "1.1.3", + "version": "2.3.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3" + "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3", - "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2", + "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2", "shasum": "" }, "require": { - "php": "^7.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.2" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "2.3-dev" } }, "autoload": { @@ -3087,31 +4081,37 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/master" + "source": "https://github.com/sebastianbergmann/type/tree/2.3.1" }, - "time": "2019-07-02T08:10:15+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:18:59+00:00" }, { "name": "sebastian/version", - "version": "2.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + "reference": "c6c1022351a901512170118436c764e473f6de8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -3134,9 +4134,15 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/master" + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" }, - "time": "2016-10-03T07:35:21+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -3246,30 +4252,35 @@ }, { "name": "webmozart/assert", - "version": "1.9.1", + "version": "1.10.0", "source": { "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" + "url": "https://github.com/webmozarts/assert.git", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0 || ^8.0", + "php": "^7.2 || ^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" + "vimeo/psalm": "<4.6.1 || 4.6.2" }, "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" + "phpunit/phpunit": "^8.5.13" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" @@ -3292,10 +4303,10 @@ "validate" ], "support": { - "issues": "https://github.com/webmozart/assert/issues", - "source": "https://github.com/webmozart/assert/tree/master" + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.10.0" }, - "time": "2020-07-08T17:02:28+00:00" + "time": "2021-03-09T10:59:23+00:00" } ], "aliases": [], @@ -3303,12 +4314,13 @@ "stability-flags": { "james-heinrich/getid3": 20, "myth/auth": 20, - "codeigniter4/codeigniter4": 20 + "codeigniter4/codeigniter4": 20, + "michalsn/codeigniter4-uuid": 10 }, "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=7.2" + "php": "^7.3||^8.0" }, "platform-dev": [], "plugin-api-version": "2.0.0" diff --git a/crontab b/crontab new file mode 100644 index 0000000000000000000000000000000000000000..fc44ff63d30e0836f967dd6c259766cf508109a0 --- /dev/null +++ b/crontab @@ -0,0 +1 @@ +* * * * * /usr/local/bin/php /castopod/public/index.php scheduled-activities diff --git a/docker-compose.yml b/docker-compose.yml index c8617b4893815e9728ef0abf84741c7b6e42d182..c7f46e488e85c159b4e52952e97ddb738f4a29d3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,7 +9,8 @@ services: context: . dockerfile: Dockerfile container_name: "castopod_app" - command: ["php", "spark", "serve", "--host", "0.0.0.0"] + command: > + sh -c "cron && php spark serve --host 0.0.0.0" ports: - 8080:8080 volumes: diff --git a/docs/setup-development.md b/docs/setup-development.md index b4be5229ee123351420f6d31458202aafc957896..f39ba6b85ee6c4ab177bd7d2d447627732e9e747 100644 --- a/docs/setup-development.md +++ b/docs/setup-development.md @@ -11,6 +11,7 @@ - [Going Further](#going-further) - [Useful docker / docker-compose commands](#useful-docker--docker-compose-commands) - [Developing inside a Container](#developing-inside-a-container) +- [Known issues](#known-issues) ## Introduction @@ -38,12 +39,12 @@ git clone https://code.podlibre.org/podlibre/castopod.git the database: ```ini -CI_ENVIRONMENT = development +CI_ENVIRONMENT="development" -database.default.hostname = mariadb -database.default.database = castopod -database.default.username = podlibre -database.default.password = castopod +database.default.hostname="mariadb" +database.default.database="castopod" +database.default.username="podlibre" +database.default.password="castopod" ``` > _NB._ You can tweak your environment by setting more environment variables in @@ -80,6 +81,8 @@ docker-compose run --rm node npm run build:js docker-compose run --rm node npm run build:css docker-compose run --rm node npm run build:icons docker-compose run --rm node npm run build:svg +docker-compose run --rm node npm run copy:images +docker-compose run --rm node npm run copy:fonts ``` ## Start docker containers @@ -258,3 +261,10 @@ git version For more info, see [VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) + +## Known issues + +- `Allocation failed - JavaScript heap out of memory` when running `npm install` + + 👉 By default, docker might not have access to enough RAM. Allocate more + memory and run `npm install` again. diff --git a/env b/env index bc1a15671d2908bafbc9e472e7c9adb71e48d929..5893f099d66d20906b373e33c06a41963ee0b136 100644 --- a/env +++ b/env @@ -35,6 +35,7 @@ # app.cookiePath = '/' # app.cookieSecure = false # app.cookieHTTPOnly = false +# app.cookieSameSite = 'Lax' # app.CSRFProtection = false # app.CSRFTokenName = 'csrf_test_name' @@ -42,6 +43,7 @@ # app.CSRFExpire = 7200 # app.CSRFRegenerate = true # app.CSRFExcludeURIs = [] +# app.CSRFSameSite = 'Lax' # app.CSPEnabled = false @@ -83,11 +85,39 @@ # contentsecuritypolicy.sandbox = false # contentsecuritypolicy.upgradeInsecureRequests = false +#-------------------------------------------------------------------- +# ENCRYPTION +#-------------------------------------------------------------------- + +# encryption.key = +# encryption.driver = OpenSSL +# encryption.blockSize = 16 +# encryption.digest = SHA512 + #-------------------------------------------------------------------- # HONEYPOT #-------------------------------------------------------------------- -# honeypot.hidden = 'true' -# honeypot.label = 'Fill This Field' -# honeypot.name = 'honeypot' -# honeypot.template = '<label>{label}</label><input type="text" name="{name}" value=""/>' +# honeypot.hidden = 'true' +# honeypot.label = 'Fill This Field' +# honeypot.name = 'honeypot' +# honeypot.template = '<label>{label}</label><input type="text" name="{name}" value=""/>' +# honeypot.container = '<div style="display:none">{template}</div>' + +#-------------------------------------------------------------------- +# SECURITY +#-------------------------------------------------------------------- + +# security.tokenName = 'csrf_token_name' +# security.headerName = 'X-CSRF-TOKEN' +# security.cookieName = 'csrf_cookie_name' +# security.expires = 7200 +# security.regenerate = true +# security.redirect = true +# security.samesite = 'Lax' + +#-------------------------------------------------------------------- +# LOGGER +#-------------------------------------------------------------------- + +# logger.threshold = 4 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 46a056ec499a5db31241a3c2d696a276fbac1abe..5a76b6ac1e4a24b82047ea4b15d8033b6feb96e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@amcharts/amcharts4": { - "version": "4.10.8", - "resolved": "https://registry.npmjs.org/@amcharts/amcharts4/-/amcharts4-4.10.8.tgz", - "integrity": "sha512-2xIPHkvuxhsN49btE+K0ThO0CxvEgHC+n2aFa05GLwIH2JKgSjFBmjSvELrEqlEYf2mEPjmKjuYe6d4TgHfGUA==", + "version": "4.10.17", + "resolved": "https://registry.npmjs.org/@amcharts/amcharts4/-/amcharts4-4.10.17.tgz", + "integrity": "sha512-7JQWiMZn/90RxJ+D862R4h3iVsF3cCuNqlBylBDxiOSfND2t6yD4ZBM9ZvM69DJgi2/lvc8BoazVyX98An81TQ==", "requires": { "@babel/runtime": "^7.6.3", "core-js": "^3.0.0", @@ -26,16 +26,16 @@ }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" } } }, "@amcharts/amcharts4-geodata": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@amcharts/amcharts4-geodata/-/amcharts4-geodata-4.1.17.tgz", - "integrity": "sha512-ylzshiOq/aMRlVrRq8dOznZP7fp4xg/XkmhTjGm2dN6O1WqvoVBBOOnGyzrmb2gBlqN5zj59PQyOqSDyQUNe/Q==" + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@amcharts/amcharts4-geodata/-/amcharts4-geodata-4.1.19.tgz", + "integrity": "sha512-y100J6mp8H95qfHPPmeAat8oC+VXJrpt+rnwOt554sEW6cFCWY6BKgPKL2dVlVbnz0U3dqNsyENOqXmp3Pu7vg==" }, "@babel/code-frame": { "version": "7.10.1", @@ -47,78 +47,61 @@ } }, "@babel/compat-data": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz", - "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz", + "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==", "dev": true }, "@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.10.tgz", + "integrity": "sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-compilation-targets": "^7.13.10", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helpers": "^7.13.10", + "@babel/parser": "^7.13.10", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", + "semver": "^6.3.0", "source-map": "^0.5.0" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.12.13" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, - "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", - "dev": true - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -133,351 +116,245 @@ } }, "@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", "dev": true, "requires": { - "@babel/types": "^7.12.1", + "@babel/types": "^7.13.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.13" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-compilation-targets": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz", - "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==", + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz", + "integrity": "sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA==", "dev": true, "requires": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-validator-option": "^7.12.1", - "browserslist": "^4.12.0", - "semver": "^5.5.0" + "@babel/compat-data": "^7.13.8", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + }, + "dependencies": { + "browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + } + }, + "caniuse-lite": { + "version": "1.0.30001204", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz", + "integrity": "sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.698", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.698.tgz", + "integrity": "sha512-VEXDzYblnlT+g8Q3gedwzgKOso1evkeJzV8lih7lV8mL8eAnGVnKyC3KsFT6S+R5PQO4ffdr1PI16/ElibY/kQ==", + "dev": true + }, + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", - "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", + "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4" + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", - "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", + "@babel/helper-annotate-as-pure": "^7.12.13", "regexpu-core": "^4.7.1" } }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "@babel/helper-define-polyfill-provider": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", + "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", - "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", "dev": true, "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.13.0" } }, "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.13" } }, "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", + "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", "dev": true, "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.13.12" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.13.12" } }, "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", + "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" }, "dependencies": { - "@babel/helper-module-imports": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", - "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - } - }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } } } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.13" } }, "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", "dev": true }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, "@babel/helper-remap-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", - "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/helper-replace-supers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", - "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" } }, "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", "dev": true, "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.13.12" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -487,53 +364,15 @@ "dev": true, "requires": { "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "dev": true, "requires": { - "@babel/types": "^7.11.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.12.13" } }, "@babel/helper-validator-identifier": { @@ -543,51 +382,32 @@ "dev": true }, "@babel/helper-validator-option": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", - "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==", + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/helpers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", - "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", + "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/highlight": { @@ -624,142 +444,155 @@ } }, "@babel/parser": { - "version": "7.12.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.2.tgz", - "integrity": "sha512-LMN+SqTiZEonUw4hQA0A3zG8DnN0E1F4K107LbDDUnC+0chML1rvWgsHloC9weB4RmZweE0uhFq0eGX7Nr/PBQ==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.12.tgz", + "integrity": "sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw==", "dev": true }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", + "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.13.12" + } + }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", - "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz", + "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", - "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", + "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", - "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", - "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", - "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", + "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", - "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", - "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", - "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", + "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", - "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", - "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-async-generators": { @@ -772,12 +605,12 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-dynamic-import": { @@ -862,484 +695,429 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-typescript": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz", - "integrity": "sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", + "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", - "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", - "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", - "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", - "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", - "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", + "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-classes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", - "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", + "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", - "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-destructuring": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", - "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", + "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", - "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", - "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", - "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-for-of": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", - "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-function-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", - "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", - "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", - "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", - "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", + "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", - "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", + "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.12.13", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", - "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", "babel-plugin-dynamic-import-node": "^2.3.3" }, "dependencies": { "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true } } }, "@babel/plugin-transform-modules-umd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", - "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", + "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", - "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1" + "@babel/helper-create-regexp-features-plugin": "^7.12.13" } }, "@babel/plugin-transform-new-target": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", - "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-object-super": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", - "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" } }, "@babel/plugin-transform-parameters": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", - "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", + "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-property-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", - "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-regenerator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", - "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", + "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", - "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", - "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", - "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.13.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz", - "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-template-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", - "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", - "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-typescript": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz", - "integrity": "sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz", + "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-typescript": "^7.12.1" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-typescript": "^7.12.13" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", - "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", - "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/preset-env": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", - "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-compilation-targets": "^7.12.1", - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.1", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.1", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.12.tgz", + "integrity": "sha512-JzElc6jk3Ko6zuZgBtjOd01pf9yYDEIH8BcqVuYIuOkzOwDesoa/Nz4gIo4lBG6K861KTV9TvIgmFuT6ytOaAA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.12", + "@babel/helper-compilation-targets": "^7.13.10", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-async-generator-functions": "^7.13.8", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-dynamic-import": "^7.13.8", + "@babel/plugin-proposal-export-namespace-from": "^7.12.13", + "@babel/plugin-proposal-json-strings": "^7.13.8", + "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-numeric-separator": "^7.12.13", + "@babel/plugin-proposal-object-rest-spread": "^7.13.8", + "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-private-methods": "^7.13.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.1", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.1", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.1", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.1", - "core-js-compat": "^3.6.2", - "semver": "^5.5.0" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", - "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.13.0", + "@babel/plugin-transform-async-to-generator": "^7.13.0", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.12.13", + "@babel/plugin-transform-classes": "^7.13.0", + "@babel/plugin-transform-computed-properties": "^7.13.0", + "@babel/plugin-transform-destructuring": "^7.13.0", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.13.0", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.13.0", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/plugin-transform-modules-systemjs": "^7.13.8", + "@babel/plugin-transform-modules-umd": "^7.13.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.13.0", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.12.13", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.13.0", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.13.0", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.13.12", + "babel-plugin-polyfill-corejs2": "^0.1.4", + "babel-plugin-polyfill-corejs3": "^0.1.3", + "babel-plugin-polyfill-regenerator": "^0.1.2", + "core-js-compat": "^3.9.0", + "semver": "^6.3.0" } }, "@babel/preset-modules": { @@ -1356,63 +1134,57 @@ } }, "@babel/preset-typescript": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz", - "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.13.0.tgz", + "integrity": "sha512-LXJwxrHy0N3f6gIJlYbLta1D9BDtHpQeqwzM0LIfjDlr6UE/D5Mc7W4iDiQzaE+ks0sTjT26ArcHWnJVt0QiHw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-transform-typescript": "^7.12.1" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-transform-typescript": "^7.13.0" } }, "@babel/runtime": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.4.tgz", - "integrity": "sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "requires": { "regenerator-runtime": "^0.13.4" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" - } } }, "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.12.13" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } @@ -1431,59 +1203,48 @@ } }, "@babel/traverse": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", - "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", + "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.1", - "@babel/types": "^7.12.1", + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.0", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.0", + "@babel/types": "^7.13.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.12.13" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, - "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -1498,84 +1259,67 @@ } }, "@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", - "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", + "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" }, "dependencies": { "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true } } }, "@commitlint/cli": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-11.0.0.tgz", - "integrity": "sha512-YWZWg1DuqqO5Zjh7vUOeSX76vm0FFyz4y0cpGMFhrhvUi5unc4IVfCXZ6337R9zxuBtmveiRuuhQqnRRer+13g==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-12.0.1.tgz", + "integrity": "sha512-V+cMYNHJOr40XT9Kvz3Vrz1Eh7QE1rjQrUbifawDAqcOrBJFuoXwU2SAcRtYFCSqFy9EhbreQGhZFs8dYb90KA==", "dev": true, "requires": { - "@babel/runtime": "^7.11.2", - "@commitlint/format": "^11.0.0", - "@commitlint/lint": "^11.0.0", - "@commitlint/load": "^11.0.0", - "@commitlint/read": "^11.0.0", - "chalk": "4.1.0", - "core-js": "^3.6.1", + "@commitlint/format": "^12.0.1", + "@commitlint/lint": "^12.0.1", + "@commitlint/load": "^12.0.1", + "@commitlint/read": "^12.0.1", + "@commitlint/types": "^12.0.1", "get-stdin": "8.0.0", "lodash": "^4.17.19", "resolve-from": "5.0.0", "resolve-global": "1.0.0", - "yargs": "^15.1.0" + "yargs": "^16.2.0" }, "dependencies": { - "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, "@commitlint/execute-rule": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz", - "integrity": "sha512-g01p1g4BmYlZ2+tdotCavrMunnPFPhTzG1ZiLKTCYrooHRbmvqo42ZZn4QMStUEIcn+jfLb6BRZX3JzIwA1ezQ==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-12.0.1.tgz", + "integrity": "sha512-JzyweYfZlFLtXpgP+btzSY3YAkGPg61TqUSYQqBr4+5IaVf1FruMm5v4D5eLu9dAJuNKUfHbM3AEfuEPiZ79pg==", "dev": true }, "@commitlint/load": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-11.0.0.tgz", - "integrity": "sha512-t5ZBrtgvgCwPfxmG811FCp39/o3SJ7L+SNsxFL92OR4WQxPcu6c8taD0CG2lzOHGuRyuMxZ7ps3EbngT2WpiCg==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-12.0.1.tgz", + "integrity": "sha512-dX8KdCWn7w0bTkkk3zKQpe9X8vsTRa5EM+1ffF313wCX9b6tGa9vujhEHCkSzKAbbE2tFV64CHZygE7rtlHdIA==", "dev": true, "requires": { - "@commitlint/execute-rule": "^11.0.0", - "@commitlint/resolve-extends": "^11.0.0", - "@commitlint/types": "^11.0.0", - "chalk": "4.1.0", + "@commitlint/execute-rule": "^12.0.1", + "@commitlint/resolve-extends": "^12.0.1", + "@commitlint/types": "^12.0.1", + "chalk": "^4.0.0", "cosmiconfig": "^7.0.0", "lodash": "^4.17.19", "resolve-from": "^5.0.0" } }, "@commitlint/resolve-extends": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-11.0.0.tgz", - "integrity": "sha512-WinU6Uv6L7HDGLqn/To13KM1CWvZ09VHZqryqxXa1OY+EvJkfU734CwnOEeNlSCK7FVLrB4kmodLJtL1dkEpXw==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-12.0.1.tgz", + "integrity": "sha512-Mvg0GDi/68Cqw893ha8uhxE8myHfPmiSSSi7d1x4VJNR4hoS37lBdX89kyx4i9NPmLfviY2cUJKTyK8ZrFznZw==", "dev": true, "requires": { "import-fresh": "^3.0.0", @@ -1585,46 +1329,14 @@ } }, "@commitlint/types": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz", - "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.0.1.tgz", + "integrity": "sha512-FsNDMV0W7D19/ZbR412klpqAilXASx75Neqh7jPtK278IEwdukOg3vth1r5kTm+BjDScM7wMUEOwIW3NNfAtwg==", "dev": true, "requires": { - "color-name": "~1.1.4" + "chalk": "^4.0.0" } }, - "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==", - "dev": true - }, "cosmiconfig": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", @@ -1638,16 +1350,10 @@ "yaml": "^1.10.0" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -1663,9 +1369,9 @@ } }, "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -1679,42 +1385,36 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true - }, - "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==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, "@commitlint/config-conventional": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-11.0.0.tgz", - "integrity": "sha512-SNDRsb5gLuDd2PL83yCOQX6pE7gevC79UPFx+GLbLfw6jGnnbO9/tlL76MLD8MOViqGbo7ZicjChO9Gn+7tHhA==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-12.0.1.tgz", + "integrity": "sha512-1ZhB135lh47zVmf1orwcjxuKuam11fJIH/bdVxW9XiQv8XPwC6iIp19knfl8FcOT78AVBnes1z6EVxgUeP2/4Q==", "dev": true, "requires": { "conventional-changelog-conventionalcommits": "^4.3.1" } }, "@commitlint/ensure": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-11.0.0.tgz", - "integrity": "sha512-/T4tjseSwlirKZdnx4AuICMNNlFvRyPQimbZIOYujp9DSO6XRtOy9NrmvWujwHsq9F5Wb80QWi4WMW6HMaENug==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-12.0.1.tgz", + "integrity": "sha512-XdBq+q1YBBDxWIAEjE3Y1YMbzhUnUuSLAEWD8SU1xsvEpQXWRYwDlMBRkjO7funNWTdL0ZQSkZDzme70imYjbw==", "dev": true, "requires": { - "@commitlint/types": "^11.0.0", + "@commitlint/types": "^12.0.1", "lodash": "^4.17.19" }, "dependencies": { "@commitlint/types": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz", - "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==", - "dev": true + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.0.1.tgz", + "integrity": "sha512-FsNDMV0W7D19/ZbR412klpqAilXASx75Neqh7jPtK278IEwdukOg3vth1r5kTm+BjDScM7wMUEOwIW3NNfAtwg==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } } } }, @@ -1726,64 +1426,76 @@ "optional": true }, "@commitlint/format": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-11.0.0.tgz", - "integrity": "sha512-bpBLWmG0wfZH/svzqD1hsGTpm79TKJWcf6EXZllh2J/LSSYKxGlv967lpw0hNojme0sZd4a/97R3qA2QHWWSLg==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-12.0.1.tgz", + "integrity": "sha512-rF79ipAxR8yFzPzG5tRoEZ//MRkyxCXj4JhpEjtdaCMBAXMssI8uazn3e5D8z4UFgSDe9qOnL0OmQvql7HTMoA==", "dev": true, "requires": { - "@commitlint/types": "^11.0.0", + "@commitlint/types": "^12.0.1", "chalk": "^4.0.0" }, "dependencies": { "@commitlint/types": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz", - "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==", - "dev": true + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.0.1.tgz", + "integrity": "sha512-FsNDMV0W7D19/ZbR412klpqAilXASx75Neqh7jPtK278IEwdukOg3vth1r5kTm+BjDScM7wMUEOwIW3NNfAtwg==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } } } }, "@commitlint/is-ignored": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-11.0.0.tgz", - "integrity": "sha512-VLHOUBN+sOlkYC4tGuzE41yNPO2w09sQnOpfS+pSPnBFkNUUHawEuA44PLHtDvQgVuYrMAmSWFQpWabMoP5/Xg==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-12.0.1.tgz", + "integrity": "sha512-AplfLn5mX/kWTIiSolcOhTYcgphuGLX8FUr+HmyHBEqUkO36jt0z9caysH47fqU71ePtH63v1DWm+RYQ5RPDjg==", "dev": true, "requires": { - "@commitlint/types": "^11.0.0", - "semver": "7.3.2" + "@commitlint/types": "^12.0.1", + "semver": "7.3.4" }, "dependencies": { "@commitlint/types": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz", - "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==", - "dev": true + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.0.1.tgz", + "integrity": "sha512-FsNDMV0W7D19/ZbR412klpqAilXASx75Neqh7jPtK278IEwdukOg3vth1r5kTm+BjDScM7wMUEOwIW3NNfAtwg==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, "@commitlint/lint": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-11.0.0.tgz", - "integrity": "sha512-Q8IIqGIHfwKr8ecVZyYh6NtXFmKw4YSEWEr2GJTB/fTZXgaOGtGFZDWOesCZllQ63f1s/oWJYtVv5RAEuwN8BQ==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-12.0.1.tgz", + "integrity": "sha512-1lKyRCq4ahJrY+Xxo8LsqCbALeJkodtEfpmYHeA5HpPMnK7lRSplLqOLcTCjoPfd4vO+gl6aDEZN+ow3YGQBOg==", "dev": true, "requires": { - "@commitlint/is-ignored": "^11.0.0", - "@commitlint/parse": "^11.0.0", - "@commitlint/rules": "^11.0.0", - "@commitlint/types": "^11.0.0" + "@commitlint/is-ignored": "^12.0.1", + "@commitlint/parse": "^12.0.1", + "@commitlint/rules": "^12.0.1", + "@commitlint/types": "^12.0.1" }, "dependencies": { "@commitlint/types": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz", - "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==", - "dev": true + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.0.1.tgz", + "integrity": "sha512-FsNDMV0W7D19/ZbR412klpqAilXASx75Neqh7jPtK278IEwdukOg3vth1r5kTm+BjDScM7wMUEOwIW3NNfAtwg==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } } } }, @@ -1923,58 +1635,80 @@ } }, "@commitlint/message": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-11.0.0.tgz", - "integrity": "sha512-01ObK/18JL7PEIE3dBRtoMmU6S3ecPYDTQWWhcO+ErA3Ai0KDYqV5VWWEijdcVafNpdeUNrEMigRkxXHQLbyJA==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-12.0.1.tgz", + "integrity": "sha512-fXuoxRC+NT1wEQi6p8oHfT7wvWIRgTk+udlRJnWTjmMpiYzVnMmmZfasdShirWr4TtxQtMyL+5DVgh7Y98kURw==", "dev": true }, "@commitlint/parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-11.0.0.tgz", - "integrity": "sha512-DekKQAIYWAXIcyAZ6/PDBJylWJ1BROTfDIzr9PMVxZRxBPc1gW2TG8fLgjZfBP5mc0cuthPkVi91KQQKGri/7A==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-12.0.1.tgz", + "integrity": "sha512-7oEGASmzBnHir5jSIR7KephXrKh7rIi9a6RpH1tOT+CIENYvhe8EDtIy29qMt+RLa2LlaPF7YrAgaJRfzG0YDQ==", "dev": true, "requires": { - "conventional-changelog-angular": "^5.0.0", + "@commitlint/types": "^12.0.1", + "conventional-changelog-angular": "^5.0.11", "conventional-commits-parser": "^3.0.0" + }, + "dependencies": { + "@commitlint/types": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.0.1.tgz", + "integrity": "sha512-FsNDMV0W7D19/ZbR412klpqAilXASx75Neqh7jPtK278IEwdukOg3vth1r5kTm+BjDScM7wMUEOwIW3NNfAtwg==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + } } }, "@commitlint/read": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-11.0.0.tgz", - "integrity": "sha512-37V0V91GSv0aDzMzJioKpCoZw6l0shk7+tRG8RkW1GfZzUIytdg3XqJmM+IaIYpaop0m6BbZtfq+idzUwJnw7g==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-12.0.1.tgz", + "integrity": "sha512-baa0YeD4QOctEuthLpExQSi9xPiw0kDPfUVHqp8I88iuIXJECeS8S1+1GBiz89e8dLN9zmEE+sN9vtJHdAp9YA==", "dev": true, "requires": { - "@commitlint/top-level": "^11.0.0", + "@commitlint/top-level": "^12.0.1", + "@commitlint/types": "^12.0.1", "fs-extra": "^9.0.0", "git-raw-commits": "^2.0.0" }, "dependencies": { + "@commitlint/types": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.0.1.tgz", + "integrity": "sha512-FsNDMV0W7D19/ZbR412klpqAilXASx75Neqh7jPtK278IEwdukOg3vth1r5kTm+BjDScM7wMUEOwIW3NNfAtwg==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", - "universalify": "^1.0.0" + "universalify": "^2.0.0" } }, "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" + "universalify": "^2.0.0" } }, "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true } } @@ -2029,35 +1763,38 @@ } }, "@commitlint/rules": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-11.0.0.tgz", - "integrity": "sha512-2hD9y9Ep5ZfoNxDDPkQadd2jJeocrwC4vJ98I0g8pNYn/W8hS9+/FuNpolREHN8PhmexXbkjrwyQrWbuC0DVaA==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-12.0.1.tgz", + "integrity": "sha512-A5O0ubNGugZR9WWxk5IVOLo07lpdUwhG5WkAW2lYpgZ7Z/2U4PLob9b4Ih1eHbQu+gnVeFr91k7F0DrpM7B8EQ==", "dev": true, "requires": { - "@commitlint/ensure": "^11.0.0", - "@commitlint/message": "^11.0.0", - "@commitlint/to-lines": "^11.0.0", - "@commitlint/types": "^11.0.0" + "@commitlint/ensure": "^12.0.1", + "@commitlint/message": "^12.0.1", + "@commitlint/to-lines": "^12.0.1", + "@commitlint/types": "^12.0.1" }, "dependencies": { "@commitlint/types": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz", - "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==", - "dev": true + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.0.1.tgz", + "integrity": "sha512-FsNDMV0W7D19/ZbR412klpqAilXASx75Neqh7jPtK278IEwdukOg3vth1r5kTm+BjDScM7wMUEOwIW3NNfAtwg==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } } } }, "@commitlint/to-lines": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-11.0.0.tgz", - "integrity": "sha512-TIDTB0Y23jlCNubDROUVokbJk6860idYB5cZkLWcRS9tlb6YSoeLn1NLafPlrhhkkkZzTYnlKYzCVrBNVes1iw==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-12.0.1.tgz", + "integrity": "sha512-XwcJ1jY7x2fhudzbGMpNQkTSMVrxWrI8bRMbVe3Abuu7RfYpFf7VXAlhtnLfxBoagaK7RxjC2+eRidp/3txQBg==", "dev": true }, "@commitlint/top-level": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-11.0.0.tgz", - "integrity": "sha512-O0nFU8o+Ws+py5pfMQIuyxOtfR/kwtr5ybqTvR+C2lUPer2x6lnQU+OnfD7hPM+A+COIUZWx10mYQvkR3MmtAA==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-12.0.1.tgz", + "integrity": "sha512-rHdgt7U24GEau2/9i2vEAbksxkBRiVjHj5ECFL5dd0AJOIvaK++vMg4EF/ME0X/1yd9qVTHTNOl2Q4tTFK7VBQ==", "dev": true, "requires": { "find-up": "^5.0.0" @@ -2083,12 +1820,12 @@ } }, "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { @@ -2116,9 +1853,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", - "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", + "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -2128,7 +1865,6 @@ "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", - "lodash": "^4.17.19", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, @@ -2149,9 +1885,9 @@ "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -2179,13 +1915,22 @@ } }, "@fullhuman/postcss-purgecss": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.3.0.tgz", - "integrity": "sha512-qnKm5dIOyPGJ70kPZ5jiz0I9foVOic0j+cOzNDoo8KoCf6HjicIZ99UfO2OmE7vCYSKAAepEwJtNzpiiZAh9xw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-3.1.3.tgz", + "integrity": "sha512-kwOXw8fZ0Lt1QmeOOrd+o4Ibvp4UTEBFQbzvWldjlKv5n+G9sXfIPn1hh63IQIL8K8vbvv1oYMJiIUbuy9bGaA==", + "dev": true, + "requires": { + "purgecss": "^3.1.3" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "dev": true, "requires": { - "postcss": "7.0.32", - "purgecss": "^2.3.0" + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" } }, "@nodelib/fs.scandir": { @@ -2215,35 +1960,36 @@ } }, "@octokit/auth-token": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.2.tgz", - "integrity": "sha512-jE/lE/IKIz2v1+/P0u4fJqv0kYwXOTujKemJMFr6FeopsxlIK3+wKDCJGnysg81XID5TgZQbIfuJ5J0lnTiuyQ==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz", + "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==", "dev": true, "requires": { - "@octokit/types": "^5.0.0" + "@octokit/types": "^6.0.3" } }, "@octokit/core": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.5.4.tgz", - "integrity": "sha512-HCp8yKQfTITYK+Nd09MHzAlP1v3Ii/oCohv0/TW9rhSLvzb98BOVs2QmVYuloE6a3l6LsfyGIwb6Pc4ycgWlIQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.3.1.tgz", + "integrity": "sha512-Dc5NNQOYjgZU5S1goN6A/E500yXOfDUFRGQB8/2Tl16AcfvS3H9PudyOe3ZNE/MaVyHPIfC0htReHMJb1tMrvw==", "dev": true, "requires": { - "@octokit/auth-token": "^2.4.0", - "@octokit/graphql": "^4.3.1", - "@octokit/request": "^5.4.0", - "@octokit/types": "^5.0.0", - "before-after-hook": "^2.1.0", - "universal-user-agent": "^5.0.0" + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.4.12", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" } }, "@octokit/endpoint": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.8.tgz", - "integrity": "sha512-MuRrgv+bM4Q+e9uEvxAB/Kf+Sj0O2JAOBA131uo1o6lgdq1iS8ejKwtqHgdfY91V3rN9R/hdGKFiQYMzVzVBEQ==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.11.tgz", + "integrity": "sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ==", "dev": true, "requires": { - "@octokit/types": "^5.0.0", + "@octokit/types": "^6.0.3", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, @@ -2253,79 +1999,60 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true } } }, "@octokit/graphql": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.5.6.tgz", - "integrity": "sha512-Rry+unqKTa3svswT2ZAuqenpLrzJd+JTv89LTeVa5UM/5OX8o4KTkPL7/1ABq4f/ZkELb0XEK/2IEoYwykcLXg==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.6.1.tgz", + "integrity": "sha512-2lYlvf4YTDgZCTXTW4+OX+9WTLFtEUc6hGm4qM1nlZjzxj+arizM4aHWzBVBCxY9glh7GIs0WEuiSgbVzv8cmA==", "dev": true, "requires": { "@octokit/request": "^5.3.0", - "@octokit/types": "^5.0.0", + "@octokit/types": "^6.0.3", "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - } } }, + "@octokit/openapi-types": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-5.3.2.tgz", + "integrity": "sha512-NxF1yfYOUO92rCx3dwvA2onF30Vdlg7YUkMVXkeptqpzA3tRLplThhFleV/UKWFgh7rpKu1yYRbvNDUtzSopKA==", + "dev": true + }, "@octokit/plugin-paginate-rest": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.4.0.tgz", - "integrity": "sha512-YT6Klz3LLH6/nNgi0pheJnUmTFW4kVnxGft+v8Itc41IIcjl7y1C8TatmKQBbCSuTSNFXO5pCENnqg6sjwpJhg==", + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.3.tgz", + "integrity": "sha512-46lptzM9lTeSmIBt/sVP/FLSTPGx6DCzAdSX3PfeJ3mTf4h9sGC26WpaQzMEq/Z44cOcmx8VsOhO+uEgE3cjYg==", "dev": true, "requires": { - "@octokit/types": "^5.5.0" + "@octokit/types": "^6.11.0" } }, "@octokit/plugin-request-log": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz", - "integrity": "sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz", + "integrity": "sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ==", "dev": true }, "@octokit/plugin-rest-endpoint-methods": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.17.0.tgz", - "integrity": "sha512-NFV3vq7GgoO2TrkyBRUOwflkfTYkFKS0tLAPym7RNpkwLCttqShaEGjthOsPEEL+7LFcYv3mU24+F2yVd3npmg==", + "version": "4.13.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.13.5.tgz", + "integrity": "sha512-kYKcWkFm4Ldk8bZai2RVEP1z97k1C/Ay2FN9FNTBg7JIyKoiiJjks4OtT6cuKeZX39tqa+C3J9xeYc6G+6g8uQ==", "dev": true, "requires": { - "@octokit/types": "^4.1.6", + "@octokit/types": "^6.12.2", "deprecation": "^2.3.1" - }, - "dependencies": { - "@octokit/types": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-4.1.10.tgz", - "integrity": "sha512-/wbFy1cUIE5eICcg0wTKGXMlKSbaAxEr00qaBXzscLXpqhcwgXeS6P8O0pkysBhRfyjkKjJaYrvR1ExMO5eOXQ==", - "dev": true, - "requires": { - "@types/node": ">= 8" - } - } } }, "@octokit/request": { - "version": "5.4.9", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.9.tgz", - "integrity": "sha512-CzwVvRyimIM1h2n9pLVYfTDmX9m+KHSgCpqPsY8F1NdEK8IaWqXhSBXsdjOBFZSpEcxNEeg4p0UO9cQ8EnOCLA==", + "version": "5.4.14", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.14.tgz", + "integrity": "sha512-VkmtacOIQp9daSnBmDI92xNIeLuSRDOIuplp/CJomkvzt7M18NXgG044Cx/LFKLgjKt9T2tZR6AtJayba9GTSA==", "dev": true, "requires": { "@octokit/endpoint": "^6.0.1", "@octokit/request-error": "^2.0.0", - "@octokit/types": "^5.0.0", + "@octokit/types": "^6.7.1", "deprecation": "^2.0.0", "is-plain-object": "^5.0.0", "node-fetch": "^2.6.1", @@ -2338,56 +2065,50 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true } } }, "@octokit/request-error": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.2.tgz", - "integrity": "sha512-2BrmnvVSV1MXQvEkrb9zwzP0wXFNbPJij922kYBTLIlIafukrGOb+ABBT2+c6wZiuyWDH1K1zmjGQ0toN/wMWw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.5.tgz", + "integrity": "sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg==", "dev": true, "requires": { - "@octokit/types": "^5.0.1", + "@octokit/types": "^6.0.3", "deprecation": "^2.0.0", "once": "^1.4.0" } }, "@octokit/rest": { - "version": "17.11.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.11.2.tgz", - "integrity": "sha512-4jTmn8WossTUaLfNDfXk4fVJgbz5JgZE8eCs4BvIb52lvIH8rpVMD1fgRCrHbSd6LRPE5JFZSfAEtszrOq3ZFQ==", + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.3.5.tgz", + "integrity": "sha512-ZPeRms3WhWxQBEvoIh0zzf8xdU2FX0Capa7+lTca8YHmRsO3QNJzf1H3PcuKKsfgp91/xVDRtX91sTe1kexlbw==", "dev": true, "requires": { - "@octokit/core": "^2.4.3", - "@octokit/plugin-paginate-rest": "^2.2.0", - "@octokit/plugin-request-log": "^1.0.0", - "@octokit/plugin-rest-endpoint-methods": "3.17.0" + "@octokit/core": "^3.2.3", + "@octokit/plugin-paginate-rest": "^2.6.2", + "@octokit/plugin-request-log": "^1.0.2", + "@octokit/plugin-rest-endpoint-methods": "4.13.5" } }, "@octokit/types": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.5.0.tgz", - "integrity": "sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.12.2.tgz", + "integrity": "sha512-kCkiN8scbCmSq+gwdJV0iLgHc0O/GTPY1/cffo9kECu1MvatLPh9E+qFhfRIktKfHEA6ZYvv6S1B4Wnv3bi3pA==", "dev": true, "requires": { - "@types/node": ">= 8" + "@octokit/openapi-types": "^5.3.2" } }, "@popperjs/core": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.5.3.tgz", - "integrity": "sha512-RFwCobxsvZ6j7twS7dHIZQZituMIDJJNHS/qY6iuthVebxS3zhRY+jaC2roEKiAYaVuTcGmX6Luc6YBcf6zJVg==" + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.1.tgz", + "integrity": "sha512-DvJbbn3dUgMxDnJLH+RZQPnXak1h4ZVYQ7CWiFWjQwBFkVajT4rfw2PdpHLTSTwxrYfnoEXkuBiwkDm6tPMQeA==" }, "@prettier/plugin-php": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@prettier/plugin-php/-/plugin-php-0.15.1.tgz", - "integrity": "sha512-uQiaGGXCs0uqpck1LyDU+V4Z50Qqml7ltajPQL+DB43r5aHVawDCSkgLGYZJSb1g+hK5eBmdVBqMa7ED8EBjbA==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@prettier/plugin-php/-/plugin-php-0.16.2.tgz", + "integrity": "sha512-0pqK5hIDTSy07O55sJu86sxqfLHlzoDYn64GyNVhft9unc/7UCQui/s2gpTTwfTpU26YHUDEqL8CT8p5Rl3s6Q==", "dev": true, "requires": { "linguist-languages": "^7.5.1", @@ -2396,9 +2117,9 @@ } }, "@rollup/plugin-babel": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.2.1.tgz", - "integrity": "sha512-Jd7oqFR2dzZJ3NWANDyBjwTtX/lYbZpVcmkHrfQcpvawHs9E4c0nYk5U2mfZ6I/DZcIvy506KZJi54XK/jxH7A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", + "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.10.4", @@ -2406,9 +2127,9 @@ } }, "@rollup/plugin-commonjs": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-15.1.0.tgz", - "integrity": "sha512-xCQqz4z/o0h2syQ7d9LskIMvBSH4PX5PjYdpSSvgS+pQik3WahkQVNWg3D8XJeYjZoVWnIUQYDghuEMRGrmQYQ==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-17.1.0.tgz", + "integrity": "sha512-PoMdXCw0ZyvjpCMT5aV4nkL0QywxP29sODQsSGeDpr/oI49Qq9tRtAsb/LbYbDzFlOydVEqHmmZWFtXJEAX9ew==", "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", @@ -2421,9 +2142,9 @@ }, "dependencies": { "estree-walker": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.1.tgz", - "integrity": "sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true } } @@ -2448,9 +2169,9 @@ } }, "@rollup/plugin-node-resolve": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz", - "integrity": "sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.0.tgz", + "integrity": "sha512-qHjNIKYt5pCcn+5RUBQxK8krhRvf1HnyVgUCcFFcweDS7fhkOLZeYh0mhHK6Ery8/bb9tvN/ubPzmfF0qjDCTA==", "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", @@ -2458,7 +2179,19 @@ "builtin-modules": "^3.1.0", "deepmerge": "^4.2.2", "is-module": "^1.0.0", - "resolve": "^1.17.0" + "resolve": "^1.19.0" + }, + "dependencies": { + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } } }, "@rollup/plugin-virtual": { @@ -2553,15 +2286,6 @@ "to-regex-range": "^5.0.1" } }, - "import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2578,12 +2302,6 @@ "picomatch": "^2.0.5" } }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2691,12 +2409,12 @@ } }, "@semantic-release/github": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.1.1.tgz", - "integrity": "sha512-w8CLCvGVKNe2FPOYQ68OFxFVNNha7YRzptnwTZYdjXYtgTDKw0XVfnMSd9NlJeQPYGfQmIhIVPNBU/cA6zUY0A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.2.0.tgz", + "integrity": "sha512-tMRnWiiWb43whRHvbDGXq4DGEbKRi56glDpXDJZit4PIiwDPX7Kx3QzmwRtDOcG+8lcpGjpdPabYZ9NBxoI2mw==", "dev": true, "requires": { - "@octokit/rest": "^17.0.0", + "@octokit/rest": "^18.0.0", "@semantic-release/error": "^2.2.0", "aggregate-error": "^3.0.0", "bottleneck": "^2.18.1", @@ -2715,39 +2433,39 @@ }, "dependencies": { "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", - "universalify": "^1.0.0" + "universalify": "^2.0.0" } }, "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" + "universalify": "^2.0.0" } }, "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true } } }, "@semantic-release/gitlab": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@semantic-release/gitlab/-/gitlab-6.0.5.tgz", - "integrity": "sha512-fPOldehLPolClGrE1am0PMa1gqOPe+wVeTwCvbr4z27fZkDLhRTbKYfEyhqzGL4cm+fVhqI5dyvzHpqBXTAZUw==", + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/@semantic-release/gitlab/-/gitlab-6.0.9.tgz", + "integrity": "sha512-PUdtYksSZvSm11T3kenyxSJkJttvumnSlrK0NGFH0ERfPeDV1VlUOoNxjOQ/cUsOM6yyY3aZ//khNe0FpGAZ2Q==", "dev": true, "requires": { "@semantic-release/error": "^2.2.0", @@ -2771,102 +2489,149 @@ "dev": true }, "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", - "universalify": "^1.0.0" + "universalify": "^2.0.0" } }, "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" + "universalify": "^2.0.0" } }, "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true } } }, "@semantic-release/npm": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-7.0.6.tgz", - "integrity": "sha512-F4judxdeLe8f7+vDva1TkqNc5Tb2tcltZYW0tLtvP2Xt7CD/gGiz7UxAWEOPsXBvIqAP+uTidvGLPl9U3/uRoQ==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-7.0.10.tgz", + "integrity": "sha512-DXFEhgSt5u22imTWbw8wfcVGB90nFJNcjUBtJI3zswJojzZ7yXpY4i2Va5RBRQRTtj00BfG0stbilAtKrKp35g==", "dev": true, "requires": { "@semantic-release/error": "^2.2.0", "aggregate-error": "^3.0.0", - "execa": "^4.0.0", + "execa": "^5.0.0", "fs-extra": "^9.0.0", "lodash": "^4.17.15", "nerf-dart": "^1.0.0", "normalize-url": "^5.0.0", - "npm": "^6.13.0", + "npm": "^6.14.9", "rc": "^1.2.8", "read-pkg": "^5.0.0", "registry-auth-token": "^4.0.0", "semver": "^7.1.2", - "tempy": "^0.5.0" + "tempy": "^1.0.0" }, "dependencies": { + "execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "dev": true, + "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" + } + }, "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", - "universalify": "^1.0.0" + "universalify": "^2.0.0" } }, + "get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true + }, + "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==", + "dev": true + }, "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" + "universalify": "^2.0.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "normalize-url": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-5.3.0.tgz", "integrity": "sha512-9/nOVLYYe/dO/eJeQUNaGUF4m4Z5E7cb9oNTKabH+bNf19mqj60txTcveQxL0GlcWLXCxkOu2/LwL8oW0idIDA==", "dev": true }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true } } }, "@semantic-release/release-notes-generator": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-9.0.1.tgz", - "integrity": "sha512-bOoTiH6SiiR0x2uywSNR7uZcRDl22IpZhj+Q5Bn0v+98MFtOMhCxFhbrKQjhbYoZw7vps1mvMRmFkp/g6R9cvQ==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-9.0.2.tgz", + "integrity": "sha512-xGFSidhGqB27uwgWCU6y0gbf4r/no5flOAkJyFFc4+bPf8S+LfAVm7xhhlK5VPXLt2Iu1RBH8F+IgMK2ah5YpA==", "dev": true, "requires": { "conventional-changelog-angular": "^5.0.0", @@ -2876,26 +2641,9 @@ "debug": "^4.0.0", "get-stream": "^5.0.0", "import-from": "^3.0.0", - "into-stream": "^5.0.0", + "into-stream": "^6.0.0", "lodash": "^4.17.4", "read-pkg-up": "^7.0.0" - }, - "dependencies": { - "import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } } }, "@sindresorhus/is": { @@ -2914,13 +2662,13 @@ } }, "@stylelint/postcss-markdown": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz", - "integrity": "sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw==", + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz", + "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==", "dev": true, "requires": { - "remark": "^12.0.0", - "unist-util-find-all-after": "^3.0.1" + "remark": "^13.0.0", + "unist-util-find-all-after": "^3.0.2" } }, "@szmarczak/http-timer": { @@ -2932,29 +2680,45 @@ "defer-to-connect": "^2.0.0" } }, - "@tailwindcss/custom-forms": { + "@tailwindcss/forms": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/custom-forms/-/custom-forms-0.2.1.tgz", - "integrity": "sha512-XdP5XY6kxo3x5o50mWUyoYWxOPV16baagLoZ5uM41gh6IhXzhz/vJYzqrTb/lN58maGIKlpkxgVsQUNSsbAS3Q==", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.2.1.tgz", + "integrity": "sha512-czfvEdY+J2Ogfd6RUSr/ZSUmDxTujr34M++YLnp2cCPC3oJ4kFvFMaRXA6cEXKw7F1hJuapdjXRjsXIEXGgORg==", "dev": true, "requires": { - "lodash": "^4.17.11", - "mini-svg-data-uri": "^1.0.3", - "traverse": "^0.6.6" + "mini-svg-data-uri": "^1.2.3" } }, - "@tailwindcss/typography": { + "@tailwindcss/line-clamp": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.2.0.tgz", - "integrity": "sha512-aPgMH+CjQiScLZculoDNOQUrrK2ktkbl3D6uCLYp1jgYRlNDrMONu9nMu8LfwAeetYNpVNeIGx7WzHSu0kvECg==", + "resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.2.0.tgz", + "integrity": "sha512-+jXSdRK3/9V/BCPCr+iNpMMhxWMMv62vn/AS2b3/ClmueGuhCijW3bUwO1IiHnE7uCaF74Sli8jUCv9djwvpLg==", "dev": true }, + "@tailwindcss/typography": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.4.0.tgz", + "integrity": "sha512-3BfOYT5MYNEq81Ism3L2qu/HRP2Q5vWqZtZRQqQrthHuaTK9qpuPfbMT5WATjAM5J1OePKBaI5pLoX4S1JGNMQ==", + "dev": true, + "requires": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" + } + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, + "@trysound/sax": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz", + "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==", + "dev": true + }, "@types/cacheable-request": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", @@ -2979,6 +2743,22 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/highlight.js": { + "version": "9.12.4", + "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.4.tgz", + "integrity": "sha512-t2szdkwmg2JJyuCM20e8kR2X59WCE5Zkl4bzm1u1Oukjm79zpbiAv+QjnwLnuuV0WHEcX2NgUItu0pAMKuOPww==", + "dev": true + }, "@types/http-cache-semantics": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", @@ -2986,9 +2766,9 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, "@types/keyv": { @@ -3001,31 +2781,47 @@ } }, "@types/linkify-it": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-2.1.0.tgz", - "integrity": "sha512-Q7DYAOi9O/+cLLhdaSvKdaumWyHbm7HAk/bFwwyTuU0arR5yyCeW5GOoqt4tJTpDRxhpx9Q8kQL6vMpuw9hDSw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.0.tgz", + "integrity": "sha512-x9OaQQTb1N2hPZ/LWJsqushexDvz7NgzuZxiRmZio44WPuolTZNHDBCrOxCzRVOMwamJRO2dWax5NbygOf1OTQ==", "dev": true }, "@types/markdown-it": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-10.0.1.tgz", - "integrity": "sha512-L1ibTdA5IUe/cRBlf3N3syAOBQSN1WCMGtAWir6mKxibiRl4LmpZM4jLz+7zAqiMnhQuAP1sqZOF9wXgn2kpEg==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.0.1.tgz", + "integrity": "sha512-mHfT8j/XkPb1uLEfs0/C3se6nd+webC2kcqcy8tgcVr0GDEONv/xaQzAN+aQvkxQXk/jC0Q6mPS+0xhFwRF35g==", "dev": true, "requires": { + "@types/highlight.js": "^9.7.0", "@types/linkify-it": "*", "@types/mdurl": "*" } }, + "@types/mdast": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", + "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", + "dev": true, + "requires": { + "@types/unist": "*" + } + }, "@types/mdurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", "dev": true }, + "@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "dev": true + }, "@types/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", "dev": true }, "@types/node": { @@ -3053,9 +2849,9 @@ "dev": true }, "@types/prosemirror-markdown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/prosemirror-markdown/-/prosemirror-markdown-1.0.3.tgz", - "integrity": "sha512-kM5W28WKfzuZrGa9Z4hS+MtHI1WViQyJejIA7di37BwEKhw1nlD03fGaToPQU2fZXR+vVsKyG0WHHN8eX3J8DQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/prosemirror-markdown/-/prosemirror-markdown-1.5.1.tgz", + "integrity": "sha512-AqHCy80J9HUF+9FHveOB9fbKZwOf+1Ds2Vm1pPN6bfZ/Y6vdgXDry/hoz74+K7fQZZ8+f1J4x16llFj3PAohVg==", "dev": true, "requires": { "@types/markdown-it": "*", @@ -3063,18 +2859,18 @@ } }, "@types/prosemirror-model": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@types/prosemirror-model/-/prosemirror-model-1.7.2.tgz", - "integrity": "sha512-2l+yXvidg3AUHN07mO4Jd8Q84fo6ksFsy7LHUurLYrZ74uTahBp2fzcO49AKZMzww2EulXJ40Kl/OFaQ/7A1fw==", + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@types/prosemirror-model/-/prosemirror-model-1.11.2.tgz", + "integrity": "sha512-mohs15V+gxj10QWJGVooErzSE9ryTo1Wy92lULiQ0BSN5Po9K4vngPzfKmLft0+gAPbEghovTX+I2zQW3bZo1w==", "dev": true, "requires": { "@types/orderedmap": "*" } }, "@types/prosemirror-state": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/prosemirror-state/-/prosemirror-state-1.2.5.tgz", - "integrity": "sha512-a5DxAifiF6vmdSJ5jsDMkpykUgUJUy+T5Q5hCjFOKJ4cfd3m3q1lsFKr7Bc4r91Qb7rfqyiKCMDnASS8LIHrKw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@types/prosemirror-state/-/prosemirror-state-1.2.6.tgz", + "integrity": "sha512-tJo0wC+/cQvbrPDVx01Fnng9Fs41bAMVxgJY1KLOyIsUPN0otUN1KdoQurLMmHNHTvIna9ZXxjZD//xJKLYfJw==", "dev": true, "requires": { "@types/prosemirror-model": "*", @@ -3083,18 +2879,18 @@ } }, "@types/prosemirror-transform": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/prosemirror-transform/-/prosemirror-transform-1.1.1.tgz", - "integrity": "sha512-yYCYSoiRH+Wcbl8GJc0PFCzeyMzNQ1vL2xrHHSXZuNcIlH75VoiKrZFeZ6BS9cl8mYXjZrlmdBe8YOxYvyKM6A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/prosemirror-transform/-/prosemirror-transform-1.1.2.tgz", + "integrity": "sha512-Ozyvs5Dquc49gaFysmC4gNhv6E65r569HSzw4RXdZgIljZ5Y9K4kHFlDvsWBBDH19+1178X9LMmM9J620O6Bug==", "dev": true, "requires": { "@types/prosemirror-model": "*" } }, "@types/prosemirror-view": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@types/prosemirror-view/-/prosemirror-view-1.16.1.tgz", - "integrity": "sha512-vsL7QB9Qmg9HcBTWsOkmBEGMF0CfA/SZgtqlUArQglnDWV40ZJYonkjBzyP+YhurMC/s4JT4T2vzfnv7rFF/cg==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/prosemirror-view/-/prosemirror-view-1.17.1.tgz", + "integrity": "sha512-PNiGGc6BffxHQzMR09UUilsBR8xFPDsKiPIXb4K/g56voPIvqq1pqySnWFfSR50Vo4ZL0tss3VBLWiiiKzVahQ==", "dev": true, "requires": { "@types/prosemirror-model": "*", @@ -3139,101 +2935,107 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.5.0.tgz", - "integrity": "sha512-mjb/gwNcmDKNt+6mb7Aj/TjKzIJjOPcoCJpjBQC9ZnTRnBt1p4q5dJSSmIqAtsZ/Pff5N+hJlbiPc5bl6QN4OQ==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.19.0.tgz", + "integrity": "sha512-CRQNQ0mC2Pa7VLwKFbrGVTArfdVDdefS+gTw0oC98vSI98IX5A8EVH4BzJ2FOB0YlCmm8Im36Elad/Jgtvveaw==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.5.0", - "@typescript-eslint/scope-manager": "4.5.0", + "@typescript-eslint/experimental-utils": "4.19.0", + "@typescript-eslint/scope-manager": "4.19.0", "debug": "^4.1.1", "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.15", "regexpp": "^3.0.0", "semver": "^7.3.2", "tsutils": "^3.17.1" }, "dependencies": { "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, "@typescript-eslint/experimental-utils": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.5.0.tgz", - "integrity": "sha512-bW9IpSAKYvkqDGRZzayBXIgPsj2xmmVHLJ+flGSoN0fF98pGoKFhbunIol0VF2Crka7z984EEhFi623Rl7e6gg==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.19.0.tgz", + "integrity": "sha512-9/23F1nnyzbHKuoTqFN1iXwN3bvOm/PRIXSBR3qFAYotK/0LveEOHr5JT1WZSzcD6BESl8kPOG3OoDRKO84bHA==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.5.0", - "@typescript-eslint/types": "4.5.0", - "@typescript-eslint/typescript-estree": "4.5.0", + "@typescript-eslint/scope-manager": "4.19.0", + "@typescript-eslint/types": "4.19.0", + "@typescript-eslint/typescript-estree": "4.19.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.5.0.tgz", - "integrity": "sha512-xb+gmyhQcnDWe+5+xxaQk5iCw6KqXd8VQxGiTeELTMoYeRjpocZYYRP1gFVM2C8Yl0SpUvLa1lhprwqZ00w3Iw==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.19.0.tgz", + "integrity": "sha512-/uabZjo2ZZhm66rdAu21HA8nQebl3lAIDcybUoOxoI7VbZBYavLIwtOOmykKCJy+Xq6Vw6ugkiwn8Js7D6wieA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.5.0", - "@typescript-eslint/types": "4.5.0", - "@typescript-eslint/typescript-estree": "4.5.0", + "@typescript-eslint/scope-manager": "4.19.0", + "@typescript-eslint/types": "4.19.0", + "@typescript-eslint/typescript-estree": "4.19.0", "debug": "^4.1.1" } }, "@typescript-eslint/scope-manager": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.5.0.tgz", - "integrity": "sha512-C0cEO0cTMPJ/w4RA/KVe4LFFkkSh9VHoFzKmyaaDWAnPYIEzVCtJ+Un8GZoJhcvq+mPFXEsXa01lcZDHDG6Www==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.19.0.tgz", + "integrity": "sha512-GGy4Ba/hLXwJXygkXqMzduqOMc+Na6LrJTZXJWVhRrSuZeXmu8TAnniQVKgj8uTRKe4igO2ysYzH+Np879G75g==", "dev": true, "requires": { - "@typescript-eslint/types": "4.5.0", - "@typescript-eslint/visitor-keys": "4.5.0" + "@typescript-eslint/types": "4.19.0", + "@typescript-eslint/visitor-keys": "4.19.0" } }, "@typescript-eslint/types": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.5.0.tgz", - "integrity": "sha512-n2uQoXnyWNk0Les9MtF0gCK3JiWd987JQi97dMSxBOzVoLZXCNtxFckVqt1h8xuI1ix01t+iMY4h4rFMj/303g==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.19.0.tgz", + "integrity": "sha512-A4iAlexVvd4IBsSTNxdvdepW0D4uR/fwxDrKUa+iEY9UWvGREu2ZyB8ylTENM1SH8F7bVC9ac9+si3LWNxcBuA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.5.0.tgz", - "integrity": "sha512-gN1mffq3zwRAjlYWzb5DanarOPdajQwx5MEWkWCk0XvqC8JpafDTeioDoow2L4CA/RkYZu7xEsGZRhqrTsAG8w==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.19.0.tgz", + "integrity": "sha512-3xqArJ/A62smaQYRv2ZFyTA+XxGGWmlDYrsfZG68zJeNbeqRScnhf81rUVa6QG4UgzHnXw5VnMT5cg75dQGDkA==", "dev": true, "requires": { - "@typescript-eslint/types": "4.5.0", - "@typescript-eslint/visitor-keys": "4.5.0", + "@typescript-eslint/types": "4.19.0", + "@typescript-eslint/visitor-keys": "4.19.0", "debug": "^4.1.1", "globby": "^11.0.1", "is-glob": "^4.0.1", - "lodash": "^4.17.15", "semver": "^7.3.2", "tsutils": "^3.17.1" }, "dependencies": { "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, "@typescript-eslint/visitor-keys": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.5.0.tgz", - "integrity": "sha512-UHq4FSa55NDZqscRU//O5ROFhHa9Hqn9KWTEvJGTArtTQp5GKv9Zqf6d/Q3YXXcFv4woyBml7fJQlQ+OuqRcHA==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.19.0.tgz", + "integrity": "sha512-aGPS6kz//j7XLSlgpzU2SeTqHPsmRYxFztj2vPuMMFJXZudpRSehE3WCV+BaxwZFvfAqMoSd86TEuM0PQ59E/A==", "dev": true, "requires": { - "@typescript-eslint/types": "4.5.0", + "@typescript-eslint/types": "4.19.0", "eslint-visitor-keys": "^2.0.0" } }, @@ -3283,9 +3085,9 @@ } }, "agent-base": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", - "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { "debug": "4" @@ -3302,9 +3104,9 @@ } }, "ajv": { - "version": "6.12.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", - "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -3441,6 +3243,12 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -3512,9 +3320,9 @@ "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=" }, "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "asynckit": { @@ -3560,6 +3368,34 @@ "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -3572,6 +3408,36 @@ "object.assign": "^4.1.0" } }, + "babel-plugin-polyfill-corejs2": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz", + "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.0", + "@babel/helper-define-polyfill-provider": "^0.1.5", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", + "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.1.5", + "core-js-compat": "^3.8.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz", + "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.1.5" + } + }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -3582,9 +3448,9 @@ }, "dependencies": { "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" }, "regenerator-runtime": { "version": "0.11.1", @@ -3665,9 +3531,9 @@ "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" }, "before-after-hook": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", - "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.0.tgz", + "integrity": "sha512-jH6rKQIfroBbhEXVmI7XmXe3ix5S/PgJqpzdDPnR8JGLHWNYLsYZ6tK5iWOF/Ra3oqEX0NobXGlzbiylIzVphQ==", "dev": true }, "big.js": { @@ -3763,9 +3629,9 @@ }, "dependencies": { "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" } } }, @@ -3817,9 +3683,9 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", "dev": true }, "bytes": { @@ -3884,7 +3750,22 @@ "integrity": "sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ==", "dev": true }, - "caller-callsite": { + "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" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", @@ -3959,12 +3840,6 @@ "redeyed": "~2.1.0" } }, - "ccount": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz", - "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==", - "dev": true - }, "center-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", @@ -4042,12 +3917,6 @@ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", "dev": true }, - "character-entities-html4": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", - "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", - "dev": true - }, "character-entities-legacy": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", @@ -4077,14 +3946,14 @@ } }, "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.0.tgz", + "integrity": "sha512-JgQM9JS92ZbFR4P90EvmzNpSGhpPBGBSj10PILeDyYFwp4h2/D9OM03wsJ4zW1fEp4ka2DGrnUeD7FuvQ2aZ2Q==", "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", + "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -4127,12 +3996,6 @@ } } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -4172,9 +4035,9 @@ } }, "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.6.tgz", + "integrity": "sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ==", "dev": true, "requires": { "colors": "1.0.3" @@ -4205,12 +4068,6 @@ "color-convert": "^2.0.1" } }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4244,9 +4101,9 @@ } }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -4272,14 +4129,14 @@ "dev": true }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^7.0.0" }, "dependencies": { "ansi-regex": { @@ -4295,9 +4152,9 @@ "dev": true }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -4395,12 +4252,6 @@ } } }, - "collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", - "dev": true - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -4468,9 +4319,9 @@ } }, "commander": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz", - "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true }, "commitizen": { @@ -4559,12 +4410,6 @@ "dot-prop": "^5.1.0" } }, - "compare-versions": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", - "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", - "dev": true - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -4610,9 +4455,9 @@ "integrity": "sha1-R1hw8DK44zhBKqX8UHiA8L9JXHc=" }, "conventional-changelog-angular": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.11.tgz", - "integrity": "sha512-nSLypht/1yEflhuTogC03i7DX7sOrXGsRn14g131Potqi6cbGbGEE9PSDEHKldabB6N76HiSyw9Ph+kLmC04Qw==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", + "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", "dev": true, "requires": { "compare-func": "^2.0.0", @@ -4620,9 +4465,9 @@ } }, "conventional-changelog-conventionalcommits": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.4.0.tgz", - "integrity": "sha512-ybvx76jTh08tpaYrYn/yd0uJNLt5yMrb1BphDe4WBredMlvPisvMghfpnJb6RmRNcqXeuhR6LfGZGewbkRm9yA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.5.0.tgz", + "integrity": "sha512-buge9xDvjjOxJlyxUnar/+6i/aVEVGA7EEh4OafBCXPlLUQPGbRUBhBUveWRxzvR8TEjhKEP4BdepnpG2FSZXw==", "dev": true, "requires": { "compare-func": "^2.0.0", @@ -4631,29 +4476,21 @@ } }, "conventional-changelog-writer": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.17.tgz", - "integrity": "sha512-IKQuK3bib/n032KWaSb8YlBFds+aLmzENtnKtxJy3+HqDq5kohu3g/UdNbIHeJWygfnEbZjnCKFxAW0y7ArZAw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz", + "integrity": "sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw==", "dev": true, "requires": { "compare-func": "^2.0.0", - "conventional-commits-filter": "^2.0.6", + "conventional-commits-filter": "^2.0.7", "dateformat": "^3.0.0", "handlebars": "^4.7.6", "json-stringify-safe": "^5.0.1", "lodash": "^4.17.15", - "meow": "^7.0.0", + "meow": "^8.0.0", "semver": "^6.0.0", "split": "^1.0.0", - "through2": "^3.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "through2": "^4.0.0" } }, "conventional-commit-types": { @@ -4663,9 +4500,9 @@ "dev": true }, "conventional-commits-filter": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.6.tgz", - "integrity": "sha512-4g+sw8+KA50/Qwzfr0hL5k5NWxqtrOVw4DDk3/h6L85a9Gz0/Eqp3oP+CWCNfesBvZZZEFHF7OTEbRe+yYSyKw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", "dev": true, "requires": { "lodash.ismatch": "^4.4.0", @@ -4673,17 +4510,17 @@ } }, "conventional-commits-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz", - "integrity": "sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.1.tgz", + "integrity": "sha512-OG9kQtmMZBJD/32NEw5IhN5+HnBqVjy03eC+I71I0oQRFA5rOgA4OtPOYG7mz1GkCfCNxn3gKIX8EiHJYuf1cA==", "dev": true, "requires": { "JSONStream": "^1.0.4", "is-text-path": "^1.0.1", "lodash": "^4.17.15", - "meow": "^7.0.0", - "split2": "^2.0.0", - "through2": "^3.0.0", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0", "trim-off-newlines": "^1.0.0" } }, @@ -4707,15 +4544,46 @@ "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" }, "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.1.tgz", + "integrity": "sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==", "dev": true, "requires": { - "browserslist": "^4.8.5", + "browserslist": "^4.16.3", "semver": "7.0.0" }, "dependencies": { + "browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + } + }, + "caniuse-lite": { + "version": "1.0.30001204", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz", + "integrity": "sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.698", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.698.tgz", + "integrity": "sha512-VEXDzYblnlT+g8Q3gedwzgKOso1evkeJzV8lih7lV8mL8eAnGVnKyC3KsFT6S+R5PQO4ffdr1PI16/ElibY/kQ==", + "dev": true + }, + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "dev": true + }, "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", @@ -4741,6 +4609,233 @@ "parse-json": "^4.0.0" } }, + "cp-file": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-7.0.0.tgz", + "integrity": "sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "nested-error-stacks": "^2.0.0", + "p-event": "^4.1.0" + } + }, + "cpy": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/cpy/-/cpy-8.1.2.tgz", + "integrity": "sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg==", + "dev": true, + "requires": { + "arrify": "^2.0.1", + "cp-file": "^7.0.0", + "globby": "^9.2.0", + "has-glob": "^1.0.0", + "junk": "^3.1.0", + "nested-error-stacks": "^2.1.0", + "p-all": "^2.1.0", + "p-filter": "^2.1.0", + "p-map": "^3.0.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "cpy-cli": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/cpy-cli/-/cpy-cli-3.1.1.tgz", + "integrity": "sha512-HCpNdBkQy3rw+uARLuIf0YurqsMXYzBa9ihhSAuxYJcNIrqrSq3BstPfr0cQN38AdMrQiO9Dp4hYy7GtGJsLPg==", + "dev": true, + "requires": { + "cpy": "^8.0.0", + "meow": "^6.1.1" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "meow": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz", + "integrity": "sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, "crc-32": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", @@ -4756,9 +4851,9 @@ "integrity": "sha512-l1cwMUOssGLEj5zgbut4lxJq95ZabOXVZnDybNqQRUtXh1lvUK7e7kJNm8SfvTQzYpE3AVJhIVUJKf382lMA7A==" }, "cross-env": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.2.tgz", - "integrity": "sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, "requires": { "cross-spawn": "^7.0.1" @@ -4804,6 +4899,56 @@ "dev": true, "requires": { "postcss": "^7.0.5" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "css-color-names": { @@ -4820,117 +4965,131 @@ "requires": { "postcss": "^7.0.1", "timsort": "^0.3.0" - } - }, - "css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" }, "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "css-modules-loader-core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz", - "integrity": "sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=", + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", "dev": true, "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.1", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0" + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, "postcss": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz", - "integrity": "sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "chalk": "^1.1.3", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^1.0.0" + "has-flag": "^3.0.0" } } } @@ -4942,6 +5101,56 @@ "dev": true, "requires": { "postcss": "^7.0.5" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "css-select": { @@ -4962,16 +5171,6 @@ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", "dev": true }, - "css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, "css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -4997,9 +5196,9 @@ "dev": true }, "css-what": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", - "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "dev": true }, "cssdb": { @@ -5024,6 +5223,56 @@ "cssnano-preset-default": "^4.0.7", "is-resolvable": "^1.0.0", "postcss": "^7.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "cssnano-preset-default": { @@ -5062,6 +5311,56 @@ "postcss-reduce-transforms": "^4.0.2", "postcss-svgo": "^4.0.2", "postcss-unique-selectors": "^4.0.1" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "cssnano-util-get-arguments": { @@ -5083,37 +5382,87 @@ "dev": true, "requires": { "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true }, "csso": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", - "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, "requires": { - "css-tree": "1.0.0-alpha.39" + "css-tree": "^1.1.2" }, "dependencies": { "css-tree": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", - "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", + "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", "dev": true, "requires": { - "mdn-data": "2.0.6", + "mdn-data": "2.0.14", "source-map": "^0.6.1" } }, "mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true }, "source-map": { @@ -5162,9 +5511,12 @@ } }, "d3-array": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.8.0.tgz", - "integrity": "sha512-6V272gsOeg7+9pTW1jSYOR1QE37g95I3my1hBmY+vOUNHRrk9yt4OTz/gK7PMkVAVDrYYq4mq3grTiZ8iJdNIw==" + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "requires": { + "internmap": "^1.0.0" + } }, "d3-color": { "version": "1.4.1", @@ -5424,6 +5776,22 @@ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -5470,6 +5838,12 @@ "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==" }, + "didyoumean": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz", + "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -5499,15 +5873,9 @@ }, "dependencies": { "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", - "dev": true - }, - "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", + "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", "dev": true } } @@ -5605,9 +5973,9 @@ } }, "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true }, "env-ci": { @@ -5638,27 +6006,50 @@ } }, "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, "requires": { + "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" }, "dependencies": { - "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } } } }, @@ -5804,13 +6195,13 @@ } }, "eslint": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.11.0.tgz", - "integrity": "sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw==", + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.22.0.tgz", + "integrity": "sha512-3VawOtjSJUQiiqac8MQc+w457iGLfuNGLFn8JmF051tTKbh5/x/0vlcEj8OgDCaw7Ysa2Jn8paGshV7x2abKXg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.1.3", + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -5820,13 +6211,13 @@ "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.0", - "esquery": "^1.2.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", - "globals": "^12.1.0", + "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -5834,7 +6225,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.19", + "lodash": "^4.17.21", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -5843,11 +6234,50 @@ "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^5.2.3", + "table": "^6.0.4", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -5855,12 +6285,12 @@ "dev": true }, "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.7.0.tgz", + "integrity": "sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" } }, "ignore": { @@ -5870,15 +6300,21 @@ "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -5886,10 +6322,13 @@ "dev": true }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "strip-ansi": { "version": "6.0.0", @@ -5907,34 +6346,23 @@ "dev": true }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "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==", "dev": true } } }, "eslint-config-prettier": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.14.0.tgz", - "integrity": "sha512-DbVwh0qZhAC7CNDWcq8cBdK6FcVHiMTKmCypOPWeZkp9hJ8xYwTaWSa6bb6cjfi8KOeJy0e9a8Izxyx+O4+gCQ==", - "dev": true, - "requires": { - "get-stdin": "^6.0.0" - }, - "dependencies": { - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - } - } + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.1.0.tgz", + "integrity": "sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw==", + "dev": true }, "eslint-plugin-prettier": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", - "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz", + "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" @@ -5974,13 +6402,13 @@ "dev": true }, "espree": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", - "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { "acorn": "^7.4.0", - "acorn-jsx": "^5.2.0", + "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" }, "dependencies": { @@ -5998,9 +6426,9 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -6183,9 +6611,9 @@ }, "dependencies": { "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" } } }, @@ -6380,12 +6808,6 @@ "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", "dev": true }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, "fastq": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", @@ -6395,6 +6817,11 @@ "reusify": "^1.0.4" } }, + "fflate": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.3.11.tgz", + "integrity": "sha512-Rr5QlUeGN1mbOHlaqcSYMKVpPbgLy0AWT/W0EHxA6NGI12yO1jpoui2zBBvU2G824ltM6Ut8BFgfHSBGfkmS0A==" + }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -6405,12 +6832,12 @@ } }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" } }, "fill-range": { @@ -6463,12 +6890,12 @@ } }, "find-versions": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", - "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", "dev": true, "requires": { - "semver-regex": "^2.0.0" + "semver-regex": "^3.1.2" } }, "findup-sync": { @@ -6484,25 +6911,24 @@ } }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, "flatpickr": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.6.tgz", - "integrity": "sha512-EZ48CJMttMg3maMhJoX+GvTuuEhX/RbA1YeuI19attP3pwBdbYy6+yqAEVm0o0hSBFYBiLbVxscLW6gJXq6H3A==" + "version": "4.6.9", + "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.9.tgz", + "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==" }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, "flatten": { @@ -6681,9 +7107,9 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", + "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", "dev": true, "optional": true }, @@ -6713,9 +7139,9 @@ } }, "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, "get-assigned-identifiers": { @@ -6729,6 +7155,16 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", @@ -6792,16 +7228,16 @@ } }, "git-raw-commits": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.7.tgz", - "integrity": "sha512-SkwrTqrDxw8y0G1uGJ9Zw13F7qu3LF8V4BifyDeiJCxSnjRGZD9SaoMiMqUvvXMXh6S3sOQ1DsBN7L2fMUZW/g==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.10.tgz", + "integrity": "sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ==", "dev": true, "requires": { "dargs": "^7.0.0", - "lodash.template": "^4.0.2", - "meow": "^7.0.0", - "split2": "^2.0.0", - "through2": "^3.0.0" + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" } }, "glob": { @@ -6826,6 +7262,12 @@ "is-glob": "^4.0.1" } }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, "global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", @@ -6932,9 +7374,9 @@ "dev": true }, "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, "requires": { "minimist": "^1.2.5", @@ -6951,9 +7393,9 @@ "dev": true }, "uglify-js": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.2.tgz", - "integrity": "sha512-G440NU6fewtnQftSgqRV1r2A5ChKbU1gqFCJ7I8S7MPpY/eZZfLGefaY6gUZYiWebMaO+txgiQ1ZyLDuNWJulg==", + "version": "3.13.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.2.tgz", + "integrity": "sha512-SbMu4D2Vo95LMC/MetNaso1194M1htEA+JrqE9Hk+G2DhI+itfS9TRu9ZKeCahLDNa/J3n4MqUJ/fOHMzQpRWw==", "dev": true, "optional": true }, @@ -6994,12 +7436,37 @@ } } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", + "integrity": "sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=", + "dev": true, + "requires": { + "is-glob": "^3.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", @@ -7059,10 +7526,13 @@ "dev": true }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "hsl-regex": { "version": "1.0.0", @@ -7102,6 +7572,12 @@ "readable-stream": "^3.1.1" }, "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -7149,115 +7625,74 @@ "dev": true }, "husky": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz", - "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-5.2.0.tgz", + "integrity": "sha512-AM8T/auHXRBxlrfPVLKP6jt49GCM2Zz47m8G3FOMsLmTv8Dj/fKVWE0Rh2d4Qrvmy131xEsdQnb3OXRib67PGg==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "compare-versions": "^3.6.0", - "cosmiconfig": "^7.0.0", - "find-versions": "^3.2.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", - "please-upgrade-node": "^3.2.0", - "slash": "^3.0.0", - "which-pm-runs": "^1.0.0" + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "requires": { + "import-from": "^3.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" }, "dependencies": { - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, "import-lazy": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", @@ -7297,9 +7732,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, "inquirer": { @@ -7336,10 +7771,15 @@ } } }, + "internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, "into-stream": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz", - "integrity": "sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", "dev": true, "requires": { "from2": "^2.3.0", @@ -7378,12 +7818,6 @@ "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", "dev": true }, - "is-alphanumeric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", - "dev": true - }, "is-alphanumerical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", @@ -7395,9 +7829,12 @@ } }, "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" + } }, "is-arrayish": { "version": "0.3.2", @@ -7405,6 +7842,11 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", "dev": true }, + "is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==" + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -7414,6 +7856,14 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "requires": { + "call-bind": "^1.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -7438,6 +7888,15 @@ "rgba-regex": "^1.0.0" } }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -7534,9 +7993,9 @@ "dev": true }, "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" }, "is-number": { "version": "3.0.0", @@ -7558,12 +8017,29 @@ } } }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==" + }, "is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "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==", + "dev": true + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -7623,6 +8099,11 @@ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" + }, "is-svg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", @@ -7655,30 +8136,24 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, - "is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", - "dev": true - }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, - "is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -7809,9 +8284,9 @@ } }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -7832,6 +8307,12 @@ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, + "junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true + }, "keyv": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", @@ -7848,9 +8329,9 @@ "dev": true }, "known-css-properties": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.19.0.tgz", - "integrity": "sha512-eYboRV94Vco725nKMlpkn3nV2+96p9c3gKXRsYqAJSswSENvBhN7n5L+uDhY58xQa0UukWsDMTGELzmD8Q+wTA==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz", + "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==", "dev": true }, "lazy-cache": { @@ -7885,9 +8366,9 @@ "dev": true }, "linguist-languages": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/linguist-languages/-/linguist-languages-7.11.1.tgz", - "integrity": "sha512-+cRUk+1WTbydcdzipXQER2iilX+wMrb1LPkbkGuDP/IcGPJRDmOZH6Olf1iH6sHlHwPnJYiNJH39YsFCVZxvUQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/linguist-languages/-/linguist-languages-7.13.0.tgz", + "integrity": "sha512-n1X6l+YYbEDtXE9tDr8nYZAgeuKw+qBFvYGzIGltw3Z3oJwS+4vyVtFG5UFa71kvmPWMS3RT/yB95RWzD7MrVQ==", "dev": true }, "linkify-it": { @@ -7899,20 +8380,20 @@ } }, "lint-staged": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.4.2.tgz", - "integrity": "sha512-OLCA9K1hS+Sl179SO6kX0JtnsaKj/MZalEhUj5yAgXsb63qPI/Gfn6Ua1KuZdbfkZNEu3/n5C/obYCu70IMt9g==", + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.4.tgz", + "integrity": "sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg==", "dev": true, "requires": { "chalk": "^4.1.0", "cli-truncate": "^2.1.0", - "commander": "^6.0.0", + "commander": "^6.2.0", "cosmiconfig": "^7.0.0", - "debug": "^4.1.1", + "debug": "^4.2.0", "dedent": "^0.7.0", "enquirer": "^2.3.6", - "execa": "^4.0.3", - "listr2": "^2.6.0", + "execa": "^4.1.0", + "listr2": "^3.2.2", "log-symbols": "^4.0.0", "micromatch": "^4.0.2", "normalize-path": "^3.0.0", @@ -7977,6 +8458,32 @@ "yaml": "^1.10.0" } }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -7993,9 +8500,9 @@ "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -8018,10 +8525,25 @@ "picomatch": "^2.0.5" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -8057,9 +8579,9 @@ } }, "listr2": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.6.2.tgz", - "integrity": "sha512-6x6pKEMs8DSIpA/tixiYY2m/GcbgMplMVmhQAaLFxEtNSKLeWTGjtmU57xvv6QCm2XcqzyNXL/cTSVf4IChCRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.4.3.tgz", + "integrity": "sha512-wZmkzNiuinOfwrGqAwTCcPw6aKQGTAMGXwG5xeU1WpDjJNeBA35jGBeWxR3OF+R6Yl5Y3dRG+3vE8t6PDcSNHA==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -8068,8 +8590,9 @@ "indent-string": "^4.0.0", "log-update": "^4.0.0", "p-map": "^4.0.0", - "rxjs": "^6.6.2", - "through": "^2.3.8" + "rxjs": "^6.6.6", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" }, "dependencies": { "ansi-styles": { @@ -8121,6 +8644,15 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "rxjs": { + "version": "6.6.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.6.tgz", + "integrity": "sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8213,6 +8745,18 @@ "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", "dev": true }, + "lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, "lodash.difference": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", @@ -8273,6 +8817,12 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, + "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==", + "dev": true + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -8317,12 +8867,64 @@ "dev": true }, "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "log-update": { @@ -8338,14 +8940,20 @@ }, "dependencies": { "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "type-fest": "^0.21.3" } }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -8355,12 +8963,6 @@ "color-convert": "^2.0.1" } }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -8416,22 +9018,42 @@ "signal-exit": "^3.0.2" } }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } }, "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } } } }, @@ -8470,12 +9092,6 @@ "yallist": "^4.0.0" } }, - "macos-release": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", - "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==", - "dev": true - }, "magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", @@ -8485,6 +9101,15 @@ "sourcemap-codec": "^1.4.4" } }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -8501,9 +9126,9 @@ "dev": true }, "map-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", - "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.0.tgz", + "integrity": "sha512-NAq0fCmZYGz9UFEQyndp7sisrow4GroyGeKluyKC/chuITZsPyOyC1UJZPJlVFImhXdROIP5xqouRLThT3BbpQ==", "dev": true }, "map-visit": { @@ -8515,12 +9140,6 @@ "object-visit": "^1.0.0" } }, - "markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", - "dev": true - }, "markdown-it": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", @@ -8540,48 +9159,88 @@ } } }, - "markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "dev": true, - "requires": { - "repeat-string": "^1.0.0" - } - }, "marked": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.0.tgz", - "integrity": "sha512-tiRxakgbNPBr301ihe/785NntvYyhxlqcL3YaC8CaxJQh7kiaEtrN9B/eK2I2943Yjkh5gw25chYFDQhOMCwMA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.1.tgz", + "integrity": "sha512-5+/fKgMv2hARmMW7DOpykr2iLhl0NgjyELk5yn92iE7z8Se1IS9n3UsFm86hFXIkvMBmVxki8+ckcpjBeyo/hw==", "dev": true }, "marked-terminal": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.1.0.tgz", - "integrity": "sha512-5KllfAOW02WS6hLRQ7cNvGOxvKW1BKuXELH4EtbWfyWgxQhROoMxEvuQ/3fTgkNjledR0J48F4HbapvYp1zWkQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.1.1.tgz", + "integrity": "sha512-t7Mdf6T3PvOEyN01c3tYxDzhyKZ8xnkp8Rs6Fohno63L/0pFTJ5Qtwto2AQVuDtbQiWzD+4E5AAu1Z2iLc8miQ==", "dev": true, "requires": { "ansi-escapes": "^4.3.1", "cardinal": "^2.1.1", - "chalk": "^4.0.0", + "chalk": "^4.1.0", "cli-table": "^0.3.1", "node-emoji": "^1.10.0", "supports-hyperlinks": "^2.1.0" }, "dependencies": { "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "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==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "has-flag": "^4.0.0" } }, "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true } } @@ -8602,15 +9261,39 @@ "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true }, - "mdast-util-compact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", - "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", + "mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", "dev": true, "requires": { - "unist-util-visit": "^2.0.0" + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" } }, + "mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "dev": true + }, "mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", @@ -8623,9 +9306,9 @@ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" }, "mem": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-8.0.0.tgz", - "integrity": "sha512-qrcJOe6uD+EW8Wrci1Vdiua/15Xw3n/QnaNXE7varnB6InxSk7nu3/i5jfy3S6kWxr8WYJ6R1o0afMUtvorTsA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.0.tgz", + "integrity": "sha512-FIkgXo0kTi3XpvaznV5Muk6Y6w8SkdmRXcY7ZLonQesuYezp59UooLxAVBcGuN6PH2tXN84mR3vyzSc6oSMUfA==", "dev": true, "requires": { "map-age-cleaner": "^0.1.3", @@ -8633,9 +9316,9 @@ } }, "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, "requires": { "@types/minimist": "^1.2.0", @@ -8643,12 +9326,12 @@ "decamelize-keys": "^1.1.0", "hard-rejection": "^2.1.0", "minimist-options": "4.1.0", - "normalize-package-data": "^2.5.0", + "normalize-package-data": "^3.0.0", "read-pkg-up": "^7.0.1", "redent": "^3.0.0", "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" } }, "merge": { @@ -8677,6 +9360,16 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, + "micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "dev": true, + "requires": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -8699,24 +9392,24 @@ } }, "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "dev": true }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", "dev": true }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", "dev": true, "requires": { - "mime-db": "1.44.0" + "mime-db": "1.45.0" } }, "mimic-fn": { @@ -8797,6 +9490,12 @@ "minimist": "^1.2.5" } }, + "modern-normalize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.0.0.tgz", + "integrity": "sha512-1lM+BMLGuDfsdwf3rsgBSrxJwAZHFIrQ8YR61xIqdHo0uNKI9M52wNpHSrliZATJp51On6JD0AfRxd4YGSU0lw==", + "dev": true + }, "modify-values": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", @@ -8815,6 +9514,12 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "nanoid": { + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", + "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==", + "dev": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -8852,17 +9557,17 @@ "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=", "dev": true }, + "nested-error-stacks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", + "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "dev": true + }, "next-tick": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node-emoji": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", @@ -8885,15 +9590,36 @@ "dev": true }, "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", + "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", + "hosted-git-info": "^4.0.1", + "resolve": "^1.20.0", + "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "normalize-path": { @@ -8920,16 +9646,10 @@ "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", "dev": true }, - "normalize.css": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", - "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", - "dev": true - }, "npm": { - "version": "6.14.8", - "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.8.tgz", - "integrity": "sha512-HBZVBMYs5blsj94GTeQZel7s9odVuuSUHy1+AlZh7rPVux1os2ashvEGLy/STNK7vUjbrCg5Kq9/GXisJgdf6A==", + "version": "6.14.11", + "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.11.tgz", + "integrity": "sha512-1Zh7LjuIoEhIyjkBflSSGzfjuPQwDlghNloppjruOH5bmj9midT9qcNT0tRUZRR04shU9ekrxNy9+UTBrqeBpQ==", "dev": true, "requires": { "JSONStream": "^1.3.5", @@ -8969,7 +9689,7 @@ "infer-owner": "^1.0.4", "inflight": "~1.0.6", "inherits": "^2.0.4", - "ini": "^1.3.5", + "ini": "^1.3.8", "init-package-json": "^1.10.3", "is-cidr": "^3.0.0", "json-parse-better-errors": "^1.0.2", @@ -9012,10 +9732,10 @@ "npm-pick-manifest": "^3.0.2", "npm-profile": "^4.0.4", "npm-registry-fetch": "^4.0.7", - "npm-user-validate": "~1.0.0", + "npm-user-validate": "^1.0.1", "npmlog": "~4.1.2", "once": "~1.4.0", - "opener": "^1.5.1", + "opener": "^1.5.2", "osenv": "^0.1.5", "pacote": "^9.5.12", "path-is-inside": "~1.0.2", @@ -9087,17 +9807,6 @@ "humanize-ms": "^1.2.1" } }, - "ajv": { - "version": "5.5.2", - "bundled": true, - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, "ansi-align": { "version": "2.0.0", "bundled": true, @@ -9428,11 +10137,6 @@ "mkdirp": "~0.5.0" } }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true - }, "code-point-at": { "version": "1.1.0", "bundled": true, @@ -9881,11 +10585,6 @@ "bundled": true, "dev": true }, - "fast-deep-equal": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, "fast-json-stable-stringify": { "version": "2.0.0", "bundled": true, @@ -10206,12 +10905,35 @@ "dev": true }, "har-validator": { - "version": "5.1.0", + "version": "5.1.5", "bundled": true, "dev": true, "requires": { - "ajv": "^5.3.0", + "ajv": "^6.12.3", "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "bundled": true, + "dev": true, + "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" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "bundled": true, + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "bundled": true, + "dev": true + } } }, "has": { @@ -10334,7 +11056,7 @@ "dev": true }, "ini": { - "version": "1.3.5", + "version": "1.3.8", "bundled": true, "dev": true }, @@ -10498,11 +11220,6 @@ "bundled": true, "dev": true }, - "json-schema-traverse": { - "version": "0.3.1", - "bundled": true, - "dev": true - }, "json-stringify-safe": { "version": "5.0.1", "bundled": true, @@ -11145,7 +11862,7 @@ } }, "npm-user-validate": { - "version": "1.0.0", + "version": "1.0.1", "bundled": true, "dev": true }, @@ -11198,7 +11915,7 @@ } }, "opener": { - "version": "1.5.1", + "version": "1.5.2", "bundled": true, "dev": true }, @@ -12149,6 +12866,21 @@ "xdg-basedir": "^3.0.0" } }, + "uri-js": { + "version": "4.4.0", + "bundled": true, + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "bundled": true, + "dev": true + } + } + }, "url-parse-lax": { "version": "1.0.0", "bundled": true, @@ -12505,68 +13237,23 @@ } }, "object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.1.1.tgz", + "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==", "dev": true }, "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" }, "object-is": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz", - "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==" - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "requires": { - "has-symbols": "^1.0.1" - } - }, - "object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "object-keys": { @@ -12584,24 +13271,26 @@ } }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "es-abstract": "^1.18.0-next.2" } }, "object.pick": { @@ -12614,14 +13303,14 @@ } }, "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", + "es-abstract": "^1.18.0-next.2", "has": "^1.0.3" } }, @@ -12650,12 +13339,6 @@ } } }, - "opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", - "dev": true - }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -12675,38 +13358,45 @@ "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-1.1.1.tgz", "integrity": "sha512-3Ux8um0zXbVacKUkcytc0u3HgC0b0bBLT+I60r2J/En72cI0nZffqrA7Xtf2Hqs27j1g82llR5Mhbd0Z1XW4AQ==" }, - "os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", - "dev": true, - "requires": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "p-cancelable": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", - "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", - "dev": true - }, - "p-defer": { - "version": "1.0.0", + "p-all": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-all/-/p-all-2.1.0.tgz", + "integrity": "sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==", + "dev": true, + "requires": { + "p-map": "^2.0.0" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } + } + }, + "p-cancelable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", + "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", + "dev": true + }, + "p-defer": { + "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", "dev": true }, "p-event": { @@ -12775,13 +13465,13 @@ } }, "p-queue": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.1.tgz", - "integrity": "sha512-miQiSxLYPYBxGkrldecZC18OTLjdUqnlRebGzPRiVxB8mco7usCmm7hFuxiTvp93K18JnLtE4KMMycjAu/cQQg==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", "dev": true, "requires": { "eventemitter3": "^4.0.4", - "p-timeout": "^3.1.0" + "p-timeout": "^3.2.0" } }, "p-reduce": { @@ -12791,9 +13481,9 @@ "dev": true }, "p-retry": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.2.0.tgz", - "integrity": "sha512-jPH38/MRh263KKcq0wBNOGFJbm+U6784RilTmHjB/HM9kH9V8WlCpVUcdOmip9cjXOh6MxZ5yk1z2SjDUJfWmA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.4.0.tgz", + "integrity": "sha512-gVB/tBsG+3AHI1SyDHRrX6n9ZL0Bcbifps9W9/Bgu3Oyu4/OrAh8SvDzDsvpP0oxfCt3oWNT+0fQ9LyUGwBTLg==", "dev": true, "requires": { "@types/retry": "^0.12.0", @@ -12868,13 +13558,15 @@ "dev": true }, "parse-path": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.2.tgz", - "integrity": "sha512-HSqVz6iuXSiL8C1ku5Gl1Z5cwDd9Wo0q8CoffdAghP6bz8pJa1tcMC+m4N+z6VAS8QdksnIGq1TB6EgR4vPR6w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.3.tgz", + "integrity": "sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA==", "dev": true, "requires": { "is-ssh": "^1.3.0", - "protocols": "^1.4.0" + "protocols": "^1.4.0", + "qs": "^6.9.4", + "query-string": "^6.13.8" } }, "pascalcase": { @@ -12883,6 +13575,12 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -12923,9 +13621,9 @@ } }, "pdfmake": { - "version": "0.1.68", - "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.1.68.tgz", - "integrity": "sha512-oE1VEjkluro3+QqvLbFgFU/rRgyKdbPy/Fh8SS/nsUxnsiUcm85ChpmD6YD0hQW1E0d3hppAo4Yh+xdXucenIA==", + "version": "0.1.70", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.1.70.tgz", + "integrity": "sha512-xPhkblaQ71U97qhRTPj/1HknAHHFZ3cPRmRdrqEWD2xXBcEjEM3Yw0MIjML8DRy9Dt9n6QRjHVf662f0eLtd7Q==", "requires": { "iconv-lite": "^0.6.2", "linebreak": "^1.0.2", @@ -13028,15 +13726,6 @@ } } }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, "pkg-up": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", @@ -13126,14 +13815,38 @@ "dev": true }, "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "version": "8.2.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.8.tgz", + "integrity": "sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "colorette": "^1.2.2", + "nanoid": "^3.1.20", + "source-map": "^0.6.1" + }, + "dependencies": { + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" }, "dependencies": { "chalk": { @@ -13158,6 +13871,17 @@ } } }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -13175,16 +13899,6 @@ } } }, - "postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^6.0.2" - } - }, "postcss-calc": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", @@ -13194,12 +13908,62 @@ "postcss": "^7.0.27", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-cli": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-8.1.0.tgz", - "integrity": "sha512-FYuV5zyYX53X5RywInxjWLqHZ4oCBC3nDwrHYU3Z75mFqUo5IHfbeY593heWSagG90nPnXq3tXCck8+2CUl8EA==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-8.3.1.tgz", + "integrity": "sha512-leHXsQRq89S3JC9zw/tKyiVV2jAhnfQe0J8VI4eQQbUjwIe0XxVqLrR+7UsahF1s9wi4GlqP6SJ8ydf44cgF2Q==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -13212,6 +13976,7 @@ "postcss-reporter": "^7.0.0", "pretty-hrtime": "^1.0.3", "read-cache": "^1.0.0", + "slash": "^3.0.0", "yargs": "^16.0.0" }, "dependencies": { @@ -13231,9 +13996,9 @@ } }, "cliui": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.1.tgz", - "integrity": "sha512-rcvHOWyGyid6I1WjT/3NatKj2kDt9OdSHSXpyLXaMWFbKpGACNW8pRhhdPUq9MWUOdwn8Rz9AVETjF4105rZZQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", @@ -13256,19 +14021,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, "fs-extra": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", @@ -13281,42 +14033,6 @@ "universalify": "^1.0.0" } }, - "import-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", - "dev": true, - "requires": { - "import-from": "^3.0.0" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -13324,43 +14040,23 @@ "dev": true }, "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "postcss-load-config": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.0.0.tgz", - "integrity": "sha512-lErrN8imuEF1cSiHBV8MiR7HeuzlDpCGNtaMyYHlOBuJHHOGw6S4xOMZp8BbXPr7AGQp14L6PZDlIOpfFJ6f7w==", - "dev": true, - "requires": { - "cosmiconfig": "^7.0.0", - "import-cwd": "^3.0.0" + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } } }, - "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==", - "dev": true - }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -13399,30 +14095,30 @@ } }, "y18n": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.2.tgz", - "integrity": "sha512-CkwaeZw6dQgqgPGeTWKMXCRmMcBgETFlTml1+ZOO+q7kGst8NREJ+eWwFNPVUQ4QGdAaklbqCZHH6Zuep1RjiA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", "dev": true }, "yargs": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.0.3.tgz", - "integrity": "sha512-6+nLw8xa9uK1BOEOykaiYAJVh6/CjxWXK/q9b5FpRgNslt8s22F2xMBqVIKgCRjNgGvGPBy8Vog7WN7yh4amtA==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^7.0.0", - "escalade": "^3.0.2", + "cliui": "^7.0.2", + "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", - "y18n": "^5.0.1", - "yargs-parser": "^20.0.0" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-yYsjuSkjbLMBp16eaOt7/siKTjNVjMm3SoJnIg3sEh/JsvqVVDyjRKmaJV4cl+lNIgq6QEco2i3gDebJl7/vLA==", + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", "dev": true } } @@ -13435,6 +14131,56 @@ "requires": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-color-gray": { @@ -13446,17 +14192,117 @@ "@csstools/convert-colors": "^1.4.0", "postcss": "^7.0.5", "postcss-values-parser": "^2.0.0" - } - }, - "postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", - "dev": true, - "requires": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - } + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "dev": true, + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } }, "postcss-color-mod-function": { "version": "3.0.3", @@ -13467,6 +14313,56 @@ "@csstools/convert-colors": "^1.4.0", "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-color-rebeccapurple": { @@ -13477,6 +14373,56 @@ "requires": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-colormin": { @@ -13492,11 +14438,59 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -13510,31 +14504,179 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", - "dev": true, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "dev": true, "requires": { "postcss": "^7.0.17", "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-custom-selectors": { @@ -13547,12 +14689,45 @@ "postcss-selector-parser": "^5.0.0-rc.3" }, "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "cssesc": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-selector-parser": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", @@ -13563,6 +14738,21 @@ "indexes-of": "^1.0.1", "uniq": "^1.0.1" } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -13576,12 +14766,45 @@ "postcss-selector-parser": "^5.0.0-rc.3" }, "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "cssesc": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-selector-parser": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", @@ -13592,6 +14815,21 @@ "indexes-of": "^1.0.1", "uniq": "^1.0.1" } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -13602,92 +14840,65 @@ "dev": true, "requires": { "postcss": "^7.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "dev": true, "requires": { "postcss": "^7.0.0" - } - }, - "postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", - "dev": true, - "requires": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-font-variant": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", - "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-functions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-functions/-/postcss-functions-3.0.0.tgz", - "integrity": "sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=", - "dev": true, - "requires": { - "glob": "^7.1.2", - "object-assign": "^4.1.1", - "postcss": "^6.0.9", - "postcss-value-parser": "^3.3.0" }, "dependencies": { "chalk": { @@ -13699,337 +14910,173 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "chalk": "^2.4.1", + "chalk": "^2.4.2", "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "supports-color": "^6.1.0" } }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-html": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", - "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", - "dev": true, - "requires": { - "htmlparser2": "^3.10.0" - } - }, - "postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-import": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", - "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "dev": true, "requires": { - "postcss": "^7.0.1", - "postcss-value-parser": "^3.2.3", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" + "postcss": "^7.0.0" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "postcss-initial": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", - "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", - "dev": true, - "requires": { - "lodash.template": "^4.5.0", - "postcss": "^7.0.2" - } - }, - "postcss-js": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-2.0.3.tgz", - "integrity": "sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==", - "dev": true, - "requires": { - "camelcase-css": "^2.0.1", - "postcss": "^7.0.18" - } - }, - "postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "dev": true, "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-less": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", - "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", - "dev": true - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" + "postcss": "^7.0.0" }, "dependencies": { - "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "is-obj": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "is-obj": "^2.0.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "has-flag": "^3.0.0" } } } }, - "postcss-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-2.0.0.tgz", - "integrity": "sha512-eqp+Bva+U2cwQO7dECJ8/V+X+uH1HduNeITB0CPPFAu6d/8LKQ32/j+p9rQ2YL1QytVcrNU0X+fBqgGmQIA1Rw==", - "dev": true, - "requires": { - "css-modules-loader-core": "^1.1.0", - "generic-names": "^2.0.1", - "lodash.camelcase": "^4.3.0", - "postcss": "^7.0.1", - "string-hash": "^1.1.1" - } - }, - "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", "dev": true, "requires": { - "postcss": "^6.0.1" + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" }, "dependencies": { "chalk": { @@ -14041,17 +15088,28 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "chalk": "^2.4.1", + "chalk": "^2.4.2", "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "supports-color": "^6.1.0" } }, "source-map": { @@ -14059,17 +15117,26 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", "dev": true, "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" }, "dependencies": { "chalk": { @@ -14081,17 +15148,28 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "chalk": "^2.4.1", + "chalk": "^2.4.2", "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "supports-color": "^6.1.0" } }, "source-map": { @@ -14099,17 +15177,25 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", "dev": true, "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "postcss": "^7.0.2" }, "dependencies": { "chalk": { @@ -14121,17 +15207,28 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "chalk": "^2.4.1", + "chalk": "^2.4.2", "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "supports-color": "^6.1.0" } }, "source-map": { @@ -14139,17 +15236,25 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", "dev": true, "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" + "postcss": "^7.0.2" }, "dependencies": { "chalk": { @@ -14161,17 +15266,28 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "chalk": "^2.4.1", + "chalk": "^2.4.2", "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "supports-color": "^6.1.0" } }, "source-map": { @@ -14179,1756 +15295,4919 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "postcss-nested": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-4.2.3.tgz", - "integrity": "sha512-rOv0W1HquRCamWy2kFl3QazJMMe1ku6rCFoAAH+9AcxdbpDeBr6k968MLWuLjvjMcGEip01ak09hKOEgpK9hvw==", - "dev": true, - "requires": { - "postcss": "^7.0.32", - "postcss-selector-parser": "^6.0.2" - } - }, - "postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "postcss-font-variant": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", + "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", "dev": true, "requires": { "postcss": "^7.0.2" - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "postcss-functions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-functions/-/postcss-functions-3.0.0.tgz", + "integrity": "sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "glob": "^7.1.2", + "object-assign": "^4.1.1", + "postcss": "^6.0.9", + "postcss-value-parser": "^3.3.0" }, "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "postcss": "^7.0.2" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "postcss-html": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", + "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "htmlparser2": "^3.10.0" } }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", "dev": true, "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "postcss-import": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.0.tgz", + "integrity": "sha512-gFDDzXhqr9ELmnLHgCC3TbGfA6Dm/YMb/UN8/f7Uuq4fL7VTk2vOIj6hwINEwbokEmp123bLD7a5m+E+KIetRg==", "dev": true, "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" } }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "postcss-initial": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", + "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "lodash.template": "^4.5.0", + "postcss": "^7.0.2" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "postcss-js": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-3.0.3.tgz", + "integrity": "sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==", "dev": true, "requires": { - "postcss": "^7.0.2" + "camelcase-css": "^2.0.1", + "postcss": "^8.1.6" } }, - "postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", "dev": true, "requires": { + "@csstools/convert-colors": "^1.4.0", "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" - } - }, - "postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", - "dev": true, - "requires": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" - } - }, - "postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" }, "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "has-flag": "^3.0.0" } } } }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "postcss-less": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", + "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" + "postcss": "^7.0.14" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "postcss-load-config": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.0.0.tgz", + "integrity": "sha512-lErrN8imuEF1cSiHBV8MiR7HeuzlDpCGNtaMyYHlOBuJHHOGw6S4xOMZp8BbXPr7AGQp14L6PZDlIOpfFJ6f7w==", "dev": true, "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "cosmiconfig": "^7.0.0", + "import-cwd": "^3.0.0" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "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==", "dev": true } } }, - "postcss-replace-overflow-wrap": { + "postcss-logical": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", "dev": true, "requires": { "postcss": "^7.0.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "postcss-reporter": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.1.tgz", - "integrity": "sha512-R9AK80KIqqMb+lwGRBcRkXS7r96VCTxrZvvrfibyA/dWjqctwx7leHMCC05A9HbW8PnChwOWwrmISwp5HQu5wg==", - "dev": true, - "requires": { - "colorette": "^1.2.1", - "lodash.difference": "^4.5.0", - "lodash.forown": "^4.4.0", - "lodash.get": "^4.4.2", - "lodash.groupby": "^4.6.0", - "lodash.sortby": "^4.7.0", - "log-symbols": "^4.0.0" - } - }, - "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", - "dev": true - }, - "postcss-safe-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", - "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", - "dev": true, - "requires": { - "postcss": "^7.0.26" - } - }, - "postcss-sass": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", - "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", - "dev": true, - "requires": { - "gonzales-pe": "^4.3.0", - "postcss": "^7.0.21" - } - }, - "postcss-scss": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", - "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", - "dev": true, - "requires": { - "postcss": "^7.0.6" - } - }, - "postcss-selector-matches": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - } - }, - "postcss-selector-not": { + "postcss-media-minmax": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", - "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", "dev": true, "requires": { - "balanced-match": "^1.0.0", "postcss": "^7.0.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } + "postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", + "dev": true }, - "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", "dev": true, "requires": { - "is-svg": "^3.0.0", + "css-color-names": "0.0.4", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" + "stylehacks": "^4.0.0" }, "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "postcss-syntax": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", - "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", - "dev": true - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "dev": true, "requires": { - "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", "postcss": "^7.0.0", - "uniqs": "^2.0.0" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", - "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "prettier-plugin-organize-imports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-1.1.1.tgz", - "integrity": "sha512-rFA1lnek1FYkMGthm4xBKME41qUKItTovuo24bCGZu/Vu1n3gW71UPLAkIdwewwkZCe29gRVweSOPXvAdckFuw==", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "printj": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" - }, - "process-nextick-args": { - "version": "2.0.1", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.0.0.tgz", + "integrity": "sha512-ghS/ovDzDqARm4Zj6L2ntadjyQMoyJmi0JkLlYtH2QFLrvNlxH5OAVRPWPeKilB0pY7SbuhO173KOWkPAxRJcw==", + "dev": true, + "requires": { + "generic-names": "^2.0.1", + "icss-replace-symbols": "^1.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.1" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" + } + } + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-nested": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.5.tgz", + "integrity": "sha512-GSRXYz5bccobpTzLQZXOnSOfKl6TwVr5CyAQJUPub4nuRJSOECK5AqurxVgmtxP48p0Kc/ndY/YyS1yqldX0Ew==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" + } + } + } + }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "dev": true, + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-reporter": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.2.tgz", + "integrity": "sha512-JyQ96NTQQsso42y6L1H1RqHfWH1C3Jr0pt91mVv5IdYddZAE9DUZxuferNgk6q0o6vBVOrfVJb10X1FgDzjmDw==", + "dev": true, + "requires": { + "colorette": "^1.2.1", + "lodash.difference": "^4.5.0", + "lodash.forown": "^4.4.0", + "lodash.get": "^4.4.2", + "lodash.groupby": "^4.6.0", + "lodash.sortby": "^4.7.0" + } + }, + "postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "dev": true + }, + "postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "dev": true, + "requires": { + "postcss": "^7.0.26" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-sass": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", + "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", + "dev": true, + "requires": { + "gonzales-pe": "^4.3.0", + "postcss": "^7.0.21" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-scss": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", + "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", + "dev": true, + "requires": { + "postcss": "^7.0.6" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-not": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", + "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + } + } + }, + "postcss-syntax": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", + "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", + "dev": true + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "prettier-plugin-organize-imports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-1.1.1.tgz", + "integrity": "sha512-rFA1lnek1FYkMGthm4xBKME41qUKItTovuo24bCGZu/Vu1n3gW71UPLAkIdwewwkZCe29gRVweSOPXvAdckFuw==", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" + }, + "process-nextick-args": { + "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise.series": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", + "integrity": "sha1-LMfr6Vn8OmYZwEq029yeRS2GS70=", + "dev": true + }, + "prosemirror-commands": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.1.4.tgz", + "integrity": "sha512-kj4Qi+8h3EpJtZuuEDwZ9h2/QNGWDsIX/CzjmClxi9GhxWyBUMVUvIFk0mgdqHyX20lLeGmOpc0TLA5aPzgpWg==", + "requires": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-dropcursor": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.2.tgz", + "integrity": "sha512-4c94OUGyobGnwcQI70OXyMhE/9T4aTgjU+CHxkd5c7D+jH/J0mKM/lk+jneFVKt7+E4/M0D9HzRPifu8U28Thw==", + "requires": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "prosemirror-example-setup": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prosemirror-example-setup/-/prosemirror-example-setup-1.1.2.tgz", + "integrity": "sha512-MTpIMyqk08jFnzxeRMCinCEMtVSTUtxKgQBGxfCbVe9C6zIOqp9qZZJz5Ojaad1GETySyuj8+OIHHvQsIaaaGQ==", + "requires": { + "prosemirror-commands": "^1.0.0", + "prosemirror-dropcursor": "^1.0.0", + "prosemirror-gapcursor": "^1.0.0", + "prosemirror-history": "^1.0.0", + "prosemirror-inputrules": "^1.0.0", + "prosemirror-keymap": "^1.0.0", + "prosemirror-menu": "^1.0.0", + "prosemirror-schema-list": "^1.0.0", + "prosemirror-state": "^1.0.0" + } + }, + "prosemirror-gapcursor": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.1.5.tgz", + "integrity": "sha512-SjbUZq5pgsBDuV3hu8GqgIpZR5eZvGLM+gPQTqjVVYSMUCfKW3EGXTEYaLHEl1bGduwqNC95O3bZflgtAb4L6w==", + "requires": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "prosemirror-history": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.1.3.tgz", + "integrity": "sha512-zGDotijea+vnfnyyUGyiy1wfOQhf0B/b6zYcCouBV8yo6JmrE9X23M5q7Nf/nATywEZbgRLG70R4DmfSTC+gfg==", + "requires": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "rope-sequence": "^1.3.0" + } + }, + "prosemirror-inputrules": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.1.2.tgz", + "integrity": "sha512-Ja5Z3BWestlHYGvtSGqyvxMeB8QEuBjlHM8YnKtLGUXMDp965qdDV4goV8lJb17kIWHk7e7JNj6Catuoa3302g==", + "requires": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-keymap": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.1.4.tgz", + "integrity": "sha512-Al8cVUOnDFL4gcI5IDlG6xbZ0aOD/i3B17VT+1JbHWDguCgt/lBHVTHUBcKvvbSg6+q/W4Nj1Fu6bwZSca3xjg==", + "requires": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "prosemirror-markdown": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.5.1.tgz", + "integrity": "sha512-QvucPHx+gKOQW1SETKUysrful9VBjKqpCFmPotgLfVZ3BdQEGy/NEIFhaXXo3TcuW316MMnKfA90K7GE5I7z8A==", + "requires": { + "markdown-it": "^10.0.0", + "prosemirror-model": "^1.0.0" + } + }, + "prosemirror-menu": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.1.4.tgz", + "integrity": "sha512-2ROsji/X9ciDnVSRvSTqFygI34GEdHfQSsK4zBKjPxSEroeiHHcdRMS1ofNIf2zM0Vpp5/YqfpxynElymQkqzg==", + "requires": { + "crelt": "^1.0.0", + "prosemirror-commands": "^1.0.0", + "prosemirror-history": "^1.0.0", + "prosemirror-state": "^1.0.0" + } + }, + "prosemirror-model": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.11.0.tgz", + "integrity": "sha512-GqoAz/mIYjdv8gVYJ8mWFKpHoTxn/lXq4tXJ6bTVxs+rem2LzMYXrNVXfucGtfsgqsJlRIgng/ByG9j7Q8XDrg==", + "requires": { + "orderedmap": "^1.1.0" + } + }, + "prosemirror-schema-list": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.1.2.tgz", + "integrity": "sha512-dgM9PwtM4twa5WsgSYMB+J8bwjnR43DAD3L9MsR9rKm/nZR5Y85xcjB7gusVMSsbQ2NomMZF03RE6No6mTnclQ==", + "requires": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-state": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.3.4.tgz", + "integrity": "sha512-Xkkrpd1y/TQ6HKzN3agsQIGRcLckUMA9u3j207L04mt8ToRgpGeyhbVv0HI7omDORIBHjR29b7AwlATFFf2GLA==", + "requires": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "prosemirror-transform": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.2.7.tgz", + "integrity": "sha512-/107Lo2zeDgXuJBxb8s/clNu0Z2W8Gv3MKmkuSS/68Mcr7LBaUnN/Hj2g+GUxEJ7MpExCzFs65GrsNo2K9rxUQ==", + "requires": { + "prosemirror-model": "^1.0.0" + } + }, + "prosemirror-view": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.18.1.tgz", + "integrity": "sha512-TZd8byDRfdopLiokBY7T27msCSfWqqRxWs/LnBbdI030F+iI2kS+tO59/XFnpZxMLFKlJgOgGGhM9SzD1Nwdxw==", + "requires": { + "prosemirror-model": "^1.1.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "protocols": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", + "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "promise.series": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", - "integrity": "sha1-LMfr6Vn8OmYZwEq029yeRS2GS70=", + "purgecss": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-3.1.3.tgz", + "integrity": "sha512-hRSLN9mguJ2lzlIQtW4qmPS2kh6oMnA9RxdIYK8sz18QYqd6ePp4GNDl18oWHA1f2v2NEQIh51CO8s/E3YGckQ==", + "dev": true, + "requires": { + "commander": "^6.0.0", + "glob": "^7.0.0", + "postcss": "^8.2.1", + "postcss-selector-parser": "^6.0.2" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, - "prosemirror-commands": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.1.4.tgz", - "integrity": "sha512-kj4Qi+8h3EpJtZuuEDwZ9h2/QNGWDsIX/CzjmClxi9GhxWyBUMVUvIFk0mgdqHyX20lLeGmOpc0TLA5aPzgpWg==", + "qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", + "dev": true + }, + "query-string": { + "version": "6.13.8", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.8.tgz", + "integrity": "sha512-jxJzQI2edQPE/NPUOusNjO/ZOGqr1o2OBa/3M00fU76FsLXDVbJDv/p7ng5OdQyorKrkRz1oqfwmbe5MAMePQg==", + "dev": true, "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" } }, - "prosemirror-dropcursor": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.2.tgz", - "integrity": "sha512-4c94OUGyobGnwcQI70OXyMhE/9T4aTgjU+CHxkd5c7D+jH/J0mKM/lk+jneFVKt7+E4/M0D9HzRPifu8U28Thw==", + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "quote-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", + "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", "requires": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0", - "prosemirror-view": "^1.1.0" + "buffer-equal": "0.0.1", + "minimist": "^1.1.3", + "through2": "^2.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", + "dev": true, + "requires": { + "esprima": "~4.0.0" + } + }, + "reduce-css-calc": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", + "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", + "dev": true, + "requires": { + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "redux": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", + "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", + "requires": { + "loose-envify": "^1.4.0", + "symbol-observable": "^1.2.0" } }, - "prosemirror-example-setup": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prosemirror-example-setup/-/prosemirror-example-setup-1.1.2.tgz", - "integrity": "sha512-MTpIMyqk08jFnzxeRMCinCEMtVSTUtxKgQBGxfCbVe9C6zIOqp9qZZJz5Ojaad1GETySyuj8+OIHHvQsIaaaGQ==", + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, "requires": { - "prosemirror-commands": "^1.0.0", - "prosemirror-dropcursor": "^1.0.0", - "prosemirror-gapcursor": "^1.0.0", - "prosemirror-history": "^1.0.0", - "prosemirror-inputrules": "^1.0.0", - "prosemirror-keymap": "^1.0.0", - "prosemirror-menu": "^1.0.0", - "prosemirror-schema-list": "^1.0.0", - "prosemirror-state": "^1.0.0" + "regenerate": "^1.4.0" } }, - "prosemirror-gapcursor": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.1.5.tgz", - "integrity": "sha512-SjbUZq5pgsBDuV3hu8GqgIpZR5eZvGLM+gPQTqjVVYSMUCfKW3EGXTEYaLHEl1bGduwqNC95O3bZflgtAb4L6w==", + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, "requires": { - "prosemirror-keymap": "^1.0.0", - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-view": "^1.0.0" + "@babel/runtime": "^7.8.4" } }, - "prosemirror-history": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.1.3.tgz", - "integrity": "sha512-zGDotijea+vnfnyyUGyiy1wfOQhf0B/b6zYcCouBV8yo6JmrE9X23M5q7Nf/nATywEZbgRLG70R4DmfSTC+gfg==", + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, "requires": { - "prosemirror-state": "^1.2.2", - "prosemirror-transform": "^1.0.0", - "rope-sequence": "^1.3.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, - "prosemirror-inputrules": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.1.2.tgz", - "integrity": "sha512-Ja5Z3BWestlHYGvtSGqyvxMeB8QEuBjlHM8YnKtLGUXMDp965qdDV4goV8lJb17kIWHk7e7JNj6Catuoa3302g==", + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", "requires": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, - "prosemirror-keymap": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.1.4.tgz", - "integrity": "sha512-Al8cVUOnDFL4gcI5IDlG6xbZ0aOD/i3B17VT+1JbHWDguCgt/lBHVTHUBcKvvbSg6+q/W4Nj1Fu6bwZSca3xjg==", + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, "requires": { - "prosemirror-state": "^1.0.0", - "w3c-keyname": "^2.2.0" + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" } }, - "prosemirror-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.5.0.tgz", - "integrity": "sha512-ugTyZfTu1l2E3EI6+DwD917mz2Sk5E4R01Nh67yMffGg4S9ZetC81g1VIKGCaak4jnoP4BMUIOUJyXAS6xFLaA==", + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dev": true, "requires": { - "markdown-it": "^10.0.0", - "prosemirror-model": "^1.0.0" + "rc": "^1.2.8" } }, - "prosemirror-menu": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.1.4.tgz", - "integrity": "sha512-2ROsji/X9ciDnVSRvSTqFygI34GEdHfQSsK4zBKjPxSEroeiHHcdRMS1ofNIf2zM0Vpp5/YqfpxynElymQkqzg==", + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "dev": true, "requires": { - "crelt": "^1.0.0", - "prosemirror-commands": "^1.0.0", - "prosemirror-history": "^1.0.0", - "prosemirror-state": "^1.0.0" + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } } }, - "prosemirror-model": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.11.0.tgz", - "integrity": "sha512-GqoAz/mIYjdv8gVYJ8mWFKpHoTxn/lXq4tXJ6bTVxs+rem2LzMYXrNVXfucGtfsgqsJlRIgng/ByG9j7Q8XDrg==", + "regression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regression/-/regression-2.0.1.tgz", + "integrity": "sha1-jSnD6CJKEIUMNeM36FqLL6w7DIc=" + }, + "remark": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", + "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", + "dev": true, "requires": { - "orderedmap": "^1.1.0" + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.0", + "unified": "^9.1.0" } }, - "prosemirror-schema-list": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.1.2.tgz", - "integrity": "sha512-dgM9PwtM4twa5WsgSYMB+J8bwjnR43DAD3L9MsR9rKm/nZR5Y85xcjB7gusVMSsbQ2NomMZF03RE6No6mTnclQ==", + "remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "dev": true, "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0" + "mdast-util-from-markdown": "^0.8.0" } }, - "prosemirror-state": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.3.3.tgz", - "integrity": "sha512-PLXh2VJsIgvlgSTH6I2Yg6vk1CzPDp21DFreVpQtDMY2S6WaMmrQgDTLRcsrD8X38v8Yc873H7+ogdGzyIPn+w==", + "remark-stringify": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", + "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", + "dev": true, "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0" + "mdast-util-to-markdown": "^0.6.0" } }, - "prosemirror-transform": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.2.7.tgz", - "integrity": "sha512-/107Lo2zeDgXuJBxb8s/clNu0Z2W8Gv3MKmkuSS/68Mcr7LBaUnN/Hj2g+GUxEJ7MpExCzFs65GrsNo2K9rxUQ==", + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "requires": { - "prosemirror-model": "^1.0.0" + "path-parse": "^1.0.6" } }, - "prosemirror-view": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.16.0.tgz", - "integrity": "sha512-iFtStCw2byF0yLc3mm1ezGdFSd6SWM4pnJod+ZaJiU5ju36QdYM4Xwa+qNm/AaI2/MgxpJqi8jsGWOJNkeBQ/Q==", + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, "requires": { - "prosemirror-model": "^1.1.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" } }, - "protocols": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", - "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "global-dirs": "^0.1.1" } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, - "purgecss": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.3.0.tgz", - "integrity": "sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ==", + "responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", "dev": true, "requires": { - "commander": "^5.0.0", - "glob": "^7.0.0", - "postcss": "7.0.32", - "postcss-selector-parser": "^6.0.2" - }, - "dependencies": { - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - } + "lowercase-keys": "^2.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "restructure": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-0.5.4.tgz", + "integrity": "sha1-9U591WNZD7NP1r9Vh2EJrsyyjeg=", + "requires": { + "browserify-optional": "^1.0.0" + } + }, + "resumer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", + "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", + "requires": { + "through": "~2.3.4" } }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, - "quote-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", - "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rgbcolor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", + "integrity": "sha1-1lBezbMEplldom+ktDMHMGd1lF0=" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "requires": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + "align-text": "^0.1.1" } }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "requires": { - "performance-now": "^2.1.0" + "glob": "^7.1.3" } }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "rollup": { + "version": "2.42.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.42.4.tgz", + "integrity": "sha512-Zqv3EvNfcllBHyyEUM754npqsZw82VIjK34cDQMwrQ1d6aqxzeYu5yFb7smGkPU4C1Bj7HupIMeT6WU7uIdnMw==", "dev": true, "requires": { - "safe-buffer": "^5.1.0" + "fsevents": "~2.3.1" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "rollup-plugin-inject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", + "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", "dev": true, "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "estree-walker": "^0.6.1", + "magic-string": "^0.25.3", + "rollup-pluginutils": "^2.8.1" }, "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true } } }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "rollup-plugin-multi-input": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-multi-input/-/rollup-plugin-multi-input-1.2.0.tgz", + "integrity": "sha512-jLmVLYpIB9sFk3JmzwKFryPqZYv1Dib/GzQEy708hfD/xauwgOyKWk7qhKMQp71mbGTuF59neUst/cnveIii+A==", "dev": true, "requires": { - "pify": "^2.3.0" + "@babel/runtime": "^7.0.0-beta.55", + "core-js": "^3.1.3", + "fast-glob": "^3.0.0", + "lodash": "^4.17.11" } }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "rollup-plugin-node-polyfills": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", + "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", "dev": true, "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "rollup-plugin-inject": "^3.0.0" + } + }, + "rollup-plugin-postcss": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.0.tgz", + "integrity": "sha512-OQzT+YspV01/6dxfyEw8lBO2px3hyL8Xn+k2QGctL7V/Yx2Z1QaMKdYVslP1mqv7RsKt6DROIlnbpmgJ3yxf6g==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "concat-with-sourcemaps": "^1.1.0", + "cssnano": "^4.1.10", + "import-cwd": "^3.0.0", + "p-queue": "^6.6.2", + "pify": "^5.0.0", + "postcss-load-config": "^3.0.0", + "postcss-modules": "^4.0.0", + "promise.series": "^0.2.0", + "resolve": "^1.19.0", + "rollup-pluginutils": "^2.8.2", + "safe-identifier": "^0.4.2", + "style-inject": "^0.3.0" }, "dependencies": { - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "color-convert": "^2.0.1" } }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "dev": true, + "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==", "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "dev": true + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "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==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "dev": true, "requires": { - "esprima": "~4.0.0" + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } } }, - "reduce-css-calc": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz", - "integrity": "sha512-fDnlZ+AybAS3C7Q9xDq5y8A2z+lT63zLbynew/lur/IR24OQF5x98tfNwf79mzEdfywZ0a2wpM860FhFfMxZlA==", + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", "dev": true, "requires": { - "css-unit-converter": "^1.1.1", - "postcss-value-parser": "^3.3.0" + "estree-walker": "^0.6.1" }, "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true } } }, - "redux": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", - "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", - "requires": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" - } + "rope-sequence": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.2.tgz", + "integrity": "sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg==" }, - "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", "dev": true }, - "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "rxjs": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", "dev": true, "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "tslib": "^1.9.0" } }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "safe-identifier": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", + "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", "dev": true }, - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" + "ret": "~0.1.10" } }, - "registry-auth-token": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", - "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", - "dev": true, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "scope-analyzer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.1.1.tgz", + "integrity": "sha512-azEAihtQ9mEyZGhfgTJy3IbOWEzeOrYbg7NcYEshPKnKd+LZmC3TNd5dmDxbLBsTG/JVWmCp+vDJ03vJjeXMHg==", "requires": { - "rc": "^1.2.8" + "array-from": "^2.1.1", + "dash-ast": "^1.0.0", + "es6-map": "^0.1.5", + "es6-set": "^0.1.5", + "es6-symbol": "^3.1.1", + "estree-is-function": "^1.0.0", + "get-assigned-identifiers": "^1.1.0" } }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "dev": true - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "semantic-release": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.4.2.tgz", + "integrity": "sha512-TPLWuoe2L2DmgnQEh+OLWW5V1T+ZAa1xWuHXsuPAWEko0BqSdLPl+5+BlQ+D5Bp27S5gDJ1//Y1tgbmvUhnOCw==", "dev": true, "requires": { - "jsesc": "~0.5.0" + "@semantic-release/commit-analyzer": "^8.0.0", + "@semantic-release/error": "^2.2.0", + "@semantic-release/github": "^7.0.0", + "@semantic-release/npm": "^7.0.0", + "@semantic-release/release-notes-generator": "^9.0.0", + "aggregate-error": "^3.0.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.0.0", + "env-ci": "^5.0.0", + "execa": "^5.0.0", + "figures": "^3.0.0", + "find-versions": "^4.0.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^2.0.0", + "hosted-git-info": "^4.0.0", + "lodash": "^4.17.15", + "marked": "^2.0.0", + "marked-terminal": "^4.1.1", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "p-reduce": "^2.0.0", + "read-pkg-up": "^7.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "semver-diff": "^3.1.1", + "signale": "^1.2.1", + "yargs": "^16.2.0" }, "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "dev": true, + "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" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "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==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true + }, + "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==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "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==", + "dev": true + } + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, - "regression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regression/-/regression-2.0.1.tgz", - "integrity": "sha1-jSnD6CJKEIUMNeM36FqLL6w7DIc=" - }, - "remark": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/remark/-/remark-12.0.1.tgz", - "integrity": "sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw==", - "dev": true, - "requires": { - "remark-parse": "^8.0.0", - "remark-stringify": "^8.0.0", - "unified": "^9.0.0" - } - }, - "remark-parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "dev": true, - "requires": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - } - }, - "remark-stringify": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", - "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", - "dev": true, - "requires": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^2.0.0", - "mdast-util-compact": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^3.0.0", - "unherit": "^1.0.4", - "xtend": "^4.0.1" - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "replace-ext": { + "semver-compare": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", "dev": true }, - "resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", "dev": true, "requires": { - "global-dirs": "^0.1.1" + "semver": "^6.3.0" } }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "semver-regex": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.2.tgz", + "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==", "dev": true }, - "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, "requires": { - "lowercase-keys": "^2.0.0" + "randombytes": "^2.1.0" } }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "restructure": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/restructure/-/restructure-0.5.4.tgz", - "integrity": "sha1-9U591WNZD7NP1r9Vh2EJrsyyjeg=", - "requires": { - "browserify-optional": "^1.0.0" - } - }, - "resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "requires": { - "through": "~2.3.4" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "rgbcolor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", - "integrity": "sha1-1lBezbMEplldom+ktDMHMGd1lF0=" - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "^0.1.1" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" }, - "rollup": { - "version": "2.32.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.32.1.tgz", - "integrity": "sha512-Op2vWTpvK7t6/Qnm1TTh7VjEZZkN8RWgf0DHbkKzQBwNf748YhXbozHVefqpPp/Fuyk/PQPAnYsBxAEtlMvpUw==", + "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==", "dev": true, "requires": { - "fsevents": "~2.1.2" + "shebang-regex": "^3.0.0" } }, - "rollup-plugin-inject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", - "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "signale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", + "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", "dev": true, "requires": { - "estree-walker": "^0.6.1", - "magic-string": "^0.25.3", - "rollup-pluginutils": "^2.8.1" + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" }, "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } } } }, - "rollup-plugin-multi-input": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-multi-input/-/rollup-plugin-multi-input-1.1.1.tgz", - "integrity": "sha512-q/sFiS7h7AQk0V/fFREt5Gizewov01V1RZgORFmXL6W9emkJOPu94GFJ21KYtSob4bmEmDq9Hpr+3ukKNi84CA==", + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "dev": true, "requires": { - "@babel/runtime": "^7.0.0-beta.55", - "core-js": "^3.1.3", - "fast-glob": "^3.0.0", - "lodash": "^4.17.11" - }, - "dependencies": { - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", - "dev": true - } + "is-arrayish": "^0.3.1" } }, - "rollup-plugin-node-polyfills": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", - "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { - "rollup-plugin-inject": "^3.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + } } }, - "rollup-plugin-postcss": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-3.1.8.tgz", - "integrity": "sha512-JHnGfW8quNc6ePxEkZ05HEZ1YiRxDgY9RKEetMfsrwxR2kh/d90OVScTc6b1c2Q17Cs/5TRYL+1uddG21lQe3w==", + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "chalk": "^4.0.0", - "concat-with-sourcemaps": "^1.1.0", - "cssnano": "^4.1.10", - "import-cwd": "^3.0.0", - "p-queue": "^6.3.0", - "pify": "^5.0.0", - "postcss": "^7.0.27", - "postcss-load-config": "^2.1.0", - "postcss-modules": "^2.0.0", - "promise.series": "^0.2.0", - "resolve": "^1.16.1", - "rollup-pluginutils": "^2.8.2", - "safe-identifier": "^0.4.1", - "style-inject": "^0.3.0" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { - "import-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "import-from": "^3.0.0" + "ms": "2.0.0" } }, - "import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "resolve-from": "^5.0.0" + "is-descriptor": "^0.1.0" } }, - "pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, - "rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "is-descriptor": "^1.0.0" } }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "kind-of": "^6.0.0" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "is-buffer": "^1.1.5" } } } }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, "requires": { - "estree-walker": "^0.6.1" + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" }, "dependencies": { - "estree-walker": { + "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, - "rope-sequence": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.2.tgz", - "integrity": "sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg==" - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "spawn-error-forwarder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", + "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=", "dev": true }, - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } }, - "rxjs": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", - "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { - "tslib": "^1.9.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true }, - "safe-identifier": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", - "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", + "specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", "dev": true }, - "safe-regex": { + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, + "split-on-first": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "ret": "~0.1.10" + "extend-shallow": "^3.0.0" } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "requires": { + "readable-stream": "^3.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, - "scope-analyzer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.1.1.tgz", - "integrity": "sha512-azEAihtQ9mEyZGhfgTJy3IbOWEzeOrYbg7NcYEshPKnKd+LZmC3TNd5dmDxbLBsTG/JVWmCp+vDJ03vJjeXMHg==", + "ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", "requires": { - "array-from": "^2.1.1", - "dash-ast": "^1.0.0", - "es6-map": "^0.1.5", - "es6-set": "^0.1.5", - "es6-symbol": "^3.1.1", - "estree-is-function": "^1.0.0", - "get-assigned-identifiers": "^1.1.0" + "frac": "~1.1.2" } }, - "semantic-release": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.2.1.tgz", - "integrity": "sha512-+xbLWsT9NoibeMMJw4te0pbY4q/Z1gt/vzhB0z9RRNGVyqCgQiK5NUJ11eW6etSyPZ9QFeAMnqO2dzscWUTy2w==", + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stackblur-canvas": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.5.0.tgz", + "integrity": "sha512-EeNzTVfj+1In7aSLPKDD03F/ly4RxEuF/EX0YcOG0cKoPXs+SLZxDawQbexQDBzwROs4VKLWTOaZQlZkGBFEIQ==" + }, + "static-eval": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", + "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", + "requires": { + "escodegen": "^1.11.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "@semantic-release/commit-analyzer": "^8.0.0", - "@semantic-release/error": "^2.2.0", - "@semantic-release/github": "^7.0.0", - "@semantic-release/npm": "^7.0.0", - "@semantic-release/release-notes-generator": "^9.0.0", - "aggregate-error": "^3.0.0", - "cosmiconfig": "^6.0.0", - "debug": "^4.0.0", - "env-ci": "^5.0.0", - "execa": "^4.0.0", - "figures": "^3.0.0", - "find-versions": "^3.0.0", - "get-stream": "^5.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^2.0.0", - "hosted-git-info": "^3.0.0", - "lodash": "^4.17.15", - "marked": "^1.0.0", - "marked-terminal": "^4.0.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "p-reduce": "^2.0.0", - "read-pkg-up": "^7.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^3.1.1", - "signale": "^1.2.1", - "yargs": "^15.0.1" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "static-module": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-3.0.4.tgz", + "integrity": "sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==", + "requires": { + "acorn-node": "^1.3.0", + "concat-stream": "~1.6.0", + "convert-source-map": "^1.5.1", + "duplexer2": "~0.1.4", + "escodegen": "^1.11.1", + "has": "^1.0.1", + "magic-string": "0.25.1", + "merge-source-map": "1.0.4", + "object-inspect": "^1.6.0", + "readable-stream": "~2.3.3", + "scope-analyzer": "^2.0.1", + "shallow-copy": "~0.0.1", + "static-eval": "^2.0.5", + "through2": "~2.0.3" }, "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, + "magic-string": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", + "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", "requires": { - "fill-range": "^7.0.1" + "sourcemap-codec": "^1.4.1" } }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + } + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", + "dev": true + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, + "string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "ansi-regex": "^3.0.0" } - }, - "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==", - "dev": true, + } + } + }, + "string.prototype.trim": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz", + "integrity": "sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", "requires": { - "to-regex-range": "^5.0.1" + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" } }, - "hosted-git-info": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.6.tgz", - "integrity": "sha512-VRvqVD5T6t9HdmNDWTwbi8H/EC722MemAhOSP5QvYAXpDAY0Nhu2I/i+bXsktu4sU5LVHSh/wmXtVU8bDtjedQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "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==", - "dev": true - } + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "dev": true, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "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==", - "dev": true, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "requires": { - "is-number": "^7.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } } } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, "requires": { - "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==", - "dev": true - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, - "semver-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", - "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", - "dev": true + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dev": true, "requires": { - "randombytes": "^2.1.0" + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + } } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "ansi-regex": "^4.1.0" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true } } }, - "shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true }, - "shebang-command": { + "strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "requires": { - "shebang-regex": "^3.0.0" + "min-indent": "^1.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==", + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "dev": true }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "style-inject": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", + "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==", "dev": true }, - "signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", + "style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", + "dev": true + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", "dev": true, "requires": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "dependencies": { "chalk": { @@ -15940,743 +20219,612 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } - } - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", "dev": true, "requires": { - "ms": "2.0.0" + "is-obj": "^2.0.0" } }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "stylelint": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.12.0.tgz", + "integrity": "sha512-P8O1xDy41B7O7iXaSlW+UuFbE5+ZWQDb61ndGDxKIt36fMH50DtlQTbwLpFLf8DikceTAb3r6nPrRv30wBlzXw==", "dev": true, "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "@stylelint/postcss-css-in-js": "^0.37.2", + "@stylelint/postcss-markdown": "^0.36.2", + "autoprefixer": "^9.8.6", + "balanced-match": "^1.0.0", + "chalk": "^4.1.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "execall": "^2.0.0", + "fast-glob": "^3.2.5", + "fastest-levenshtein": "^1.0.12", + "file-entry-cache": "^6.0.1", + "get-stdin": "^8.0.0", + "global-modules": "^2.0.0", + "globby": "^11.0.2", + "globjoin": "^0.1.4", + "html-tags": "^3.1.0", + "ignore": "^5.1.8", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "known-css-properties": "^0.21.0", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.2", + "normalize-selector": "^0.2.0", + "postcss": "^7.0.35", + "postcss-html": "^0.36.0", + "postcss-less": "^3.1.4", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^4.0.2", + "postcss-sass": "^0.4.4", + "postcss-scss": "^2.1.1", + "postcss-selector-parser": "^6.0.4", + "postcss-syntax": "^0.36.2", + "postcss-value-parser": "^4.1.0", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "specificity": "^0.4.1", + "string-width": "^4.2.2", + "strip-ansi": "^6.0.0", + "style-search": "^0.1.0", + "sugarss": "^2.0.0", + "svg-tags": "^1.0.0", + "table": "^6.0.7", + "v8-compile-cache": "^2.2.0", + "write-file-atomic": "^3.0.3" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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==", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "color-name": "~1.1.4" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "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==", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "ms": "2.1.2" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + }, + "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==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "to-regex-range": "^5.0.1" } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" - }, - "spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", - "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", - "dev": true - }, - "specificity": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", - "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "dev": true, - "requires": { - "through2": "^2.0.2" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "ssf": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", - "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", - "requires": { - "frac": "~1.1.2" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stackblur-canvas": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.4.0.tgz", - "integrity": "sha512-Z+HixfgYV0ss3C342DxPwc+UvN1SYWqoz7Wsi3xEDWEnaBkSCL3Ey21gF4io+WlLm8/RIrSnCrDBIEcH4O+q5Q==" - }, - "state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", - "dev": true - }, - "static-eval": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", - "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", - "requires": { - "escodegen": "^1.11.1" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" } - } - } - }, - "static-module": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-3.0.4.tgz", - "integrity": "sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==", - "requires": { - "acorn-node": "^1.3.0", - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "^1.11.1", - "has": "^1.0.1", - "magic-string": "0.25.1", - "merge-source-map": "1.0.4", - "object-inspect": "^1.6.0", - "readable-stream": "~2.3.3", - "scope-analyzer": "^2.0.1", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.5", - "through2": "~2.0.3" - }, - "dependencies": { - "magic-string": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", - "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", + }, + "globby": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "dev": true, "requires": { - "sourcemap-codec": "^1.4.1" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" } }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "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==", + "dev": true + } } - } - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" } - } - } - }, - "string.prototype.trim": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.2.tgz", - "integrity": "sha512-b5yrbl3BXIjHau9Prk7U0RRYcUYdN4wGSVaqoBQS50CCE3KBuYU0TYRNPFCP7aVoNMX87HKThdMRVIP3giclKg==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==" + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, "requires": { - "has-symbols": "^1.0.1" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + } } }, - "object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" } - } - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.1.tgz", - "integrity": "sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ==", - "dev": true, - "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.2", - "is-hexadecimal": "^1.0.0" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } } } }, - "strip-bom": { + "stylelint-config-recommended": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "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==", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-4.0.0.tgz", + "integrity": "sha512-sgna89Ng+25Hr9kmmaIxpGWt2LStVm1xf1807PdcWasiPDaOTkOHRL61sINw0twky7QMzafCGToGDnHT/kTHtQ==", "dev": true }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "stylelint-config-standard": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-21.0.0.tgz", + "integrity": "sha512-Yf6mx5oYEbQQJxWuW7X3t1gcxqbUx52qC9SMS3saC2ruOVYEyqmr5zSW6k3wXflDjjFrPhar3kp68ugRopmlzg==", "dev": true, "requires": { - "min-indent": "^1.0.0" + "stylelint-config-recommended": "^4.0.0" } }, - "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, - "style-inject": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", - "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==", - "dev": true - }, - "style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", - "dev": true - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "sugarss": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", + "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" + "postcss": "^7.0.2" }, "dependencies": { - "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "is-obj": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "has-flag": "^3.0.0" } } } }, - "stylelint": { - "version": "13.7.2", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.7.2.tgz", - "integrity": "sha512-mmieorkfmO+ZA6CNDu1ic9qpt4tFvH2QUB7vqXgrMVHe5ENU69q7YDq0YUg/UHLuCsZOWhUAvcMcLzLDIERzSg==", + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "@stylelint/postcss-css-in-js": "^0.37.2", - "@stylelint/postcss-markdown": "^0.36.1", - "autoprefixer": "^9.8.6", - "balanced-match": "^1.0.0", - "chalk": "^4.1.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.1.1", - "execall": "^2.0.0", - "fast-glob": "^3.2.4", - "fastest-levenshtein": "^1.0.12", - "file-entry-cache": "^5.0.1", - "get-stdin": "^8.0.0", - "global-modules": "^2.0.0", - "globby": "^11.0.1", - "globjoin": "^0.1.4", - "html-tags": "^3.1.0", - "ignore": "^5.1.8", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "known-css-properties": "^0.19.0", - "lodash": "^4.17.20", - "log-symbols": "^4.0.0", - "mathml-tag-names": "^2.1.3", - "meow": "^7.1.1", - "micromatch": "^4.0.2", - "normalize-selector": "^0.2.0", - "postcss": "^7.0.32", - "postcss-html": "^0.36.0", - "postcss-less": "^3.1.4", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^4.0.2", - "postcss-sass": "^0.4.4", - "postcss-scss": "^2.1.1", - "postcss-selector-parser": "^6.0.2", - "postcss-syntax": "^0.36.2", - "postcss-value-parser": "^4.1.0", - "resolve-from": "^5.0.0", - "slash": "^3.0.0", - "specificity": "^0.4.1", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "style-search": "^0.1.0", - "sugarss": "^2.0.0", - "svg-tags": "^1.0.0", - "table": "^6.0.1", - "v8-compile-cache": "^2.1.1", - "write-file-atomic": "^3.0.3" + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "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==", "dev": true, "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" + "has-flag": "^4.0.0" } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + } + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "svg-to-pdfkit": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/svg-to-pdfkit/-/svg-to-pdfkit-0.1.8.tgz", + "integrity": "sha512-QItiGZBy5TstGy+q8mjQTMGRlDDOARXLxH+sgVm1n/LYeo0zFcQlcCh8m4zi8QxctrxB9Kue/lStc/RD5iLadQ==", + "requires": { + "pdfkit": ">=0.8.1" + } + }, + "svgo": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.2.2.tgz", + "integrity": "sha512-kJugY2d0yrsONnG4YavppVkKmKULMw2iFRbB9+usyWqzTaqoBuUaqdMnQ2G1n5P1dmOA2tZvc5zmMM6sPOVBSQ==", + "dev": true, + "requires": { + "@trysound/sax": "0.1.1", + "chalk": "^4.1.0", + "commander": "^7.1.0", + "css-select": "^3.1.2", + "css-tree": "^1.1.2", + "csso": "^4.2.0", + "stable": "^0.1.8" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "color-convert": "^2.0.1" } }, "chalk": { @@ -16704,60 +20852,76 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "css-select": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-3.1.2.tgz", + "integrity": "sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA==", "dev": true, "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "boolbase": "^1.0.0", + "css-what": "^4.0.0", + "domhandler": "^4.0.0", + "domutils": "^2.4.3", + "nth-check": "^2.0.0" } }, - "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "css-tree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", + "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", "dev": true, "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "mdn-data": "2.0.14", + "source-map": "^0.6.1" } }, - "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==", + "css-what": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-4.0.0.tgz", + "integrity": "sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==", + "dev": true + }, + "dom-serializer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.2.0.tgz", + "integrity": "sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA==", "dev": true, "requires": { - "to-regex-range": "^5.0.1" + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "entities": "^2.0.0" } }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "domelementtype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", + "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", + "dev": true + }, + "domhandler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz", + "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==", "dev": true, "requires": { - "global-prefix": "^3.0.0" + "domelementtype": "^2.1.0" } }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "domutils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.5.0.tgz", + "integrity": "sha512-Ho16rzNMOFk2fPwChGh3D2D9OEHAfG19HgmRR2l+WLSsIstNsAYBzePH412bL0y5T44ejABIVfTHQ8nqi/tBCg==", "dev": true, "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0" } }, "has-flag": { @@ -16766,79 +20930,89 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "nth-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", "dev": true, "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "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==", - "dev": true - } + "boolbase": "^1.0.0" } }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "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==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "has-flag": "^4.0.0" } - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + } + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, + "table": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "dev": true, + "requires": { + "ajv": "^7.0.2", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ajv": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.3.tgz", + "integrity": "sha512-idv5WZvKVXDqKralOImQgPM9v6WOdLNa0IY3B3doOjw/YxRGT8I+allIJ6kd7Uaj+SF1xZUSU+nPM5aDNBVtnw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "resolve-from": { + "ansi-regex": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -16854,213 +21028,181 @@ "requires": { "ansi-regex": "^5.0.0" } + } + } + }, + "tailwindcss": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.0.4.tgz", + "integrity": "sha512-WhgR0oiBxGOZ9jY0yVfaJCHnckR7U74Fs/BMsYxGdwGJQ5Hd/HlaKD26bEJFZOvYScJo0QcUj2ImldzedsG7Bw==", + "dev": true, + "requires": { + "@fullhuman/postcss-purgecss": "^3.1.3", + "bytes": "^3.0.0", + "chalk": "^4.1.0", + "color": "^3.1.3", + "detective": "^5.2.0", + "didyoumean": "^1.2.1", + "fs-extra": "^9.1.0", + "html-tags": "^3.1.0", + "lodash": "^4.17.21", + "modern-normalize": "^1.0.0", + "node-emoji": "^1.8.1", + "object-hash": "^2.1.1", + "postcss-functions": "^3", + "postcss-js": "^3.0.3", + "postcss-nested": "^5.0.5", + "postcss-selector-parser": "^6.0.4", + "postcss-value-parser": "^4.1.0", + "pretty-hrtime": "^1.0.3", + "reduce-css-calc": "^2.1.8", + "resolve": "^1.20.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } }, - "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==", + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "table": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.3.tgz", - "integrity": "sha512-8321ZMcf1B9HvVX/btKv8mMZahCjn2aYrDlpqHaBFCfnox64edeH9kEid0vTLTRR8gWR2A20aDgeuTTea4sVtw==", + "color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", "dev": true, "requires": { - "ajv": "^6.12.4", - "lodash": "^4.17.20", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } } }, - "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==", + "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==", "dev": true, "requires": { - "is-number": "^7.0.0" + "color-name": "~1.1.4" } - } - } - }, - "stylelint-config-recommended": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz", - "integrity": "sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==", - "dev": true - }, - "stylelint-config-standard": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-20.0.0.tgz", - "integrity": "sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA==", - "dev": true, - "requires": { - "stylelint-config-recommended": "^3.0.0" - } - }, - "sugarss": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", - "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { + }, + "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==", + "dev": true + }, + "color-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "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==", + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" } - } - } - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", - "dev": true - }, - "svg-to-pdfkit": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/svg-to-pdfkit/-/svg-to-pdfkit-0.1.8.tgz", - "integrity": "sha512-QItiGZBy5TstGy+q8mjQTMGRlDDOARXLxH+sgVm1n/LYeo0zFcQlcCh8m4zi8QxctrxB9Kue/lStc/RD5iLadQ==", - "requires": { - "pdfkit": ">=0.8.1" - } - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" } - } - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "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==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "has-flag": "^4.0.0" } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true } } }, - "tailwindcss": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.9.5.tgz", - "integrity": "sha512-Je5t1fAfyW333YTpSxF+8uJwbnrkpyBskDtZYgSMMKQbNp6QUhEKJ4g/JIevZjD2Zidz9VxLraEUq/yWOx6nQg==", - "dev": true, - "requires": { - "@fullhuman/postcss-purgecss": "^2.1.2", - "autoprefixer": "^9.4.5", - "browserslist": "^4.12.0", - "bytes": "^3.0.0", - "chalk": "^3.0.0 || ^4.0.0", - "color": "^3.1.2", - "detective": "^5.2.0", - "fs-extra": "^8.0.0", - "html-tags": "^3.1.0", - "lodash": "^4.17.20", - "node-emoji": "^1.8.1", - "normalize.css": "^8.0.1", - "object-hash": "^2.0.3", - "postcss": "^7.0.11", - "postcss-functions": "^3.0.0", - "postcss-js": "^2.0.0", - "postcss-nested": "^4.1.1", - "postcss-selector-parser": "^6.0.0", - "postcss-value-parser": "^4.1.0", - "pretty-hrtime": "^1.0.3", - "reduce-css-calc": "^2.1.6", - "resolve": "^1.14.2" - } - }, "tape": { "version": "4.13.3", "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.3.tgz", @@ -17105,21 +21247,22 @@ "dev": true }, "tempy": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.5.0.tgz", - "integrity": "sha512-VEY96x7gbIRfsxqsafy2l5yVxxp3PhwAGoWMyC2D2Zt5DmEv+2tGiPOrquNRpf21hhGnKLVEsuqleqiZmKG/qw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", "dev": true, "requires": { + "del": "^6.0.0", "is-stream": "^2.0.0", "temp-dir": "^2.0.0", - "type-fest": "^0.12.0", + "type-fest": "^0.16.0", "unique-string": "^2.0.0" }, "dependencies": { "type-fest": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", - "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true } } @@ -17167,13 +21310,25 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" + "readable-stream": "3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "timsort": { @@ -17261,12 +21416,6 @@ "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", "dev": true }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", - "dev": true - }, "trim-newlines": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", @@ -17279,12 +21428,6 @@ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, - "trim-trailing-lines": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz", - "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==", - "dev": true - }, "trough": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", @@ -17298,9 +21441,9 @@ "dev": true }, "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -17321,9 +21464,9 @@ } }, "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true }, "typedarray": { @@ -17341,9 +21484,9 @@ } }, "typescript": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", - "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", + "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", "dev": true }, "uc.micro": { @@ -17395,14 +21538,15 @@ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "optional": true }, - "unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "dev": true, + "unbox-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz", + "integrity": "sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA==", "requires": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" + "function-bind": "^1.1.1", + "has-bigints": "^1.0.0", + "has-symbols": "^1.0.0", + "which-boxed-primitive": "^1.0.1" } }, "unicode-canonical-property-names-ecmascript": { @@ -17437,9 +21581,9 @@ }, "dependencies": { "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "unicode-trie": { "version": "2.0.0", @@ -17468,9 +21612,9 @@ } }, "unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz", + "integrity": "sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==", "dev": true, "requires": { "bail": "^1.0.0", @@ -17482,9 +21626,9 @@ }, "dependencies": { "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "dev": true }, "is-plain-obj": { @@ -17529,29 +21673,20 @@ } }, "unist-util-find-all-after": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz", - "integrity": "sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz", + "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==", "dev": true, "requires": { "unist-util-is": "^4.0.0" } }, "unist-util-is": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", - "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", "dev": true }, - "unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "dev": true, - "requires": { - "unist-util-visit": "^2.0.0" - } - }, "unist-util-stringify-position": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", @@ -17561,35 +21696,11 @@ "@types/unist": "^2.0.2" } }, - "unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - } - }, - "unist-util-visit-parents": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz", - "integrity": "sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - } - }, "universal-user-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", - "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", - "dev": true, - "requires": { - "os-name": "^3.1.0" - } + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true }, "universalify": { "version": "0.1.2", @@ -17644,9 +21755,9 @@ } }, "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -17688,9 +21799,9 @@ } }, "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "validate-npm-package-license": { @@ -17720,32 +21831,25 @@ } }, "vfile": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.0.tgz", - "integrity": "sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", "dev": true, "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", - "replace-ext": "1.0.0", "unist-util-stringify-position": "^2.0.0", "vfile-message": "^2.0.0" }, "dependencies": { "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "dev": true } } }, - "vfile-location": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.1.0.tgz", - "integrity": "sha512-FCZ4AN9xMcjFIG1oGmZKo61PjwJHRVA+0/tPUP2ul4uIwjGGndIxavEMRpWn5p4xwm/ZsdXp9YNygf1ZyE4x8g==", - "dev": true - }, "vfile-message": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", @@ -17770,107 +21874,23 @@ "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", - "dev": true + "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" + } }, "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" }, - "windows-release": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", - "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", - "dev": true, - "requires": { - "execa": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - } - } - }, "wmf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", @@ -17892,9 +21912,9 @@ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" }, "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -17909,12 +21929,11 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -17940,9 +21959,9 @@ "dev": true }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -17966,15 +21985,6 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", @@ -17988,9 +21998,9 @@ } }, "xlsx": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.16.8.tgz", - "integrity": "sha512-qWub4YCn0xLEGHI7WWhk6IJ73MDu7sPSJQImxN6/LiI8wsHi0hUhICEDbyqBT+jgFgORZxrii0HvhNSwBNAPoQ==", + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.16.9.tgz", + "integrity": "sha512-gxi1I3EasYvgCX1vN9pGyq920Ron4NO8PNfhuoA3Hpq6Y8f0ECXiy4OLrK4QZBnj1jx3QD+8Fq5YZ/3mPZ5iXw==", "requires": { "adler-32": "~1.2.0", "cfb": "^1.1.4", @@ -17998,6 +22008,7 @@ "commander": "~2.17.1", "crc-32": "~1.2.0", "exit-on-epipe": "~1.0.1", + "fflate": "^0.3.8", "ssf": "~0.11.2", "wmf": "~1.0.1", "word": "~0.3.0" @@ -18024,9 +22035,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", "dev": true }, "yallist": { @@ -18042,22 +22053,18 @@ "dev": true }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "dependencies": { "ansi-regex": { @@ -18073,9 +22080,9 @@ "dev": true }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -18095,14 +22102,22 @@ } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "dev": true + }, + "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==", + "dev": true + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "dev": true } } } diff --git a/package.json b/package.json index 1744ab89fef9013a38f103bd46eaca6f6d4e9b21..99f61e00dbab2e4ae258d9cdd46c8890b598c303 100644 --- a/package.json +++ b/package.json @@ -9,13 +9,15 @@ "url": "https://code.podlibre.org/podlibre/castopod.git" }, "scripts": { - "build": "npm run build:js && cross-env NODE_ENV=production npm run build:css && npm run build:icons && npm run build:svg", + "build": "npm run build:js && cross-env NODE_ENV=production npm run build:css && npm run build:icons && npm run build:svg && npm run copy:images && npm run copy:fonts", "watch:js": "rollup --config --watch", "build:js": "rollup --config", "watch:css": "postcss app/Views/_assets/styles/index.css -o public/assets/index.css -w", "build:css": "postcss app/Views/_assets/styles/index.css -o public/assets/index.css", - "build:icons": "svgo -f app/Views/_assets/icons -o public/assets/icons --config=./.svgo.icons.yml", - "build:svg": "svgo -f app/Views/_assets/images -o public/assets/images -r --config=./.svgo.yml", + "build:icons": "svgo -f app/Views/_assets/icons -o public/assets/icons -r --config=./.svgo.icons.js", + "build:svg": "svgo -f app/Views/_assets/images -o public/assets/images -r --config=./.svgo.js", + "copy:images": "cpy app/Views/_assets/images/*.jpg public/assets/images", + "copy:fonts": "cpy app/Views/_assets/fonts public/assets/fonts", "lint": "eslint --ext js,ts app/Views/_assets", "lint:fix": "eslint --ext js,ts app/Views/_assets --fix", "lint:css": "stylelint \"app/Views/_assets/**/*.css\"", @@ -25,63 +27,66 @@ "release": "semantic-release" }, "dependencies": { - "@amcharts/amcharts4": "^4.10.8", - "@amcharts/amcharts4-geodata": "^4.1.17", - "@popperjs/core": "^2.5.3", + "@amcharts/amcharts4": "^4.10.17", + "@amcharts/amcharts4-geodata": "^4.1.19", + "@popperjs/core": "^2.9.1", "choices.js": "^9.0.1", - "flatpickr": "^4.6.6", + "flatpickr": "^4.6.9", "prosemirror-example-setup": "^1.1.2", - "prosemirror-markdown": "^1.5.0", - "prosemirror-state": "^1.3.3", - "prosemirror-view": "^1.16.0" + "prosemirror-markdown": "^1.5.1", + "prosemirror-state": "^1.3.4", + "prosemirror-view": "^1.18.1" }, "devDependencies": { - "@babel/core": "^7.12.3", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-typescript": "^7.12.1", - "@commitlint/cli": "^11.0.0", - "@commitlint/config-conventional": "^11.0.0", - "@prettier/plugin-php": "^0.15.1", - "@rollup/plugin-babel": "^5.2.1", - "@rollup/plugin-commonjs": "^15.1.0", + "@babel/core": "^7.13.10", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/preset-env": "^7.13.12", + "@babel/preset-typescript": "^7.13.0", + "@commitlint/cli": "^12.0.1", + "@commitlint/config-conventional": "^12.0.1", + "@prettier/plugin-php": "^0.16.2", + "@rollup/plugin-babel": "^5.3.0", + "@rollup/plugin-commonjs": "^17.1.0", "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-multi-entry": "^4.0.0", - "@rollup/plugin-node-resolve": "^9.0.0", + "@rollup/plugin-node-resolve": "^11.2.0", "@semantic-release/changelog": "^5.0.1", "@semantic-release/exec": "^5.0.0", "@semantic-release/git": "^9.0.0", - "@semantic-release/gitlab": "^6.0.5", - "@tailwindcss/custom-forms": "^0.2.1", - "@tailwindcss/typography": "^0.2.0", - "@types/prosemirror-markdown": "^1.0.3", - "@types/prosemirror-view": "^1.16.1", - "@typescript-eslint/eslint-plugin": "^4.5.0", - "@typescript-eslint/parser": "^4.5.0", - "cross-env": "^7.0.2", + "@semantic-release/gitlab": "^6.0.9", + "@tailwindcss/forms": "^0.2.1", + "@tailwindcss/line-clamp": "^0.2.0", + "@tailwindcss/typography": "^0.4.0", + "@types/prosemirror-markdown": "^1.5.1", + "@types/prosemirror-view": "^1.17.1", + "@typescript-eslint/eslint-plugin": "^4.19.0", + "@typescript-eslint/parser": "^4.19.0", + "cpy-cli": "^3.1.1", + "cross-env": "^7.0.3", "cssnano": "^4.1.10", "cz-conventional-changelog": "^3.3.0", - "eslint": "^7.11.0", - "eslint-config-prettier": "^6.14.0", - "eslint-plugin-prettier": "^3.1.4", - "husky": "^4.3.0", - "lint-staged": "^10.4.2", - "postcss-cli": "^8.1.0", - "postcss-import": "^12.0.1", + "eslint": "^7.22.0", + "eslint-config-prettier": "^8.1.0", + "eslint-plugin-prettier": "^3.3.1", + "husky": "^5.2.0", + "lint-staged": "^10.5.4", + "postcss": "^8.2.8", + "postcss-cli": "^8.3.1", + "postcss-import": "^14.0.0", "postcss-preset-env": "^6.7.0", - "prettier": "2.1.2", + "prettier": "2.2.1", "prettier-plugin-organize-imports": "^1.1.1", - "rollup": "^2.32.1", - "rollup-plugin-multi-input": "^1.1.1", + "rollup": "^2.42.4", + "rollup-plugin-multi-input": "^1.2.0", "rollup-plugin-node-polyfills": "^0.2.1", - "rollup-plugin-postcss": "^3.1.8", + "rollup-plugin-postcss": "^4.0.0", "rollup-plugin-terser": "^7.0.2", - "semantic-release": "^17.2.1", - "stylelint": "^13.7.2", - "stylelint-config-standard": "^20.0.0", - "svgo": "^1.3.2", - "tailwindcss": "^1.9.5", - "typescript": "^4.0.3" + "semantic-release": "^17.4.2", + "stylelint": "^13.12.0", + "stylelint-config-standard": "^21.0.0", + "svgo": "^2.2.2", + "tailwindcss": "^2.0.4", + "typescript": "^4.2.3" }, "husky": { "hooks": { diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 80664cbbfefb8e6a5f6079ebe6b002b1ece22bb0..c05e50146fcc7dfec4b288d4097e8980e2d65618 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> -<phpunit bootstrap="vendor/codeigniter4/codeigniter4/system/Test/bootstrap.php" +<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + bootstrap="vendor/codeigniter4/framework/system/Test/bootstrap.php" backupGlobals="false" colors="true" convertErrorsToExceptions="true" @@ -8,53 +9,49 @@ stopOnError="false" stopOnFailure="false" stopOnIncomplete="false" - stopOnSkipped="false"> + stopOnSkipped="false" + xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"> + <coverage includeUncoveredFiles="true" processUncoveredFiles="true"> + <include> + <directory suffix=".php">./app</directory> + </include> + <exclude> + <directory suffix=".php">./app/Views</directory> + <file>./app/Config/Routes.php</file> + </exclude> + <report> + <clover outputFile="build/logs/clover.xml"/> + <html outputDirectory="build/logs/html"/> + <php outputFile="build/logs/coverage.serialized"/> + <text outputFile="php://stdout" showUncoveredFiles="false"/> + </report> + </coverage> <testsuites> - <testsuite name="app"> + <testsuite name="App"> <directory>./tests</directory> </testsuite> </testsuites> - - <filter> - <whitelist addUncoveredFilesFromWhitelist="true" processUncoveredFilesFromWhitelist="true"> - <directory suffix=".php">./app</directory> - <exclude> - <directory suffix=".php">./app/Views</directory> - <file>./app/Config/Routes.php</file> - </exclude> - </whitelist> - </filter> - <logging> - <log type="coverage-html" target="build/logs/html"/> - <log type="coverage-clover" target="build/logs/clover.xml"/> - <log type="coverage-php" target="build/logs/coverage.serialized"/> - <log type="coverage-text" target="php://stdout" showUncoveredFiles="false"/> - <log type="testdox-html" target="build/logs/testdox.html"/> - <log type="testdox-text" target="build/logs/testdox.txt"/> - <log type="junit" target="build/logs/logfile.xml"/> + <testdoxHtml outputFile="build/logs/testdox.html"/> + <testdoxText outputFile="build/logs/testdox.txt"/> + <junit outputFile="build/logs/logfile.xml"/> </logging> - <php> - <server name="app.baseURL" value="http://example.com"/> - + <server name="app.baseURL" value="http://example.com/"/> <!-- Directory containing phpunit.xml --> <const name="HOMEPATH" value="./"/> - <!-- Directory containing the Paths config file --> <const name="CONFIGPATH" value="./app/Config/"/> - <!-- Directory containing the front controller (index.php) --> <const name="PUBLICPATH" value="./public/"/> - <!-- Database configuration --> -<!-- <env name="database.tests.hostname" value="localhost"/> --> -<!-- <env name="database.tests.database" value="tests"/> --> -<!-- <env name="database.tests.username" value="tests_user"/> --> -<!-- <env name="database.tests.password" value=""/> --> -<!-- <env name="database.tests.DBDriver" value="MySQLi"/> --> -<!-- <env name="database.tests.DBPrefix" value="tests_"/> --> - <env name="database.tests.database" value=":memory:"/> - <env name="database.tests.DBDriver" value="SQLite3"/> + <!-- Uncomment to provide your own database for testing + <env name="database.tests.hostname" value="localhost"/> + <env name="database.tests.database" value="tests"/> + <env name="database.tests.username" value="tests_user"/> + <env name="database.tests.password" value=""/> + <env name="database.tests.DBDriver" value="MySQLi"/> + <env name="database.tests.DBPrefix" value="tests_"/> + --> </php> -</phpunit> +</phpunit> \ No newline at end of file diff --git a/public/.htaccess b/public/.htaccess index bc84dae6d091af2eebe1efd36f0eb9715839eb74..4ae666b78b9a3d911e1559e46af716737bf1c36c 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -18,4 +18,4 @@ ServerSignature Off # If we don't have mod_rewrite installed, all 404's # can be sent to index.php, and everything works as normal. ErrorDocument 404 /index.php -</IfModule> \ No newline at end of file +</IfModule> diff --git a/public/index.php b/public/index.php index 9e1f9d1a44657396e97dda5982859479e79b439a..b48871b015bf638d60d9bd0338d5fa4a60474286 100644 --- a/public/index.php +++ b/public/index.php @@ -1,11 +1,11 @@ <?php // Valid PHP Version? -$minPHPVersion = '7.2'; -if (phpversion() < $minPHPVersion) { +$minPHPVersion = '7.3'; +if (version_compare(PHP_VERSION, $minPHPVersion, '<')) { die( "Your PHP version must be {$minPHPVersion} or higher to run CodeIgniter. Current version: " . - phpversion() + PHP_VERSION ); } unset($minPHPVersion); @@ -13,11 +13,6 @@ unset($minPHPVersion); // Path to the front controller (this file) define('FCPATH', __DIR__ . DIRECTORY_SEPARATOR); -// Location of the Paths config file. -// This is the line that might need to be changed, depending on your folder structure. -$pathsPath = realpath(FCPATH . '../app/Config/Paths.php'); -// ^^^ Change this if you move your application folder - /* *--------------------------------------------------------------- * BOOTSTRAP THE APPLICATION @@ -31,11 +26,19 @@ $pathsPath = realpath(FCPATH . '../app/Config/Paths.php'); chdir(__DIR__); // Load our paths config file -require $pathsPath; +// This is the line that might need to be changed, depending on your folder structure. +require realpath(FCPATH . '../app/Config/Paths.php') ?: + FCPATH . '../app/Config/Paths.php'; +// ^^^ Change this if you move your application folder + $paths = new Config\Paths(); // Location of the framework bootstrap file. -$app = require rtrim($paths->systemDirectory, '/ ') . '/bootstrap.php'; +$bootstrap = + rtrim($paths->systemDirectory, '\\/ ') . + DIRECTORY_SEPARATOR . + 'bootstrap.php'; +$app = require realpath($bootstrap) ?: $bootstrap; /* *--------------------------------------------------------------- diff --git a/public/media/persons/index.html b/public/media/persons/index.html new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/public/media/podcasts/index.html b/public/media/podcasts/index.html new file mode 100644 index 0000000000000000000000000000000000000000..eebf8ecb2b2bdf794e1a23e04bc129e3aaacaeb4 --- /dev/null +++ b/public/media/podcasts/index.html @@ -0,0 +1,9 @@ +<!DOCTYPE html> +<html> + <head> + <title>403 Forbidden</title> + </head> + <body> + <p>Directory access is forbidden.</p> + </body> +</html> diff --git a/spark b/spark index a02ea6e43e0a7e00b6447aa8dfa8f33322e22a83..83a5cc25c3a47b303027efe33f6b535f4028526a 100644 --- a/spark +++ b/spark @@ -1,5 +1,15 @@ #!/usr/bin/env php <?php +// Valid PHP Version? +$minPHPVersion = "7.3"; +if (version_compare(PHP_VERSION, $minPHPVersion, "<")) { + die( + "Your PHP version must be {$minPHPVersion} or higher to run CodeIgniter. Current version: " . + PHP_VERSION + ); +} +unset($minPHPVersion); + /* * -------------------------------------------------------------------- * CodeIgniter command-line tools @@ -11,7 +21,7 @@ * this class mainly acts as a passthru to the framework itself. */ -define('SPARKED', true); +define("SPARKED", true); /* *--------------------------------------------------------------- @@ -23,17 +33,20 @@ define('SPARKED', true); */ // Refuse to run when called from php-cgi -if (substr(php_sapi_name(), 0, 3) === 'cgi') { +if (strpos(PHP_SAPI, "cgi") === 0) { die( "The cli tool is not supported when running php-cgi. It needs php-cli to function!\n\n" ); } // Path to the front controller -define('FCPATH', __DIR__ . '/public' . DIRECTORY_SEPARATOR); +define( + "FCPATH", + __DIR__ . DIRECTORY_SEPARATOR . "public" . DIRECTORY_SEPARATOR +); // Load our paths config file -require 'app/Config/Paths.php'; +require realpath("app/Config/Paths.php") ?: "app/Config/Paths.php"; // ^^^ Change this line if you move your application folder $paths = new Config\Paths(); @@ -41,14 +54,18 @@ $paths = new Config\Paths(); // Ensure the current directory is pointing to the front controller's directory chdir(FCPATH); -$app = require rtrim($paths->systemDirectory, '/ ') . '/bootstrap.php'; +$bootstrap = + rtrim($paths->systemDirectory, "\\/ ") . + DIRECTORY_SEPARATOR . + "bootstrap.php"; +$app = require realpath($bootstrap) ?: $bootstrap; // Grab our Console -$console = new \CodeIgniter\CLI\Console($app); +$console = new CodeIgniter\CLI\Console($app); // We want errors to be shown when using it from the CLI. error_reporting(-1); -ini_set('display_errors', 1); +ini_set("display_errors", "1"); // Show basic information before we do anything else. $console->showHeader(); diff --git a/tailwind.config.js b/tailwind.config.js index 7d19c1261a1cfc3c4ebd8cddc29a8bcb0011a812..9d3bc162120b2045d0b94c7e6a0965ac1022f12a 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -2,18 +2,51 @@ module.exports = { purge: ["./app/Views/**/*.php", "./app/Views/**/*.ts", "./app/Helpers/*.php"], - theme: {}, - variants: { - textDecoration: ["responsive", "hover", "focus", "group-hover"], + theme: { + extend: { + fontFamily: { + sans: ["Montserrat", "sans-serif"], + display: ["Kumbh Sans", "sans-serif"], + body: ["Montserrat", "sans-serif"], + }, + colors: { + pine: { + 50: "#ebf8f8", + 100: "#cff7f3", + 200: "#9df2e4", + 300: "#5ee8d4", + 400: "#1cd7ba", + 500: "#08c09a", + 600: "#07a57d", + 700: "#009486", + 800: "#006D60", + 900: "#00564A", + }, + rose: { + 50: "#fcf9f8", + 100: "#fdeef2", + 200: "#fbcfe4", + 300: "#faa7cd", + 400: "#fb6ea5", + 500: "#fc437c", + 600: "#f24664", + 700: "#dd1f47", + 800: "#b21a39", + 900: "#8e162e", + }, + }, + spacing: { + 112: "28rem", + }, + gridTemplateColumns: { + podcasts: "repeat(auto-fill, minmax(14rem, 1fr))", + }, + }, }, + variants: {}, plugins: [ - require("@tailwindcss/custom-forms"), + require("@tailwindcss/forms"), require("@tailwindcss/typography"), + require("@tailwindcss/line-clamp"), ], - future: { - removeDeprecatedGapUtilities: true, - purgeLayersByDefault: true, - defaultLineHeights: true, - standardFontWeights: true, - }, };