diff --git a/src/components/CodeBlock.tsx b/src/components/CodeBlock.tsx index ae9d21c72..fa6906375 100644 --- a/src/components/CodeBlock.tsx +++ b/src/components/CodeBlock.tsx @@ -30,6 +30,7 @@ export const CodeWrapper = styled.div` type Iprops = React.PropsWithChildren<{ code: string; + wordBreak?: 'normal' | 'break-all' | 'keep-all' | 'break-word'; }>; export const CodeBlock = (props: Iprops) => { const [copied, setCopied] = useState(false); @@ -56,7 +57,9 @@ export const CodeBlock = (props: Iprops) => { {props.code ? ( - {props.code} + + {props.code} + ) : ( )} diff --git a/src/components/CollectionShare.tsx b/src/components/CollectionShare.tsx index 0dc3315b8..baaabd880 100644 --- a/src/components/CollectionShare.tsx +++ b/src/components/CollectionShare.tsx @@ -1,4 +1,5 @@ import React, { useContext, useEffect, useState } from 'react'; +import Select from 'react-select'; import constants from 'utils/strings/constants'; import { Formik, FormikHelpers } from 'formik'; import * as Yup from 'yup'; @@ -12,17 +13,27 @@ import { unshareCollection, createShareableURL, deleteShareableURL, + updateShareableURL, } from 'services/collectionService'; import { getData, LS_KEYS } from 'utils/storage/localStorage'; import SubmitButton from './SubmitButton'; import MessageDialog from './MessageDialog'; -import { Collection } from 'types/collection'; -import { appendCollectionKeyToShareURL } from 'utils/collection'; -import { FlexWrapper } from './Container'; +import { Collection, PublicURL, UpdatePublicURL } from 'types/collection'; +import { + appendCollectionKeyToShareURL, + selectIntOptions, + shareExpiryOptions, +} from 'utils/collection'; +import { FlexWrapper, Label, Row, Value } from './Container'; import { CodeBlock } from './CodeBlock'; import { ButtonVariant, getVariantColor } from './pages/gallery/LinkButton'; import { handleSharingErrors } from 'utils/error'; import { sleep } from 'utils/common'; +import { SelectStyles } from './Search/styles'; +import CryptoWorker from 'utils/crypto'; +import { dateStringWithMMH } from 'utils/time'; +import styled from 'styled-components'; +import SingleInputForm from './SingleInputForm'; interface Props { show: boolean; @@ -33,16 +44,64 @@ interface Props { interface formValues { email: string; } + interface ShareeProps { sharee: User; collectionUnshare: (sharee: User) => void; } +const DropdownStyle = { + ...SelectStyles, + dropdownIndicator: (style) => ({ + ...style, + margin: '0px', + }), + singleValue: (style) => ({ + ...style, + color: '#d1d1d1', + width: '240px', + }), + control: (style, { isFocused }) => ({ + ...style, + ...SelectStyles.control(style, { isFocused }), + minWidth: '240px', + }), +}; + +const linkExpiryStyle = { + ...DropdownStyle, + placeholder: (style) => ({ + ...style, + color: '#d1d1d1', + }), +}; + +const OptionRow = styled(Row)` + flex-wrap: wrap; + justify-content: center; +`; +const OptionLabel = styled(Label)` + flex: 1 1 103px; + @media (min-width: 513px) { + text-align: left; + } + margin: 5px; +`; +const OptionValue = styled(Value)` + flex: 0 0 240px; + justify-content: center; + margin: 5px; +`; + function CollectionShare(props: Props) { const [loading, setLoading] = useState(false); const galleryContext = useContext(GalleryContext); const [sharableLinkError, setSharableLinkError] = useState(null); const [publicShareUrl, setPublicShareUrl] = useState(null); + const [publicShareProp, setPublicShareProp] = useState(null); + const [configurePassword, setConfigurePassword] = useState(false); + const deviceLimitOptions = selectIntOptions(50); + const expiryOptions = shareExpiryOptions; useEffect(() => { const main = async () => { @@ -52,8 +111,12 @@ function CollectionShare(props: Props) { props.collection.key ); setPublicShareUrl(t); + setPublicShareProp( + props.collection?.publicURLs?.[0] as PublicURL + ); } else { setPublicShareUrl(null); + setPublicShareProp(null); } }; main(); @@ -132,6 +195,55 @@ function CollectionShare(props: Props) { } }; + const savePassword = async (passphrase, setFieldError) => { + if (passphrase && passphrase.trim().length >= 1) { + await enablePublicUrlPassword(passphrase); + setConfigurePassword(false); + publicShareProp.passwordEnabled = true; + } else { + setFieldError('linkPassword', 'can not be empty'); + } + }; + + const handlePasswordChangeSetting = async () => { + if (publicShareProp.passwordEnabled) { + await disablePublicUrlPassword(); + } else { + setConfigurePassword(true); + } + }; + + const disablePublicUrlPassword = async () => { + galleryContext.setDialogMessage({ + title: constants.DISABLE_PASSWORD, + content: constants.DISABLE_PASSWORD_MESSAGE, + close: { text: constants.CANCEL }, + proceed: { + text: constants.DISABLE, + action: () => + updatePublicShareURLHelper({ + collectionID: props.collection.id, + disablePassword: true, + }), + variant: ButtonVariant.danger, + }, + }); + }; + + const enablePublicUrlPassword = async (password: string) => { + const cryptoWorker = await new CryptoWorker(); + const kekSalt: string = await cryptoWorker.generateSaltToDeriveKey(); + const kek = await cryptoWorker.deriveInteractiveKey(password, kekSalt); + const passHash = await cryptoWorker.toB64(kek.key); + return updatePublicShareURLHelper({ + collectionID: props.collection.id, + passHash: passHash, + nonce: kekSalt, + opsLimit: kek.opsLimit, + memLimit: kek.memLimit, + }); + }; + const disablePublicSharing = () => { galleryContext.setDialogMessage({ title: constants.DISABLE_PUBLIC_SHARING, @@ -145,6 +257,51 @@ function CollectionShare(props: Props) { }); }; + const disableFileDownload = () => { + galleryContext.setDialogMessage({ + title: constants.DISABLE_FILE_DOWNLOAD, + content: constants.DISABLE_FILE_DOWNLOAD_MESSAGE, + close: { text: constants.CANCEL }, + proceed: { + text: constants.DISABLE, + action: () => + updatePublicShareURLHelper({ + collectionID: props.collection.id, + enableDownload: false, + }), + variant: ButtonVariant.danger, + }, + }); + }; + + const updatePublicShareURLHelper = async (req: UpdatePublicURL) => { + try { + galleryContext.setBlockingLoad(true); + const response = await updateShareableURL(req); + setPublicShareProp(response); + galleryContext.syncWithRemote(false, true); + } catch (e) { + const errorMessage = handleSharingErrors(e); + setSharableLinkError(errorMessage); + } finally { + galleryContext.setBlockingLoad(false); + } + }; + + const updateDeviceLimit = async (newLimit: number) => { + return updatePublicShareURLHelper({ + collectionID: props.collection.id, + deviceLimit: newLimit, + }); + }; + + const updateDeviceExpiry = async (optionFn) => { + return updatePublicShareURLHelper({ + collectionID: props.collection.id, + validTill: optionFn(), + }); + }; + const handleCollectionPublicSharing = () => { setSharableLinkError(null); if (publicShareUrl) { @@ -154,6 +311,17 @@ function CollectionShare(props: Props) { } }; + const handleFileDownloadSetting = () => { + if (publicShareProp.enableDownload) { + disableFileDownload(); + } else { + updatePublicShareURLHelper({ + collectionID: props.collection.id, + enableDownload: true, + }); + } + }; + const ShareeRow = ({ sharee, collectionUnshare }: ShareeProps) => ( {sharee.email} @@ -178,11 +346,15 @@ function CollectionShare(props: Props) { if (!props.collection) { return <>; } + return ( + attributes={{ + title: constants.SHARE_COLLECTION, + staticBackdrop: true, + }}>
{constants.SHARE_WITH_PEOPLE} @@ -291,11 +463,139 @@ function CollectionShare(props: Props) { )} {publicShareUrl ? ( -
- -
+ <> + +
+ { + const lastOptionRow: Element = + e.currentTarget.nextElementSibling + .lastElementChild; + const main = async ( + lastOptionRow: Element + ) => { + await sleep(0); + lastOptionRow.scrollIntoView(true); + }; + main(lastOptionRow); + }} + className="manageLinkHeader" + style={{ marginBottom: '20px' }}> + {constants.MANAGE_LINK} + +
+ + + {constants.LINK_DEVICE_LIMIT} + + + { + updateDeviceExpiry(e.value); + }} + styles={linkExpiryStyle} + /> + + + + + {constants.FILE_DOWNLOAD} + + + + + + + + + {constants.LINK_PASSWORD_LOCK}{' '} + + + + + +
+ setConfigurePassword(false)} + size="sm" + attributes={{ + title: constants.PASSWORD_LOCK, + }}> + + +
+ ) : ( -
+
)} diff --git a/src/components/Container.ts b/src/components/Container.ts index 9ec7b7faa..8b2be4886 100644 --- a/src/components/Container.ts +++ b/src/components/Container.ts @@ -62,8 +62,7 @@ export const FlexWrapper = styled.div` `; export const FreeFlowText = styled.div` - word-wrap: break-word; - overflow-wrap: break-word; + word-break: break-word; min-width: 30%; text-align: left; `; diff --git a/src/components/SearchBar.tsx b/src/components/Search/index.tsx similarity index 82% rename from src/components/SearchBar.tsx rename to src/components/Search/index.tsx index d1ea5b552..e3e9bc251 100644 --- a/src/components/SearchBar.tsx +++ b/src/components/Search/index.tsx @@ -13,21 +13,22 @@ import { } from 'services/searchService'; import { getFormattedDate } from 'utils/search'; import constants from 'utils/strings/constants'; -import LocationIcon from './icons/LocationIcon'; -import DateIcon from './icons/DateIcon'; -import SearchIcon from './icons/SearchIcon'; -import CloseIcon from './icons/CloseIcon'; +import LocationIcon from '../icons/LocationIcon'; +import DateIcon from '../icons/DateIcon'; +import SearchIcon from '../icons/SearchIcon'; +import CloseIcon from '../icons/CloseIcon'; import { Collection } from 'types/collection'; -import CollectionIcon from './icons/CollectionIcon'; +import CollectionIcon from '../icons/CollectionIcon'; -import ImageIcon from './icons/ImageIcon'; -import VideoIcon from './icons/VideoIcon'; -import { IconButton } from './Container'; +import ImageIcon from '../icons/ImageIcon'; +import VideoIcon from '../icons/VideoIcon'; +import { IconButton } from '../Container'; import { EnteFile } from 'types/file'; import { Suggestion, SuggestionType, DateValue, Bbox } from 'types/search'; import { Search, SearchStats } from 'types/gallery'; import { FILE_TYPE } from 'constants/file'; import { GalleryContext } from 'pages/gallery'; +import { SelectStyles } from './styles'; const Wrapper = styled.div<{ isDisabled: boolean; isOpen: boolean }>` position: fixed; @@ -251,58 +252,6 @@ export default function SearchBar(props: Props) { {props.children} ); - - const customStyles = { - control: (style, { isFocused }) => ({ - ...style, - backgroundColor: '#282828', - color: '#d1d1d1', - borderColor: isFocused ? '#51cd7c' : '#444', - boxShadow: 'none', - ':hover': { - borderColor: '#51cd7c', - cursor: 'text', - '&>.icon': { color: '#51cd7c' }, - }, - }), - input: (style) => ({ - ...style, - color: '#d1d1d1', - }), - menu: (style) => ({ - ...style, - marginTop: '10px', - backgroundColor: '#282828', - }), - option: (style, { isFocused }) => ({ - ...style, - backgroundColor: isFocused && '#343434', - }), - dropdownIndicator: (style) => ({ - ...style, - display: 'none', - }), - indicatorSeparator: (style) => ({ - ...style, - display: 'none', - }), - clearIndicator: (style) => ({ - ...style, - display: 'none', - }), - singleValue: (style, state) => ({ - ...style, - backgroundColor: '#282828', - color: '#d1d1d1', - display: state.selectProps.menuIsOpen ? 'none' : 'block', - }), - placeholder: (style) => ({ - ...style, - color: '#686868', - wordSpacing: '2px', - whiteSpace: 'nowrap', - }), - }; return ( <> {props.searchStats && ( @@ -328,7 +277,7 @@ export default function SearchBar(props: Props) { onChange={handleChange} isClearable escapeClearsValue - styles={customStyles} + styles={SelectStyles} noOptionsMessage={() => null} />
diff --git a/src/components/Search/styles.ts b/src/components/Search/styles.ts new file mode 100644 index 000000000..fa4b98bfa --- /dev/null +++ b/src/components/Search/styles.ts @@ -0,0 +1,52 @@ +export const SelectStyles = { + control: (style, { isFocused }) => ({ + ...style, + backgroundColor: '#282828', + color: '#d1d1d1', + + borderColor: isFocused ? '#51cd7c' : '#444', + boxShadow: 'none', + ':hover': { + borderColor: '#51cd7c', + cursor: 'text', + '&>.icon': { color: '#51cd7c' }, + }, + }), + input: (style) => ({ + ...style, + color: '#d2d2d1', + }), + menu: (style) => ({ + ...style, + marginTop: '1px', + backgroundColor: '#282828', + }), + option: (style, { isFocused }) => ({ + ...style, + backgroundColor: isFocused && '#343434', + }), + dropdownIndicator: (style) => ({ + ...style, + display: 'none', + }), + indicatorSeparator: (style) => ({ + ...style, + display: 'none', + }), + clearIndicator: (style) => ({ + ...style, + display: 'none', + }), + singleValue: (style, state) => ({ + ...style, + backgroundColor: '#282828', + color: '#d1d1d1', + display: state.selectProps.menuIsOpen ? 'none' : 'block', + }), + placeholder: (style) => ({ + ...style, + color: '#686868', + wordSpacing: '2px', + whiteSpace: 'nowrap', + }), +}; diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index a9c8e7eae..474b68ed4 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -354,6 +354,9 @@ const GlobalStyles = createGlobalStyle` .bg-upload-progress-bar { background-color: #51cd7c; } + .custom-switch.custom-switch-md{ + z-index:0; + } .custom-switch.custom-switch-md .custom-control-label { padding-left: 2rem; padding-bottom: 1.5rem; @@ -518,7 +521,9 @@ const GlobalStyles = createGlobalStyle` .form-check-input:hover, .form-check-label :hover{ cursor:pointer; } - + .manageLinkHeader:hover{ + color:#bbb; + } `; export const LogoImage = styled.img` diff --git a/src/pages/gallery/index.tsx b/src/pages/gallery/index.tsx index ff36b0c12..ec9b413c9 100644 --- a/src/pages/gallery/index.tsx +++ b/src/pages/gallery/index.tsx @@ -52,7 +52,7 @@ import { sortFiles, sortFilesIntoCollections, } from 'utils/file'; -import SearchBar from 'components/SearchBar'; +import SearchBar from 'components/Search'; import SelectedFileOptions from 'components/pages/gallery/SelectedFileOptions'; import CollectionSelector, { CollectionSelectorAttributes, @@ -132,6 +132,7 @@ const defaultGalleryContext: GalleryContextType = { startLoading: () => null, finishLoading: () => null, setNotificationAttributes: () => null, + setBlockingLoad: () => null, }; export const GalleryContext = createContext( @@ -157,7 +158,7 @@ export default function Gallery() { const [dialogMessage, setDialogMessage] = useState(); const [messageDialogView, setMessageDialogView] = useState(false); const [planModalView, setPlanModalView] = useState(false); - const [loading, setLoading] = useState(false); + const [blockingLoad, setBlockingLoad] = useState(false); const [collectionSelectorAttributes, setCollectionSelectorAttributes] = useState(null); const [collectionSelectorView, setCollectionSelectorView] = useState(false); @@ -276,7 +277,11 @@ export default function Gallery() { useEffect(() => { const key = getKey(SESSION_KEYS.ENCRYPTION_KEY); if (router.isReady && key) { - checkSubscriptionPurchase(setDialogMessage, router, setLoading); + checkSubscriptionPurchase( + setDialogMessage, + router, + setBlockingLoad + ); } }, [router.isReady]); @@ -568,11 +573,12 @@ export default function Gallery() { startLoading, finishLoading, setNotificationAttributes, + setBlockingLoad, }}> - {loading && ( + {blockingLoad && ( @@ -587,7 +593,7 @@ export default function Gallery() { modalView={planModalView} closeModal={() => setPlanModalView(false)} setDialogMessage={setDialogMessage} - setLoading={setLoading} + setLoading={setBlockingLoad} /> { } }; +export const updateShareableURL = async ( + request: UpdatePublicURL +): Promise => { + try { + const token = getToken(); + if (!token) { + return null; + } + const res = await HTTPService.put( + `${ENDPOINT}/collections/share-url`, + request, + null, + { + 'X-Auth-Token': token, + } + ); + return res.data.result as PublicURL; + } catch (e) { + logError(e, 'updateShareableURL failed '); + throw e; + } +}; + export const getFavCollection = async () => { const collections = await getLocalCollections(); for (const collection of collections) { diff --git a/src/services/upload/exifService.ts b/src/services/upload/exifService.ts index ee81da515..1abb8dfb0 100644 --- a/src/services/upload/exifService.ts +++ b/src/services/upload/exifService.ts @@ -6,6 +6,7 @@ import { FileTypeInfo } from 'types/upload'; import { logError } from 'utils/sentry'; import { ParsedExtractedMetadata } from 'types/upload'; import { getUnixTimeInMicroSeconds } from 'utils/time'; +import { CustomError } from 'utils/error'; const EXIF_TAGS_NEEDED = [ 'DateTimeOriginal', @@ -38,11 +39,7 @@ export async function getExifData( } parsedEXIFData = { location: getEXIFLocation(exifData), - creationTime: getUnixTimeInMicroSeconds( - exifData.DateTimeOriginal ?? - exifData.CreateDate ?? - exifData.ModifyDate - ), + creationTime: getExifTime(exifData), }; } catch (e) { logError(e, 'getExifData failed'); @@ -132,8 +129,34 @@ function getEXIFLocation(exifData): Location { return { latitude: exifData.latitude, longitude: exifData.longitude }; } +function getExifTime(exifData: Exif) { + let dateTime = + exifData.DateTimeOriginal ?? exifData.CreateDate ?? exifData.ModifyDate; + if (!dateTime) { + return null; + } + if (!(dateTime instanceof Date)) { + try { + dateTime = parseEXIFDate(dateTime); + } catch (e) { + logError(Error(CustomError.NOT_A_DATE), ' date revive failed', { + dateTime, + }); + return null; + } + } + return getUnixTimeInMicroSeconds(dateTime); +} + function convertToExifDateFormat(date: Date) { return `${date.getFullYear()}:${ date.getMonth() + 1 }:${date.getDate()} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}`; } + +function parseEXIFDate(dateTime: String) { + const [year, month, date, hour, minute, second] = dateTime + .match(/\d+/g) + .map((x) => parseInt(x)); + return new Date(Date.UTC(year, month - 1, date, hour, minute, second)); +} diff --git a/src/types/collection/index.ts b/src/types/collection/index.ts index e75df8dec..f865e191b 100644 --- a/src/types/collection/index.ts +++ b/src/types/collection/index.ts @@ -26,9 +26,21 @@ export interface PublicURL { validTill: number; enableDownload: boolean; passwordEnabled: boolean; - nonce: string; - opsLimit: number; - memLimit: number; + nonce?: string; + opsLimit?: number; + memLimit?: number; +} + +export interface UpdatePublicURL { + collectionID: number; + disablePassword?: boolean; + enableDownload?: boolean; + validTill?: number; + deviceLimit?: number; + passHash?: string; + nonce?: string; + opsLimit?: number; + memLimit?: number; } export interface CreatePublicAccessTokenRequest { diff --git a/src/types/gallery/index.ts b/src/types/gallery/index.ts index 77fba9b3d..2e5415b2c 100644 --- a/src/types/gallery/index.ts +++ b/src/types/gallery/index.ts @@ -34,6 +34,7 @@ export type GalleryContextType = { startLoading: () => void; finishLoading: () => void; setNotificationAttributes: (attributes: NotificationAttributes) => void; + setBlockingLoad: (value: boolean) => void; }; export interface NotificationAttributes { diff --git a/src/utils/collection/index.ts b/src/utils/collection/index.ts index 9dd5c5cda..c2a02ba96 100644 --- a/src/utils/collection/index.ts +++ b/src/utils/collection/index.ts @@ -17,6 +17,7 @@ import constants from 'utils/strings/constants'; import { Collection } from 'types/collection'; import { CollectionType } from 'constants/collection'; import { getAlbumSiteHost } from 'constants/pages'; +import { getUnixTimeInMicroSecondsWithDelta } from 'utils/time'; export enum COLLECTION_OPS_TYPE { ADD, @@ -126,3 +127,37 @@ export async function appendCollectionKeyToShareURL( sharableURL.hash = bs58.encode(bytes); return sharableURL.href; } + +const _intSelectOption = (i: number) => { + return { label: i.toString(), value: i }; +}; + +export function selectIntOptions(upperLimit: number) { + return [...Array(upperLimit).reverse().keys()].map((i) => + _intSelectOption(i + 1) + ); +} + +export const shareExpiryOptions = [ + { label: 'never', value: () => 0 }, + { + label: 'after 1 hour', + value: () => getUnixTimeInMicroSecondsWithDelta({ hours: 1 }), + }, + { + label: 'after 1 day', + value: () => getUnixTimeInMicroSecondsWithDelta({ days: 1 }), + }, + { + label: 'after 1 week', + value: () => getUnixTimeInMicroSecondsWithDelta({ days: 7 }), + }, + { + label: 'after 1 month', + value: () => getUnixTimeInMicroSecondsWithDelta({ months: 1 }), + }, + { + label: 'after 1 year', + value: () => getUnixTimeInMicroSecondsWithDelta({ years: 1 }), + }, +]; diff --git a/src/utils/crypto/index.ts b/src/utils/crypto/index.ts index 4fcc18f69..9c4a3238d 100644 --- a/src/utils/crypto/index.ts +++ b/src/utils/crypto/index.ts @@ -74,7 +74,7 @@ export async function generateAndSaveIntermediateKeyAttributes( const cryptoWorker = await new CryptoWorker(); const intermediateKekSalt: string = await cryptoWorker.generateSaltToDeriveKey(); - const intermediateKek: KEK = await cryptoWorker.deriveIntermediateKey( + const intermediateKek: KEK = await cryptoWorker.deriveInteractiveKey( passphrase, intermediateKekSalt ); diff --git a/src/utils/crypto/libsodium.ts b/src/utils/crypto/libsodium.ts index e4678a2c7..0d616a508 100644 --- a/src/utils/crypto/libsodium.ts +++ b/src/utils/crypto/libsodium.ts @@ -1,5 +1,6 @@ import sodium, { StateAddress } from 'libsodium-wrappers'; import { ENCRYPTION_CHUNK_SIZE } from 'constants/crypto'; +import assert from 'assert'; export async function decryptChaChaOneShot( data: Uint8Array, @@ -290,8 +291,15 @@ export async function deriveSensitiveKey(passphrase: string, salt: string) { } } -export async function deriveIntermediateKey(passphrase: string, salt: string) { +export async function deriveInteractiveKey(passphrase: string, salt: string) { await sodium.ready; + // default algo can change in future when we upgrade library. + // this assert act as a safegaurd for us to identify any such issue. + assert( + sodium.crypto_pwhash_ALG_DEFAULT === + sodium.crypto_pwhash_ALG_ARGON2ID13, + 'mismatch in expected password hashing algorithm' + ); const key = await toB64( sodium.crypto_pwhash( sodium.crypto_secretbox_KEYBYTES, diff --git a/src/utils/error/index.ts b/src/utils/error/index.ts index 4bd2f17c1..f0c5a9db5 100644 --- a/src/utils/error/index.ts +++ b/src/utils/error/index.ts @@ -41,6 +41,7 @@ export enum CustomError { NOT_FOUND = 'not found ', NO_METADATA = 'no metadata', TOO_LARGE_LIVE_PHOTO_ASSETS = 'too large live photo assets', + NOT_A_DATE = 'not a date', } function parseUploadErrorCodes(error) { diff --git a/src/utils/strings/englishConstants.tsx b/src/utils/strings/englishConstants.tsx index 8252be11c..d2c949f35 100644 --- a/src/utils/strings/englishConstants.tsx +++ b/src/utils/strings/englishConstants.tsx @@ -637,10 +637,19 @@ const englishConstants = { PUBLIC_SHARING: 'link sharing', NOT_FOUND: '404 - not found', LINK_EXPIRED: 'this link has either expired or been disabled!', + MANAGE_LINK: 'manage link', LINK_TOO_MANY_REQUESTS: 'this album is too popular for us to handle!', DISABLE_PUBLIC_SHARING: "'disable public sharing", DISABLE_PUBLIC_SHARING_MESSAGE: 'are you sure you want to disable public sharing?', + FILE_DOWNLOAD: 'file download', + LINK_PASSWORD_LOCK: 'password lock', + LINK_DEVICE_LIMIT: 'device limit', + LINK_EXPIRY: 'link expiry', + LINK_EXPIRY_NEVER: 'never', + DISABLE_FILE_DOWNLOAD: 'disable download', + DISABLE_FILE_DOWNLOAD_MESSAGE: + 'are you sure that you want to disable the download button for files? \n viewers can still take screenshots or save a copy of your photos using external tools', ABUSE_REPORT: 'abuse report', ABUSE_REPORT_BUTTON_TEXT: 'report abuse?', MALICIOUS_CONTENT: 'contains malicious content', @@ -674,6 +683,10 @@ const englishConstants = { PLAYBACK_SUPPORT_COMING: 'playback support coming soon...', LIVE_PHOTO: 'this is a live photo', LIVE: 'LIVE', + DISABLE_PASSWORD: 'disable password', + DISABLE_PASSWORD_MESSAGE: 'are you sure you want to disable password', + PASSWORD_LOCK: 'password lock', + LOCK: 'lock', DOWNLOAD_UPLOAD_LOGS: 'debug logs', }; diff --git a/src/utils/time/index.ts b/src/utils/time/index.ts index 65e15fbce..ba85aa78d 100644 --- a/src/utils/time/index.ts +++ b/src/utils/time/index.ts @@ -1,3 +1,37 @@ +export interface TimeDelta { + hours?: number; + days?: number; + months?: number; + years?: number; +} + +export function dateStringWithMMH(unixTimeInMicroSeconds: number): string { + return new Date(unixTimeInMicroSeconds / 1000).toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + }); +} + +export function getUnixTimeInMicroSecondsWithDelta(delta: TimeDelta): number { + let currentDate = new Date(); + if (delta?.hours) { + currentDate = _addHours(currentDate, delta.hours); + } + if (delta?.days) { + currentDate = _addDays(currentDate, delta.days); + } + if (delta?.months) { + currentDate = _addMonth(currentDate, delta.months); + } + if (delta?.years) { + currentDate = _addYears(currentDate, delta.years); + } + return currentDate.getTime() * 1000; +} + export function getUnixTimeInMicroSeconds(dateTime: Date) { if (!dateTime || isNaN(dateTime.getTime())) { return null; @@ -9,3 +43,27 @@ export function getUnixTimeInMicroSeconds(dateTime: Date) { return unixTime; } } + +function _addDays(date: Date, days: number): Date { + const result = new Date(date); + result.setDate(date.getDate() + days); + return result; +} + +function _addHours(date: Date, hours: number): Date { + const result = new Date(date); + result.setHours(date.getHours() + hours); + return result; +} + +function _addMonth(date: Date, months: number) { + const result = new Date(date); + result.setMonth(date.getMonth() + months); + return result; +} + +function _addYears(date: Date, years: number) { + const result = new Date(date); + result.setFullYear(date.getFullYear() + years); + return result; +} diff --git a/src/worker/crypto.worker.js b/src/worker/crypto.worker.js index d7287fe89..dc7803b00 100644 --- a/src/worker/crypto.worker.js +++ b/src/worker/crypto.worker.js @@ -84,8 +84,8 @@ export class Crypto { return libsodium.deriveSensitiveKey(passphrase, salt); } - async deriveIntermediateKey(passphrase, salt) { - return libsodium.deriveIntermediateKey(passphrase, salt); + async deriveInteractiveKey(passphrase, salt) { + return libsodium.deriveInteractiveKey(passphrase, salt); } async decryptB64(data, nonce, key) { diff --git a/yarn.lock b/yarn.lock index 3ed63de7d..4a30b86aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@babel/code-frame@7.12.11": version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" @@ -182,7 +182,7 @@ "@babel/helper-plugin-utils@^7.14.5": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz" integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== "@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": @@ -227,7 +227,7 @@ "@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== "@babel/helper-validator-option@^7.14.5": @@ -256,7 +256,7 @@ "@babel/highlight@^7.10.4": version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz" integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== dependencies: "@babel/helper-validator-identifier" "^7.16.7" @@ -1058,7 +1058,7 @@ "@next/env@12.1.0": version "12.1.0" - resolved "https://registry.yarnpkg.com/@next/env/-/env-12.1.0.tgz#73713399399b34aa5a01771fb73272b55b22c314" + resolved "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz" integrity sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ== "@next/swc-android-arm64@12.1.0": @@ -1068,7 +1068,7 @@ "@next/swc-darwin-arm64@12.1.0": version "12.1.0" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz#08e8b411b8accd095009ed12efbc2f1d4d547135" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz" integrity sha512-R8vcXE2/iONJ1Unf5Ptqjk6LRW3bggH+8drNkkzH4FLEQkHtELhvcmJwkXcuipyQCsIakldAXhRbZmm3YN1vXg== "@next/swc-darwin-x64@12.1.0": @@ -1403,12 +1403,12 @@ "@types/node@*": version "17.0.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.18.tgz#3b4fed5cfb58010e3a2be4b6e74615e4847f1074" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.18.tgz" integrity sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA== "@types/node@11.11.6": version "11.11.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" + resolved "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz" integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== "@types/node@^14.6.4": @@ -1735,19 +1735,19 @@ ansi-regex@^3.0.0: ansi-regex@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" @@ -1977,7 +1977,7 @@ balanced-match@^1.0.0: base-x@^3.0.2: version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== dependencies: safe-buffer "^5.0.1" @@ -1994,7 +1994,7 @@ bfj@^6.1.1: bip39@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.4.tgz#5b11fed966840b5e1b8539f0f54ab6392969b2a0" + resolved "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz" integrity sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw== dependencies: "@types/node" "11.11.6" @@ -2072,7 +2072,7 @@ browserslist@^4.16.6, browserslist@^4.17.0: bs58@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= dependencies: base-x "^3.0.2" @@ -2089,12 +2089,12 @@ builtin-modules@^3.1.0: bytes@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" @@ -2117,12 +2117,12 @@ caniuse-lite@^1.0.30001254: caniuse-lite@^1.0.30001283: version "1.0.30001312" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz#e11eba4b87e24d22697dae05455d5aea28550d5f" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz" integrity sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ== chalk@^2.0.0, chalk@^2.4.1: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -2151,7 +2151,7 @@ chrono-node@^2.2.6: cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" @@ -2197,26 +2197,26 @@ code-point-at@^1.0.0: color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colorette@^1.2.2, colorette@^1.3.0: @@ -2313,7 +2313,7 @@ core-js@^2.4.0: core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig@^7.0.0: @@ -2329,7 +2329,7 @@ cosmiconfig@^7.0.0: create-hash@^1.1.0, create-hash@^1.1.2: version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" @@ -2340,7 +2340,7 @@ create-hash@^1.1.0, create-hash@^1.1.2: create-hmac@^1.1.4: version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" @@ -2436,7 +2436,7 @@ deepmerge@^2.1.1: define-properties@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== dependencies: object-keys "^1.0.12" @@ -2461,7 +2461,7 @@ delegates@^1.0.0: depd@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= dequal@^2.0.2: @@ -2580,7 +2580,7 @@ es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: es-to-primitive@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" @@ -2589,7 +2589,7 @@ es-to-primitive@^1.2.1: escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-html@~1.0.3: @@ -2599,7 +2599,7 @@ escape-html@~1.0.3: escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escape-string-regexp@^4.0.0: @@ -2872,7 +2872,7 @@ esutils@~1.0.0: etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eve@~0.5.1: @@ -3011,7 +3011,7 @@ filesize@^3.6.1: fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" @@ -3056,7 +3056,7 @@ fn-name@~3.0.0: follow-redirects@^1.0.0, follow-redirects@^1.14.0: version "1.14.8" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz" integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA== formik@^2.1.5: @@ -3098,7 +3098,7 @@ fs.realpath@^1.0.0: function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== functional-red-black-tree@^1.0.1: @@ -3127,7 +3127,7 @@ gensync@^1.0.0-beta.2: get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== dependencies: function-bind "^1.1.1" @@ -3146,7 +3146,7 @@ get-stream@^6.0.0: get-symbol-description@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: call-bind "^1.0.2" @@ -3206,12 +3206,7 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -graceful-fs@^4.1.2: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== - -graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.8" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== @@ -3226,27 +3221,27 @@ gzip-size@^5.0.0: has-bigints@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== has-tostringtag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: has-symbols "^1.0.2" @@ -3258,14 +3253,14 @@ has-unicode@^2.0.0: has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hash-base@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: inherits "^2.0.4" @@ -3318,7 +3313,7 @@ http-errors@1.7.2: http-errors@~1.7.2: version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== dependencies: depd "~1.1.2" @@ -3367,7 +3362,7 @@ husky@^7.0.1: iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" @@ -3430,12 +3425,12 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i inherits@2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= internal-slot@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: get-intrinsic "^1.1.0" @@ -3461,14 +3456,14 @@ is-arrayish@^0.2.1: is-bigint@^1.0.1: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" is-boolean-object@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" @@ -3476,7 +3471,7 @@ is-boolean-object@^1.1.0: is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== is-core-module@^2.2.0, is-core-module@^2.6.0: @@ -3488,7 +3483,7 @@ is-core-module@^2.2.0, is-core-module@^2.6.0: is-date-object@^1.0.1: version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" @@ -3500,7 +3495,7 @@ is-electron@^2.2.0: is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^1.0.0: @@ -3529,7 +3524,7 @@ is-glob@^4.0.0: is-glob@^4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" @@ -3541,19 +3536,19 @@ is-module@^1.0.0: is-negative-zero@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz" integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== dependencies: has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^1.0.1: @@ -3587,7 +3582,7 @@ is-plain-obj@^3.0.0: is-regex@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" @@ -3600,7 +3595,7 @@ is-regexp@^1.0.0: is-shared-array-buffer@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz" integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== is-stream@^2.0.0: @@ -3610,14 +3605,14 @@ is-stream@^2.0.0: is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" @@ -3634,14 +3629,14 @@ is-url@^1.2.4: is-weakref@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: @@ -3664,7 +3659,7 @@ jpeg-js@^0.4.1: "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: @@ -3712,7 +3707,7 @@ json-stable-stringify-without-jsonify@^1.0.1: json5@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== dependencies: minimist "^1.2.0" @@ -3959,7 +3954,7 @@ magic-string@^0.25.0, magic-string@^0.25.7: md5.js@^1.3.4: version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" @@ -3983,7 +3978,7 @@ merge-descriptors@1.0.1: merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0: @@ -4047,7 +4042,7 @@ mkdirp@^0.5.1, mkdirp@^0.5.5: ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@2.1.1: @@ -4062,7 +4057,7 @@ ms@2.1.2, ms@^2.1.1: nanoid@^3.1.30: version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz" integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== natural-compare@^1.4.0: @@ -4077,7 +4072,7 @@ negotiator@0.6.2: next@^12.1.0: version "12.1.0" - resolved "https://registry.yarnpkg.com/next/-/next-12.1.0.tgz#c33d753b644be92fc58e06e5a214f143da61dd5d" + resolved "https://registry.npmjs.org/next/-/next-12.1.0.tgz" integrity sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q== dependencies: "@next/env" "12.1.0" @@ -4127,7 +4122,7 @@ normalize-package-data@^2.3.2: normalize-path@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-run-path@^4.0.1: @@ -4159,12 +4154,12 @@ object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: object-inspect@^1.11.0, object-inspect@^1.9.0: version "1.12.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.0, object.assign@^4.1.2: @@ -4368,16 +4363,16 @@ peek-readable@^4.0.1: integrity sha512-7qmhptnR0WMSpxT5rMHG9bW/mYSR1uqaPFj2MHvT+y/aOUu6msJijpKt5SkTDKySwg65OWG2JwTMBlgcbwMHrQ== "photoswipe@file:./thirdparty/photoswipe": - version "4.1.4" + version "4.1.3" picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== picomatch@^2.2.2, picomatch@^2.2.3: @@ -4387,7 +4382,7 @@ picomatch@^2.2.2, picomatch@^2.2.3: piexifjs@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/piexifjs/-/piexifjs-1.0.6.tgz#883811d73f447218d0d06e9ed7866d04533e59e0" + resolved "https://registry.npmjs.org/piexifjs/-/piexifjs-1.0.6.tgz" integrity sha512-0wVyH0cKohzBQ5Gi2V1BuxYpxWfxF3cSqfFXfPIpl5tl9XLS5z4ogqhUCD20AbHi0h9aJkqXNJnkVev6gwh2ag== pify@^2.0.0: @@ -4450,7 +4445,7 @@ postcss-value-parser@^4.0.2: postcss@8.4.5: version "8.4.5" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz" integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== dependencies: nanoid "^3.1.30" @@ -4474,7 +4469,7 @@ pretty-bytes@^5.3.0: process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== progress@^2.0.0, progress@^2.0.3: @@ -4519,7 +4514,7 @@ proxy-from-env@^1.1.0: punycode@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== qs@6.7.0: @@ -4607,7 +4602,7 @@ react-datepicker@^4.3.0: react-dom@^17.0.2: version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== dependencies: loose-envify "^1.1.0" @@ -4730,7 +4725,7 @@ react-window@^1.8.6: react@^17.0.2: version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== dependencies: loose-envify "^1.1.0" @@ -4768,7 +4763,7 @@ readable-stream@^2.0.6, readable-stream@~2.3.6: readable-stream@^3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" @@ -4801,7 +4796,7 @@ regenerator-runtime@^0.11.0: regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== regenerator-transform@^0.14.2: @@ -4913,7 +4908,7 @@ rimraf@^3.0.2: ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: hash-base "^3.0.0" @@ -4970,17 +4965,17 @@ rxjs@^6.6.7: safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== "safer-buffer@>= 2.1.2 < 3": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sax@^1.2.4: @@ -4990,7 +4985,7 @@ sax@^1.2.4: scheduler@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== dependencies: loose-envify "^1.1.0" @@ -5076,12 +5071,12 @@ set-immediate-shim@~1.0.1: setprototypeof@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" @@ -5106,7 +5101,7 @@ shebang-regex@^3.0.0: side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -5162,7 +5157,7 @@ source-list-map@^2.0.0: source-map-js@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== source-map-support@~0.5.12: @@ -5288,7 +5283,7 @@ string.prototype.matchall@^4.0.5: string.prototype.trimend@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz" integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: call-bind "^1.0.2" @@ -5296,7 +5291,7 @@ string.prototype.trimend@^1.0.4: string.prototype.trimstart@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz" integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: call-bind "^1.0.2" @@ -5304,14 +5299,14 @@ string.prototype.trimstart@^1.0.4: string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" @@ -5395,7 +5390,7 @@ styled-components@^5.2.0: styled-jsx@5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.0.tgz#816b4b92e07b1786c6b7111821750e0ba4d26e77" + resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz" integrity sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA== stylis@^4.0.3: @@ -5405,7 +5400,7 @@ stylis@^4.0.3: supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" @@ -5419,7 +5414,7 @@ supports-color@^6.1.0: supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" @@ -5481,19 +5476,19 @@ tiny-warning@^1.0.2: to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== token-types@^4.1.1: @@ -5583,7 +5578,7 @@ typescript@^4.1.3: unbox-primitive@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz" integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== dependencies: function-bind "^1.1.1" @@ -5655,14 +5650,14 @@ uri-js@^4.2.2: use-subscription@1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1" + resolved "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz" integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA== dependencies: object-assign "^4.1.1" util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= utils-merge@1.0.1: @@ -5737,7 +5732,7 @@ whatwg-url@^5.0.0: which-boxed-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1"