From d4a1546ddc288af3cb5b597682ce5479345858ba Mon Sep 17 00:00:00 2001 From: d-turley <109699790+d-turley@users.noreply.github.com> Date: Wed, 21 Sep 2022 15:35:23 -0700 Subject: [PATCH] Initial commit of Rhythm of Business Calendar app sample (#1) Co-authored-by: d-turley --- .../.editorconfig | 25 + .../.eslintrc.js | 372 + .../.gitattributes | 63 + .../.gitignore | 33 + .../.yo-rc.json | 12 + .../README.md | 124 + .../assets/screenshot-edit-refiner.png | Bin 0 -> 135355 bytes .../assets/screenshot-month-view.png | Bin 0 -> 91632 bytes .../assets/screenshot-view-event.png | Bin 0 -> 137589 bytes .../build/gulpfile.ts | 479 + .../config/config.json | 20 + .../config/copy-assets.json | 4 + .../config/deploy-azure-storage.json | 7 + .../config/package-solution.json | 20 + .../config/serve.json | 6 + .../config/write-manifests.json | 4 + .../documentation/README.md | 17 + .../documentation/build-tools.md | 3 + .../documentation/components.md | 3 + .../documentation/entities.md | 3 + .../documentation/fast-load-caching.md | 3 + .../documentation/live-update.md | 3 + .../documentation/schema.md | 3 + .../documentation/services.md | 3 + .../documentation/solution-structure.md | 3 + .../environments.json | 98 + .../gulpfile.js | 1 + .../jest.config.js | 41 + .../jest.setup.localization-mocks.ts | 61 + .../mock_modules/@microsoft/sp-http/index.ts | 20 + .../@microsoft/sp-webpart-base/index.ts | 25 + .../package-lock.json | 63970 ++++++++++++++++ .../package.json | 84 + .../src/apps/LoadingShimmer.tsx | 250 + .../src/apps/RhythmOfBusinessCalendarApp.tsx | 98 + .../src/apps/index.ts | 1 + .../onboarding/addEventsIllustration.png | Bin 0 -> 10409 bytes .../onboarding/setApproversIllustration.png | Bin 0 -> 13352 bytes .../onboarding/setRefinersIllustration.png | Bin 0 -> 11814 bytes .../src/common/AsyncData.ts | 180 + .../src/common/BackEventListener.ts | 34 + .../src/common/Color.ts | 77 + .../src/common/Entity.ts | 941 + .../src/common/ErrorHandler.ts | 53 + .../src/common/GroupByOption.ts | 7 + .../src/common/IComponent.ts | 3 + .../src/common/IKey.ts | 3 + .../src/common/IUserListChanges.ts | 6 + .../src/common/Loader.ts | 50 + .../src/common/Localization.ts | 36 + .../src/common/MomentRange.ts | 9 + .../src/common/ReactRouter.tsx | 9 + .../src/common/SortOption.ts | 8 + .../src/common/User.ts | 96 + .../src/common/Utils.ts | 310 + .../src/common/ValidationError.ts | 9 + .../src/common/ValidationRules.ts | 148 + .../common/components/AsyncDataComponent.tsx | 99 + .../src/common/components/AsyncOverlay.tsx | 27 + .../src/common/components/CalendarPicker.tsx | 73 + .../common/components/CalloutColorPicker.tsx | 65 + .../src/common/components/ConfirmDialog.tsx | 56 + .../common/components/DataComponentBase.tsx | 308 + .../src/common/components/DataDialogBase.tsx | 320 + .../src/common/components/DataPanelBase.tsx | 410 + .../src/common/components/DateRotator.tsx | 60 + .../common/components/EntityComponentBase.tsx | 119 + .../common/components/EntityDialogBase.tsx | 120 + .../src/common/components/EntityPanelBase.tsx | 132 + .../src/common/components/InfoTooltip.tsx | 26 + .../components/LengthLimitedTextField.tsx | 72 + .../common/components/LengthOfTimePicker.tsx | 81 + .../src/common/components/LiveCheckbox.tsx | 56 + .../src/common/components/LiveChoiceGroup.tsx | 72 + .../src/common/components/LiveComboBox.tsx | 74 + .../src/common/components/LiveDatePicker.tsx | 65 + .../src/common/components/LiveDropdown.tsx | 82 + .../components/LiveMultiselectDropdown.tsx | 100 + .../common/components/LiveRelationship.tsx | 147 + .../src/common/components/LiveText.tsx | 51 + .../src/common/components/LiveTextField.tsx | 76 + .../src/common/components/LiveTimePicker.tsx | 63 + .../src/common/components/LiveToggle.tsx | 75 + .../src/common/components/LiveUpdate.tsx | 287 + .../src/common/components/LiveUserPicker.tsx | 72 + .../src/common/components/LiveUtils.ts | 103 + .../src/common/components/Localize.tsx | 22 + .../src/common/components/ResponsiveGrid.tsx | 124 + .../src/common/components/SharePointApp.tsx | 130 + .../src/common/components/TimePicker.tsx | 104 + .../src/common/components/UserList.tsx | 38 + .../src/common/components/UserPicker.tsx | 181 + .../src/common/components/Validation.tsx | 48 + .../src/common/components/WebPartTitle.tsx | 20 + .../src/common/components/Wizard.tsx | 458 + .../src/common/components/index.ts | 37 + .../common/components/loc/commonstrings.d.ts | 88 + .../src/common/components/loc/en-us.js | 90 + .../styles/AsyncLoadComponent.module.scss | 22 + .../styles/AsyncOverlay.module.scss | 13 + .../styles/CalloutColorPicker.module.scss | 14 + .../styles/DataDialogBase.module.scss | 40 + .../styles/DataPanelBase.module.scss | 26 + .../styles/FloatingPane.module.scss | 8 + .../styles/LengthLimitedTextfield.module.scss | 24 + .../styles/LiveComponents.module.scss | 11 + .../components/styles/Pager.module.scss | 7 + .../components/styles/TimePicker.module.scss | 18 + .../components/styles/UserList.module.scss | 7 + .../components/styles/UserPicker.module.scss | 7 + .../styles/WebPartTitle.module.scss | 8 + .../components/styles/Wizard.module.scss | 30 + .../components/styles/_common.module.scss | 351 + .../src/common/extensions/IList.ts | 17 + .../src/common/extensions/index.ts | 1 + .../src/common/index.ts | 20 + .../src/common/services/IService.ts | 15 + .../src/common/services/IServiceDescriptor.ts | 10 + .../src/common/services/ServiceKeyBuilder.ts | 40 + .../src/common/services/ServiceManager.ts | 115 + .../src/common/services/SpfxContext.ts | 17 + .../developer/DeveloperServiceDescriptor.ts | 22 + .../developer/OnlineDeveloperService.ts | 39 + .../src/common/services/developer/index.ts | 1 + .../directory/DirectoryServiceDescriptor.ts | 43 + .../directory/MockDirectoryService.ts | 71 + .../directory/OnlineDirectoryService.ts | 276 + .../src/common/services/directory/index.ts | 2 + .../DomainIsolationServiceDescriptor.ts | 31 + .../MockDomainIsolationService.ts | 34 + .../OnlineDomainIsolationService.ts | 89 + .../common/services/domainIsolation/index.ts | 1 + .../src/common/services/index.ts | 11 + .../liveUpdate/LiveUpdateServiceDescriptor.ts | 27 + .../liveUpdate/OnlineLiveUpdateService.ts | 93 + .../src/common/services/liveUpdate/index.ts | 1 + .../sharepoint/IPagedListDataStream.ts | 7 + .../services/sharepoint/ListDataAsStream.ts | 94 + .../sharepoint/OnlineSharePointService.ts | 326 + .../sharepoint/SharePointServiceDescriptor.ts | 81 + .../src/common/services/sharepoint/index.ts | 2 + .../timezones/OnlineTimeZoneService.ts | 140 + .../timezones/TimeZoneServiceDescriptor.ts | 33 + .../src/common/services/timezones/index.ts | 1 + .../services/timezones/timezone-mappings.json | 537 + .../src/common/services/withServices.tsx | 37 + .../src/common/sharepoint/CamlQuery.ts | 52 + .../src/common/sharepoint/ChoiceFieldValue.ts | 6 + .../src/common/sharepoint/ListItemCache.ts | 225 + .../src/common/sharepoint/ListItemEntity.ts | 109 + .../src/common/sharepoint/ListItemRating.ts | 71 + .../src/common/sharepoint/ModerationStatus.ts | 25 + .../src/common/sharepoint/PagedViewLoader.ts | 362 + .../common/sharepoint/RangedListItemLoader.ts | 271 + .../sharepoint/RateableListItemEntity.ts | 50 + .../src/common/sharepoint/SPField.ts | 250 + .../src/common/sharepoint/SharePointGroup.ts | 89 + .../common/sharepoint/TaxonomyTermEntity.ts | 52 + .../common/sharepoint/compressed-json.d.ts | 4 + .../src/common/sharepoint/createEntity.ts | 28 + .../src/common/sharepoint/index.ts | 19 + .../sharepoint/query_/IAddListItemResult.ts | 9 + .../sharepoint/query_/IChoiceFieldInfo.ts | 6 + .../query_/ICurrentChangeTokenResult.ts | 3 + .../common/sharepoint/query_/IFolderResult.ts | 10 + .../sharepoint/query_/IListItemResult.ts | 12 + .../common/sharepoint/query_/ILookupResult.ts | 4 + .../query_/IRenderListDataAsStreamResult.ts | 8 + .../sharepoint/query_/ITaxonomyResult.ts | 5 + .../sharepoint/query_/IThumbnailResult.ts | 11 + .../sharepoint/query_/IUserInfoResult.ts | 7 + .../query_/IWebAllPropertiesResult.ts | 10 + .../src/common/sharepoint/query_/index.ts | 11 + .../schema/AddListFieldUpgradeAction.ts | 22 + .../schema/AddOrUpdateViewUpgradeAction.ts | 22 + .../schema/CreateListUpgradeAction.ts | 18 + .../schema/DeleteListFieldUpgradeAction.ts | 22 + .../schema/DeleteListViewUpgradeAction.ts | 22 + .../schema/DeleteSiteFieldUpgradeAction.ts | 20 + .../sharepoint/schema/ElementProvisioner.ts | 846 + .../sharepoint/schema/IElementDefinitions.ts | 414 + .../sharepoint/schema/IUpgradeAction.ts | 5 + .../schema/UpdateListFieldUpgradeAction.ts | 22 + .../schema/UpdateUserRolesUpgradeAction.ts | 20 + .../src/common/sharepoint/schema/index.ts | 11 + .../sharepoint/update/IUpdateListItem.ts | 3 + .../update/ModeratedUpdateListItem.ts | 15 + .../sharepoint/update/UpdateHyperlink.ts | 9 + .../sharepoint/update/UpdateMultiChoice.ts | 8 + .../sharepoint/update/UpdateMultiLookup.ts | 6 + .../sharepoint/update/UpdateTaxonomy.ts | 10 + .../src/common/sharepoint/update/index.ts | 6 + .../src/components/Root.tsx | 21 + .../src/components/_common.module.scss | 1 + .../src/components/_panels.module.scss | 14 + .../components/approvals/ApprovalDialog.tsx | 100 + .../approvals/ApproversPanel.module.scss | 1 + .../components/approvals/ApproversPanel.tsx | 295 + .../approvals/ConfigureApproversPanel.tsx | 210 + .../src/components/approvals/EventCard.tsx | 35 + .../approvals/MyApprovalsFilter.tsx | 24 + .../approvals/MyApprovalsPanel.module.scss | 8 + .../components/approvals/MyApprovalsPanel.tsx | 90 + .../src/components/approvals/index.ts | 5 + .../components/events/EventBar.module.scss | 51 + .../src/components/events/EventBar.tsx | 79 + .../components/events/EventDetailsCallout.tsx | 74 + .../src/components/events/EventFilter.tsx | 56 + .../events/EventOverview.module.scss | 26 + .../src/components/events/EventOverview.tsx | 86 + .../components/events/EventPanel.module.scss | 7 + .../src/components/events/EventPanel.tsx | 969 + .../src/components/events/IEventCommands.ts | 12 + .../src/components/events/index.ts | 6 + .../src/components/hooks/index.ts | 9 + .../src/components/hooks/useApprovals.ts | 74 + .../src/components/hooks/useCopyLinkDialog.ts | 19 + .../hooks/useEventCommandActionButtons.tsx | 78 + .../src/components/hooks/useEventPanel.ts | 31 + .../hooks/useExecuteEventDeepLink.ts | 71 + .../src/components/hooks/useRefinerPanel.ts | 35 + .../src/components/hooks/useRefinerValues.ts | 74 + .../src/components/hooks/useSettings.ts | 30 + .../src/components/hooks/useWindowSize.ts | 21 + .../src/components/index.ts | 3 + .../src/components/loc/componentstrings.d.ts | 370 + .../src/components/loc/en-us.js | 340 + .../recurrence/ChoiceGroupOptionStack.tsx | 9 + .../src/components/recurrence/DailyEditor.tsx | 107 + .../components/recurrence/MonthlyEditor.tsx | 167 + .../components/recurrence/NumberTextField.tsx | 51 + .../recurrence/PatternChoiceGroup.tsx | 35 + .../recurrence/Recurrence.module.scss | 5 + .../recurrence/SharedDropdownOptions.ts | 64 + .../src/components/recurrence/UntilEditor.tsx | 136 + .../components/recurrence/WeekdayCheckbox.tsx | 24 + .../components/recurrence/WeeklyEditor.tsx | 83 + .../components/recurrence/YearlyEditor.tsx | 152 + .../src/components/recurrence/index.ts | 6 + .../refiners/OnRefinerSelectionChanged.ts | 8 + .../components/refiners/RefinerCheckbox.tsx | 39 + .../refiners/RefinerPanel.module.scss | 78 + .../src/components/refiners/RefinerPanel.tsx | 544 + .../refiners/RefinerValuePill.module.scss | 11 + .../components/refiners/RefinerValuePill.tsx | 30 + .../refiners/RefinerValues.module.scss | 19 + .../src/components/refiners/RefinerValues.tsx | 131 + .../src/components/refiners/Refiners.tsx | 29 + .../src/components/refiners/index.ts | 4 + .../src/components/settings/RefinerEditor.tsx | 116 + .../settings/SettingsPanel.module.scss | 23 + .../src/components/settings/SettingsPanel.tsx | 258 + .../src/components/settings/index.ts | 1 + .../components/setup/ConfigurationWizard.tsx | 123 + .../src/components/setup/Upgrade.module.scss | 8 + .../src/components/setup/Upgrade.tsx | 201 + .../src/components/shared/CopyLinkDialog.tsx | 65 + .../components/shared/ListItemTechnicals.tsx | 30 + .../src/components/shared/Rail.tsx | 53 + .../src/components/shared/SwipedEvents.tsx | 47 + .../src/components/shared/index.ts | 4 + .../src/components/shared/swiped-events.d.ts | 1 + .../components/views/DateRotatorController.ts | 38 + .../src/components/views/IViewCommands.ts | 8 + .../src/components/views/IViewDescriptor.ts | 14 + .../src/components/views/IViewProps.ts | 13 + .../src/components/views/ViewNav.module.scss | 7 + .../src/components/views/ViewNav.tsx | 32 + .../components/views/ViewRoute.module.scss | 11 + .../src/components/views/ViewRoute.tsx | 323 + .../src/components/views/Views.ts | 15 + .../components/views/day/DayView.module.scss | 8 + .../src/components/views/day/DayView.tsx | 95 + .../src/components/views/index.ts | 6 + .../src/components/views/month/Builder.ts | 134 + .../src/components/views/month/ContentRow.tsx | 26 + .../src/components/views/month/EventItem.tsx | 30 + .../src/components/views/month/Header.tsx | 42 + .../views/month/MonthView.module.scss | 48 + .../src/components/views/month/MonthView.tsx | 53 + .../src/components/views/month/ShimItem.tsx | 10 + .../src/components/views/month/Week.tsx | 34 + .../components/views/month/WeekBackground.tsx | 120 + .../src/components/views/month/blockStyles.ts | 6 + .../src/components/views/quarter/Builder.ts | 124 + .../components/views/quarter/EventItem.tsx | 41 + .../src/components/views/quarter/Month.tsx | 68 + .../components/views/quarter/QuarterView.tsx | 79 + .../views/quarter/RefinerValueEvents.tsx | 33 + .../src/components/views/quarter/Utils.ts | 7 + .../src/components/views/useView.ts | 8 + .../src/components/views/week/Background.tsx | 120 + .../src/components/views/week/Builder.ts | 101 + .../src/components/views/week/ContentRow.tsx | 26 + .../src/components/views/week/EventItem.tsx | 28 + .../src/components/views/week/Header.tsx | 42 + .../src/components/views/week/ShimItem.tsx | 10 + .../views/week/WeekView.module.scss | 90 + .../src/components/views/week/WeekView.tsx | 62 + .../src/components/views/week/blockStyles.ts | 6 + .../src/index.ts | 1 + .../src/model/Approvers.ts | 91 + .../src/model/Cadence.ts | 291 + .../src/model/Event.ts | 415 + .../src/model/EventModerationStatus.ts | 26 + .../src/model/EventOccurrence.ts | 47 + .../src/model/IEvent.ts | 26 + .../src/model/Recurrence.ts | 149 + .../src/model/Refiner.ts | 90 + .../src/model/RefinerValue.ts | 85 + .../src/model/Validations.ts | 155 + .../src/model/ViewKeys.ts | 12 + .../src/model/humanize.ts | 118 + .../src/model/index.ts | 10 + .../src/schema/Configuration.ts | 72 + .../src/schema/Defaults.ts | 23 + .../schema/RhythmOfBusinessCalendarSchema.ts | 30 + .../src/schema/index.ts | 3 + .../src/schema/lists/ApproversList.ts | 68 + .../src/schema/lists/ConfigurationList.ts | 119 + .../src/schema/lists/EventsList.ts | 229 + .../src/schema/lists/RefinerValuesList.ts | 116 + .../src/schema/lists/RefinersList.ts | 114 + .../src/schema/lists/index.ts | 5 + .../configuration/ConfigurationLoader.ts | 74 + .../ConfigurationServiceDescriptor.ts | 27 + .../OnlineConfigurationService.ts | 91 + .../src/services/configuration/index.ts | 1 + .../src/services/events/ApproversLoader.ts | 47 + .../src/services/events/Defaults.ts | 15 + .../src/services/events/EventLoader.ts | 142 + .../events/EventsServiceDescriptor.ts | 40 + .../services/events/OnlineEventsService.ts | 481 + .../src/services/events/RecurrenceData.ts | 375 + .../src/services/events/RefinerLoader.ts | 59 + .../src/services/events/RefinerValueLoader.ts | 54 + .../services/events/iCalendarFileBuilder.ts | 161 + .../src/services/events/index.ts | 1 + .../src/services/index.ts | 3 + .../RhythmOfBusinessCalendar.module.scss | 3 + ...thmOfBusinessCalendarWebPart.manifest.json | 32 + .../RhythmOfBusinessCalendarWebPart.tsx | 43 + .../rhythmOfBusinessCalendar/loc/en-us.js | 7 + .../loc/mystrings.d.ts | 12 + .../teams/dev/RhythmOfBusinessCalendarDEV.zip | Bin 0 -> 8077 bytes .../teams/dev/color.png | Bin 0 -> 6300 bytes .../teams/dev/manifest.json | 48 + .../teams/dev/outline.png | Bin 0 -> 506 bytes .../teams/prod/RhythmOfBusinessCalendar.zip | Bin 0 -> 8068 bytes .../teams/prod/color.png | Bin 0 -> 6300 bytes .../teams/prod/manifest.json | 48 + .../teams/prod/outline.png | Bin 0 -> 506 bytes .../test/RhythmOfBusinessCalendarTEST.zip | Bin 0 -> 8074 bytes .../teams/test/color.png | Bin 0 -> 6300 bytes .../teams/test/manifest.json | 48 + .../teams/test/outline.png | Bin 0 -> 506 bytes .../tsconfig.json | 39 + 357 files changed, 90550 insertions(+) create mode 100644 samples/react-rhythm-of-business-calendar/.editorconfig create mode 100644 samples/react-rhythm-of-business-calendar/.eslintrc.js create mode 100644 samples/react-rhythm-of-business-calendar/.gitattributes create mode 100644 samples/react-rhythm-of-business-calendar/.gitignore create mode 100644 samples/react-rhythm-of-business-calendar/.yo-rc.json create mode 100644 samples/react-rhythm-of-business-calendar/README.md create mode 100644 samples/react-rhythm-of-business-calendar/assets/screenshot-edit-refiner.png create mode 100644 samples/react-rhythm-of-business-calendar/assets/screenshot-month-view.png create mode 100644 samples/react-rhythm-of-business-calendar/assets/screenshot-view-event.png create mode 100644 samples/react-rhythm-of-business-calendar/build/gulpfile.ts create mode 100644 samples/react-rhythm-of-business-calendar/config/config.json create mode 100644 samples/react-rhythm-of-business-calendar/config/copy-assets.json create mode 100644 samples/react-rhythm-of-business-calendar/config/deploy-azure-storage.json create mode 100644 samples/react-rhythm-of-business-calendar/config/package-solution.json create mode 100644 samples/react-rhythm-of-business-calendar/config/serve.json create mode 100644 samples/react-rhythm-of-business-calendar/config/write-manifests.json create mode 100644 samples/react-rhythm-of-business-calendar/documentation/README.md create mode 100644 samples/react-rhythm-of-business-calendar/documentation/build-tools.md create mode 100644 samples/react-rhythm-of-business-calendar/documentation/components.md create mode 100644 samples/react-rhythm-of-business-calendar/documentation/entities.md create mode 100644 samples/react-rhythm-of-business-calendar/documentation/fast-load-caching.md create mode 100644 samples/react-rhythm-of-business-calendar/documentation/live-update.md create mode 100644 samples/react-rhythm-of-business-calendar/documentation/schema.md create mode 100644 samples/react-rhythm-of-business-calendar/documentation/services.md create mode 100644 samples/react-rhythm-of-business-calendar/documentation/solution-structure.md create mode 100644 samples/react-rhythm-of-business-calendar/environments.json create mode 100644 samples/react-rhythm-of-business-calendar/gulpfile.js create mode 100644 samples/react-rhythm-of-business-calendar/jest.config.js create mode 100644 samples/react-rhythm-of-business-calendar/jest.setup.localization-mocks.ts create mode 100644 samples/react-rhythm-of-business-calendar/mock_modules/@microsoft/sp-http/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/mock_modules/@microsoft/sp-webpart-base/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/package-lock.json create mode 100644 samples/react-rhythm-of-business-calendar/package.json create mode 100644 samples/react-rhythm-of-business-calendar/src/apps/LoadingShimmer.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/apps/RhythmOfBusinessCalendarApp.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/apps/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/assets/onboarding/addEventsIllustration.png create mode 100644 samples/react-rhythm-of-business-calendar/src/assets/onboarding/setApproversIllustration.png create mode 100644 samples/react-rhythm-of-business-calendar/src/assets/onboarding/setRefinersIllustration.png create mode 100644 samples/react-rhythm-of-business-calendar/src/common/AsyncData.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/BackEventListener.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/Color.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/Entity.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/ErrorHandler.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/GroupByOption.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/IComponent.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/IKey.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/IUserListChanges.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/Loader.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/Localization.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/MomentRange.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/ReactRouter.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/SortOption.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/User.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/Utils.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/ValidationError.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/ValidationRules.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/AsyncDataComponent.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/AsyncOverlay.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/CalendarPicker.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/CalloutColorPicker.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/ConfirmDialog.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/DataComponentBase.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/DataDialogBase.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/DataPanelBase.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/DateRotator.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/EntityComponentBase.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/EntityDialogBase.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/EntityPanelBase.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/InfoTooltip.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/LengthLimitedTextField.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/LengthOfTimePicker.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/LiveCheckbox.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/LiveChoiceGroup.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/LiveComboBox.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/LiveDatePicker.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/LiveDropdown.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/LiveMultiselectDropdown.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/LiveRelationship.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/LiveText.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/LiveTextField.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/LiveTimePicker.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/LiveToggle.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/LiveUpdate.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/LiveUserPicker.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/LiveUtils.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/Localize.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/ResponsiveGrid.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/SharePointApp.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/TimePicker.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/UserList.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/UserPicker.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/Validation.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/WebPartTitle.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/Wizard.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/loc/commonstrings.d.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/loc/en-us.js create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/styles/AsyncLoadComponent.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/styles/AsyncOverlay.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/styles/CalloutColorPicker.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/styles/DataDialogBase.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/styles/DataPanelBase.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/styles/FloatingPane.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/styles/LengthLimitedTextfield.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/styles/LiveComponents.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/styles/Pager.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/styles/TimePicker.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/styles/UserList.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/styles/UserPicker.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/styles/WebPartTitle.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/styles/Wizard.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/common/components/styles/_common.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/common/extensions/IList.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/extensions/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/IService.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/IServiceDescriptor.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/ServiceKeyBuilder.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/ServiceManager.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/SpfxContext.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/developer/DeveloperServiceDescriptor.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/developer/OnlineDeveloperService.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/developer/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/directory/DirectoryServiceDescriptor.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/directory/MockDirectoryService.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/directory/OnlineDirectoryService.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/directory/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/domainIsolation/DomainIsolationServiceDescriptor.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/domainIsolation/MockDomainIsolationService.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/domainIsolation/OnlineDomainIsolationService.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/domainIsolation/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/liveUpdate/LiveUpdateServiceDescriptor.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/liveUpdate/OnlineLiveUpdateService.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/liveUpdate/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/IPagedListDataStream.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/ListDataAsStream.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/OnlineSharePointService.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/SharePointServiceDescriptor.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/timezones/OnlineTimeZoneService.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/timezones/TimeZoneServiceDescriptor.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/timezones/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/timezones/timezone-mappings.json create mode 100644 samples/react-rhythm-of-business-calendar/src/common/services/withServices.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/CamlQuery.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/ChoiceFieldValue.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/ListItemCache.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/ListItemEntity.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/ListItemRating.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/ModerationStatus.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/PagedViewLoader.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/RangedListItemLoader.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/RateableListItemEntity.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/SPField.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/SharePointGroup.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/TaxonomyTermEntity.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/compressed-json.d.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/createEntity.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IAddListItemResult.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IChoiceFieldInfo.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/ICurrentChangeTokenResult.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IFolderResult.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IListItemResult.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/ILookupResult.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IRenderListDataAsStreamResult.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/ITaxonomyResult.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IThumbnailResult.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IUserInfoResult.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IWebAllPropertiesResult.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/AddListFieldUpgradeAction.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/AddOrUpdateViewUpgradeAction.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/CreateListUpgradeAction.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/DeleteListFieldUpgradeAction.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/DeleteListViewUpgradeAction.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/DeleteSiteFieldUpgradeAction.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/ElementProvisioner.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/IElementDefinitions.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/IUpgradeAction.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/UpdateListFieldUpgradeAction.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/UpdateUserRolesUpgradeAction.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/IUpdateListItem.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/ModeratedUpdateListItem.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/UpdateHyperlink.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/UpdateMultiChoice.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/UpdateMultiLookup.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/UpdateTaxonomy.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/Root.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/_common.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/_panels.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/approvals/ApprovalDialog.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/approvals/ApproversPanel.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/approvals/ApproversPanel.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/approvals/ConfigureApproversPanel.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/approvals/EventCard.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/approvals/MyApprovalsFilter.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/approvals/MyApprovalsPanel.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/approvals/MyApprovalsPanel.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/approvals/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/events/EventBar.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/events/EventBar.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/events/EventDetailsCallout.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/events/EventFilter.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/events/EventOverview.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/events/EventOverview.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/events/EventPanel.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/events/EventPanel.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/events/IEventCommands.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/events/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/hooks/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/hooks/useApprovals.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/hooks/useCopyLinkDialog.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/hooks/useEventCommandActionButtons.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/hooks/useEventPanel.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/hooks/useExecuteEventDeepLink.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/hooks/useRefinerPanel.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/hooks/useRefinerValues.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/hooks/useSettings.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/hooks/useWindowSize.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/loc/componentstrings.d.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/loc/en-us.js create mode 100644 samples/react-rhythm-of-business-calendar/src/components/recurrence/ChoiceGroupOptionStack.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/recurrence/DailyEditor.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/recurrence/MonthlyEditor.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/recurrence/NumberTextField.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/recurrence/PatternChoiceGroup.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/recurrence/Recurrence.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/recurrence/SharedDropdownOptions.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/recurrence/UntilEditor.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/recurrence/WeekdayCheckbox.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/recurrence/WeeklyEditor.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/recurrence/YearlyEditor.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/recurrence/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/refiners/OnRefinerSelectionChanged.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerCheckbox.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerPanel.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerPanel.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerValuePill.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerValuePill.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerValues.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerValues.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/refiners/Refiners.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/refiners/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/settings/RefinerEditor.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/settings/SettingsPanel.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/settings/SettingsPanel.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/settings/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/setup/ConfigurationWizard.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/setup/Upgrade.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/setup/Upgrade.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/shared/CopyLinkDialog.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/shared/ListItemTechnicals.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/shared/Rail.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/shared/SwipedEvents.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/shared/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/shared/swiped-events.d.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/DateRotatorController.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/IViewCommands.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/IViewDescriptor.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/IViewProps.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/ViewNav.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/ViewNav.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/ViewRoute.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/ViewRoute.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/Views.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/day/DayView.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/day/DayView.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/month/Builder.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/month/ContentRow.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/month/EventItem.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/month/Header.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/month/MonthView.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/month/MonthView.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/month/ShimItem.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/month/Week.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/month/WeekBackground.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/month/blockStyles.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/quarter/Builder.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/quarter/EventItem.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/quarter/Month.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/quarter/QuarterView.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/quarter/RefinerValueEvents.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/quarter/Utils.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/useView.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/week/Background.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/week/Builder.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/week/ContentRow.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/week/EventItem.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/week/Header.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/week/ShimItem.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/week/WeekView.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/week/WeekView.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/components/views/week/blockStyles.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/model/Approvers.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/model/Cadence.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/model/Event.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/model/EventModerationStatus.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/model/EventOccurrence.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/model/IEvent.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/model/Recurrence.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/model/Refiner.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/model/RefinerValue.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/model/Validations.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/model/ViewKeys.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/model/humanize.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/model/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/schema/Configuration.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/schema/Defaults.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/schema/RhythmOfBusinessCalendarSchema.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/schema/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/schema/lists/ApproversList.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/schema/lists/ConfigurationList.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/schema/lists/EventsList.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/schema/lists/RefinerValuesList.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/schema/lists/RefinersList.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/schema/lists/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/services/configuration/ConfigurationLoader.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/services/configuration/ConfigurationServiceDescriptor.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/services/configuration/OnlineConfigurationService.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/services/configuration/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/services/events/ApproversLoader.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/services/events/Defaults.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/services/events/EventLoader.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/services/events/EventsServiceDescriptor.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/services/events/OnlineEventsService.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/services/events/RecurrenceData.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/services/events/RefinerLoader.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/services/events/RefinerValueLoader.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/services/events/iCalendarFileBuilder.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/services/events/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/services/index.ts create mode 100644 samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/RhythmOfBusinessCalendar.module.scss create mode 100644 samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/RhythmOfBusinessCalendarWebPart.manifest.json create mode 100644 samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/RhythmOfBusinessCalendarWebPart.tsx create mode 100644 samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/loc/en-us.js create mode 100644 samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/loc/mystrings.d.ts create mode 100644 samples/react-rhythm-of-business-calendar/teams/dev/RhythmOfBusinessCalendarDEV.zip create mode 100644 samples/react-rhythm-of-business-calendar/teams/dev/color.png create mode 100644 samples/react-rhythm-of-business-calendar/teams/dev/manifest.json create mode 100644 samples/react-rhythm-of-business-calendar/teams/dev/outline.png create mode 100644 samples/react-rhythm-of-business-calendar/teams/prod/RhythmOfBusinessCalendar.zip create mode 100644 samples/react-rhythm-of-business-calendar/teams/prod/color.png create mode 100644 samples/react-rhythm-of-business-calendar/teams/prod/manifest.json create mode 100644 samples/react-rhythm-of-business-calendar/teams/prod/outline.png create mode 100644 samples/react-rhythm-of-business-calendar/teams/test/RhythmOfBusinessCalendarTEST.zip create mode 100644 samples/react-rhythm-of-business-calendar/teams/test/color.png create mode 100644 samples/react-rhythm-of-business-calendar/teams/test/manifest.json create mode 100644 samples/react-rhythm-of-business-calendar/teams/test/outline.png create mode 100644 samples/react-rhythm-of-business-calendar/tsconfig.json diff --git a/samples/react-rhythm-of-business-calendar/.editorconfig b/samples/react-rhythm-of-business-calendar/.editorconfig new file mode 100644 index 000000000..7f9318b70 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/.editorconfig @@ -0,0 +1,25 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + + +[*] + +# change these settings to your own preference +indent_style = space +indent_size = 4 + +# we recommend you to keep these unchanged +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[{package,bower}.json] +indent_style = space +indent_size = 2 \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/.eslintrc.js b/samples/react-rhythm-of-business-calendar/.eslintrc.js new file mode 100644 index 000000000..918ec9032 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/.eslintrc.js @@ -0,0 +1,372 @@ +require('@rushstack/eslint-config/patch/modern-module-resolution'); +module.exports = { + extends: ['@microsoft/eslint-config-spfx/lib/profiles/react'], + parserOptions: { tsconfigRootDir: __dirname }, + overrides: [ + { + files: ['*.ts', '*.tsx'], + parser: '@typescript-eslint/parser', + 'parserOptions': { + 'project': './tsconfig.json', + 'ecmaVersion': 2018, + 'sourceType': 'module' + }, + rules: { + // Prevent usage of the JavaScript null value, while allowing code to access existing APIs that may require null. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/no-new-null': 1, + // Require Jest module mocking APIs to be called before any other statements in their code block. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/hoist-jest-mock': 1, + // Require regular expressions to be constructed from string constants rather than dynamically building strings at runtime. https://www.npmjs.com/package/@rushstack/eslint-plugin-security + '@rushstack/security/no-unsafe-regexp': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/adjacent-overload-signatures': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // + // CONFIGURATION: By default, these are banned: String, Boolean, Number, Object, Symbol + '@typescript-eslint/ban-types': [ + 1, + { + 'extendDefaults': false, + 'types': { + 'String': { + 'message': 'Use \'string\' instead', + 'fixWith': 'string' + }, + 'Boolean': { + 'message': 'Use \'boolean\' instead', + 'fixWith': 'boolean' + }, + 'Number': { + 'message': 'Use \'number\' instead', + 'fixWith': 'number' + }, + 'Object': { + 'message': 'Use \'object\' instead, or else define a proper TypeScript type:' + }, + 'Symbol': { + 'message': 'Use \'symbol\' instead', + 'fixWith': 'symbol' + }, + 'Function': { + 'message': 'The \'Function\' type accepts any function-like value.\nIt provides no type safety when calling the function, which can be a common source of bugs.\nIt also accepts things like class declarations, which will throw at runtime as they will not be called with \'new\'.\nIf you are expecting the function to accept certain arguments, you should explicitly define the function shape.' + } + } + } + ], + '@typescript-eslint/no-empty-function': 'off', + // RATIONALE: Code is more readable when the type of every variable is immediately obvious. + // Even if the compiler may be able to infer a type, this inference will be unavailable + // to a person who is reviewing a GitHub diff. This rule makes writing code harder, + // but writing code is a much less important activity than reading it. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/explicit-function-return-type': 'off', + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: although this is a recommended rule, it is up to dev to select coding style. + // Set to 1 (warning) or 2 (error) to enable. + '@typescript-eslint/explicit-member-accessibility': 0, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-array-constructor': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // + // RATIONALE: The "any" keyword disables static type checking, the main benefit of using TypeScript. + // This rule should be suppressed only in very special cases such as JSON.stringify() + // where the type really can be anything. Even if the type is flexible, another type + // may be more appropriate such as "unknown", "{}", or "Record". + '@typescript-eslint/no-explicit-any': 'off', + // RATIONALE: The #1 rule of promises is that every promise chain must be terminated by a catch() + // handler. Thus wherever a Promise arises, the code must either append a catch handler, + // or else return the object to a caller (who assumes this responsibility). Unterminated + // promise chains are a serious issue. Besides causing errors to be silently ignored, + // they can also cause a NodeJS process to terminate unexpectedly. + '@typescript-eslint/no-floating-promises': 'off', + // RATIONALE: Catches a common coding mistake. + '@typescript-eslint/no-for-in-array': 2, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-misused-new': 2, + // RATIONALE: The "namespace" keyword is not recommended for organizing code because JavaScript lacks + // a "using" statement to traverse namespaces. Nested namespaces prevent certain bundler + // optimizations. If you are declaring loose functions/variables, it's better to make them + // static members of a class, since classes support property getters and their private + // members are accessible by unit tests. Also, the exercise of choosing a meaningful + // class name tends to produce more discoverable APIs: for example, search+replacing + // the function "reverse()" is likely to return many false matches, whereas if we always + // write "Text.reverse()" is more unique. For large scale organization, it's recommended + // to decompose your code into separate NPM packages, which ensures that component + // dependencies are tracked more conscientiously. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-namespace': [ + 1, + { + 'allowDeclarations': false, + 'allowDefinitionFiles': false + } + ], + // RATIONALE: Parameter properties provide a shorthand such as "constructor(public title: string)" + // that avoids the effort of declaring "title" as a field. This TypeScript feature makes + // code easier to write, but arguably sacrifices readability: In the notes for + // "@typescript-eslint/member-ordering" we pointed out that fields are central to + // a class's design, so we wouldn't want to bury them in a constructor signature + // just to save some typing. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Set to 1 (warning) or 2 (error) to enable the rule + '@typescript-eslint/no-parameter-properties': 0, + // RATIONALE: When left in shipping code, unused variables often indicate a mistake. Dead code + // may impact performance. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-unused-vars': [ + 1, + { + 'vars': 'all', + // Unused function arguments often indicate a mistake in JavaScript code. However in TypeScript code, + // the compiler catches most of those mistakes, and unused arguments are fairly common for type signatures + // that are overriding a base class method or implementing an interface. + 'args': 'none' + } + ], + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-use-before-define': [ + 2, + { + 'functions': false, + 'classes': true, + 'variables': true, + 'enums': true, + 'typedefs': true + } + ], + // Disallows require statements except in import statements. + // In other words, the use of forms such as var foo = require("foo") are banned. Instead use ES6 style imports or import foo = require("foo") imports. + '@typescript-eslint/no-var-requires': 'off', + // RATIONALE: The "module" keyword is deprecated except when describing legacy libraries. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/prefer-namespace-keyword': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: it's up to developer to decide if he wants to add type annotations + // Set to 1 (warning) or 2 (error) to enable the rule + '@typescript-eslint/no-inferrable-types': 0, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: declaration of empty interfaces may be helpful for generic types scenarios + '@typescript-eslint/no-empty-interface': 'off', + // RATIONALE: This rule warns if setters are defined without getters, which is probably a mistake. + 'accessor-pairs': 1, + // RATIONALE: In TypeScript, if you write x["y"] instead of x.y, it disables type checking. + 'dot-notation': [ + 1, + { + 'allowPattern': '^_' + } + ], + // RATIONALE: Catches code that is likely to be incorrect + 'eqeqeq': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'for-direction': 1, + // RATIONALE: Catches a common coding mistake. + 'guard-for-in': 2, + // RATIONALE: If you have more than 2,000 lines in a single source file, it's probably time + // to split up your code. + 'max-lines': ['warn', { max: 2000 }], + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-async-promise-executor': 2, + // RATIONALE: Deprecated language feature. + 'no-caller': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-compare-neg-zero': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-cond-assign': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-constant-condition': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-control-regex': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-debugger': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-delete-var': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-duplicate-case': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty-character-class': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty-pattern': 1, + // RATIONALE: Eval is a security concern and a performance concern. + 'no-eval': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-ex-assign': 2, + // RATIONALE: System types are global and should not be tampered with in a scalable code base. + // If two different libraries (or two versions of the same library) both try to modify + // a type, only one of them can win. Polyfills are acceptable because they implement + // a standardized interoperable contract, but polyfills are generally coded in plain + // JavaScript. + 'no-extend-native': 1, + // Disallow unnecessary labels + 'no-extra-label': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-fallthrough': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-func-assign': 1, + // RATIONALE: Catches a common coding mistake. + 'no-implied-eval': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-invalid-regexp': 2, + // RATIONALE: Catches a common coding mistake. + 'no-label-var': 2, + // RATIONALE: Eliminates redundant code. + 'no-lone-blocks': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-misleading-character-class': 2, + // RATIONALE: Catches a common coding mistake. + 'no-multi-str': 2, + // RATIONALE: It's generally a bad practice to call "new Thing()" without assigning the result to + // a variable. Either it's part of an awkward expression like "(new Thing()).doSomething()", + // or else implies that the constructor is doing nontrivial computations, which is often + // a poor class design. + 'no-new': 1, + // RATIONALE: Obsolete language feature that is deprecated. + 'no-new-func': 2, + // RATIONALE: Obsolete language feature that is deprecated. + 'no-new-object': 2, + // RATIONALE: Obsolete notation. + 'no-new-wrappers': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-octal': 2, + // RATIONALE: Catches code that is likely to be incorrect + 'no-octal-escape': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-regex-spaces': 2, + // RATIONALE: Catches a common coding mistake. + 'no-return-assign': 'off', + // RATIONALE: Security risk. + 'no-script-url': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-self-assign': 2, + // RATIONALE: Catches a common coding mistake. + 'no-self-compare': 2, + // RATIONALE: This avoids statements such as "while (a = next(), a && a.length);" that use + // commas to create compound expressions. In general code is more readable if each + // step is split onto a separate line. This also makes it easier to set breakpoints + // in the debugger. + 'no-sequences': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-shadow-restricted-names': 2, + // RATIONALE: Obsolete language feature that is deprecated. + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-sparse-arrays': 2, + // RATIONALE: Although in theory JavaScript allows any possible data type to be thrown as an exception, + // such flexibility adds pointless complexity, by requiring every catch block to test + // the type of the object that it receives. Whereas if catch blocks can always assume + // that their object implements the "Error" contract, then the code is simpler, and + // we generally get useful additional information like a call stack. + 'no-throw-literal': 2, + // RATIONALE: Catches a common coding mistake. + 'no-unmodified-loop-condition': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-unsafe-finally': 2, + // RATIONALE: Catches a common coding mistake. + 'no-unused-expressions': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-unused-labels': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-useless-catch': 1, + // RATIONALE: Avoids a potential performance problem. + 'no-useless-concat': 1, + // RATIONALE: The "var" keyword is deprecated because of its confusing "hoisting" behavior. + // Always use "let" or "const" instead. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + 'no-var': 2, + // RATIONALE: Generally not needed in modern code. + 'no-void': 1, + // RATIONALE: Obsolete language feature that is deprecated. + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-with': 2, + // RATIONALE: Makes logic easier to understand, since constants always have a known value + // @typescript-eslint\eslint-plugin\dist\configs\eslint-recommended.js + 'prefer-const': 1, + // RATIONALE: Catches a common coding mistake where "resolve" and "reject" are confused. + 'promise/param-names': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'require-atomic-updates': 'off', + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'require-yield': 1, + // "Use strict" is redundant when using the TypeScript compiler. + 'strict': [ + 2, + 'never' + ], + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'use-isnan': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + // Set to 1 (warning) or 2 (error) to enable. + // Rationale to disable: !!{} + 'no-extra-boolean-cast': 0, + // ==================================================================== + // @microsoft/eslint-plugin-spfx + // ==================================================================== + '@microsoft/spfx/import-requires-chunk-name': 1, + '@microsoft/spfx/no-require-ensure': 2, + '@microsoft/spfx/pair-react-dom-render-unmount': 1 + } + }, + { + // For unit tests, we can be a little bit less strict. The settings below revise the + // defaults specified in the extended configurations, as well as above. + files: [ + // Test files + '*.test.ts', + '*.test.tsx', + '*.spec.ts', + '*.spec.tsx', + + // Facebook convention + '**/__mocks__/*.ts', + '**/__mocks__/*.tsx', + '**/__tests__/*.ts', + '**/__tests__/*.tsx', + + // Microsoft convention + '**/test/*.ts', + '**/test/*.tsx' + ], + rules: { + 'no-new': 0, + 'class-name': 0, + 'export-name': 0, + forin: 0, + 'label-position': 0, + 'member-access': 2, + 'no-arg': 0, + 'no-console': 0, + 'no-construct': 0, + 'no-duplicate-variable': 2, + 'no-eval': 0, + 'no-function-expression': 2, + 'no-internal-module': 2, + 'no-shadowed-variable': 2, + 'no-switch-case-fall-through': 2, + 'no-unnecessary-semicolons': 2, + 'no-unused-expression': 2, + 'no-with-statement': 2, + semicolon: 2, + 'trailing-comma': 0, + typedef: 0, + 'typedef-whitespace': 0, + 'use-named-parameter': 2, + 'variable-name': 0, + whitespace: 0 + } + } + ] +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/.gitattributes b/samples/react-rhythm-of-business-calendar/.gitattributes new file mode 100644 index 000000000..1ff0c4230 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/samples/react-rhythm-of-business-calendar/.gitignore b/samples/react-rhythm-of-business-calendar/.gitignore new file mode 100644 index 000000000..d5ab57b0f --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/.gitignore @@ -0,0 +1,33 @@ +# Logs +logs +*.log +npm-debug.log* + +# Dependency directories +node_modules + +# Build generated files +dist +lib +release +solution +temp +*.sppkg + +# Coverage directory used by tools like istanbul +coverage + +# OSX +.DS_Store + +# Visual Studio files +.ntvs_analysis.dat +.vs +bin +obj + +# Resx Generated Code +*.resx.ts + +# Styles Generated Code +*.scss.ts diff --git a/samples/react-rhythm-of-business-calendar/.yo-rc.json b/samples/react-rhythm-of-business-calendar/.yo-rc.json new file mode 100644 index 000000000..4b07b0c39 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/.yo-rc.json @@ -0,0 +1,12 @@ +{ + "@microsoft/generator-sharepoint": { + "isCreatingSolution": true, + "environment": "spo", + "version": "1.15.2", + "libraryName": "rhythm-of-business-calendar", + "libraryId": "58f92635-9ea6-43cc-a136-3daae0c68678", + "packageManager": "npm", + "isDomainIsolated": false, + "componentType": "webpart" + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/README.md b/samples/react-rhythm-of-business-calendar/README.md new file mode 100644 index 000000000..8557a239c --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/README.md @@ -0,0 +1,124 @@ +# Rhythm of Business Calendar + +## Summary + +This sample is the source code for the Rhythm of Business Calendar app published in [AppSource](https://appsource.microsoft.com/en-us/marketplace/apps?product=sharepoint) and is intended to demonstrate patterns and practices for building enterprise apps on the SharePoint platform. + +Rhythm of Business (RoB) Calendar keeps you on top of your business goals by managing all team and organizational events seamlessly. Simplify and expedite the coordination and planning process for your team and subgroups with the help of color-coded events, approval workflow, refiners and confidential events. Ideal for Chiefs of Staff, Executive Assistants, or anyone who manages a team calendar, you can empower your teams by enabling better insights on your business goals and team events. + +Month view +![Screenshot of month view](./assets/screenshot-month-view.png) + +View event details +![Screenshot of view event panel](./assets/screenshot-view-event.png) + +Edit refiner +![Screenshot of edit refiner panel](./assets/screenshot-edit-refiner.png) + +## Compatibility + +![SPFx 1.15](https://img.shields.io/badge/SPFx-1.15-green.svg) +![Node.js v14 | v12](https://img.shields.io/badge/Node.js-v16-green.svg) +![Compatible with SharePoint Online](https://img.shields.io/badge/SharePoint%20Online-Compatible-green.svg) +![Does not work with SharePoint 2019](https://img.shields.io/badge/SharePoint%20Server%202019-Incompatible-red.svg "SharePoint Server 2019 requires SPFx 1.4.1 or lower") +![Does not work with SharePoint 2016 (Feature Pack 2)](https://img.shields.io/badge/SharePoint%20Server%202016%20(Feature%20Pack%202)-Incompatible-red.svg "SharePoint Server 2016 Feature Pack 2 requires SPFx 1.1") +![Local Workbench Unsupported](https://img.shields.io/badge/Local%20Workbench-Unsupported-red.svg "Local workbench is no longer available as of SPFx 1.13 and above") +![Hosted Workbench Compatible](https://img.shields.io/badge/Hosted%20Workbench-Compatible-green.svg) +![Compatible with Remote Containers](https://img.shields.io/badge/Remote%20Containers-Compatible-green.svg) +![Teams Yes: Designed for Microsoft Teams](https://img.shields.io/badge/Teams-Yes-green.svg "Designed for Microsoft Teams") + +## Applies to + +* [SharePoint Framework](https://docs.microsoft.com/sharepoint/dev/spfx/sharepoint-framework-overview) +* [Microsoft 365 tenant](https://docs.microsoft.com/sharepoint/dev/spfx/set-up-your-development-environment) + +> Get your own free development tenant by subscribing to [Microsoft 365 developer program](http://aka.ms/o365devprogram) + +## Solution + + +Solution|Author(s) +--------|--------- +react-rhythm-of-business-calendar | [Dan Turley](https://github.com/d-turley), Avanade + +## Version history + +Version|Date|Comments +-------|----|-------- +1.0|September 26, 2022|Initial release + +## Minimal path to awesome + +* Clone this repository (or [download this solution as a .ZIP file](https://pnp.github.io/download-partial/?url=https://github.com/pnp/sp-dev-fx-webparts/tree/main/samples/react-rhythm-of-business-calendar) then unzip it) +* From your command line, change your current directory to the directory containing this sample (`react-rhythm-of-business-calendar`, located under `samples`) +* in the command line run: + * `npm install` + * `gulp serve --nobrowser` + +> This sample can also be opened with [VS Code Remote Development](https://code.visualstudio.com/docs/remote/remote-overview). Visit for further instructions. + +## Features + +This sample is a complete app that demonstrates the "SPFx Solution Accelerator" framework, along with patterns and practices for building enterprise-class apps on SharePoint. Inspired by Domain Driven Design and Onion Architecture, this Accelerator has evolved since SPFx v1.0, and we want to share it with the world! + +At a high-level, the accelerator includes the following features: +* Prescribed solution structure separates web parts, components, model, services, and schema (data) layers +* Robust entity domain model with relationships, validation, change tracking, and text search +* Robust schema provisioning and versioning; use SharePoint lists as a simple relational database +* Services for interacting with SharePoint, timezones, domain isolation, and users and groups, plus patterns for building custom services for app-specific logic +* Component library with customizable wizard, panel/dialog for quickly building view/edit screens, validation, and more +* Live Update feature ensures users are always working with the latest data without manaually reloading the page +* Built on the latest SPFx with TypeScript, React, and Fluent UI, plus PnPjs, Moment.js, Lodash, and Jest + + + + + + +## Help + +We do not support samples, but this community is always willing to help, and we want to improve these samples. We use GitHub to track issues, which makes it easy for community members to volunteer their time and help resolve issues. + +If you're having issues building the solution, please run [spfx doctor](https://pnp.github.io/cli-microsoft365/cmd/spfx/spfx-doctor/) from within the solution folder to diagnose incompatibility issues with your environment. + +You can try looking at [issues related to this sample](https://github.com/pnp/sp-dev-fx-webparts/issues?q=label%3A%22sample%3A%20react-rhythm-of-business-calendar%22) to see if anybody else is having the same issues. + +You can also try looking at [discussions related to this sample](https://github.com/pnp/sp-dev-fx-webparts/discussions?discussions_q=react-rhythm-of-business-calendar) and see what the community is saying. + +If you encounter any issues using this sample, [create a new issue](https://github.com/pnp/sp-dev-fx-webparts/issues/new?assignees=&labels=Needs%3A+Triage+%3Amag%3A%2Ctype%3Abug-suspected%2Csample%3A%20react-rhythm-of-business-calendar&template=bug-report.yml&sample=react-rhythm-of-business-calendar&authors=@d-turley&title=react-rhythm-of-business-calendar%20-%20). + +For questions regarding this sample, [create a new question](https://github.com/pnp/sp-dev-fx-webparts/issues/new?assignees=&labels=Needs%3A+Triage+%3Amag%3A%2Ctype%3Aquestion%2Csample%3A%20react-rhythm-of-business-calendar&template=question.yml&sample=react-rhythm-of-business-calendar&authors=@d-turley&title=react-rhythm-of-business-calendar%20-%20). + +Finally, if you have an idea for improvement, [make a suggestion](https://github.com/pnp/sp-dev-fx-webparts/issues/new?assignees=&labels=Needs%3A+Triage+%3Amag%3A%2Ctype%3Aenhancement%2Csample%3A%20react-rhythm-of-business-calendar&template=suggestion.yml&sample=react-rhythm-of-business-calendar&authors=@d-turley&title=react-rhythm-of-business-calendar%20-%20). + +## Disclaimer + +**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.** + + diff --git a/samples/react-rhythm-of-business-calendar/assets/screenshot-edit-refiner.png b/samples/react-rhythm-of-business-calendar/assets/screenshot-edit-refiner.png new file mode 100644 index 0000000000000000000000000000000000000000..60a105f23877fe7746f12ce506355f948210b806 GIT binary patch literal 135355 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 literal 0 HcmV?d00001 diff --git a/samples/react-rhythm-of-business-calendar/assets/screenshot-view-event.png b/samples/react-rhythm-of-business-calendar/assets/screenshot-view-event.png new file mode 100644 index 0000000000000000000000000000000000000000..e8cd74fa20251ec703f8f6cdc9677d6a8923ba50 GIT binary patch literal 137589 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 z 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

0KkuSGi^Ze7Nl9q_1+aMkdYrYKpM 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 =$nR%Q5gR{5cb!#?%bs^cze|`%uYa% zW2CL`e)qkoDm~Xj$e-&l(v{Mwb=pA6bTY|F_Y+Jr@81r@qv1hVHUx{So?xG$v?}hEPxRITp=~s9Vq{0gd3XG!5*$YB$s6$c^MZw@Y2!Cq| zrdn$w4YjeFFCMH%_&Ma>g8FUp+k$7G4&kl{p276cz4Z(;h6=2G*PIPAzH5=@xQUi? zE0sd}hw_gqR_&OD(R+B`pHqFwvlW1*hjohVK^3Re0aEEb=c-t8z5X=YG)9 zT{HX-Ib!aEl3&!&#Q3qXl4+6RV#rtvLt7lU;Ud- z4D~9Es1Rgj1cg%2|CbvBCp@rJy?N8hE@n!anU^C zuf4L1Lna6vsz3~Suae9e|0wwR`=Yprl6aMV!gp_qd)_S$#FAQl_Rn_vvdI;E z0gt*6Aig)xrH=SeY(6IzL-Lzv!?0<%v`oIKSl$+2I(2|1nkFFMNf+7f(|G&D3Ff96 zK;)!U5I30$6E*!r%U7r)yWV;T4S6uxoN|8Hm~iwYyk>qDUoyc3jTe!YEb5NkAHQBE z`udtGe$b2BP2#cV6}{+(;quV56-9_m$4{uqg$%&_43&4!@?ky)%_nGhw_j ziJ0MDB$o&l97s~EN9c9a3UC*Dm%3M47HD`Poa=~aa5bf9BF>LP%A7!S8}b{iiGv9Q z^Enq=BC>$dm>87i?=uZ^AUXT#1hLzs{}il^70sgH0yR;$#d!_nL|Bl_z#pFrc+smv zV~3l}X3dTU%x!(x{b8l4DBp67Sn|MLbFBTG%ku9I?P*El3oa99FV{_QFK)8ld~`0p z+SSM}b6x8xBj@G`wqVTHh0!@F#n7ie_EHdNq4iVNsdrJ>$I7o+Q=dxUb}ww}7Ky-; zh+PvK(UFP{tmgyu<0(WzILj>q>6Ig9^K)lK%O!B@;C(!N&BOu0t_K-CQPj~iPAUzf zgvPa=dM|Ec_Mi*cCm|yIhNTiZL%>wa=yV3z&1if54rd`fGl+O za$<1X&d#}9w3m|i%Kf+`)h?5iM8SuLZI>*rRxU|y-f z-^(oAFXuI?ZrMm{991Buc$l>mc(Ayv&^qVIgs?vDy`#4MtDWGKM_O7`8}j+I{6{B> z6JIWIgF%Z^f4gRYog;w|^j{3Ff%dy3i8|0orbkm>ikV=^Rl=6Jlj@oKPuit9EYGO2 zm&Kd>K3}L}UhQ9fjQ}Fgj|cZ7+KL>OlJ$U}YF+j? zhN=g|=;xOY=a8sAi~2k|`iEl_UW%ps;g}$>i2UH-$p$qC0AW-<|I)h-xkVewl;^`& z?p#Vo$1Uo%XvPSl*cgf5@{m!$gZGed*QPBKYJwpL!k((GQ zS0o(TwYUm`oL%|q)y1SQO&($O`#KY>Fg)t0wlhKP+Ax} zUU?qJ4M=X6mX9QmrX;G { + return (environmentConfigurations.environments[buildOptions.args[environmentArgName] as string || defaultEnvironment]); +}; + +const createPowershellProxy = () => new StatefulProcessCommandProxy({ + name: 'PowerShell proxy', + min: 1, + max: 1, + processCommand: 'powershell.exe', + processArgs: ['-Command', '-'], + processInvalidateOnRegex: + { + 'any': [{ regex: '.*error.*', flags: 'ig' }], + 'stdout': [{ regex: '.*error.*', flags: 'ig' }], + 'stderr': [{ regex: '.*error.*', flags: 'ig' }] + }, + logFunction: () => { } +}); +const logResult = (result: any) => { + if (result.stdout) build.log(result.stdout); + if (result.stderr) build.error(result.stderr); +}; + +const modifyFile = (fn: (contents: string, path: string, file: any) => string) => { + return through2obj((file, enc, cb) => { + const contents = fn(String(file.contents), file.path, file) || file.contents; + + if (file.isBuffer() === true) { + file.contents = Buffer.from(contents); + } + + cb(null, file); + }); +}; + +build.configureWebpack.mergeConfig({ + additionalConfiguration: (generatedConfiguration) => { + const solutionFolders = ['apps', 'assets', 'common', 'components', 'domain', 'model', 'schema', 'services']; + + const createPaths = (importPath: string) => { + const paths = [path.resolve(__dirname, 'lib', importPath)]; + + if (nodePackages) { + for (const dependency of nodePackages) { + paths.push(path.resolve(__dirname, dependency, 'lib', importPath)); + } + } + + return paths; + }; + + const resolveAliasPlugin = new AliasPlugin('described-resolve', + solutionFolders.map(folder => { + return { + name: folder, + alias: createPaths(folder) + }; + }), 'resolve'); + + generatedConfiguration.resolve ||= {}; + generatedConfiguration.resolve.plugins ||= []; + generatedConfiguration.resolve.plugins.unshift(resolveAliasPlugin); + + return generatedConfiguration; + } +}); + + +if (nodePackages) { + for (const dependency of nodePackages) { + build.serveWatchFilter.push(`${dependency}/src/**/*.{ts,tsx,scss,resx,js,json,html}`); + build.serveWatchFilter.push(`!${dependency}/src/**/*.{scss.ts,resx.ts}`); + } +} + +if (spfxLibraries) { + for (const dependency of spfxLibraries) { + build.serveWatchFilter.push(`${dependency}/dist/*.{json}`); + } +} + +const buildDependency_NodePackages_Subtask = build.subTask('build-dependency-nodepackages-subtask', async (_gulp, buildOptions) => { + if (nodePackages) { + for (const nodePackage of nodePackages) { + const powershellProxy = createPowershellProxy(); + const gulpCommand = `cmd.exe /c "cd ${nodePackage} && gulp build ${buildOptions.production ? '--production' : ''}"`; + build.log("Executing ", gulpCommand); + await powershellProxy.executeCommand(gulpCommand).then(logResult); + await powershellProxy.shutdown(); + } + } + + return {}; +}); +build.task('build-dependency-nodepackages', buildDependency_NodePackages_Subtask); + +const modifyPackageSolutionJsonSubtask = build.subTask('modify-package-solution-json-subtask', (_gulp, buildOptions, done) => { + const config = getEnvironmentConfig(buildOptions); + + if (config) { + return gulp.src('config/package-solution.json', { base: '.' }) + .pipe(gulp.dest(buildOptions.tempFolder + '/perEnvConfig')) + .pipe(modifyFile((content: string) => { + build.log("Modifying package-solution.json"); + const json = JSON5.parse(content) as IPackageSolutionConfig; + json.solution!.id = config.package.id; + json.solution!.name = config.package.name; + json.solution!.features = json.solution!.features && json.solution!.features.map(originalFeature => { + const configFeature = (config.package.features || []).filter(f => f.matchLocalId == originalFeature.id)[0]; + if (configFeature) { + const modifiedFeature: IFeature = Object.assign({}, originalFeature); + modifiedFeature.id = configFeature.id; + modifiedFeature.title = configFeature.title; + modifiedFeature.assets!.elementManifests = configFeature.elementManifests; + return modifiedFeature; + } else { + return originalFeature; + } + }); + json.paths!.zippedPackage = `solution/${config.package.filename}`; + return JSON.stringify(json, undefined, 4); + })) + .pipe(gulp.dest('.')); + } + else { + done!(); + } +}); + +const modifyWebPartManifestsSubtask = build.subTask('modify-webpart-manifests-subtask', (_gulp, buildOptions, done) => { + const config = getEnvironmentConfig(buildOptions); + + if (config) { + return gulp.src('src/webparts/*/*WebPart.manifest.json', { base: '.' }) + .pipe(gulp.dest(buildOptions.tempFolder + '/perEnvConfig')) + .pipe(modifyFile((content: string, filePath: string) => { + const filename = filePath.split('\\').pop()?.split('/').pop()!; + const webpartConfig = config.webparts.filter(wp => wp.manifest == filename)[0]; + build.log("Examining ", filename); + if (webpartConfig) { + build.log("Modifying ", filename); + const json = JSON5.parse(content); + json.id = webpartConfig.id; + json.alias = webpartConfig.alias; + json.preconfiguredEntries[0].title.default = webpartConfig.title; + return JSON.stringify(json, undefined, 4); + } else { + build.log("No modifications specified ", filename); + return content; + } + })) + .pipe(gulp.dest('.')); + } else { + done!(); + } +}); + +const modifyExtensionManifestsSubtask = build.subTask('modify-extension-manifests-subtask', (_gulp, buildOptions, done) => { + const config = getEnvironmentConfig(buildOptions); + + if (config && config.extensions) { + return gulp.src('src/extensions/*/*ApplicationCustomizer.manifest.json', { base: '.' }) + .pipe(gulp.dest(buildOptions.tempFolder + '/perEnvConfig')) + .pipe(modifyFile((content: string, filePath: string) => { + const filename = filePath.split('\\').pop()?.split('/').pop()!; + const extensionConfig = config.extensions.filter(ext => ext.manifest == filename)[0]; + build.log("Examining ", filename); + if (extensionConfig) { + build.log("Modifying ", filename); + const json = JSON5.parse(content); + json.id = extensionConfig.id; + json.alias = extensionConfig.alias; + return JSON.stringify(json, undefined, 4); + } else { + build.log("No modifications specified ", filename); + return content; + } + })) + .pipe(gulp.dest('.')); + } else { + done!(); + } +}); + +const modifyLibraryManifestsSubtask = build.subTask('modify-library-manifests-subtask', (_gulp, buildOptions, done) => { + const config = getEnvironmentConfig(buildOptions); + + if (config) { + return gulp.src('src/**/*Library.manifest.json', { base: '.' }) + .pipe(gulp.dest(buildOptions.tempFolder + '/perEnvConfig')) + .pipe(modifyFile((content: string, filePath: string) => { + const filename = filePath.split('\\').pop()?.split('/').pop()!; + const libraryConfig = config.libraries.filter(wp => wp.manifest == filename)[0]; + build.log("Examining ", filename); + if (libraryConfig) { + build.log("Modifying ", filename); + const json = JSON5.parse(content); + json.id = libraryConfig.id; + json.alias = libraryConfig.alias; + return JSON.stringify(json, undefined, 4); + } else { + build.log("No modifications specified ", filename); + return content; + } + })) + .pipe(gulp.dest('.')); + } else { + done!(); + } +}); + +const modifySchemaDefaultsSubtask = build.subTask('modify-schema-defaults-subtask', (_gulp, buildOptions, done) => { + const config = getEnvironmentConfig(buildOptions); + + if (config) { + return gulp.src('src/**{,/*/**}/Defaults.ts', { base: '.' }) + .pipe(gulp.dest(buildOptions.tempFolder + '/perEnvConfig')) + .pipe(modifyFile((content: string, filePath: string) => { + build.log("Modifying ", filePath.split('\\src\\').pop()!); + const lines = content.split('\n'); + return lines.map(line => { + if (line.startsWith("const Environment =")) + return `const Environment = ${config.environmentSymbol};`; + else + return line; + }).join('\n'); + })) + .pipe(gulp.dest('.')); + } else { + done!(); + } +}); + +const modifySchemaDefaults_NodePackages_Subtask = build.subTask('modify-schema-defaults-nodepackages-subtask', (_gulp, buildOptions, done) => { + const config = getEnvironmentConfig(buildOptions); + + if (config && nodePackages) { + return Promise.all(nodePackages.map(nodePackage => { + return new Promise((resolve, reject) => { + gulp.src(`${nodePackage}/src/**{,/*/**}/Defaults.ts`, { base: `./${nodePackage}` }) + .pipe(gulp.dest(`${nodePackage}/temp/perEnvConfig`)) + .on('error', reject) + .pipe(modifyFile((content: string, filePath: string) => { + build.log("Modifying ", nodePackage, ' ', filePath.split('\\src\\').pop()!); + const lines = content.split('\n'); + return lines.map(line => { + if (line.startsWith("const Environment =")) + return `const Environment = ${config.environmentSymbol};`; + else + return line; + }).join('\n'); + })) + .pipe(gulp.dest(`./${nodePackage}`)) + .on('end', resolve); + }); + })); + } else { + done!(); + } +}); + +const modifyConfig_SPFxLibraries_Subtask = build.subTask('modify-config-spfxlibs-subtask', async (_gulp, buildOptions) => { + if (spfxLibraries) { + for (const spfxLibrary of spfxLibraries) { + const powershellProxy = createPowershellProxy(); + const gulpCommand = `cmd.exe /c "cd ${spfxLibrary} && gulp modify-env-config --env ${buildOptions.args[environmentArgName]}"`; + build.log("Executing ", gulpCommand); + await powershellProxy.executeCommand(gulpCommand).then(logResult); + await powershellProxy.shutdown(); + } + } + + return {}; +}); + + +const restoreConfig_Subtask = build.subTask('restore-config-subtask', (_gulp, buildOptions) => { + return gulp + .src(buildOptions.tempFolder + '/perEnvConfig/**/*') + .pipe(gulp.dest('.')); +}); + +const restoreDependencyConfig_NodePackages_Subtask = build.subTask('restore-dependency-config-nodepackages-subtask', (_gulp, _buildOptions, done) => { + if (nodePackages) { + return Promise.all(nodePackages.map(nodePackage => { + return new Promise((resolve, reject) => { + return gulp + .src(`${nodePackage}/temp/perEnvConfig/**/*`) + .on('error', reject) + .pipe(gulp.dest(`./${nodePackage}`)) + .on('end', resolve); + }); + })); + } else { + done!(); + } +}); + +const restoreDependencyConfig_SPFxLibraries_Subtask = build.subTask('restore-dependency-config-spfxlibs-subtask', async (_gulp, _buildOptions) => { + if (spfxLibraries) { + for (const spfxLibrary of spfxLibraries) { + const powershellProxy = createPowershellProxy(); + const gulpCommand = `cmd.exe /c "cd ${spfxLibrary} && gulp restore-original-config"`; + build.log("Executing ", gulpCommand); + await powershellProxy.executeCommand(gulpCommand).then(logResult); + await powershellProxy.shutdown(); + } + } + + return {}; +}); + +const zipSourceCodeSubtask = build.subTask('zip-sourcecode-subtask', (_gulp, buildOptions, done) => { + const config = getEnvironmentConfig(buildOptions); + + if (config) { + return gulp.src(['*.*', 'build/**/*.*', 'config/**/*.*', 'mock_modules/**/*.*', 'release/assets/**/*.*', 'src/**{,/*/**}/*.*'], { base: '.' }) + .pipe(zip(`${config.package.filename.replace('.sppkg', '')}-src.zip`)) + .pipe(gulp.dest('sharepoint/solution')); + } else { + done!(); + } +}); +build.task('zip-sourcecode', zipSourceCodeSubtask); + +const publishSolutionSubtask = build.subTask('publish-solution-subtask', async (_gulp, buildOptions) => { + const config = getEnvironmentConfig(buildOptions); + + if (config && config.deploySiteUrl) { + const powershellProxy = createPowershellProxy(); + + const scope = config.deployScope || "Site"; + const connectCommand = `Connect-PnPOnline -Interactive -Url ${config.deploySiteUrl}`; + const addPackageCommand = `Add-PnPApp -Path .\\sharepoint\\solution\\${config.package.filename} -Scope ${scope} -Publish -Overwrite ${config.skipFeatureDeployment ? '-SkipFeatureDeployment' : ''}`; + + build.log("Executing ", connectCommand); + await powershellProxy.executeCommand(connectCommand).then(logResult); + + build.log("Executing ", addPackageCommand); + await powershellProxy.executeCommand(addPackageCommand).then(logResult); + + await powershellProxy.shutdown(); + } + + return {}; +}); +build.task('publish', publishSolutionSubtask); + + +const modifyEnvConfigTask = build.task('modify-env-config', + build.parallel( + modifyConfig_SPFxLibraries_Subtask, + modifyPackageSolutionJsonSubtask, + modifySchemaDefaults_NodePackages_Subtask, + modifySchemaDefaultsSubtask, + modifyWebPartManifestsSubtask, + modifyExtensionManifestsSubtask, + modifyLibraryManifestsSubtask + ) +); + +const restoreOriginalConfigTask = build.task('restore-original-config', + build.parallel( + restoreDependencyConfig_SPFxLibraries_Subtask, + restoreDependencyConfig_NodePackages_Subtask, + restoreConfig_Subtask + ) +); + +build.rig.addPreBuildTask(buildDependency_NodePackages_Subtask); + +const buildTask = build.serial( + build.preCopy, + buildDependency_NodePackages_Subtask, + build.parallel(build.sass, build.copyStaticAssets), + build.parallel(build.lintCmd, build.tscCmd), + build.postCopy +); + +const bundleTask = build.serial( + buildTask, + build.configureWebpack, + build.webpack +); + +const packageTask = build.task('package', + build.serial( + build.clean, + modifyEnvConfigTask, + bundleTask, + zipSourceCodeSubtask, + build.packageSolution, + restoreOriginalConfigTask + ) +); + +build.task('deploy', + build.serial( + packageTask, + publishSolutionSubtask + ) +); + +build.task('serve', + build.serial( + build.serve, + build.watch(build.serveWatchFilter, + build.serial( + bundleTask, + build.reload + ) + ) + ) +); + +build.addSuppression(/^Warning - \[sass\].*$/); +build.initialize(gulp); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/config/config.json b/samples/react-rhythm-of-business-calendar/config/config.json new file mode 100644 index 000000000..f71a00c14 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/config/config.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/config.2.0.schema.json", + "version": "2.0", + "bundles": { + "rhythm-of-business-web-parts": { + "components": [ + { + "entrypoint": "./lib/webparts/rhythmOfBusinessCalendar/RhythmOfBusinessCalendarWebPart.js", + "manifest": "./src/webparts/rhythmOfBusinessCalendar/RhythmOfBusinessCalendarWebPart.manifest.json" + } + ] + } + }, + "externals": { }, + "localizedResources": { + "CommonStrings": "lib/common/components/loc/{locale}.js", + "ComponentStrings": "lib/components/loc/{locale}.js", + "RhythmOfBusinessCalendarWebPartStrings": "lib/webparts/rhythmOfBusinessCalendar/loc/{locale}.js" + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/config/copy-assets.json b/samples/react-rhythm-of-business-calendar/config/copy-assets.json new file mode 100644 index 000000000..0a020b78e --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/config/copy-assets.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/copy-assets.schema.json", + "deployCdnPath": "temp/deploy" +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/config/deploy-azure-storage.json b/samples/react-rhythm-of-business-calendar/config/deploy-azure-storage.json new file mode 100644 index 000000000..ffd8a775a --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/config/deploy-azure-storage.json @@ -0,0 +1,7 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/deploy-azure-storage.schema.json", + "workingDir": "./release/assets/", + "account": "", + "container": "rhythm-of-business-calendar", + "accessKey": "" +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/config/package-solution.json b/samples/react-rhythm-of-business-calendar/config/package-solution.json new file mode 100644 index 000000000..87016a803 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/config/package-solution.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/package-solution.schema.json", + "solution": { + "name": "LOCAL Rhythm of Business Calendar", + "id": "37df9a1c-b53e-46ad-9efb-2e4da77a724f", + "version": "1.0.0.0", + "includeClientSideAssets": true, + "skipFeatureDeployment": true, + "developer": { + "name": "", + "websiteUrl": "", + "privacyUrl": "", + "termsOfUseUrl": "", + "mpnId": "" + } + }, + "paths": { + "zippedPackage": "solution/RhythmOfBusinessCalendar-LOCAL.sppkg" + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/config/serve.json b/samples/react-rhythm-of-business-calendar/config/serve.json new file mode 100644 index 000000000..7046337ed --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/config/serve.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/core-build/serve.schema.json", + "port": 4321, + "https": true, + "initialPage": "https://contoso.sharepoint.com/_layouts/15/workbench.aspx" +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/config/write-manifests.json b/samples/react-rhythm-of-business-calendar/config/write-manifests.json new file mode 100644 index 000000000..0e63279a8 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/config/write-manifests.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/write-manifests.schema.json", + "cdnBasePath": "" +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/documentation/README.md b/samples/react-rhythm-of-business-calendar/documentation/README.md new file mode 100644 index 000000000..12e7d5dd5 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/documentation/README.md @@ -0,0 +1,17 @@ +# SPFx Solution Accelerator Deep Dive + +## Solution Structure + +## Build Tools + +## Entities + +## Services + +## Schema + +## Components + +## Live Update + +## Fast Load Caching diff --git a/samples/react-rhythm-of-business-calendar/documentation/build-tools.md b/samples/react-rhythm-of-business-calendar/documentation/build-tools.md new file mode 100644 index 000000000..4a2db0632 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/documentation/build-tools.md @@ -0,0 +1,3 @@ +# Build Tools + +Coming soon \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/documentation/components.md b/samples/react-rhythm-of-business-calendar/documentation/components.md new file mode 100644 index 000000000..fb5aff081 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/documentation/components.md @@ -0,0 +1,3 @@ +# Components + +Coming soon \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/documentation/entities.md b/samples/react-rhythm-of-business-calendar/documentation/entities.md new file mode 100644 index 000000000..c9d576d55 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/documentation/entities.md @@ -0,0 +1,3 @@ +# Entities + +Coming soon \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/documentation/fast-load-caching.md b/samples/react-rhythm-of-business-calendar/documentation/fast-load-caching.md new file mode 100644 index 000000000..941cd7a60 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/documentation/fast-load-caching.md @@ -0,0 +1,3 @@ +# Fast Load Caching + +Coming soon \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/documentation/live-update.md b/samples/react-rhythm-of-business-calendar/documentation/live-update.md new file mode 100644 index 000000000..790b49f3a --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/documentation/live-update.md @@ -0,0 +1,3 @@ +# Live Update + +Coming soon \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/documentation/schema.md b/samples/react-rhythm-of-business-calendar/documentation/schema.md new file mode 100644 index 000000000..538280efd --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/documentation/schema.md @@ -0,0 +1,3 @@ +# Schema + +Coming soon \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/documentation/services.md b/samples/react-rhythm-of-business-calendar/documentation/services.md new file mode 100644 index 000000000..018aa76d9 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/documentation/services.md @@ -0,0 +1,3 @@ +# Services + +Coming soon \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/documentation/solution-structure.md b/samples/react-rhythm-of-business-calendar/documentation/solution-structure.md new file mode 100644 index 000000000..ce90a7d17 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/documentation/solution-structure.md @@ -0,0 +1,3 @@ +# Solution Structure + +Coming soon \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/environments.json b/samples/react-rhythm-of-business-calendar/environments.json new file mode 100644 index 000000000..33b54951d --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/environments.json @@ -0,0 +1,98 @@ +{ + "dependencies": {}, + "environments": { + "local": { + "environmentSymbol": "Environments.LOCAL", + "skipFeatureDeployment": false, + "package": { + "name": "LOCAL Rhythm of Business Calendar", + "id": "37df9a1c-b53e-46ad-9efb-2e4da77a724f", + "filename": "RhythmOfBusinessCalendar-LOCAL.sppkg" + }, + "webparts": [ + { + "manifest": "RhythmOfBusinessCalendarWebPart.manifest.json", + "id": "ff77b45a-483c-4fe7-94b4-b5fc8def29c0", + "alias": "RhythmOfBusinessCalendarWebPartLOCAL", + "title": "(LOCAL) Rhythm of Business Calendar" + } + ] + }, + "dev": { + "deploySiteUrl": "https://contoso.sharepoint.com/sites/RhythmOfBusinessCalendar_DEV", + "deployScope": "Site", + "skipFeatureDeployment": false, + "environmentSymbol": "Environments.DEV", + "package": { + "name": "DEV Rhythm of Business Calendar", + "id": "54b89a4f-15c4-4007-942f-d1d9e8fc6871", + "filename": "RhythmOfBusinessCalendar-DEV.sppkg" + }, + "webparts": [ + { + "manifest": "RhythmOfBusinessCalendarWebPart.manifest.json", + "id": "8454e333-242f-45af-bd58-bd823010822a", + "alias": "RhythmOfBusinessCalendarWebPartDEV", + "title": "(DEV) Rhythm of Business Calendar" + } + ] + }, + "test": { + "deploySiteUrl": "https://contoso.sharepoint.com/sites/appcatalog", + "deployScope": "Tenant", + "skipFeatureDeployment": true, + "environmentSymbol": "Environments.TEST", + "package": { + "name": "TEST Rhythm of Business Calendar", + "id": "839937b0-a90a-4665-8ed6-30dcde0cfa9e", + "filename": "RhythmOfBusinessCalendar-TEST.sppkg" + }, + "webparts": [ + { + "manifest": "RhythmOfBusinessCalendarWebPart.manifest.json", + "id": "0039f049-a62f-427e-830e-7b3de838f69e", + "alias": "RhythmOfBusinessCalendarWebPartTEST", + "title": "(TEST) Rhythm of Business Calendar" + } + ] + }, + "stage": { + "deploySiteUrl": "https://contoso.sharepoint.com/sites/appcatalog", + "deployScope": "Tenant", + "skipFeatureDeployment": true, + "environmentSymbol": "Environments.STAGE", + "package": { + "name": "STG Rhythm of Business Calendar", + "id": "bf1f3d59-8ce2-4c98-9c92-a7a7bf36abb6", + "filename": "RhythmOfBusinessCalendar-STG.sppkg" + }, + "webparts": [ + { + "manifest": "RhythmOfBusinessCalendarWebPart.manifest.json", + "id": "b7aeb8c7-7819-4f06-8779-00dce2caeeab", + "alias": "RhythmOfBusinessCalendarWebPartSTG", + "title": "(STG) Rhythm of Business Calendar" + } + ] + }, + "prod": { + "deploySiteUrl": "https://contoso.sharepoint.com/sites/appcatalog", + "deployScope": "Tenant", + "skipFeatureDeployment": true, + "environmentSymbol": "Environments.PROD", + "package": { + "name": "Rhythm of Business Calendar", + "id": "8588904e-d33f-40ac-9ee0-2fcfcfb0ebc2", + "filename": "RhythmOfBusinessCalendar.sppkg" + }, + "webparts": [ + { + "manifest": "RhythmOfBusinessCalendarWebPart.manifest.json", + "id": "077f5c4a-37bf-4531-ac24-6369ca0f5f51", + "alias": "RhythmOfBusinessCalendarWebPart", + "title": "Rhythm of Business Calendar" + } + ] + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/gulpfile.js b/samples/react-rhythm-of-business-calendar/gulpfile.js new file mode 100644 index 000000000..663ead71d --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/gulpfile.js @@ -0,0 +1 @@ +eval(require("typescript").transpile(require("fs").readFileSync("build/gulpfile.ts").toString())); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/jest.config.js b/samples/react-rhythm-of-business-calendar/jest.config.js new file mode 100644 index 000000000..a6bf7d604 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/jest.config.js @@ -0,0 +1,41 @@ +const { defaults: tsjPreset } = require('ts-jest/presets'); + +module.exports = { + "rootDir": ".", + "collectCoverage": true, + "coverageDirectory": "temp/test", + "coverageReporters": [ + "json", + "lcov", + "text-summary" + ], + "moduleFileExtensions": [ + "ts", + "tsx", + "js", + "json" + ], + "moduleNameMapper": { + "\\.(css|scss)$": "identity-obj-proxy", + "^@microsoft/sp-core-library": "identity-obj-proxy", + "^resx-strings/en-us.json": "@microsoft/sp-core-library/lib/resx-strings/en-us.json" + }, + "moduleDirectories": [ + "mock_modules", + "mock_loc_modules", + "src", + "node_modules" + ], + "setupFiles": [ + "raf/polyfill" + ], + "globalSetup": "./jest.setup.localization-mocks.ts", + "snapshotSerializers": [], + "testMatch": [ + "**/src/**/*.(spec|test).+(ts|js)?(x)" + ], + "testURL": "http://localhost", + "transform": { + ...tsjPreset.transform, + } +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/jest.setup.localization-mocks.ts b/samples/react-rhythm-of-business-calendar/jest.setup.localization-mocks.ts new file mode 100644 index 000000000..01cb3f14b --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/jest.setup.localization-mocks.ts @@ -0,0 +1,61 @@ +import fs from "fs"; +import path from "path"; + +declare const __dirname: string; + +declare global { + namespace NodeJS { + interface Global { + define: any; + } + } +} + +module.exports = async () => { + const mockModulesPath = "mock_loc_modules"; + const config = JSON.parse(fs.readFileSync("./config/config.json").toString()); + + const packageJson = (stringModule: string) => + `{"name":"${stringModule}","main":"index.js"}`; + + const rel = (pathString: string) => path.join(__dirname, ...pathString.split("/")); + + if (!fs.existsSync(rel(`${mockModulesPath}`))) { + fs.mkdirSync(rel(`${mockModulesPath}`)); + } + + Object.keys(config.localizedResources).forEach((stringModule: string) => { + if (!fs.existsSync(rel(`${mockModulesPath}/${stringModule}`))) { + fs.mkdirSync(rel(`${mockModulesPath}/${stringModule}`)); + } + + // try to get strings - check various combinations until the file is found + let stringsPath = config.localizedResources[stringModule].replace( + "{locale}", + "en-us" + ); + + if (!fs.existsSync(rel(stringsPath))) + stringsPath = stringsPath.replace("lib", "src"); + + if (!fs.existsSync(rel(stringsPath))) + stringsPath = stringsPath.replace("en-us", "en_us"); + + if (!fs.existsSync(rel(stringsPath))) + stringsPath = stringsPath.replace("src", "lib"); + + // set requirejs define function + global.define = (name: string, ready: Function): void => { + fs.writeFileSync( + rel(`${mockModulesPath}/${stringModule}/index.js`), + "module.exports = " + JSON.stringify(ready(), null, 2) + ); + }; + require(rel(stringsPath).replace(/\.js$/, "")); + + fs.writeFileSync( + rel(`${mockModulesPath}/${stringModule}/package.json`), + packageJson(stringModule) + ); + }); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/mock_modules/@microsoft/sp-http/index.ts b/samples/react-rhythm-of-business-calendar/mock_modules/@microsoft/sp-http/index.ts new file mode 100644 index 000000000..a9b8e9282 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/mock_modules/@microsoft/sp-http/index.ts @@ -0,0 +1,20 @@ + +export type SPHttpClientConfiguration = any; +export type ISPHttpClientOptions = any; +export type SPHttpClientResponse = any; + +export class SPHttpClient { + public static readonly configurations: any; + + public async fetch(url: string, configuration: SPHttpClientConfiguration, options: ISPHttpClientOptions): Promise { + return null; + } + + public async get(url: string, configuration: SPHttpClientConfiguration, options?: ISPHttpClientOptions): Promise { + return null; + } + + public async post(url: string, configuration: SPHttpClientConfiguration, options: ISPHttpClientOptions): Promise { + return null; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/mock_modules/@microsoft/sp-webpart-base/index.ts b/samples/react-rhythm-of-business-calendar/mock_modules/@microsoft/sp-webpart-base/index.ts new file mode 100644 index 000000000..30358d6a6 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/mock_modules/@microsoft/sp-webpart-base/index.ts @@ -0,0 +1,25 @@ + +export abstract class BaseWebPart { + protected readonly dataVersion: any; //Version; + protected readonly properties: TProperties; + protected readonly disableReactivePropertyChanges: boolean; + protected readonly previewImageUrl: string | undefined; + protected readonly accessibleTitle: string; + protected readonly title: string; + protected readonly description: string; + + constructor() { } + + protected async onInit(): Promise { } + protected getPropertyPaneConfiguration(): any { return null; } //IPropertyPaneConfiguration; +} + +export abstract class BaseClientSideWebPart extends BaseWebPart { + protected readonly context: any; //WebPartContext; + protected readonly domElement: HTMLElement; + + constructor() { super(); } + + protected abstract render(): void; + protected onDispose(): void { } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/package-lock.json b/samples/react-rhythm-of-business-calendar/package-lock.json new file mode 100644 index 000000000..dc30873fc --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/package-lock.json @@ -0,0 +1,63970 @@ +{ + "name": "rhythm-of-business-calendar", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "rhythm-of-business-calendar", + "version": "1.0.0", + "dependencies": { + "@fluentui/react": "^8.77.2", + "@fluentui/react-hooks": "^8.6.0", + "@fluentui/react-icons-mdl2": "^1.3.11", + "@microsoft/sp-component-base": "^1.15.2", + "@microsoft/sp-core-library": "^1.15.2", + "@microsoft/sp-http": "^1.15.2", + "@microsoft/sp-list-subscription": "^1.15.2", + "@microsoft/sp-loader": "^1.15.2", + "@microsoft/sp-property-pane": "1.15.2", + "@microsoft/sp-webpart-base": "1.15.2", + "@pnp/common": "^2.13.0", + "@pnp/graph": "^2.13.0", + "@pnp/logging": "^2.13.0", + "@pnp/odata": "^2.13.0", + "@pnp/sp": "^2.13.0", + "compressed-json": "^1.0.16", + "he": "^1.2.0", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.21", + "moment-timezone": "^0.5.34", + "office-ui-fabric-react": "7.185.7", + "react": "~16.13.1", + "react-beautiful-dnd": "^13.1.1", + "react-dom": "~16.13.1", + "react-router-dom": "^6.3.0", + "sanitize-html": "^2.7.1", + "swiped-events": "^1.1.6" + }, + "devDependencies": { + "@microsoft/eslint-config-spfx": "^1.15.2", + "@microsoft/eslint-plugin-spfx": "^1.15.2", + "@microsoft/gulp-core-build": "3.17.19", + "@microsoft/rush-stack-compiler-4.5": "0.2.2", + "@microsoft/sp-build-core-tasks": "^1.15.2", + "@microsoft/sp-build-web": "^1.15.2", + "@microsoft/sp-module-interfaces": "^1.15.2", + "@rushstack/eslint-config": "2.5.1", + "@testing-library/jest-dom": "^5.14.1", + "@testing-library/react": "^11.2.7", + "@types/he": "^1.1.2", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/jest": "^26.0.24", + "@types/react": "~16.9.51", + "@types/react-beautiful-dnd": "^13.1.2", + "@types/react-dom": "~16.9.8", + "@types/react-router-dom": "^5.3.3", + "@types/react-test-renderer": "~16.9.5", + "@types/sanitize-html": "^2.3.2", + "@types/sharepoint": "^2016.1.10", + "@types/webpack-env": "^1.16.2", + "acorn": "^8.4.1", + "ajv": "^8.6.1", + "enhanced-resolve": "^5.8.2", + "eslint-plugin-react-hooks": "^4.3.0", + "gulp": "^4.0.2", + "gulp-zip": "^5.1.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^26.6.3", + "json5": "^2.2.0", + "raf": "^3.4.1", + "react-test-renderer": "~16.13.1", + "stateful-process-command-proxy": "^1.0.1", + "ts-jest": "^26.5.6" + }, + "engines": { + "node": ">=16.15.1" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.0.1.tgz", + "integrity": "sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==", + "dev": true + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@azure/abort-controller": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", + "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", + "dev": true, + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/core-asynciterator-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.2.tgz", + "integrity": "sha512-3rkP4LnnlWawl0LZptJOdXNrT/fHp2eQMadoasa6afspXdpGrtPZuAQc2PD0cpgyuoXtUWyC3tv7xfntjGS5Dw==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", + "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/core-http": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-1.2.6.tgz", + "integrity": "sha512-odtH7UMKtekc5YQ86xg9GlVHNXR6pq2JgJ5FBo7/jbOjNGdBqcrIVrZx2bevXVJz/uUTSx6vUf62gzTXTfqYSQ==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-asynciterator-polyfill": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-tracing": "1.0.0-preview.11", + "@azure/logger": "^1.0.0", + "@types/node-fetch": "^2.5.0", + "@types/tunnel": "^0.0.1", + "form-data": "^3.0.0", + "node-fetch": "^2.6.0", + "process": "^0.11.10", + "tough-cookie": "^4.0.0", + "tslib": "^2.2.0", + "tunnel": "^0.0.6", + "uuid": "^8.3.0", + "xml2js": "^0.4.19" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@azure/core-http/node_modules/@azure/core-tracing": { + "version": "1.0.0-preview.11", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.11.tgz", + "integrity": "sha512-frF0pJc9HTmKncVokhBxCqipjbql02DThQ1ZJ9wLi7SDMLdPAFyDI5xZNzX5guLz+/DtPkY+SGK2li9FIXqshQ==", + "dev": true, + "dependencies": { + "@opencensus/web-types": "0.0.7", + "@opentelemetry/api": "1.0.0-rc.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@azure/core-http/node_modules/@opentelemetry/api": { + "version": "1.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.0-rc.0.tgz", + "integrity": "sha512-iXKByCMfrlO5S6Oh97BuM56tM2cIBB0XsL/vWF/AtJrJEKx4MC/Xdu0xDsGXMGcNWpqF7ujMsjjnp0+UHBwnDQ==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@azure/core-http/node_modules/@types/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@azure/core-http/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@azure/core-lro": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-1.0.5.tgz", + "integrity": "sha512-0EFCFZxARrIoLWMIRt4vuqconRVIO2Iin7nFBfJiYCCbKp5eEmxutNk8uqudPmG0XFl5YqlVh68/al/vbE5OOg==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-http": "^1.2.0", + "@azure/core-tracing": "1.0.0-preview.11", + "events": "^3.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@azure/core-lro/node_modules/@azure/core-tracing": { + "version": "1.0.0-preview.11", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.11.tgz", + "integrity": "sha512-frF0pJc9HTmKncVokhBxCqipjbql02DThQ1ZJ9wLi7SDMLdPAFyDI5xZNzX5guLz+/DtPkY+SGK2li9FIXqshQ==", + "dev": true, + "dependencies": { + "@opencensus/web-types": "0.0.7", + "@opentelemetry/api": "1.0.0-rc.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@azure/core-lro/node_modules/@opentelemetry/api": { + "version": "1.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.0-rc.0.tgz", + "integrity": "sha512-iXKByCMfrlO5S6Oh97BuM56tM2cIBB0XsL/vWF/AtJrJEKx4MC/Xdu0xDsGXMGcNWpqF7ujMsjjnp0+UHBwnDQ==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@azure/core-paging": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.3.0.tgz", + "integrity": "sha512-H6Tg9eBm0brHqLy0OSAGzxIh1t4UL8eZVrSUMJ60Ra9cwq2pOskFqVpz2pYoHDsBY1jZ4V/P8LRGb5D5pmC6rg==", + "dev": true, + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.0.0-preview.9", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.9.tgz", + "integrity": "sha512-zczolCLJ5QG42AEPQ+Qg9SRYNUyB+yZ5dzof4YEc+dyWczO9G2sBqbAjLB7IqrsdHN2apkiB2oXeDKCsq48jug==", + "dev": true, + "dependencies": { + "@opencensus/web-types": "0.0.7", + "@opentelemetry/api": "^0.10.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@azure/identity": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-1.0.3.tgz", + "integrity": "sha512-yWoOL3WjbD1sAYHdx4buFCGd9mCIHGzlTHgkhhLrmMpBztsfp9ejo5LRPYIV2Za4otfJzPL4kH/vnSLTS/4WYA==", + "dev": true, + "dependencies": { + "@azure/core-http": "^1.0.0", + "@azure/core-tracing": "1.0.0-preview.7", + "@azure/logger": "^1.0.0", + "@opentelemetry/types": "^0.2.0", + "events": "^3.0.0", + "jws": "^3.2.2", + "msal": "^1.0.2", + "qs": "^6.7.0", + "tslib": "^1.9.3", + "uuid": "^3.3.2" + } + }, + "node_modules/@azure/identity/node_modules/@azure/core-tracing": { + "version": "1.0.0-preview.7", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.7.tgz", + "integrity": "sha512-pkFCw6OiJrpR+aH1VQe6DYm3fK2KWCC5Jf3m/Pv1RxF08M1Xm08RCyQ5Qe0YyW5L16yYT2nnV48krVhYZ6SGFA==", + "dev": true, + "dependencies": { + "@opencensus/web-types": "0.0.7", + "@opentelemetry/types": "^0.2.0", + "tslib": "^1.9.3" + } + }, + "node_modules/@azure/identity/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@azure/identity/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/@azure/logger": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.3.tgz", + "integrity": "sha512-aK4s3Xxjrx3daZr3VylxejK3vG5ExXck5WOHDJ8in/k9AqlfIyFMMT1uG7u8mNjX+QRILTIn0/Xgschfh/dQ9g==", + "dev": true, + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/msal-browser": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.22.0.tgz", + "integrity": "sha512-ZpnbnzjYGRGHjWDPOLjSp47CQvhK927+W9avtLoNNCMudqs2dBfwj76lnJwObDE7TAKmCUueTiieglBiPb1mgQ==", + "dependencies": { + "@azure/msal-common": "^6.1.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-common": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.4.0.tgz", + "integrity": "sha512-WZdgq9f9O8cbxGzdRwLLMM5xjmLJ2mdtuzgXeiGxIRkVVlJ9nZ6sWnDFKa2TX8j72UXD1IfL0p/RYNoTXYoGfg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/storage-blob": { + "version": "12.4.1", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.4.1.tgz", + "integrity": "sha512-RH6ru8LbnCC+m1rlVLon6mYUXdHsTcyUXFCJAWRQQM7p0XOwVKPS+UiVk2tZXfvMWd3q/qT/meOrEbHEcp/c4g==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-http": "^1.2.0", + "@azure/core-lro": "^1.0.2", + "@azure/core-paging": "^1.1.1", + "@azure/core-tracing": "1.0.0-preview.9", + "@azure/logger": "^1.0.0", + "@opentelemetry/api": "^0.10.2", + "events": "^3.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz", + "integrity": "sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz", + "integrity": "sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.13", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.13", + "@babel/types": "^7.18.13", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz", + "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.13", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz", + "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", + "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz", + "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==", + "dev": true, + "dependencies": { + "core-js-pure": "^3.20.2", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz", + "integrity": "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.13", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.13", + "@babel/types": "^7.18.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz", + "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@fluentui/date-time-utilities": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@fluentui/date-time-utilities/-/date-time-utilities-8.5.2.tgz", + "integrity": "sha512-u540ACUdnC+Jms1DIHkho80eJmoCg/LtAzR4a/1Tum6PicxWv59UYp9Ba7qFbIw+mrjWnwX/2ZmBpqTy9Rgn7w==", + "dependencies": { + "@fluentui/set-version": "^8.2.2", + "tslib": "^2.1.0" + } + }, + "node_modules/@fluentui/dom-utilities": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@fluentui/dom-utilities/-/dom-utilities-2.2.2.tgz", + "integrity": "sha512-puklLc6Jvg279OGagqkSfuHML6ckBhw3gJakdvIZHKeJiduh+34U4Finl3K24yBSXzG2WsN+LwLTd1Vcociy+g==", + "dependencies": { + "@fluentui/set-version": "^8.2.2", + "tslib": "^2.1.0" + } + }, + "node_modules/@fluentui/font-icons-mdl2": { + "version": "8.4.8", + "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.4.8.tgz", + "integrity": "sha512-BVbXK/UBa/JfnOBj2atAvz8fzjvRsLJHyO0x8Z8VFgv0YZ2J1+2kv4ijw+nV6obg45bPNDH4PaN/HPgECz9FQA==", + "dependencies": { + "@fluentui/set-version": "^8.2.2", + "@fluentui/style-utilities": "^8.7.7", + "@fluentui/utilities": "^8.12.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@fluentui/foundation-legacy": { + "version": "8.2.15", + "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.2.15.tgz", + "integrity": "sha512-OLwCsTF5krheALJn+9ZYtciyRjlVExcuY7NpW/3mvOWeXZTPw22yIFQ2vP2QFvpctV/+Q1LtGcaGrt/afshr3Q==", + "dependencies": { + "@fluentui/merge-styles": "^8.5.3", + "@fluentui/set-version": "^8.2.2", + "@fluentui/style-utilities": "^8.7.7", + "@fluentui/utilities": "^8.12.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0" + } + }, + "node_modules/@fluentui/keyboard-key": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@fluentui/keyboard-key/-/keyboard-key-0.4.2.tgz", + "integrity": "sha512-6WdMrnFpY94uWefUGGRqO4WiS6R+Kso6/FR95SxXMuS6kfnjGJCHzywFGZcN5OU1fX067Zna4aPQ/nDwYMgBPw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@fluentui/merge-styles": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@fluentui/merge-styles/-/merge-styles-8.5.3.tgz", + "integrity": "sha512-bHWftN3zTp1bbBfmAEH8YK9UURWj2mffw7b7VaW2Og1qxwv3GMSza1cyv/d3EVqpMJ8AVwFv3mbi9p1ieMN9mw==", + "dependencies": { + "@fluentui/set-version": "^8.2.2", + "tslib": "^2.1.0" + } + }, + "node_modules/@fluentui/react": { + "version": "8.90.1", + "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.90.1.tgz", + "integrity": "sha512-2yIkuDmUytMKJTRrI1wLBk0qkG1GlCfumjRddcx6fXX+ydffrNQ4NQqRp8Hl8Sk8Ag2WOpM3sFm0/UyCuIjyEQ==", + "dependencies": { + "@fluentui/date-time-utilities": "^8.5.2", + "@fluentui/font-icons-mdl2": "^8.4.8", + "@fluentui/foundation-legacy": "^8.2.15", + "@fluentui/merge-styles": "^8.5.3", + "@fluentui/react-focus": "^8.8.0", + "@fluentui/react-hooks": "^8.6.7", + "@fluentui/react-portal-compat-context": "^9.0.1", + "@fluentui/react-window-provider": "^2.2.2", + "@fluentui/set-version": "^8.2.2", + "@fluentui/style-utilities": "^8.7.7", + "@fluentui/theme": "^2.6.12", + "@fluentui/utilities": "^8.12.0", + "@microsoft/load-themed-styles": "^1.10.26", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "@types/react-dom": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0", + "react-dom": ">=16.8.0 <18.0.0" + } + }, + "node_modules/@fluentui/react-focus": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.8.0.tgz", + "integrity": "sha512-TzTIMfD1ESCYIgx6dKGokYEWeCMB5xRDyo2F4MeCcYhuwX2fYjrMhxyrA6nK2qrJa7nHYw0USZY4bKwDny1RkA==", + "dependencies": { + "@fluentui/keyboard-key": "^0.4.2", + "@fluentui/merge-styles": "^8.5.3", + "@fluentui/set-version": "^8.2.2", + "@fluentui/style-utilities": "^8.7.7", + "@fluentui/utilities": "^8.12.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0" + } + }, + "node_modules/@fluentui/react-hooks": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.6.7.tgz", + "integrity": "sha512-lQ6TQZEAtKImSVCm87V2Was4HQud4uWWARzEiUO1pQkbwux912REGKyfRgsKC0ZBQDTV8siTCmsC2q103/Am0A==", + "dependencies": { + "@fluentui/react-window-provider": "^2.2.2", + "@fluentui/set-version": "^8.2.2", + "@fluentui/utilities": "^8.12.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0" + } + }, + "node_modules/@fluentui/react-icons-mdl2": { + "version": "1.3.17", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons-mdl2/-/react-icons-mdl2-1.3.17.tgz", + "integrity": "sha512-8lmr6PoeSnjj5+BJ/O/JrohJ6uzwai69/Xpy87giGGclRgHcIjVuUkdXX7FQWfCtPjQ3yH9aUn0QWht50ZGZ/A==", + "dependencies": { + "@fluentui/react-icon-provider": "^1.3.15", + "@fluentui/set-version": "^8.2.2", + "@fluentui/utilities": "^8.12.0", + "@microsoft/load-themed-styles": "^1.10.26", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.8.0 <18.0.0" + } + }, + "node_modules/@fluentui/react-icons-mdl2/node_modules/@fluentui/react-icon-provider": { + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/@fluentui/react-icon-provider/-/react-icon-provider-1.3.15.tgz", + "integrity": "sha512-f9Zar4sGEhASgwY8br9jNgNyZtgBS+gSi0THANCDEQdXHXWy7dFRMwL1AXruYg3QjPAYLibU5J5C7O8C2a5KdA==", + "dependencies": { + "@fluentui/set-version": "^8.2.2", + "@fluentui/style-utilities": "^8.7.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "@types/react-dom": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0", + "react-dom": ">=16.8.0 <18.0.0" + } + }, + "node_modules/@fluentui/react-portal-compat-context": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal-compat-context/-/react-portal-compat-context-9.0.1.tgz", + "integrity": "sha512-KhOcXy2tvzNoAqFowkaRGFiLuRuPjzn6i1W30iMkhgsSVKxa/9jxso86Z8R0eZwA+16RNO/Ia2nX1gqfUac9mw==", + "dependencies": { + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0" + } + }, + "node_modules/@fluentui/react-window-provider": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-2.2.2.tgz", + "integrity": "sha512-/1uQ01HqGRpUOMozUy1FYmxp6blZZvtKN50rqxnQJr8O1bcpg8lJzhq064E8EjOXfdNh47zKSloP4ebbDI5vrw==", + "dependencies": { + "@fluentui/set-version": "^8.2.2", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0" + } + }, + "node_modules/@fluentui/set-version": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@fluentui/set-version/-/set-version-8.2.2.tgz", + "integrity": "sha512-Vg20KZ0ufgWjxx6GFbqC5wiVxXZDUWgNT0r0By/Eyj4bUSb1jG6lmf5z1oY1dUX0YS6Cp5e6GnvbNdXg5E7orA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@fluentui/style-utilities": { + "version": "8.7.7", + "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.7.7.tgz", + "integrity": "sha512-5EcL3QQGDiAi8GJYAZINHlJU10UgVTSgAFR6sF6Jl4+dFr6xrr2+Z53783YiaIyO0bAx9Ljh3/XWuh1cHAe7Ww==", + "dependencies": { + "@fluentui/merge-styles": "^8.5.3", + "@fluentui/set-version": "^8.2.2", + "@fluentui/theme": "^2.6.12", + "@fluentui/utilities": "^8.12.0", + "@microsoft/load-themed-styles": "^1.10.26", + "tslib": "^2.1.0" + } + }, + "node_modules/@fluentui/theme": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.12.tgz", + "integrity": "sha512-tnv/XL39KI4LY83CgPeI8yvLEk4bHmeGTwPRH8BiGvKrwEJ1ics23LMQu+K03ltvvo8HDzomyoir+Nb6cD7lDA==", + "dependencies": { + "@fluentui/merge-styles": "^8.5.3", + "@fluentui/set-version": "^8.2.2", + "@fluentui/utilities": "^8.12.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0" + } + }, + "node_modules/@fluentui/utilities": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.12.0.tgz", + "integrity": "sha512-DrC/bgYlOAyXiJxGQlYNVkmEu/zFv7NEZ7Nf0NGzwS2NiRwtv7Qa9lghbKY0gCk08iKrWpwtgCf8h7XxTEPXlQ==", + "dependencies": { + "@fluentui/dom-utilities": "^2.2.2", + "@fluentui/merge-styles": "^8.5.3", + "@fluentui/set-version": "^8.2.2", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "dev": true, + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true, + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz", + "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "jest-message-util": "^25.5.0", + "jest-util": "^25.5.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@jest/core": { + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.4.0.tgz", + "integrity": "sha512-h1x9WSVV0+TKVtATGjyQIMJENs8aF6eUjnCoi4jyRemYZmekLr8EJOGQqTWEX8W6SbZ6Skesy9pGXrKeAolUJw==", + "dev": true, + "dependencies": { + "@jest/console": "^25.4.0", + "@jest/reporters": "^25.4.0", + "@jest/test-result": "^25.4.0", + "@jest/transform": "^25.4.0", + "@jest/types": "^25.4.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.3", + "jest-changed-files": "^25.4.0", + "jest-config": "^25.4.0", + "jest-haste-map": "^25.4.0", + "jest-message-util": "^25.4.0", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.4.0", + "jest-resolve-dependencies": "^25.4.0", + "jest-runner": "^25.4.0", + "jest-runtime": "^25.4.0", + "jest-snapshot": "^25.4.0", + "jest-util": "^25.4.0", + "jest-validate": "^25.4.0", + "jest-watcher": "^25.4.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "realpath-native": "^2.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@jest/environment": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.5.0.tgz", + "integrity": "sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@jest/fake-timers": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.5.0.tgz", + "integrity": "sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", + "lolex": "^5.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@jest/globals": { + "version": "25.5.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-25.5.2.tgz", + "integrity": "sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA==", + "dev": true, + "dependencies": { + "@jest/environment": "^25.5.0", + "@jest/types": "^25.5.0", + "expect": "^25.5.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@jest/reporters": { + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.4.0.tgz", + "integrity": "sha512-bhx/buYbZgLZm4JWLcRJ/q9Gvmd3oUh7k2V7gA4ZYBx6J28pIuykIouclRdiAC6eGVX1uRZT+GK4CQJLd/PwPg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^25.4.0", + "@jest/test-result": "^25.4.0", + "@jest/transform": "^25.4.0", + "@jest/types": "^25.4.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^25.4.0", + "jest-resolve": "^25.4.0", + "jest-util": "^25.4.0", + "jest-worker": "^25.4.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^3.1.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^4.1.3" + }, + "engines": { + "node": ">= 8.3" + }, + "optionalDependencies": { + "node-notifier": "^6.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@jest/reporters/node_modules/node-notifier": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", + "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", + "dev": true, + "optional": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.1.1", + "semver": "^6.3.0", + "shellwords": "^0.1.1", + "which": "^1.3.1" + } + }, + "node_modules/@jest/reporters/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@jest/reporters/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "optional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/@jest/source-map": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.5.0.tgz", + "integrity": "sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@jest/source-map/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@jest/test-result": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz", + "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==", + "dev": true, + "dependencies": { + "@jest/console": "^25.5.0", + "@jest/types": "^25.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz", + "integrity": "sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^25.5.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", + "jest-runner": "^25.5.4", + "jest-runtime": "^25.5.4" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@jest/transform": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.5.1.tgz", + "integrity": "sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^25.5.0", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^3.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", + "jest-regex-util": "^25.2.6", + "jest-util": "^25.5.0", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "realpath-native": "^2.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@jest/types/node_modules/@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@microsoft/api-extractor": { + "version": "7.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.15.2.tgz", + "integrity": "sha512-/Y/n+QOc1vM6Vg3OAUByT/wXdZciE7jV3ay33+vxl3aKva5cNsuOauL14T7XQWUiLko3ilPwrcnFcEjzXpLsuA==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor-model": "7.13.2", + "@microsoft/tsdoc": "0.13.2", + "@microsoft/tsdoc-config": "~0.15.2", + "@rushstack/node-core-library": "3.38.0", + "@rushstack/rig-package": "0.2.12", + "@rushstack/ts-command-line": "4.7.10", + "colors": "~1.2.1", + "lodash": "~4.17.15", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "source-map": "~0.6.1", + "typescript": "~4.2.4" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.13.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.13.2.tgz", + "integrity": "sha512-gA9Q8q5TPM2YYk7rLinAv9KqcodrmRC13BVmNzLswjtFxpz13lRh0BmrqD01/sddGpGMIuWFYlfUM4VSWxnggA==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.13.2", + "@microsoft/tsdoc-config": "~0.15.2", + "@rushstack/node-core-library": "3.38.0" + } + }, + "node_modules/@microsoft/api-extractor-model/node_modules/@rushstack/node-core-library": { + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.38.0.tgz", + "integrity": "sha512-cmvl0yQx8sSmbuXwiRYJi8TO+jpTtrLJQ8UmFHhKvgPVJAW8cV8dnpD1Xx/BvTGrJZ2XtRAIkAhBS9okBnap4w==", + "dev": true, + "dependencies": { + "@types/node": "10.17.13", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~3.18.3" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/@rushstack/node-core-library": { + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.38.0.tgz", + "integrity": "sha512-cmvl0yQx8sSmbuXwiRYJi8TO+jpTtrLJQ8UmFHhKvgPVJAW8cV8dnpD1Xx/BvTGrJZ2XtRAIkAhBS9okBnap4w==", + "dev": true, + "dependencies": { + "@types/node": "10.17.13", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~3.18.3" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@microsoft/eslint-config-spfx": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/eslint-config-spfx/-/eslint-config-spfx-1.15.2.tgz", + "integrity": "sha512-GMF1HMzyxI6QR5ncwLElcQoOe9jLRA97ZoSIV3JbELOqCjUGNYyZw7a+kl3TwP622Vj3CYAVXWQWhLC2Te/NTg==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "5.20.0" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@microsoft/eslint-plugin-spfx": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/eslint-plugin-spfx/-/eslint-plugin-spfx-1.15.2.tgz", + "integrity": "sha512-4OObWB0H0SUOD7X5sIliAs1LrTeXsRwxXN2kbiR7puORl8b27iPkWA1ljVUAbw15qNlBRJTFF4aQtTSowDxVUA==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "5.20.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@microsoft/gulp-core-build": { + "version": "3.17.19", + "resolved": "https://registry.npmjs.org/@microsoft/gulp-core-build/-/gulp-core-build-3.17.19.tgz", + "integrity": "sha512-izeW3DDC9KC5NYqwHqddY0KElO7YYLtbXvH30JJnYFVlpaXTl23opv5XFZYpWe6LKGuNVGnbTNwYqEuxiGiTVg==", + "dev": true, + "dependencies": { + "@jest/core": "~25.4.0", + "@jest/reporters": "~25.4.0", + "@rushstack/node-core-library": "~3.44.1", + "@types/chalk": "0.4.31", + "@types/gulp": "4.0.6", + "@types/jest": "25.2.1", + "@types/node": "10.17.13", + "@types/node-notifier": "8.0.2", + "@types/orchestrator": "0.0.30", + "@types/semver": "7.3.5", + "@types/through2": "2.0.32", + "@types/vinyl": "2.0.3", + "@types/yargs": "0.0.34", + "colors": "~1.2.1", + "del": "^2.2.2", + "end-of-stream": "~1.1.0", + "glob": "~7.0.5", + "glob-escape": "~0.0.2", + "globby": "~5.0.0", + "gulp": "~4.0.2", + "gulp-flatten": "~0.2.0", + "gulp-if": "^2.0.1", + "jest": "~25.4.0", + "jest-cli": "~25.4.0", + "jest-environment-jsdom": "~25.4.0", + "jest-nunit-reporter": "~1.3.1", + "jsdom": "~11.11.0", + "lodash.merge": "~4.6.2", + "merge2": "~1.0.2", + "node-notifier": "~10.0.1", + "object-assign": "~4.1.0", + "orchestrator": "~0.3.8", + "pretty-hrtime": "~1.0.2", + "semver": "~7.3.0", + "through2": "~2.0.1", + "vinyl": "~2.2.0", + "xml": "~1.0.1", + "yargs": "~4.6.0", + "z-schema": "~3.18.3" + } + }, + "node_modules/@microsoft/gulp-core-build-sass": { + "version": "4.15.5", + "resolved": "https://registry.npmjs.org/@microsoft/gulp-core-build-sass/-/gulp-core-build-sass-4.15.5.tgz", + "integrity": "sha512-kDxVDAb4SL/otB7pNAy+oRnIYIdf/cxydc85Y13j2dInNEraaId/bvEFXNxfUn3GxIUF4YJOmLtHklfVhCxIGA==", + "dev": true, + "dependencies": { + "@microsoft/gulp-core-build": "3.17.19", + "@microsoft/load-themed-styles": "~1.10.172", + "@rushstack/node-core-library": "~3.44.1", + "@types/gulp": "4.0.6", + "@types/node": "10.17.13", + "autoprefixer": "~9.8.8", + "clean-css": "4.2.1", + "glob": "~7.0.5", + "postcss": "7.0.38", + "postcss-modules": "~1.5.0", + "sass": "1.44.0" + } + }, + "node_modules/@microsoft/gulp-core-build-serve": { + "version": "3.9.21", + "resolved": "https://registry.npmjs.org/@microsoft/gulp-core-build-serve/-/gulp-core-build-serve-3.9.21.tgz", + "integrity": "sha512-Q+sCbf+fSbF48jgp6I74aNftXGHvvCtPEuGD4bpH2l06uiu3IH+tEGiMgCH41GTBckbmkz8cXl+Q8681Tq38bA==", + "dev": true, + "dependencies": { + "@microsoft/gulp-core-build": "3.17.19", + "@rushstack/debug-certificate-manager": "~1.1.19", + "@rushstack/node-core-library": "~3.44.1", + "@types/node": "10.17.13", + "colors": "~1.2.1", + "express": "~4.16.2", + "gulp": "~4.0.2", + "gulp-connect": "~5.5.0", + "gulp-open": "~3.0.1", + "sudo": "~1.0.3" + } + }, + "node_modules/@microsoft/gulp-core-build-typescript": { + "version": "8.5.32", + "resolved": "https://registry.npmjs.org/@microsoft/gulp-core-build-typescript/-/gulp-core-build-typescript-8.5.32.tgz", + "integrity": "sha512-jQKLtvzNzixpRO3R38xnkjOswG3r+t7TlC40IPKTFhpGd4p1hgSahS8txejkcSH6jc4k5Rstdmg8xNjZJqKnoQ==", + "dev": true, + "dependencies": { + "@microsoft/gulp-core-build": "3.17.19", + "@rushstack/node-core-library": "~3.44.1", + "@types/node": "10.17.13", + "decomment": "~0.9.1", + "glob": "~7.0.5", + "glob-escape": "~0.0.2", + "resolve": "~1.17.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack": { + "version": "5.2.27", + "resolved": "https://registry.npmjs.org/@microsoft/gulp-core-build-webpack/-/gulp-core-build-webpack-5.2.27.tgz", + "integrity": "sha512-6vEKnFqgfXie9um+uVcPZZEg9mZQJXLOdz1KQWMZwpPmfM7gf+ND8eHCmZizg2Exksm+WthEn5xn8zgLpdudig==", + "dev": true, + "dependencies": { + "@microsoft/gulp-core-build": "3.17.19", + "@types/gulp": "4.0.6", + "@types/node": "10.17.13", + "colors": "~1.2.1", + "gulp": "~4.0.2", + "webpack": "~4.44.2" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/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, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/@microsoft/gulp-core-build-webpack/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@microsoft/gulp-core-build/node_modules/@types/jest": { + "version": "25.2.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.2.1.tgz", + "integrity": "sha512-msra1bCaAeEdkSyA0CZ6gW1ukMIvZ5YoJkdXw/qhQdsuuDlFTcEUrUw8CLCPt2rVRUfXlClVvK2gvPs9IokZaA==", + "dev": true, + "dependencies": { + "jest-diff": "^25.2.1", + "pretty-format": "^25.2.1" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/jest": { + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.4.0.tgz", + "integrity": "sha512-XWipOheGB4wai5JfCYXd6vwsWNwM/dirjRoZgAa7H2wd8ODWbli2AiKjqG8AYhyx+8+5FBEdpO92VhGlBydzbw==", + "dev": true, + "dependencies": { + "@jest/core": "^25.4.0", + "import-local": "^3.0.2", + "jest-cli": "^25.4.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@microsoft/gulp-core-build/node_modules/pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@microsoft/load-themed-styles": { + "version": "1.10.288", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.288.tgz", + "integrity": "sha512-45Z/ROR2pkgFRvWzve+cMSqgHFQZ1EUaC4e4WtX38kjbFYT+P++AFGtvor912WjQe6qS75wS3cPph2a6hPLoEA==" + }, + "node_modules/@microsoft/loader-load-themed-styles": { + "version": "1.9.147", + "resolved": "https://registry.npmjs.org/@microsoft/loader-load-themed-styles/-/loader-load-themed-styles-1.9.147.tgz", + "integrity": "sha512-x6RmEo/LMJBv7Zn3exVJhnTwdtKayCyFuiUZ1VCDVT4otV6DLg5msvKWNqN4mm1EyGh4JmYFWYqEIO96nvcq8w==", + "dev": true, + "dependencies": { + "@microsoft/load-themed-styles": "1.10.266", + "loader-utils": "~1.1.0" + } + }, + "node_modules/@microsoft/loader-load-themed-styles/node_modules/@microsoft/load-themed-styles": { + "version": "1.10.266", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.266.tgz", + "integrity": "sha512-xburd5lN4LSFgRbvA2M3bgXIZUa/OlKf9F851gdCu4qMNqyHavZlusRfhGl+H3bsmrWTYU1xlanGZz6ie2zLoA==", + "dev": true + }, + "node_modules/@microsoft/microsoft-graph-client": { + "version": "1.7.2-spfx", + "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-client/-/microsoft-graph-client-1.7.2-spfx.tgz", + "integrity": "sha512-BQN50r3tohWYOaQ0de7LJ5eCRjI6eg4RQqLhGDlgRmZIZhWzH0bhR6QBMmmxtYtwKWifhPhJSxYDW+cP67TJVw==", + "dependencies": { + "es6-promise": "^4.2.6", + "isomorphic-fetch": "^3.0.0", + "tslib": "^1.9.3" + } + }, + "node_modules/@microsoft/microsoft-graph-client/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@microsoft/microsoft-graph-clientV3": { + "name": "@microsoft/microsoft-graph-client", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-client/-/microsoft-graph-client-3.0.2.tgz", + "integrity": "sha512-eYDiApYmiGsm1s1jfAa/rhB2xQCsX4pWt0vCTd1LZmiApMQfT/c0hXj2hvpuGz5GrcLdugbu05xB79rIV57Pjw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependenciesMeta": { + "@azure/identity": { + "optional": true + }, + "@azure/msal-browser": { + "optional": true + }, + "buffer": { + "optional": true + }, + "stream-browserify": { + "optional": true + } + } + }, + "node_modules/@microsoft/microsoft-graph-types": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-types/-/microsoft-graph-types-2.23.0.tgz", + "integrity": "sha512-4TwjVg/A28K5Df1br17gRmv7Z0iWqYArdUo77xPz+bEtMpDD1hwmKUNj7O7a8r3sN7WIC2nKp6Atb6LXTr1LEA==" + }, + "node_modules/@microsoft/office-ui-fabric-react-bundle": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/office-ui-fabric-react-bundle/-/office-ui-fabric-react-bundle-1.15.2.tgz", + "integrity": "sha512-iYQvIIRkjvwkoD9RHa3LUqbago9wSL0YUiifbQib7sG4fzl38Hmrht+WA0DPRPZbSwOWCsjzv7FXt1YWy9QxFQ==", + "dependencies": { + "@microsoft/sp-core-library": "1.15.2", + "@uifabric/icons": "7.7.2", + "office-ui-fabric-react": "7.185.7", + "react": "16.13.1", + "react-dom": "16.13.1", + "tslib": "2.3.1" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/office-ui-fabric-react-bundle/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/@microsoft/rush-lib": { + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/@microsoft/rush-lib/-/rush-lib-5.70.0.tgz", + "integrity": "sha512-voTwbD33rp3+2KdP8tvgmV63ay5QDeSZyxLIb3gjmzmF2dp6SYi1OPXULFbJBgCEg2c/V09Aa5o7fZ6nHtLuGw==", + "dev": true, + "dependencies": { + "@pnpm/link-bins": "~5.3.7", + "@rushstack/heft-config-file": "0.8.4", + "@rushstack/node-core-library": "3.45.5", + "@rushstack/package-deps-hash": "3.2.17", + "@rushstack/rig-package": "0.3.11", + "@rushstack/rush-amazon-s3-build-cache-plugin": "5.70.0", + "@rushstack/rush-azure-storage-build-cache-plugin": "5.70.0", + "@rushstack/stream-collator": "4.0.172", + "@rushstack/terminal": "0.3.41", + "@rushstack/ts-command-line": "4.11.0", + "@types/node-fetch": "1.6.9", + "@yarnpkg/lockfile": "~1.0.2", + "builtin-modules": "~3.1.0", + "cli-table": "~0.3.1", + "colors": "~1.2.1", + "git-repo-info": "~2.1.0", + "glob": "~7.0.5", + "glob-escape": "~0.0.2", + "https-proxy-agent": "~5.0.0", + "ignore": "~5.1.6", + "inquirer": "~7.3.3", + "js-yaml": "~3.13.1", + "jszip": "~3.7.1", + "lodash": "~4.17.15", + "node-fetch": "2.6.7", + "npm-package-arg": "~6.1.0", + "npm-packlist": "~2.1.2", + "read-package-tree": "~5.1.5", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "ssri": "~8.0.0", + "strict-uri-encode": "~2.0.0", + "tapable": "2.2.1", + "tar": "~6.1.11", + "true-case-path": "~2.2.1" + }, + "engines": { + "node": ">=5.6.0" + } + }, + "node_modules/@microsoft/rush-lib/node_modules/@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@microsoft/rush-lib/node_modules/@rushstack/rig-package": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.11.tgz", + "integrity": "sha512-uI1/g5oQPtyrT9nStoyX/xgZSLa2b+srRFaDk3r1eqC7zA5th4/bvTGl2QfV3C9NcP+coSqmk5mFJkUfH6i3Lw==", + "dev": true, + "dependencies": { + "resolve": "~1.17.0", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@microsoft/rush-lib/node_modules/@rushstack/ts-command-line": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.11.0.tgz", + "integrity": "sha512-ptG9L0mjvJ5QtK11GsAFY+jGfsnqHDS6CY6Yw1xT7a9bhjfNYnf6UPwjV+pF6UgiucfNcMDNW9lkDLxvZKKxMg==", + "dev": true, + "dependencies": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, + "node_modules/@microsoft/rush-lib/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@microsoft/rush-lib/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "node_modules/@microsoft/rush-lib/node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@microsoft/rush-lib/node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/@microsoft/rush-stack-compiler-4.5": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@microsoft/rush-stack-compiler-4.5/-/rush-stack-compiler-4.5-0.2.2.tgz", + "integrity": "sha512-nRlomAZwOYUR3qmFxxVcn8A3wmkjQ4eS3hoKzYylOqEU8SYPFxDFSN4I+2Y+hGTYG0gpm3NSL4Wvb0I180pCbg==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor": "~7.15.2", + "@rushstack/eslint-config": "~2.5.0", + "@rushstack/node-core-library": "~3.44.1", + "@types/node": "10.17.13", + "eslint": "8.7.0", + "import-lazy": "~4.0.0", + "typescript": "~4.5.5" + }, + "bin": { + "rush-api-extractor": "bin/rush-api-extractor", + "rush-eslint": "bin/rush-eslint", + "rush-tsc": "bin/rush-tsc", + "rush-tslint": "bin/rush-tslint" + } + }, + "node_modules/@microsoft/rush-stack-compiler-4.5/node_modules/@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@microsoft/rush-stack-compiler-4.5/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@microsoft/rush-stack-compiler-4.5/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@microsoft/rush-stack-compiler-4.5/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@microsoft/rush-stack-compiler-4.5/node_modules/eslint": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz", + "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.2.0", + "espree": "^9.3.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@microsoft/rush-stack-compiler-4.5/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@microsoft/rush-stack-compiler-4.5/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@microsoft/rush-stack-compiler-4.5/node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@microsoft/rush-stack-compiler-4.5/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@microsoft/rush-stack-compiler-4.5/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@microsoft/rush-stack-compiler-4.5/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@microsoft/rush-stack-compiler-4.5/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@microsoft/rush-stack-compiler-4.5/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/rush-stack-compiler-4.5/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@microsoft/rush-stack-compiler-4.5/node_modules/typescript": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-build-core-tasks/-/sp-build-core-tasks-1.15.2.tgz", + "integrity": "sha512-yVpPKGKlMcsDbO9bjVYEf2PZEcVHC8eAx49qYXi4jGbAIOqZC6hjxJKQYLXT/Gh02wA67GFmwr55C7KOO1wMUg==", + "dev": true, + "dependencies": { + "@microsoft/gulp-core-build": "3.17.19", + "@microsoft/gulp-core-build-serve": "3.9.21", + "@microsoft/gulp-core-build-webpack": "5.2.27", + "@microsoft/spfx-heft-plugins": "1.15.2", + "@rushstack/node-core-library": "3.45.5", + "@types/glob": "5.0.30", + "@types/lodash": "4.14.117", + "@types/webpack": "4.41.24", + "colors": "~1.2.1", + "glob": "~7.0.5", + "gulp": "4.0.2", + "lodash": "4.17.21", + "webpack": "~4.44.2" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/cacache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/make-dir/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/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, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@microsoft/sp-build-core-tasks/node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/@microsoft/sp-build-web": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-build-web/-/sp-build-web-1.15.2.tgz", + "integrity": "sha512-lS67sxWuqkbTEjPhJHYurARxMQCNc8j0zw5WdnvKG8bt1DrcHe8NLtpfK9pDcPYe7S5YfgI36AOiEvICxjRkqg==", + "dev": true, + "dependencies": { + "@microsoft/gulp-core-build": "3.17.19", + "@microsoft/gulp-core-build-sass": "4.15.5", + "@microsoft/gulp-core-build-serve": "3.9.21", + "@microsoft/gulp-core-build-typescript": "8.5.32", + "@microsoft/gulp-core-build-webpack": "5.2.27", + "@microsoft/rush-lib": "5.70.0", + "@microsoft/sp-build-core-tasks": "1.15.2", + "@rushstack/node-core-library": "3.45.5", + "@types/webpack": "4.41.24", + "gulp": "4.0.2", + "semver": "~7.3.2", + "true-case-path": "~2.2.1", + "webpack": "~4.44.2", + "yargs": "~4.6.0" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@microsoft/sp-build-web/node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "node_modules/@microsoft/sp-build-web/node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "node_modules/@microsoft/sp-build-web/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@microsoft/sp-build-web/node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "node_modules/@microsoft/sp-build-web/node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/@microsoft/sp-build-web/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/@microsoft/sp-build-web/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@microsoft/sp-build-web/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/make-dir/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/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, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/@microsoft/sp-build-web/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/@microsoft/sp-build-web/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@microsoft/sp-build-web/node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/@microsoft/sp-component-base": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-component-base/-/sp-component-base-1.15.2.tgz", + "integrity": "sha512-Uf7nZ6Ohf68FQ4ABDs+8GVyqAb87rybaTJh/xBYz7DAjUUk/G1urq9wqTih8hSaHGog4P7ovuVeBKNYpmOU3Tg==", + "dependencies": { + "@microsoft/office-ui-fabric-react-bundle": "1.15.2", + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-dynamic-data": "1.15.2", + "@microsoft/sp-http": "1.15.2", + "@microsoft/sp-lodash-subset": "1.15.2", + "@microsoft/sp-module-interfaces": "1.15.2", + "@microsoft/sp-page-context": "1.15.2", + "tslib": "2.3.1" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-component-base/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/@microsoft/sp-core-library": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-core-library/-/sp-core-library-1.15.2.tgz", + "integrity": "sha512-sEotaC8+jUMZa5wc3lvtDYOGpAzzcl1fSZ0FnANIrJGyBC6tTqred0fzpkXptd4R0G/wi3746ivrccAOkzONkQ==", + "dependencies": { + "@microsoft/sp-lodash-subset": "1.15.2", + "@microsoft/sp-module-interfaces": "1.15.2", + "@microsoft/sp-odata-types": "1.15.2", + "tslib": "2.3.1" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-core-library/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/@microsoft/sp-css-loader": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-css-loader/-/sp-css-loader-1.15.2.tgz", + "integrity": "sha512-3SjLphivW4kYg/Jl4exVStrBNuEjl0ol69zdJCjkRLT+wZvAstc5Y4RVljMDAap1BgTh14zJ3jT6nztbExlMGA==", + "dev": true, + "dependencies": { + "@microsoft/load-themed-styles": "1.10.266", + "@rushstack/node-core-library": "3.45.5", + "autoprefixer": "9.7.1", + "css-loader": "3.4.2", + "cssnano": "~4.1.10", + "loader-utils": "1.2.3", + "postcss": "~8.1.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", + "webpack": "~4.44.2" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/@microsoft/load-themed-styles": { + "version": "1.10.266", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.266.tgz", + "integrity": "sha512-xburd5lN4LSFgRbvA2M3bgXIZUa/OlKf9F851gdCu4qMNqyHavZlusRfhGl+H3bsmrWTYU1xlanGZz6ie2zLoA==", + "dev": true + }, + "node_modules/@microsoft/sp-css-loader/node_modules/@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@microsoft/sp-css-loader/node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "node_modules/@microsoft/sp-css-loader/node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "node_modules/@microsoft/sp-css-loader/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@microsoft/sp-css-loader/node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "node_modules/@microsoft/sp-css-loader/node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/autoprefixer": { + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz", + "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==", + "dev": true, + "dependencies": { + "browserslist": "^4.7.2", + "caniuse-lite": "^1.0.30001006", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.21", + "postcss-value-parser": "^4.0.2" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/autoprefixer/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/@microsoft/sp-css-loader/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@microsoft/sp-css-loader/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/@microsoft/sp-css-loader/node_modules/css-loader": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", + "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.23", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.1.1", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.2", + "schema-utils": "^2.6.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/css-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/css-loader/node_modules/postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/css-loader/node_modules/postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "dependencies": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/css-loader/node_modules/postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/css-loader/node_modules/postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "dependencies": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@microsoft/sp-css-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/make-dir/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/postcss": { + "version": "8.1.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.14.tgz", + "integrity": "sha512-KatkyVPBKfENS+c3dpXJoDXnDD5UZs5exAnDksLqaRJPKwYphEPZt4N0m0i049v2/BtWVQibAhxW4ilXXcolpA==", + "dev": true, + "dependencies": { + "colorette": "^1.2.1", + "nanoid": "^3.1.20", + "source-map": "^0.6.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/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, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/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, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/postcss-modules-local-by-default/node_modules/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, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/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, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/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, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/postcss-modules-values/node_modules/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, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/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, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@microsoft/sp-css-loader/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/@microsoft/sp-css-loader/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@microsoft/sp-css-loader/node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/@microsoft/sp-diagnostics": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-diagnostics/-/sp-diagnostics-1.15.2.tgz", + "integrity": "sha512-9OJQwkdy3kqATQISpI4SG+5OUMB90KesupsWIE31aAyPcQiilh0XGhWmaYnCxCgGATAWcaYrFeptlDOTQNpuiA==", + "dependencies": { + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-lodash-subset": "1.15.2" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-dynamic-data": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-dynamic-data/-/sp-dynamic-data-1.15.2.tgz", + "integrity": "sha512-6ks5GUBSatsijQC8NUjaLjYCv4efAbEJcbSVTj8lySpTVCWu8aKsFtKB1b/Vc3I1g9Adq6z2e9sgTaPwm6HTlA==", + "dependencies": { + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-lodash-subset": "1.15.2", + "@microsoft/sp-module-interfaces": "1.15.2", + "tslib": "2.3.1" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-dynamic-data/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/@microsoft/sp-http": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-http/-/sp-http-1.15.2.tgz", + "integrity": "sha512-vP3heQlje3YVTgyaGKZmrHksqmWP+zczuhQP116cCl6z52ZdUiuJIZpDcu+WGZaG1HdznAyrNGkkiZauTytIHw==", + "dependencies": { + "@azure/msal-browser": "2.22.0", + "@microsoft/microsoft-graph-client": "1.7.2-spfx", + "@microsoft/microsoft-graph-clientV3": "npm:@microsoft/microsoft-graph-client@3.0.2", + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-page-context": "1.15.2", + "@types/adal-angular": "1.0.1", + "adal-angular": "1.0.16", + "msalLegacy": "npm:msal@1.4.12", + "tslib": "2.3.1" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-http/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/@microsoft/sp-image-helper": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-image-helper/-/sp-image-helper-1.15.2.tgz", + "integrity": "sha512-vNwymXZtGLFdgkNaV0j/Oi5t8Pz2FV9LgS2gnbAKuRzLSXtCSZ9hfP+5eC5LrVBWkSzxHC+8e+gAGaxqbr2asA==", + "dependencies": { + "@microsoft/office-ui-fabric-react-bundle": "1.15.2", + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-http": "1.15.2", + "@microsoft/sp-loader": "1.15.2", + "@microsoft/sp-lodash-subset": "1.15.2", + "@microsoft/sp-page-context": "1.15.2", + "tslib": "2.3.1" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-image-helper/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/@microsoft/sp-list-subscription": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-list-subscription/-/sp-list-subscription-1.15.2.tgz", + "integrity": "sha512-s7YldyAi9YGnUOiQWh0Qq9j/AJDkToV+18LRAB+vpU5vTKQQuDKxQc8h9uze7u1CBBhDl4YiABCNkZwxgaD2EQ==", + "dependencies": { + "@microsoft/sp-component-base": "1.15.2", + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-http": "1.15.2", + "@microsoft/sp-page-context": "1.15.2", + "tslib": "2.3.1" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-list-subscription/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/@microsoft/sp-loader": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-loader/-/sp-loader-1.15.2.tgz", + "integrity": "sha512-w1EbIrP7AXH5Oq0cQwKW5OZUK6+c3amiImGUBSAlyHaEyC5/gSKMCDM0XJ0xkrihWs0ICWj/yX2o0aLaaReO3g==", + "dependencies": { + "@microsoft/office-ui-fabric-react-bundle": "1.15.2", + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-dynamic-data": "1.15.2", + "@microsoft/sp-http": "1.15.2", + "@microsoft/sp-lodash-subset": "1.15.2", + "@microsoft/sp-module-interfaces": "1.15.2", + "@microsoft/sp-odata-types": "1.15.2", + "@microsoft/sp-page-context": "1.15.2", + "@microsoft/sp-polyfills": "1.15.2", + "@rushstack/loader-raw-script": "1.3.228", + "@types/requirejs": "2.1.29", + "office-ui-fabric-react": "7.185.7", + "raw-loader": "~0.5.1", + "react": "16.13.1", + "react-dom": "16.13.1", + "requirejs": "2.3.6", + "tslib": "2.3.1" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-loader/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/@microsoft/sp-lodash-subset": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-lodash-subset/-/sp-lodash-subset-1.15.2.tgz", + "integrity": "sha512-XLqSltvz9W0hft76fylqVFNUIVS1sLjdUF3+lIQyj0g+4R9kDy9VsGhpxX7qLGAdW10yZ6Z40qfmBWgn8NN4MA==", + "dependencies": { + "@types/lodash": "4.14.117", + "tslib": "2.3.1" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-lodash-subset/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/@microsoft/sp-module-interfaces": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-module-interfaces/-/sp-module-interfaces-1.15.2.tgz", + "integrity": "sha512-JGOjK8f5ww+r4ax8TBAPDyZhDhGWVg1Jk4PvKE0cU6qjywM0DzWWkzHJFcyFXdjr8UE/+wzJOKasCCtu1RjWQg==", + "dependencies": { + "@rushstack/node-core-library": "3.45.5", + "z-schema": "4.2.4" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-module-interfaces/node_modules/@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@microsoft/sp-module-interfaces/node_modules/@rushstack/node-core-library/node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/@microsoft/sp-module-interfaces/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==" + }, + "node_modules/@microsoft/sp-module-interfaces/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "optional": true + }, + "node_modules/@microsoft/sp-module-interfaces/node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@microsoft/sp-module-interfaces/node_modules/z-schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-4.2.4.tgz", + "integrity": "sha512-YvBeW5RGNeNzKOUJs3rTL4+9rpcvHXt5I051FJbOcitV8bl40pEfcG0Q+dWSwS0/BIYrMZ/9HHoqLllMkFhD0w==", + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.6.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=6.0.0" + }, + "optionalDependencies": { + "commander": "^2.7.1" + } + }, + "node_modules/@microsoft/sp-odata-types": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-odata-types/-/sp-odata-types-1.15.2.tgz", + "integrity": "sha512-Eb5MAWRAOkRAGXSdacg8p/KdSpYDJBNwyqNCZwrsCbgf/66h28oK0KUqQ6o8Hcy+vAZpa16x6bvpJQw5u1u8ZA==", + "dependencies": { + "tslib": "2.3.1" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-odata-types/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/@microsoft/sp-page-context": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-page-context/-/sp-page-context-1.15.2.tgz", + "integrity": "sha512-gq7q2vq5rzAwkOn4/jpdL/VgHCrtDWNZqjcU62W6iIW4TNT3nVykcof9llpghPcYx5dOuTtrRizXfa+vtQ+rzw==", + "dependencies": { + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-dynamic-data": "1.15.2", + "@microsoft/sp-lodash-subset": "1.15.2", + "@microsoft/sp-odata-types": "1.15.2", + "tslib": "2.3.1" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-page-context/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/@microsoft/sp-polyfills": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-polyfills/-/sp-polyfills-1.15.2.tgz", + "integrity": "sha512-XxbM/3p6yW/OIahcmzOVFQArKRxySHuDLSveSEdjIY3ycG8UWNX4QXDEd1tZchWCDz3vfO+j4aUsPPSOVW1Wcw==", + "dependencies": { + "es6-promise": "4.2.4", + "es6-symbol": "3.1.3", + "tslib": "2.3.1", + "whatwg-fetch": "2.0.3", + "whatwg-url": "4.7.1" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-polyfills/node_modules/es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" + }, + "node_modules/@microsoft/sp-polyfills/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/@microsoft/sp-property-pane": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-property-pane/-/sp-property-pane-1.15.2.tgz", + "integrity": "sha512-V78aUGZa4gM/MMmOg14iWYPoknHe9jrormvTXpltjcIvipRm5H5bRr6D4SfuzJ7uu0roJ53zfGddCDdvn05ezA==", + "dependencies": { + "@microsoft/office-ui-fabric-react-bundle": "1.15.2", + "@microsoft/sp-component-base": "1.15.2", + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-dynamic-data": "1.15.2", + "@microsoft/sp-image-helper": "1.15.2", + "@microsoft/sp-lodash-subset": "1.15.2", + "@microsoft/sp-page-context": "1.15.2", + "office-ui-fabric-react": "7.185.7", + "react": "16.13.1", + "react-dom": "16.13.1", + "tslib": "2.3.1" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-property-pane/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/@microsoft/sp-webpart-base": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-webpart-base/-/sp-webpart-base-1.15.2.tgz", + "integrity": "sha512-dFQBwmRg81EDyV5RzA7JEhtdKyjk3vjKZBn3pWvaY/4Yo+oGyzKdQ8o/z2A9OO6KwXXlXkFiGJgoau57c/EALQ==", + "dependencies": { + "@microsoft/sp-component-base": "1.15.2", + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-dynamic-data": "1.15.2", + "@microsoft/sp-http": "1.15.2", + "@microsoft/sp-loader": "1.15.2", + "@microsoft/sp-lodash-subset": "1.15.2", + "@microsoft/sp-module-interfaces": "1.15.2", + "@microsoft/sp-page-context": "1.15.2", + "@microsoft/sp-property-pane": "1.15.2", + "@microsoft/teams-js": "1.12.1", + "@types/office-js": "1.0.36", + "office-ui-fabric-react": "7.185.7", + "react": "16.13.1", + "react-dom": "16.13.1", + "tslib": "2.3.1" + }, + "engines": { + "node": ">=12.13.0 <13.0.0 || >=14.15.0 <15.0.0 || >=16.13.0 <17.0.0" + } + }, + "node_modules/@microsoft/sp-webpart-base/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/@microsoft/spfx-heft-plugins": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/spfx-heft-plugins/-/spfx-heft-plugins-1.15.2.tgz", + "integrity": "sha512-92MAbCba3luuofv5se1p6SOnvuSTVmHJDozu/FljR6s3OIFrDOYjEZXSD3DgK0rf1oTijJbH3jXI5Pq6VqmimQ==", + "dev": true, + "dependencies": { + "@azure/storage-blob": "~12.4.1", + "@microsoft/loader-load-themed-styles": "1.9.147", + "@microsoft/rush-lib": "5.70.0", + "@microsoft/sp-css-loader": "1.15.2", + "@microsoft/sp-module-interfaces": "1.15.2", + "@rushstack/heft-config-file": "0.8.4", + "@rushstack/localization-plugin": "0.11.0", + "@rushstack/module-minifier-plugin": "0.9.0", + "@rushstack/node-core-library": "3.45.5", + "@rushstack/rig-package": "0.3.11", + "@rushstack/set-webpack-public-path-plugin": "3.3.37", + "@rushstack/terminal": "0.3.43", + "@types/tapable": "1.0.6", + "autoprefixer": "9.7.1", + "colors": "~1.2.1", + "copy-webpack-plugin": "~6.0.3", + "css-loader": "~3.2.0", + "cssnano": "~4.1.10", + "express": "4.17.1", + "file-loader": "~1.1.11", + "git-repo-info": "~2.1.1", + "glob": "~7.0.5", + "html-loader": "~0.5.1", + "lodash": "4.17.21", + "mime": "2.5.2", + "node-zip": "~1.1.1", + "postcss-loader": "3.0.0", + "resolve": "~1.17.0", + "sass": "1.44.0", + "sass-loader": "8.0.2", + "source-map": "0.6.1", + "source-map-loader": "1.1.3", + "tapable": "1.1.3", + "true-case-path": "~2.2.1", + "uuid": "~3.1.0", + "webpack": "~4.44.2", + "webpack-dev-server": "~3.11.0", + "webpack-sources": "1.4.3", + "xml": "~1.0.1" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@rushstack/localization-plugin": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@rushstack/localization-plugin/-/localization-plugin-0.11.0.tgz", + "integrity": "sha512-csb0TpH6Flp70yii/WVYFKmgykx1h9WQpzYWDDZCpMqIlCo+TmwnCpJjNZpdFCpzqqQt1bux1sprelNaUh1Nag==", + "dev": true, + "dependencies": { + "@rushstack/node-core-library": "3.45.5", + "@rushstack/typings-generator": "0.6.24", + "@types/node": "12.20.24", + "@types/tapable": "1.0.6", + "decache": "~4.5.1", + "loader-utils": "~1.1.0", + "lodash": "~4.17.15", + "minimatch": "~3.0.3", + "pseudolocale": "~1.1.0", + "xmldoc": "~1.1.2" + }, + "peerDependencies": { + "@rushstack/set-webpack-public-path-plugin": "^3.3.37", + "@types/webpack": "^4.39.0", + "webpack": "^4.31.0" + }, + "peerDependenciesMeta": { + "@rushstack/set-webpack-public-path-plugin": { + "optional": true + }, + "@types/webpack": { + "optional": true + } + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@rushstack/module-minifier-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@rushstack/module-minifier-plugin/-/module-minifier-plugin-0.9.0.tgz", + "integrity": "sha512-DsDeQ5crXB7tNZTPSkGQ74yOxiMrpNVYXCIXTAoUHCqk2T0+oSVaCKb12C8cIRIDRz+EjfLjAc529HqX/cT0Kw==", + "dev": true, + "dependencies": { + "@rushstack/module-minifier": "0.1.0", + "@rushstack/worker-pool": "0.1.0", + "@types/node": "12.20.24", + "@types/tapable": "1.0.6", + "tapable": "1.1.3" + }, + "engines": { + "node": ">=10.17.1" + }, + "peerDependencies": { + "@types/webpack": "*", + "webpack": "^4.31.0", + "webpack-sources": "~1.4.3" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + } + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@rushstack/rig-package": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.11.tgz", + "integrity": "sha512-uI1/g5oQPtyrT9nStoyX/xgZSLa2b+srRFaDk3r1eqC7zA5th4/bvTGl2QfV3C9NcP+coSqmk5mFJkUfH6i3Lw==", + "dev": true, + "dependencies": { + "resolve": "~1.17.0", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@rushstack/terminal": { + "version": "0.3.43", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.3.43.tgz", + "integrity": "sha512-iJJ+hbPISsFykLvmfUocFfxyzyah1t2PGXU2gSzG1P5ouicPdh0yjM0Tta2ZbaSi9Z2F59+/8iUGHRWk5WE+Tg==", + "dev": true, + "dependencies": { + "@rushstack/node-core-library": "3.45.5", + "@types/node": "12.20.24", + "wordwrap": "~1.0.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/autoprefixer": { + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz", + "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==", + "dev": true, + "dependencies": { + "browserslist": "^4.7.2", + "caniuse-lite": "^1.0.30001006", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.21", + "postcss-value-parser": "^4.0.2" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/cacache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/cacache/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/css-loader": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.2.1.tgz", + "integrity": "sha512-q40kYdcBNzMvkIImCL2O+wk8dh+RGwPPV9Dfz3n7XtOYPXqe2Z6VgtvoxjkLHz02gmhepG9sOAJOUlx+3hHsBg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.23", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.1.1", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.2", + "schema-utils": "^2.6.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/css-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "dependencies": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" + }, + "engines": { + "node": ">= 4.3 < 5.0.0 || >= 5.10" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/file-loader/node_modules/schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/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, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/make-dir/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "dependencies": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "dependencies": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/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, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/webpack/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@microsoft/spfx-heft-plugins/node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/@microsoft/teams-js": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@microsoft/teams-js/-/teams-js-1.12.1.tgz", + "integrity": "sha512-BRy6vZOseN9F/MG0NWTojYpenuo9XlZ4AfAvwnsG+C36UDPPgW0skWlZ6ub+7RBPhOHcxz8sNg2uHOdGRebWkQ==" + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", + "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==", + "dev": true + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz", + "integrity": "sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.13.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@microsoft/tsdoc-config/node_modules/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, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opencensus/web-types": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@opencensus/web-types/-/web-types-0.0.7.tgz", + "integrity": "sha512-xB+w7ZDAu3YBzqH44rCmG9/RlrOmFuDPt/bpf17eJr8eZSrLt7nc7LnWdxM9Mmoj/YKMHpxRg28txu3TcpiL+g==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@opentelemetry/api": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.10.2.tgz", + "integrity": "sha512-GtpMGd6vkzDMYcpu2t9LlhEgMy/SzBwRnz48EejlRArYqZzqSzAsKmegUK7zHgl+EOIaK9mKHhnRaQu3qw20cA==", + "dev": true, + "dependencies": { + "@opentelemetry/context-base": "^0.10.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/context-base": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.10.2.tgz", + "integrity": "sha512-hZNKjKOYsckoOEgBziGMnBcX0M7EtstnCmwz5jZUOUYwlZ+/xxX6z3jPu1XVO2Jivk0eLfuP9GP+vFD49CMetw==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/types/-/types-0.2.0.tgz", + "integrity": "sha512-GtwNB6BNDdsIPAYEdpp3JnOGO/3AJxjPvny53s3HERBdXSJTGQw8IRhiaTEX0b3w9P8+FwFZde4k+qkjn67aVw==", + "deprecated": "Package renamed to @opentelemetry/api, see https://github.com/open-telemetry/opentelemetry-js", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@pnp/common": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@pnp/common/-/common-2.14.0.tgz", + "integrity": "sha512-GtiV/GfnDtQpoCCTr1GsGpLNI3QC6CRSDduSMbnqFO7uW0MCQXH2xh126/UceH4mwP3BVjNUhi7JZCMEa1lB2A==", + "dependencies": { + "tslib": "2.3.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/patrick-rodgers/" + } + }, + "node_modules/@pnp/common/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/@pnp/graph": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@pnp/graph/-/graph-2.14.0.tgz", + "integrity": "sha512-ASDp/W9UtQEZJlZBZLfFMUb3JHXJD+Jn/9CPSB8kAqfpThB6e7lxaMtlvhWq1nOdWTNs4CBMeKzwqLGcLgDFnQ==", + "dependencies": { + "@microsoft/microsoft-graph-types": "^2.13.0", + "@pnp/common": "2.14.0", + "@pnp/logging": "2.14.0", + "@pnp/odata": "2.14.0", + "tslib": "2.3.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/patrick-rodgers/" + } + }, + "node_modules/@pnp/graph/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/@pnp/logging": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@pnp/logging/-/logging-2.14.0.tgz", + "integrity": "sha512-M/7PyG6zf962KI96ORtmnKp+a45x2Wcy5llsz0+i4FYoWRZuXA9UY5ahIO34sRSYB7FZw5tVwmxSlvQKVLWF3w==", + "dependencies": { + "tslib": "2.3.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/patrick-rodgers/" + } + }, + "node_modules/@pnp/logging/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/@pnp/odata": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@pnp/odata/-/odata-2.14.0.tgz", + "integrity": "sha512-HuVOLJxXsjiVj/Qi0sDYL+v+Nty6SPquz4Qtb0PDNUdRnH63UKEmI8M19QQDohxmCJvueNL1gNj9iy9yHWnASQ==", + "dependencies": { + "@pnp/common": "2.14.0", + "@pnp/logging": "2.14.0", + "tslib": "2.3.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/patrick-rodgers/" + } + }, + "node_modules/@pnp/odata/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/@pnp/sp": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@pnp/sp/-/sp-2.14.0.tgz", + "integrity": "sha512-DP1Hajw6gm2vFfNd5iStYTaSVt1aggGQ0rBpOU+5B9tfJb9WBVOlpwQ8jfvRZXNjc9TRGxFTnO1oH29E4MP2UA==", + "dependencies": { + "@pnp/common": "2.14.0", + "@pnp/logging": "2.14.0", + "@pnp/odata": "2.14.0", + "tslib": "2.3.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/patrick-rodgers/" + } + }, + "node_modules/@pnp/sp/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/@pnpm/error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pnpm/error/-/error-1.4.0.tgz", + "integrity": "sha512-vxkRrkneBPVmP23kyjnYwVOtipwlSl6UfL+h+Xa3TrABJTz5rYBXemlTsU5BzST8U4pD7YDkTb3SQu+MMuIDKA==", + "dev": true, + "engines": { + "node": ">=10.16" + }, + "funding": { + "url": "https://opencollective.com/pnpm" + } + }, + "node_modules/@pnpm/link-bins": { + "version": "5.3.25", + "resolved": "https://registry.npmjs.org/@pnpm/link-bins/-/link-bins-5.3.25.tgz", + "integrity": "sha512-9Xq8lLNRHFDqvYPXPgaiKkZ4rtdsm7izwM/cUsFDc5IMnG0QYIVBXQbgwhz2UvjUotbJrvfKLJaCfA3NGBnLDg==", + "dev": true, + "dependencies": { + "@pnpm/error": "1.4.0", + "@pnpm/package-bins": "4.1.0", + "@pnpm/read-modules-dir": "2.0.3", + "@pnpm/read-package-json": "4.0.0", + "@pnpm/read-project-manifest": "1.1.7", + "@pnpm/types": "6.4.0", + "@zkochan/cmd-shim": "^5.0.0", + "is-subdir": "^1.1.1", + "is-windows": "^1.0.2", + "mz": "^2.7.0", + "normalize-path": "^3.0.0", + "p-settle": "^4.1.1", + "ramda": "^0.27.1" + }, + "engines": { + "node": ">=10.16" + }, + "funding": { + "url": "https://opencollective.com/pnpm" + } + }, + "node_modules/@pnpm/package-bins": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/package-bins/-/package-bins-4.1.0.tgz", + "integrity": "sha512-57/ioGYLBbVRR80Ux9/q2i3y8Q+uQADc3c+Yse8jr/60YLOi3jcWz13e2Jy+ANYtZI258Qc5wk2X077rp0Ly/Q==", + "dev": true, + "dependencies": { + "@pnpm/types": "6.4.0", + "fast-glob": "^3.2.4", + "is-subdir": "^1.1.1" + }, + "engines": { + "node": ">=10.16" + }, + "funding": { + "url": "https://opencollective.com/pnpm" + } + }, + "node_modules/@pnpm/read-modules-dir": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@pnpm/read-modules-dir/-/read-modules-dir-2.0.3.tgz", + "integrity": "sha512-i9OgRvSlxrTS9a2oXokhDxvQzDtfqtsooJ9jaGoHkznue5aFCTSrNZFQ6M18o8hC03QWfnxaKi0BtOvNkKu2+A==", + "dev": true, + "dependencies": { + "mz": "^2.7.0" + }, + "engines": { + "node": ">=10.13" + }, + "funding": { + "url": "https://opencollective.com/pnpm" + } + }, + "node_modules/@pnpm/read-package-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@pnpm/read-package-json/-/read-package-json-4.0.0.tgz", + "integrity": "sha512-1cr2tEwe4YU6SI0Hmg+wnsr6yxBt2iJtqv6wrF84On8pS9hx4A2PLw3CIgbwxaG0b+ur5wzhNogwl4qD5FLFNg==", + "dev": true, + "dependencies": { + "@pnpm/error": "1.4.0", + "@pnpm/types": "6.4.0", + "load-json-file": "^6.2.0", + "normalize-package-data": "^3.0.2" + }, + "engines": { + "node": ">=10.16" + }, + "funding": { + "url": "https://opencollective.com/pnpm" + } + }, + "node_modules/@pnpm/read-project-manifest": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@pnpm/read-project-manifest/-/read-project-manifest-1.1.7.tgz", + "integrity": "sha512-tj8ExXZeDcMmMUj7D292ETe/RiEirr1X1wpT6Zy85z2MrFYoG9jfCJpps40OdZBNZBhxbuKtGPWKVSgXD0yrVw==", + "dev": true, + "dependencies": { + "@pnpm/error": "1.4.0", + "@pnpm/types": "6.4.0", + "@pnpm/write-project-manifest": "1.1.7", + "detect-indent": "^6.0.0", + "fast-deep-equal": "^3.1.3", + "graceful-fs": "4.2.4", + "is-windows": "^1.0.2", + "json5": "^2.1.3", + "parse-json": "^5.1.0", + "read-yaml-file": "^2.0.0", + "sort-keys": "^4.1.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=10.16" + }, + "funding": { + "url": "https://opencollective.com/pnpm" + } + }, + "node_modules/@pnpm/read-project-manifest/node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "node_modules/@pnpm/types": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@pnpm/types/-/types-6.4.0.tgz", + "integrity": "sha512-nco4+4sZqNHn60Y4VE/fbtlShCBqipyUO+nKRPvDHqLrecMW9pzHWMVRxk4nrMRoeowj3q0rX3GYRBa8lsHTAg==", + "dev": true, + "engines": { + "node": ">=10.16" + }, + "funding": { + "url": "https://opencollective.com/pnpm" + } + }, + "node_modules/@pnpm/write-project-manifest": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@pnpm/write-project-manifest/-/write-project-manifest-1.1.7.tgz", + "integrity": "sha512-OLkDZSqkA1mkoPNPvLFXyI6fb0enCuFji6Zfditi/CLAo9kmIhQFmEUDu4krSB8i908EljG8YwL5Xjxzm5wsWA==", + "dev": true, + "dependencies": { + "@pnpm/types": "6.4.0", + "json5": "^2.1.3", + "mz": "^2.7.0", + "write-file-atomic": "^3.0.3", + "write-yaml-file": "^4.1.3" + }, + "engines": { + "node": ">=10.16" + }, + "funding": { + "url": "https://opencollective.com/pnpm" + } + }, + "node_modules/@rushstack/debug-certificate-manager": { + "version": "1.1.67", + "resolved": "https://registry.npmjs.org/@rushstack/debug-certificate-manager/-/debug-certificate-manager-1.1.67.tgz", + "integrity": "sha512-GyBGG+suxoen6EBZLFhxEOPUc9sST8cySYWLEIzIH19d+GqcSmYCmyKrUA9ndvo9TkD3DzemB1AvkBUuRCaj2g==", + "dev": true, + "dependencies": { + "@rushstack/node-core-library": "3.50.2", + "node-forge": "~1.3.1", + "sudo": "~1.0.3" + } + }, + "node_modules/@rushstack/debug-certificate-manager/node_modules/@rushstack/node-core-library": { + "version": "3.50.2", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.50.2.tgz", + "integrity": "sha512-+zpZBcaX5s+wA0avF0Lk3sd5jbGRo5SmsEJpElJbqQd3KGFvc/hcyeNSMqV5+esJ1JuTfnE1QyRt8nvxFNTaQg==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@rushstack/debug-certificate-manager/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@rushstack/debug-certificate-manager/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "node_modules/@rushstack/debug-certificate-manager/node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@rushstack/debug-certificate-manager/node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/@rushstack/eslint-config": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-config/-/eslint-config-2.5.1.tgz", + "integrity": "sha512-pcDQ/fmJEIqe5oZiP84bYZ1N7QoDfd+5G+e7GIobOwM793dX/SdRKqcJvGlzyBB92eo6rG7/qRnP2VVQN2pdbQ==", + "dev": true, + "dependencies": { + "@rushstack/eslint-patch": "1.1.0", + "@rushstack/eslint-plugin": "0.8.4", + "@rushstack/eslint-plugin-packlets": "0.3.4", + "@rushstack/eslint-plugin-security": "0.2.4", + "@typescript-eslint/eslint-plugin": "~5.6.0", + "@typescript-eslint/experimental-utils": "~5.6.0", + "@typescript-eslint/parser": "~5.6.0", + "@typescript-eslint/typescript-estree": "~5.6.0", + "eslint-plugin-promise": "~6.0.0", + "eslint-plugin-react": "~7.27.1", + "eslint-plugin-tsdoc": "~0.2.14" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0", + "typescript": ">=3.0.0" + } + }, + "node_modules/@rushstack/eslint-config/node_modules/@typescript-eslint/experimental-utils": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.6.0.tgz", + "integrity": "sha512-VDoRf3Qj7+W3sS/ZBXZh3LBzp0snDLEgvp6qj0vOAIiAPM07bd5ojQ3CTzF/QFl5AKh7Bh1ycgj6lFBJHUt/DA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.6.0", + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/typescript-estree": "5.6.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.0.tgz", + "integrity": "sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A==", + "dev": true + }, + "node_modules/@rushstack/eslint-plugin": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-plugin/-/eslint-plugin-0.8.4.tgz", + "integrity": "sha512-c8cY9hvak+1EQUGlJxPihElFB/5FeQCGyULTGRLe5u6hSKKtXswRqc23DTo87ZMsGd4TaScPBRNKSGjU5dORkg==", + "dev": true, + "dependencies": { + "@rushstack/tree-pattern": "0.2.2", + "@typescript-eslint/experimental-utils": "~5.3.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@rushstack/eslint-plugin-packlets": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-plugin-packlets/-/eslint-plugin-packlets-0.3.4.tgz", + "integrity": "sha512-OSA58EZCx4Dw15UDdvNYGGHziQmhiozKQiOqDjn8ZkrCM3oyJmI6dduSJi57BGlb/C4SpY7+/88MImId7Y5cxA==", + "dev": true, + "dependencies": { + "@rushstack/tree-pattern": "0.2.2", + "@typescript-eslint/experimental-utils": "~5.3.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@rushstack/eslint-plugin-packlets/node_modules/@typescript-eslint/experimental-utils": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", + "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@rushstack/eslint-plugin-packlets/node_modules/@typescript-eslint/scope-manager": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", + "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@rushstack/eslint-plugin-packlets/node_modules/@typescript-eslint/types": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", + "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@rushstack/eslint-plugin-packlets/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", + "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@rushstack/eslint-plugin-packlets/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", + "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.3.1", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@rushstack/eslint-plugin-packlets/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@rushstack/eslint-plugin-packlets/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@rushstack/eslint-plugin-packlets/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@rushstack/eslint-plugin-packlets/node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rushstack/eslint-plugin-security": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-plugin-security/-/eslint-plugin-security-0.2.4.tgz", + "integrity": "sha512-MWvM7H4vTNHXIY/SFcFSVgObj5UD0GftBM8UcIE1vXrPwdVYXDgDYXrSXdx7scWS4LYKPLBVoB3v6/Trhm2wug==", + "dev": true, + "dependencies": { + "@rushstack/tree-pattern": "0.2.2", + "@typescript-eslint/experimental-utils": "~5.3.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@rushstack/eslint-plugin-security/node_modules/@typescript-eslint/experimental-utils": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", + "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@rushstack/eslint-plugin-security/node_modules/@typescript-eslint/scope-manager": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", + "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@rushstack/eslint-plugin-security/node_modules/@typescript-eslint/types": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", + "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@rushstack/eslint-plugin-security/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", + "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@rushstack/eslint-plugin-security/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", + "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.3.1", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@rushstack/eslint-plugin-security/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@rushstack/eslint-plugin-security/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@rushstack/eslint-plugin-security/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@rushstack/eslint-plugin-security/node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rushstack/eslint-plugin/node_modules/@typescript-eslint/experimental-utils": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", + "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@rushstack/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", + "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@rushstack/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", + "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@rushstack/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", + "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@rushstack/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", + "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.3.1", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@rushstack/eslint-plugin/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@rushstack/eslint-plugin/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@rushstack/eslint-plugin/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@rushstack/eslint-plugin/node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rushstack/heft-config-file": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@rushstack/heft-config-file/-/heft-config-file-0.8.4.tgz", + "integrity": "sha512-OFvezlWYFQlKSXXIIjuGlBwSIKIl7WXYQ48diK/J5WJWpdVaq/SLVzB3coAxNZPA/a7u+dbs1DcLORBa2e133Q==", + "dev": true, + "dependencies": { + "@rushstack/node-core-library": "3.45.5", + "@rushstack/rig-package": "0.3.11", + "jsonpath-plus": "~4.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@rushstack/heft-config-file/node_modules/@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@rushstack/heft-config-file/node_modules/@rushstack/rig-package": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.11.tgz", + "integrity": "sha512-uI1/g5oQPtyrT9nStoyX/xgZSLa2b+srRFaDk3r1eqC7zA5th4/bvTGl2QfV3C9NcP+coSqmk5mFJkUfH6i3Lw==", + "dev": true, + "dependencies": { + "resolve": "~1.17.0", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/heft-config-file/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@rushstack/heft-config-file/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "node_modules/@rushstack/heft-config-file/node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@rushstack/heft-config-file/node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/@rushstack/loader-raw-script": { + "version": "1.3.228", + "resolved": "https://registry.npmjs.org/@rushstack/loader-raw-script/-/loader-raw-script-1.3.228.tgz", + "integrity": "sha512-yJPiwe4vCEmiZck9qUktYqVgExJV18C5wjO6Vv/l4ZWyI8WgYCei1eIcIJBtz//v3E18b8s6tKnSZDAUw1mhUQ==", + "dependencies": { + "loader-utils": "~1.1.0" + } + }, + "node_modules/@rushstack/module-minifier": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@rushstack/module-minifier/-/module-minifier-0.1.0.tgz", + "integrity": "sha512-hHrjM9wMfLjtRPHWvIJzCzRD2qTQGc2DseFdBkGB3/oaUwO8hHyVzyf2LSYjQChHlLYlaZNLLvk1f3g8UJ51dg==", + "dev": true, + "dependencies": { + "@rushstack/worker-pool": "0.1.0", + "@types/node": "12.20.24", + "serialize-javascript": "6.0.0", + "source-map": "~0.7.3", + "terser": "5.9.0" + } + }, + "node_modules/@rushstack/module-minifier/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@rushstack/module-minifier/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/@rushstack/module-minifier/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rushstack/module-minifier/node_modules/terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library": { + "version": "3.44.3", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.44.3.tgz", + "integrity": "sha512-Bt+R5LAnVr2BImTJqPpton5rvhJ2Wq8x4BaTqaCHQMmfxqtz5lb4nLYT9kneMJTCDuRMBvvLpSuz4MBj50PV3w==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@rushstack/node-core-library/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "node_modules/@rushstack/node-core-library/node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/@rushstack/package-deps-hash": { + "version": "3.2.17", + "resolved": "https://registry.npmjs.org/@rushstack/package-deps-hash/-/package-deps-hash-3.2.17.tgz", + "integrity": "sha512-VglZ9hB2ZgG4ov0dCTA9ceTl4DNSJyl2xX68BMUu/vU54t709yHSorx8iKhzYHD1NiF1QA0XfZhDxZWL/m01Nw==", + "dev": true, + "dependencies": { + "@rushstack/node-core-library": "3.45.5" + } + }, + "node_modules/@rushstack/package-deps-hash/node_modules/@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@rushstack/package-deps-hash/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@rushstack/package-deps-hash/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "node_modules/@rushstack/package-deps-hash/node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@rushstack/package-deps-hash/node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.2.12.tgz", + "integrity": "sha512-nbePcvF8hQwv0ql9aeQxcaMPK/h1OLAC00W7fWCRWIvD2MchZOE8jumIIr66HGrfG2X1sw++m/ZYI4D+BM5ovQ==", + "dev": true, + "dependencies": { + "resolve": "~1.17.0", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/rush-amazon-s3-build-cache-plugin": { + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/@rushstack/rush-amazon-s3-build-cache-plugin/-/rush-amazon-s3-build-cache-plugin-5.70.0.tgz", + "integrity": "sha512-Ky3qmG1+oH1J4Lm5UbbPzDzh7ThTW8jO+mD4lVYwrsbSG7nWEiLSNXKPYVqak2eKQaMJR8HoQ1J8CjPagxBNhA==", + "dev": true, + "dependencies": { + "@rushstack/node-core-library": "3.45.5", + "@rushstack/rush-sdk": "5.70.0", + "https-proxy-agent": "~5.0.0", + "node-fetch": "2.6.7" + } + }, + "node_modules/@rushstack/rush-amazon-s3-build-cache-plugin/node_modules/@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@rushstack/rush-amazon-s3-build-cache-plugin/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@rushstack/rush-amazon-s3-build-cache-plugin/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "node_modules/@rushstack/rush-amazon-s3-build-cache-plugin/node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@rushstack/rush-amazon-s3-build-cache-plugin/node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/@rushstack/rush-azure-storage-build-cache-plugin": { + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/@rushstack/rush-azure-storage-build-cache-plugin/-/rush-azure-storage-build-cache-plugin-5.70.0.tgz", + "integrity": "sha512-u8g73HN8LWRcsuxQro0gC9ORew3Y3I7OgNMIbOIpJqwaU2qstZzCwZwxHD4o6UeIr4vUZp0/x/9pKXFFKUdtfA==", + "dev": true, + "dependencies": { + "@azure/identity": "~1.0.0", + "@azure/storage-blob": "~12.3.0", + "@rushstack/node-core-library": "3.45.5", + "@rushstack/rush-sdk": "5.70.0", + "@rushstack/terminal": "0.3.41" + } + }, + "node_modules/@rushstack/rush-azure-storage-build-cache-plugin/node_modules/@azure/storage-blob": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.3.0.tgz", + "integrity": "sha512-nCySzNfm782pEW3sg9GHj1zE4gBeVVMeEBdWb4MefifrCwQQOoz5cXZTNFiUJAJqAO+/72r2UjZcUwHk/QmzkA==", + "dev": true, + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-http": "^1.2.0", + "@azure/core-lro": "^1.0.2", + "@azure/core-paging": "^1.1.1", + "@azure/core-tracing": "1.0.0-preview.9", + "@azure/logger": "^1.0.0", + "@opentelemetry/api": "^0.10.2", + "events": "^3.0.0", + "tslib": "^2.0.0" + } + }, + "node_modules/@rushstack/rush-azure-storage-build-cache-plugin/node_modules/@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@rushstack/rush-azure-storage-build-cache-plugin/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@rushstack/rush-azure-storage-build-cache-plugin/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "node_modules/@rushstack/rush-azure-storage-build-cache-plugin/node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@rushstack/rush-azure-storage-build-cache-plugin/node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/@rushstack/rush-sdk": { + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/@rushstack/rush-sdk/-/rush-sdk-5.70.0.tgz", + "integrity": "sha512-44yzEnL9koY/BeRVf8FCXVvLXMCcthHbbKOiIsAc+wjwjJ7rO5i+rGxUR5mdHB6plL1Rv3d4/ljeJhkEZjEPWg==", + "dev": true, + "dependencies": { + "@rushstack/node-core-library": "3.45.5", + "@types/node-fetch": "1.6.9", + "tapable": "2.2.1" + } + }, + "node_modules/@rushstack/rush-sdk/node_modules/@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@rushstack/rush-sdk/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@rushstack/rush-sdk/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "node_modules/@rushstack/rush-sdk/node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@rushstack/rush-sdk/node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/@rushstack/set-webpack-public-path-plugin": { + "version": "3.3.37", + "resolved": "https://registry.npmjs.org/@rushstack/set-webpack-public-path-plugin/-/set-webpack-public-path-plugin-3.3.37.tgz", + "integrity": "sha512-PGKZDbA68SxdZVfW3weyvqbO6vN9eir2Yqr5QUqwtDZ1t1KTfzTV2aKPLVMiwq4qsxkp+0GfXQtOwXlZ6nJHTA==", + "dev": true, + "dependencies": { + "@rushstack/webpack-plugin-utilities": "0.1.4" + }, + "peerDependencies": { + "@types/webpack": "^4.39.8", + "webpack": "^5.35.1" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@rushstack/stream-collator": { + "version": "4.0.172", + "resolved": "https://registry.npmjs.org/@rushstack/stream-collator/-/stream-collator-4.0.172.tgz", + "integrity": "sha512-lYwRDlsEB6dZMPzF4OJ5BsrLXsfF2NCV/XjONYW1q0lPFxFdxlYANJt746VlSU6p3ykD2OXb0Veywxrgf54qIA==", + "dev": true, + "dependencies": { + "@rushstack/node-core-library": "3.45.5", + "@rushstack/terminal": "0.3.41" + } + }, + "node_modules/@rushstack/stream-collator/node_modules/@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@rushstack/stream-collator/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@rushstack/stream-collator/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "node_modules/@rushstack/stream-collator/node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@rushstack/stream-collator/node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.3.41", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.3.41.tgz", + "integrity": "sha512-GfDZO4eYTHVXzNUAUY4poxTQ+MmkTmnhSq56J0zDolg5IZb/wVXEj4oeEnOXwlr/3LVE6sBv5yIkCstIo+u5Nw==", + "dev": true, + "dependencies": { + "@rushstack/node-core-library": "3.45.5", + "@types/node": "12.20.24", + "wordwrap": "~1.0.0" + } + }, + "node_modules/@rushstack/terminal/node_modules/@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@rushstack/terminal/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@rushstack/terminal/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "node_modules/@rushstack/terminal/node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@rushstack/terminal/node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/@rushstack/tree-pattern": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@rushstack/tree-pattern/-/tree-pattern-0.2.2.tgz", + "integrity": "sha512-0KdqI7hGtVIlxobOBLWet0WGiD70V/QoYQr5A2ikACeQmIaN4WT6Fn9BcvgwgaSIMcazEcD8ql7Fb9N4dKdQlA==", + "dev": true + }, + "node_modules/@rushstack/ts-command-line": { + "version": "4.7.10", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.7.10.tgz", + "integrity": "sha512-8t042g8eerypNOEcdpxwRA3uCmz0duMo21rG4Z2mdz7JxJeylDmzjlU3wDdef2t3P1Z61JCdZB6fbm1Mh0zi7w==", + "dev": true, + "dependencies": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, + "node_modules/@rushstack/typings-generator": { + "version": "0.6.24", + "resolved": "https://registry.npmjs.org/@rushstack/typings-generator/-/typings-generator-0.6.24.tgz", + "integrity": "sha512-5u49+43B+TCSQaCwEJRtaqarjhXBfI8ziWINnUpqtoTWZ+LLMC15QdgamjeyfKeFdAvFrFCIY3tlosfEzA5CeQ==", + "dev": true, + "dependencies": { + "@rushstack/node-core-library": "3.45.5", + "@types/node": "12.20.24", + "chokidar": "~3.4.0", + "glob": "~7.0.5" + } + }, + "node_modules/@rushstack/typings-generator/node_modules/@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@rushstack/typings-generator/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@rushstack/typings-generator/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@rushstack/typings-generator/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@rushstack/typings-generator/node_modules/chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/@rushstack/typings-generator/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "node_modules/@rushstack/typings-generator/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@rushstack/typings-generator/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/@rushstack/typings-generator/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@rushstack/typings-generator/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@rushstack/typings-generator/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@rushstack/typings-generator/node_modules/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, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/@rushstack/typings-generator/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@rushstack/typings-generator/node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@rushstack/typings-generator/node_modules/z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/@rushstack/webpack-plugin-utilities": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@rushstack/webpack-plugin-utilities/-/webpack-plugin-utilities-0.1.4.tgz", + "integrity": "sha512-CXCSJsI8nOH1tMXSjzTgbl6rIVhByizor5phuzRIqYTkWHdidvjb/HzQ97AB5gRD0OlYp4FhePUMArBDppUBhg==", + "dev": true, + "peerDependencies": { + "@types/webpack": "^4.39.8", + "webpack": "^5.35.1" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@rushstack/worker-pool": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@rushstack/worker-pool/-/worker-pool-0.1.0.tgz", + "integrity": "sha512-68qskCLruYWSLZDIRhYGklAXo8+lVm3drEQ3uQVXNCxb/Ow1byEDvtA0AaJleaZ/ZXZ5PN+Ct8WTzcD+ZxkUrg==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24" + } + }, + "node_modules/@rushstack/worker-pool/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "7.31.2", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz", + "integrity": "sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^4.2.2", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.6", + "lz-string": "^1.4.4", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz", + "integrity": "sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==", + "dev": true, + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/react": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.7.tgz", + "integrity": "sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^7.28.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@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, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/adal-angular": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/adal-angular/-/adal-angular-1.0.1.tgz", + "integrity": "sha512-2sRGxJYrluhvIz8ae98i5k5woe9Fics4dMFHTcNfY2xAkj5QGZor+sfZzlgM58Fpw7Kklau9Gn6OhgJP25dKug==" + }, + "node_modules/@types/anymatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-3.0.0.tgz", + "integrity": "sha512-qLChUo6yhpQ9k905NwL74GU7TxH+9UODwwQ6ICNI+O6EDMExqH/Cv9NsbmcZ7yC/rRXJ/AHCzfgjsFRY5fKjYw==", + "deprecated": "This is a stub types definition. anymatch provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "anymatch": "*" + } + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true + }, + "node_modules/@types/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.0.tgz", + "integrity": "sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/chalk": { + "version": "0.4.31", + "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz", + "integrity": "sha512-nF0fisEPYMIyfrFgabFimsz9Lnuu9MwkNrrlATm2E4E46afKDyeelT+8bXfw1VSc7sLBxMxRgT7PxTC2JcqN4Q==", + "dev": true + }, + "node_modules/@types/eslint": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true, + "peer": true + }, + "node_modules/@types/glob": { + "version": "5.0.30", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.30.tgz", + "integrity": "sha512-ZM05wDByI+WA153sfirJyEHoYYoIuZ7lA2dB/Gl8ymmpMTR78fNRtDMqa7Z6SdH4fZdLWZNRE6mZpx3XqBOrHw==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/glob-stream": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.1.tgz", + "integrity": "sha512-AGOUTsTdbPkRS0qDeyeS+6KypmfVpbT5j23SN8UPG63qjKXNKjXn6V9wZUr8Fin0m9l8oGYaPK8b2WUMF8xI1A==", + "dev": true, + "dependencies": { + "@types/glob": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/gulp": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/gulp/-/gulp-4.0.6.tgz", + "integrity": "sha512-0E8/iV/7FKWyQWSmi7jnUvgXXgaw+pfAzEB06Xu+l0iXVJppLbpOye5z7E2klw5akXd+8kPtYuk65YBcZPM4ow==", + "dev": true, + "dependencies": { + "@types/undertaker": "*", + "@types/vinyl-fs": "*", + "chokidar": "^2.1.2" + } + }, + "node_modules/@types/he": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/he/-/he-1.1.2.tgz", + "integrity": "sha512-kSJPcLO1x+oolc0R89pUl2kozldQ/fVQ1C1p5mp8fPoLdF/ZcBvckaTC2M8xXh3GYendXvCpy5m/a2eSbfgNgw==", + "dev": true + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "dev": true + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "26.0.24", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", + "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", + "dev": true, + "dependencies": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.14.117", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.117.tgz", + "integrity": "sha512-xyf2m6tRbz8qQKcxYZa7PA4SllYcay+eh25DN3jmNYY6gSTL7Htc/bttVdkqj2wfJGbeWlQiX8pIyJpKU+tubw==" + }, + "node_modules/@types/microsoft-ajax": { + "version": "0.0.37", + "resolved": "https://registry.npmjs.org/@types/microsoft-ajax/-/microsoft-ajax-0.0.37.tgz", + "integrity": "sha512-Y5WhLt8s/ADXSKROE067Qm7rGH/16jPYswPOKxFx9ipxldm2ZXPENzQuzyvuxqkHR2LFvsvbHIswmi05qdUD9g==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "10.17.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.13.tgz", + "integrity": "sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==", + "dev": true + }, + "node_modules/@types/node-fetch": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-1.6.9.tgz", + "integrity": "sha512-n2r6WLoY7+uuPT7pnEtKJCmPUGyJ+cbyBR8Avnu4+m1nzz7DwBVuyIvvlBzCZ/nrpC7rIgb3D6pNavL7rFEa9g==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@types/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-5v0PhPv0AManpxT7W25Zipmj/Lxp1WqfkcpZHyqSloB+gGoAHRBuzhrCelFKrPvNF5ki3gAcO4kxaGO2/21u8g==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@types/office-js": { + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/@types/office-js/-/office-js-1.0.36.tgz", + "integrity": "sha512-v5jOXCPS0nbbuVzZThhDMzttuJrpzzvx1GsPo5Qed8Cs9uzMwEV1vdkKN5zLFnAUlEF4s8Szl9KXnhnSvH89Kw==" + }, + "node_modules/@types/orchestrator": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/orchestrator/-/orchestrator-0.0.30.tgz", + "integrity": "sha512-rT9So631KbmirIGsZ5m6T15FKHqiWhYRULdl03l/WBezzZ8wwhYTS2zyfHjsvAGYFVff1wtmGFd0akRCBDSZrA==", + "dev": true, + "dependencies": { + "@types/q": "*" + } + }, + "node_modules/@types/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", + "dev": true + }, + "node_modules/@types/react": { + "version": "16.9.56", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.56.tgz", + "integrity": "sha512-gIkl4J44G/qxbuC6r2Xh+D3CGZpJ+NdWTItAPmZbR5mUS+JQ8Zvzpl0ea5qT/ZT3ZNTUcDKUVqV3xBE8wv/DyQ==", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-beautiful-dnd": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.2.tgz", + "integrity": "sha512-+OvPkB8CdE/bGdXKyIhc/Lm2U7UAYCCJgsqmopFmh9gbAudmslkI8eOrPDjg4JhwSE6wytz4a3/wRjKtovHVJg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-dom": { + "version": "16.9.16", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.16.tgz", + "integrity": "sha512-Oqc0RY4fggGA3ltEgyPLc3IV9T73IGoWjkONbsyJ3ZBn+UPPCYpU2ec0i3cEbJuEdZtkqcCF2l1zf2pBdgUGSg==", + "dependencies": { + "@types/react": "^16" + } + }, + "node_modules/@types/react-redux": { + "version": "7.1.24", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.24.tgz", + "integrity": "sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ==", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.18", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz", + "integrity": "sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==", + "dev": true, + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dev": true, + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/react-test-renderer": { + "version": "16.9.5", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.9.5.tgz", + "integrity": "sha512-C4cN7C2uSSGOYelp2XfdtJb5TsCP+QiZ+0Bm4U3ZfUswN8oN9O/l86XO/OvBSFCmWY7w75fzsQvZ50eGkFN34A==", + "dev": true, + "dependencies": { + "@types/react": "^16" + } + }, + "node_modules/@types/requirejs": { + "version": "2.1.29", + "resolved": "https://registry.npmjs.org/@types/requirejs/-/requirejs-2.1.29.tgz", + "integrity": "sha512-61MNgoBY6iEsHhFGiElSjEu8HbHOahJLGh9BdGSfzgAN+2qOuFJKuG3f7F+/ggKr+0yEM3Y4fCWAgxU6es0otg==" + }, + "node_modules/@types/sanitize-html": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/sanitize-html/-/sanitize-html-2.6.2.tgz", + "integrity": "sha512-7Lu2zMQnmHHQGKXVvCOhSziQMpa+R2hMHFefzbYoYMHeaXR0uXqNeOc3JeQQQ8/6Xa2Br/P1IQTLzV09xxAiUQ==", + "dev": true, + "dependencies": { + "htmlparser2": "^6.0.0" + } + }, + "node_modules/@types/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-iotVxtCCsPLRAvxMFFgxL8HD2l4mAZ2Oin7/VJ2ooWO0VOK4EGOGmZWZn1uCq7RofR3I/1IOSjCHlFT71eVK0Q==", + "dev": true + }, + "node_modules/@types/sharepoint": { + "version": "2016.1.10", + "resolved": "https://registry.npmjs.org/@types/sharepoint/-/sharepoint-2016.1.10.tgz", + "integrity": "sha512-eSt1ONJ4doMdJgXVyvwDZpmPKp7+P8plhkh6yvvd5KnRWPFTY1YqL9NP5kVit5GHqkLCdTj89nS06ETEj6YTKw==", + "dev": true, + "dependencies": { + "@types/microsoft-ajax": "*" + } + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "node_modules/@types/tapable": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", + "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", + "dev": true + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz", + "integrity": "sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==", + "dev": true, + "dependencies": { + "@types/jest": "*" + } + }, + "node_modules/@types/through2": { + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/@types/through2/-/through2-2.0.32.tgz", + "integrity": "sha512-VYclBauj55V0qPDHs9QMdKBdxdob6zta8mcayjTyOzlRgl+PNERnvNol99W1PBnvQXaYoTTqSce97rr9dz9oXQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/tunnel": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.1.tgz", + "integrity": "sha512-AOqu6bQu5MSWwYvehMXLukFHnupHrpZ8nvgae5Ggie9UwzDR1CCwoXgSSWNZJuyOlCdfdsWMA5F2LlmvyoTv8A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/uglify-js": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.0.tgz", + "integrity": "sha512-3HO6rm0y+/cqvOyA8xcYLweF0TKXlAxmQASjbOi49Co51A1N4nR4bEwBgRoD9kNM+rqFGArjKr654SLp2CoGmQ==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/undertaker": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@types/undertaker/-/undertaker-1.2.8.tgz", + "integrity": "sha512-gW3PRqCHYpo45XFQHJBhch7L6hytPsIe0QeLujlnFsjHPnXLhJcPdN6a9368d7aIQgH2I/dUTPFBlGeSNA3qOg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/undertaker-registry": "*", + "async-done": "~1.3.2" + } + }, + "node_modules/@types/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha512-Z4TYuEKn9+RbNVk1Ll2SS4x1JeLHecolIbM/a8gveaHsW0Hr+RQMraZACwTO2VD7JvepgA6UO1A1VrbktQrIbQ==", + "dev": true + }, + "node_modules/@types/vinyl": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.3.tgz", + "integrity": "sha512-hrT6xg16CWSmndZqOTJ6BGIn2abKyTw0B58bI+7ioUoj3Sma6u8ftZ1DTI2yCaJamOVGLOnQWiPH3a74+EaqTA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/vinyl-fs": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-2.4.12.tgz", + "integrity": "sha512-LgBpYIWuuGsihnlF+OOWWz4ovwCYlT03gd3DuLwex50cYZLmX3yrW+sFF9ndtmh7zcZpS6Ri47PrIu+fV+sbXw==", + "dev": true, + "dependencies": { + "@types/glob-stream": "*", + "@types/node": "*", + "@types/vinyl": "*" + } + }, + "node_modules/@types/webpack": { + "version": "4.41.24", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.24.tgz", + "integrity": "sha512-1A0MXPwZiMOD3DPMuOKUKcpkdPo8Lq33UGggZ7xio6wJ/jV1dAu5cXDrOfGDnldUroPIRLsr/DT43/GqOA4RFQ==", + "dev": true, + "dependencies": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-env": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz", + "integrity": "sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg==", + "dev": true + }, + "node_modules/@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/yargs": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-0.0.34.tgz", + "integrity": "sha512-Rrj9a2bqpcPKGYCIyQGkD24PeCZG3ow58cgaAtI4jwsUMe/9hDaCInMpXZ+PaUK3cVwsFUstpOEkSfMdQpCnYA==", + "dev": true + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.6.0.tgz", + "integrity": "sha512-MIbeMy5qfLqtgs1hWd088k1hOuRsN9JrHUPwVVKCD99EOUqScd7SrwoZl4Gso05EAP9w1kvLWUVGJOVpRPkDPA==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "5.6.0", + "@typescript-eslint/scope-manager": "5.6.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/experimental-utils": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.6.0.tgz", + "integrity": "sha512-VDoRf3Qj7+W3sS/ZBXZh3LBzp0snDLEgvp6qj0vOAIiAPM07bd5ojQ3CTzF/QFl5AKh7Bh1ycgj6lFBJHUt/DA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.6.0", + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/typescript-estree": "5.6.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.20.0.tgz", + "integrity": "sha512-w5qtx2Wr9x13Dp/3ic9iGOGmVXK5gMwyc8rwVgZU46K9WTjPZSyPvdER9Ycy+B5lNHvoz+z2muWhUvlTpQeu+g==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "5.20.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.6.0.tgz", + "integrity": "sha512-YVK49NgdUPQ8SpCZaOpiq1kLkYRPMv9U5gcMrywzI8brtwZjr/tG3sZpuHyODt76W/A0SufNjYt9ZOgrC4tLIQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.6.0", + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/typescript-estree": "5.6.0", + "debug": "^4.3.2" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.6.0.tgz", + "integrity": "sha512-1U1G77Hw2jsGWVsO2w6eVCbOg0HZ5WxL/cozVSTfqnL/eB9muhb8THsP0G3w+BB5xAHv9KptwdfYFAUfzcIh4A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/visitor-keys": "5.6.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.6.0.tgz", + "integrity": "sha512-OIZffked7mXv4mXzWU5MgAEbCf9ecNJBKi+Si6/I9PpTaj+cf2x58h2oHW5/P/yTnPkKaayfjhLvx+crnl5ubA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.6.0.tgz", + "integrity": "sha512-92vK5tQaE81rK7fOmuWMrSQtK1IMonESR+RJR2Tlc7w4o0MeEdjgidY/uO2Gobh7z4Q1hhS94Cr7r021fMVEeA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/visitor-keys": "5.6.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.20.0.tgz", + "integrity": "sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.20.0", + "@typescript-eslint/types": "5.20.0", + "@typescript-eslint/typescript-estree": "5.20.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.20.0.tgz", + "integrity": "sha512-h9KtuPZ4D/JuX7rpp1iKg3zOH0WNEa+ZIXwpW/KWmEFDxlA/HSfCMhiyF1HS/drTICjIbpA6OqkAhrP/zkCStg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.20.0", + "@typescript-eslint/visitor-keys": "5.20.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.20.0.tgz", + "integrity": "sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.20.0.tgz", + "integrity": "sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.20.0", + "@typescript-eslint/visitor-keys": "5.20.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.20.0.tgz", + "integrity": "sha512-1flRpNF+0CAQkMNlTJ6L/Z5jiODG/e5+7mk6XwtPOUS3UrTz3UOiAg9jG2VtKsWI6rZQfy4C6a232QNRZTRGlg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.20.0", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.6.0.tgz", + "integrity": "sha512-1p7hDp5cpRFUyE3+lvA74egs+RWSgumrBpzBCDzfTFv0aQ7lIeay80yU0hIxgAhwQ6PcasW35kaOCyDOv6O/Ng==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.6.0", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@uifabric/foundation": { + "version": "7.10.6", + "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-7.10.6.tgz", + "integrity": "sha512-o11QJ4T0kWvhU/Qev11DuVaYsItAvkNV2QAOFKeHQJKiQ5iXvigCNlbRu8/D6ikALppFy+8a+9mSuIEkKnTAyQ==", + "dependencies": { + "@uifabric/merge-styles": "^7.19.2", + "@uifabric/set-version": "^7.0.24", + "@uifabric/styling": "^7.21.2", + "@uifabric/utilities": "^7.35.0", + "tslib": "^1.10.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "@types/react-dom": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0", + "react-dom": ">=16.8.0 <18.0.0" + } + }, + "node_modules/@uifabric/foundation/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@uifabric/icons": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-7.7.2.tgz", + "integrity": "sha512-3f223BZ5TXTF37J7lG+saGBY7U8vAi5HyMP58ccIoUafOj5551h5sovPFD/hVIYzYFhvT+/VpbUzF3vw+RARHA==", + "dependencies": { + "@uifabric/set-version": "^7.0.24", + "@uifabric/styling": "^7.20.2", + "@uifabric/utilities": "^7.34.1", + "tslib": "^1.10.0" + } + }, + "node_modules/@uifabric/icons/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@uifabric/merge-styles": { + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-7.19.2.tgz", + "integrity": "sha512-kTlhwglDqwVgIaJq+0yXgzi65plGhmFcPrfme/rXUGMJZoU+qlGT5jXj5d3kuI59p6VB8jWEg9DAxHozhYeu0g==", + "dependencies": { + "@uifabric/set-version": "^7.0.24", + "tslib": "^1.10.0" + } + }, + "node_modules/@uifabric/merge-styles/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@uifabric/react-hooks": { + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@uifabric/react-hooks/-/react-hooks-7.15.1.tgz", + "integrity": "sha512-HPDsBsKiGarKR1SNuM632Q7DlxIUb8AuvABl7YAmPU3gCFZrLSyWfa43ucUwI/2mUxfQLdXKVB4wmMp6aOx+xg==", + "dependencies": { + "@fluentui/react-window-provider": "^1.0.3", + "@uifabric/set-version": "^7.0.24", + "@uifabric/utilities": "^7.35.0", + "tslib": "^1.10.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "@types/react-dom": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0", + "react-dom": ">=16.8.0 <18.0.0" + } + }, + "node_modules/@uifabric/react-hooks/node_modules/@fluentui/react-window-provider": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-1.0.3.tgz", + "integrity": "sha512-nFFhYlEWDSklAFjw87hQuOO5ZQP8or4J12ZJ7Glf+pcifRl0AySBshuGTJsTyZ0QyzgIeQYGSYf6wcPtycS0aA==", + "dependencies": { + "@uifabric/set-version": "^7.0.24", + "tslib": "^1.10.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "@types/react-dom": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0", + "react-dom": ">=16.8.0 <18.0.0" + } + }, + "node_modules/@uifabric/react-hooks/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@uifabric/set-version": { + "version": "7.0.24", + "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-7.0.24.tgz", + "integrity": "sha512-t0Pt21dRqdC707/ConVJC0WvcQ/KF7tKLU8AZY7YdjgJpMHi1c0C427DB4jfUY19I92f60LOQyhJ4efH+KpFEg==", + "dependencies": { + "tslib": "^1.10.0" + } + }, + "node_modules/@uifabric/set-version/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@uifabric/styling": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-7.21.2.tgz", + "integrity": "sha512-EeR+UyoHygy5ONYMmG7w3qFghGe3WbgQYLD11kvNKV+21iu4WMNkngsX7LzGWwMiTJyGY8WuhWqqojb9JJmQCQ==", + "dependencies": { + "@fluentui/theme": "^1.7.7", + "@microsoft/load-themed-styles": "^1.10.26", + "@uifabric/merge-styles": "^7.19.2", + "@uifabric/set-version": "^7.0.24", + "@uifabric/utilities": "^7.35.0", + "tslib": "^1.10.0" + } + }, + "node_modules/@uifabric/styling/node_modules/@fluentui/theme": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-1.7.7.tgz", + "integrity": "sha512-m3h0o2Pk0N+Q3VuiLM0uRitakYkb371Eso4moEuJTy/TTkVF+I3UKfoneArA5hycdqZ0xOXVVHSb9jUSaBWHAA==", + "dependencies": { + "@uifabric/merge-styles": "^7.19.2", + "@uifabric/set-version": "^7.0.24", + "@uifabric/utilities": "^7.35.0", + "tslib": "^1.10.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "@types/react-dom": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0", + "react-dom": ">=16.8.0 <18.0.0" + } + }, + "node_modules/@uifabric/styling/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@uifabric/utilities": { + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.35.0.tgz", + "integrity": "sha512-USbgKKJo70H9c7zBuBfSmP2DRMizjzftLkKwmFQIODZlwb0U4gFzx94aIsCGi5HNFydyVUtO1JOb+wzyLpPvJw==", + "dependencies": { + "@fluentui/dom-utilities": "^1.1.2", + "@uifabric/merge-styles": "^7.19.2", + "@uifabric/set-version": "^7.0.24", + "prop-types": "^15.7.2", + "tslib": "^1.10.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "@types/react-dom": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0", + "react-dom": ">=16.8.0 <18.0.0" + } + }, + "node_modules/@uifabric/utilities/node_modules/@fluentui/dom-utilities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@fluentui/dom-utilities/-/dom-utilities-1.1.2.tgz", + "integrity": "sha512-XqPS7l3YoMwxdNlaYF6S2Mp0K3FmVIOIy2K3YkMc+eRxu9wFK6emr2Q/3rBhtG5u/On37NExRT7/5CTLnoi9gw==", + "dependencies": { + "@uifabric/set-version": "^7.0.24", + "tslib": "^1.10.0" + } + }, + "node_modules/@uifabric/utilities/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-module-context/node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-module-context/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.0.2.tgz", + "integrity": "sha512-MqJ00WXw89ga0rK6GZkdmmgv3bAsxpJixyTthjcix73O44pBqotyU2BejBkLuIsaOBI6SEu77vAnSyLe5iIHkw==", + "dev": true + }, + "node_modules/@zkochan/cmd-shim": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@zkochan/cmd-shim/-/cmd-shim-5.3.1.tgz", + "integrity": "sha512-xoSqbd1iuV/dSID+OjTjQc/0wId/vhEqYBXbFu9SzpXGxhuzK6QN6CaF8i8v86q0FXX4n3/qD9ewUT6N5ngFQg==", + "dev": true, + "dependencies": { + "cmd-extension": "^1.0.2", + "is-windows": "^1.0.2" + }, + "engines": { + "node": ">=10.13" + } + }, + "node_modules/abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "dependencies": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adal-angular": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/adal-angular/-/adal-angular-1.0.16.tgz", + "integrity": "sha512-tJf2bRwolKA8/J+wcy4CFOTAva8gpueHplptfjz3Wt1XOb7Y1jnwdm2VdkFZQUhxCtd/xPvcRSAQP2+ROtAD5g==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/agent-base": { + "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, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==", + "dev": true + }, + "node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-escapes": { + "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, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==", + "dev": true, + "dependencies": { + "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", + "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==", + "dev": true, + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==", + "dev": true, + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==", + "dev": true + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==", + "dev": true, + "dependencies": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-initial/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "dependencies": { + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "dependencies": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", + "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "dev": true + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha512-qEdtR2UH78yyHX/AUNfXmJTlM48XoFZKBdwi1nzkI1mJL21cmbu0cvjxjpkXJ5NENMq42H+hNs8VLJcqXLerBQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==", + "dev": true, + "dependencies": { + "async-done": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dev": true, + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.5.1.tgz", + "integrity": "sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==", + "dev": true, + "dependencies": { + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^25.5.0", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz", + "integrity": "sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz", + "integrity": "sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz", + "integrity": "sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^25.5.0", + "babel-preset-current-node-syntax": "^0.1.2" + }, + "engines": { + "node": ">= 8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==", + "dev": true, + "dependencies": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha512-3vqtKL1N45I5dV0RdssXZG7X6pCqQrWPNOlBPZPrd+QkE2HEhR57Z04m0KtpbsZH73j+a3F8UD1TQnn+ExTvIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/better-path-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", + "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", + "dev": true, + "dependencies": { + "is-windows": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha512-YQyoqQG3sO8iCmf8+hyVpgHHOv0/hCEFiS4zTGUwTA1HjAFX66wRcNQrVCeJq9pgESMRvUAOvSil5MJlmccuKQ==", + "dev": true, + "dependencies": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/bonjour/node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "dependencies": { + "resolve": "1.1.7" + } + }, + "node_modules/browser-resolve/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/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, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", + "dev": true + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "dev": true, + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "dev": true, + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "dev": true, + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001381", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001381.tgz", + "integrity": "sha512-fEnkDOKpvp6qc+olg7+NzE1SqyfiyKf4uci7fAU38M3zxs0YOyKOxW/nMZ2l9sJbt7KZHcDIxUnbI0Iime7V4w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/chokidar/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/chokidar/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/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 + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "dev": true, + "dependencies": { + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/cli-table/node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone-deep/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", + "dev": true + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/cmd-extension": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cmd-extension/-/cmd-extension-1.0.2.tgz", + "integrity": "sha512-iWDjmP8kvsMdBmLTHxFaqXikO8EdFRDfim7k6vUHglY/2xJ5jLrPsnQGijdfp4U+sr/BeecG0wKm02dSIAeQ1g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/coa/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==", + "dev": true, + "dependencies": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/color/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, + "node_modules/colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/compressed-json": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/compressed-json/-/compressed-json-1.0.16.tgz", + "integrity": "sha512-fklkJ76BEyTPMbLv75nEEhFyHSLS0dt0AIGECBeCgd7O/IECIg7khOIi+2aKIutrjHaazr5J8M7edVDFEfRA/g==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect-livereload": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz", + "integrity": "sha512-3KnRwsWf4VmP01I4hCDQqTc4e2UxOvJIi8i08GiwqX2oymzxNFY7PqjFkwHglYTJ0yzUJkO5yqdPxVaIz3Pbug==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/connect/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-concurrently/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/copy-concurrently/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/copy-concurrently/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/copy-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-props": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", + "dev": true, + "dependencies": { + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.4.tgz", + "integrity": "sha512-zCazfdYAh3q/O4VzZFiadWGpDA2zTs6FC6D7YTHD6H1J40pzo0H4z22h1NYMCl4ArQP4CK8y/KWqPrJ4rVkZ5A==", + "dev": true, + "dependencies": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^2.7.0", + "serialize-javascript": "^4.0.0", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/copy-webpack-plugin/node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/copy-webpack-plugin/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/copy-webpack-plugin/node_modules/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, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/core-js-pure": { + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.24.1.tgz", + "integrity": "sha512-r1nJk41QLLPyozHUUPmILCEMtMw24NG4oWK6RbsDdjzQgg9ZvrUsPBj1MnG0wXXp1DCDU6j+wUvEmBSrtRbLXg==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/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": "sha512-XWOBwgy5nwBn76aA+6ybUGL/3JBnCtBX9Ay9/OWIpzKYWlVHMazvJ+WtHumfi+xxdPF440cWK7JCYtt8xDifew==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/css-modules-loader-core/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-modules-loader-core/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-modules-loader-core/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-modules-loader-core/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/css-modules-loader-core/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/css-modules-loader-core/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-modules-loader-core/node_modules/postcss": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz", + "integrity": "sha512-VbGX1LQgQbf9l3cZ3qbUuC3hGqIEOGQFHAEHQ/Diaeo0yLgpgK5Rb8J+OcamIfQ9PbAU/fzBjVtQX3AhJHUvZw==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/css-modules-loader-core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-modules-loader-core/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-modules-loader-core/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/css-select/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dev": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/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 + }, + "node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.3.1.tgz", + "integrity": "sha512-tNvaxM5blOnxanyxI6panOsnfiyLRj3HV4qjqqS45WPNS1usdYWRUQjqTEEELK73lpeP/1KoIGYUwrBn/VcECA==", + "dev": true, + "dependencies": { + "cssom": "0.3.x" + } + }, + "node_modules/csstype": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", + "dev": true + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "node_modules/data-urls/node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/decache": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/decache/-/decache-4.5.1.tgz", + "integrity": "sha512-5J37nATc6FmOTLbcsr9qx7Nm28qQyg1SK4xyEHqM0IBkNhWFp0Sm+vKoWYHD8wq+OUEb9jLyaKFfzzd1A9hcoA==", + "dev": true, + "dependencies": { + "callsite": "^1.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", + "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==", + "dev": true + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decomment": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/decomment/-/decomment-0.9.5.tgz", + "integrity": "sha512-h0TZ8t6Dp49duwyDHo3iw67mnh9/UpFiSSiOb5gDK1sqoXzrfX/SQxIUQd2R2QEiSnqib0KF2fnKnGfAhAs6lg==", + "dev": true, + "dependencies": { + "esprima": "4.0.1" + }, + "engines": { + "node": ">=6.4", + "npm": ">=2.15" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "dependencies": { + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/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, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/default-gateway/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/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, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/default-gateway/node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/default-gateway/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/default-gateway/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/default-gateway/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==", + "dev": true, + "dependencies": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/del/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "dev": true + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", + "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==", + "dev": true + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "dependencies": { + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", + "dev": true, + "dependencies": { + "readable-stream": "~1.1.9" + } + }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "node_modules/each-props/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.226", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.226.tgz", + "integrity": "sha512-CvevLaSiUp0u12K0e+QhMX1hn724nSUNO9ToBek+FMHk/5RofrQs5MChjrD0re0IwqxDFxFMSZD+uic05i2Z5w==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", + "integrity": "sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==", + "dev": true, + "dependencies": { + "once": "~1.3.0" + } + }, + "node_modules/end-of-stream/node_modules/once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true, + "peer": true + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-templates": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", + "integrity": "sha512-sziUVwcvQ+lOsrTyUY0Q11ilAPj+dy7AQ1E1MgSaHTaaAFTffaa08QSlGNU61iyVaroyb6nYdBV6oD7nzn6i8w==", + "dev": true, + "dependencies": { + "recast": "~0.11.12", + "through": "~2.3.6" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", + "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.3", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz", + "integrity": "sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.27.1.tgz", + "integrity": "sha512-meyunDjMMYeWr/4EBLTV1op3iSG3mjT/pz5gti38UzfM4OPpNc2m0t2xvKCOMU5D6FSdd34BIMFOvQbW+i8GAA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flatmap": "^1.2.5", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.0", + "object.values": "^1.1.5", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-tsdoc": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.16.tgz", + "integrity": "sha512-F/RWMnyDQuGlg82vQEFHQtGyWi7++XJKdYNn0ulIbyMOFqYIjoJOUdE6olORxgwgLkpJxsCJpJbTHgxJ/ggfXw==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "0.16.1" + } + }, + "node_modules/eslint-plugin-tsdoc/node_modules/@microsoft/tsdoc": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", + "integrity": "sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw==", + "dev": true + }, + "node_modules/eslint-plugin-tsdoc/node_modules/@microsoft/tsdoc-config": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.1.tgz", + "integrity": "sha512-2RqkwiD4uN6MLnHFljqBlZIXlt/SaUT6cuogU1w2ARw4nKuuppSmR0+s+NC+7kXBQykd9zzu0P4HtBpZT5zBpQ==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.1", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + } + }, + "node_modules/eslint-plugin-tsdoc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint-plugin-tsdoc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint-plugin-tsdoc/node_modules/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, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, + "node_modules/eslint/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "peer": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "peer": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", + "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-stream": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz", + "integrity": "sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", + "dev": true + }, + "node_modules/execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "dev": true, + "dependencies": { + "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", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": "^8.12.0 || >=9.7.0" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.5.0.tgz", + "integrity": "sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "ansi-styles": "^4.0.0", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-regex-util": "^25.2.6" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "dependencies": { + "type": "^2.5.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/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, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-glob/node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fifo": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/fifo/-/fifo-2.4.1.tgz", + "integrity": "sha512-XTbUCNmo54Jav0hcL6VxDuY4x1eCQH61HEF80C2Oww283pfjQ2C8avZeyq4v43sW2S2403kmzssE9j4lbF66Sg==", + "dev": true + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/findup-sync/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fined/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/fork-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz", + "integrity": "sha512-Pqq5NnT78ehvUnAk/We/Jr22vSvanRlFTpAmQ88xBY/M1TlHe+P0ILuEyXS595ysdGfaj22634LBkGMA2GTcpA==", + "dev": true + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "dev": true + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-names": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz", + "integrity": "sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0" + } + }, + "node_modules/generic-pool": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.4.4.tgz", + "integrity": "sha512-9GicuYkryPAwzKW2Vpfus1zC28ER7mwWEZgY7F+6RqpPMK4N8XpkxzAr4CuPf10NrzW0f/kQ4AmeDVgFhdwjAQ==", + "dev": true, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/gensync": { + "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, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/git-repo-info": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/git-repo-info/-/git-repo-info-2.1.1.tgz", + "integrity": "sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg==", + "dev": true, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha512-f8c0rE8JiCxpa52kWPAOa3ZaYEnzofDzCQLCn3Vdk0Z5OVLq3BsRFJI4S4ykpeVW6QMGBUkMeUpoEgWnMTnw5Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-escape": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/glob-escape/-/glob-escape-0.0.2.tgz", + "integrity": "sha512-L/cXYz8x7qer1HAyUQ+mbjcUsJVdpRxpAf7CwqHoNBs9vTpABlGfNN4tzkDxt+u3Z7ZncVyKlCNPtzb0R/7WbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-stream/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-stream/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, + "node_modules/glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-watcher/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/glob-watcher/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true, + "peer": true + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", + "dev": true + }, + "node_modules/gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "dependencies": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-cli/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/gulp-cli/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/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, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/gulp-cli/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/gulp-cli/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/yargs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" + } + }, + "node_modules/gulp-cli/node_modules/yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "node_modules/gulp-connect": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/gulp-connect/-/gulp-connect-5.5.0.tgz", + "integrity": "sha512-oRBLjw/4EVaZb8g8OcxOVdGD8ZXYrRiWKcNxlrGjxb/6Cp0GDdqw7ieX7D8xJrQS7sbXT+G94u63pMJF3MMjQA==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "connect": "^3.6.5", + "connect-livereload": "^0.5.4", + "event-stream": "^3.3.2", + "fancy-log": "^1.3.2", + "send": "^0.13.2", + "serve-index": "^1.9.1", + "serve-static": "^1.13.1", + "tiny-lr": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-connect/node_modules/debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw==", + "dev": true, + "dependencies": { + "ms": "0.7.1" + } + }, + "node_modules/gulp-connect/node_modules/etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha512-Mbv5pNpLNPrm1b4rzZlZlfTRpdDr31oiD43N362sIyvSWVNu5Du33EcJGzvEV4YdYLuENB1HzND907cQkFmXNw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/gulp-connect/node_modules/fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha512-akx5WBKAwMSg36qoHTuMMVncHWctlaDGslJASDYAhoLrzDUDCjZlOngNa/iC6lPm9aA0qk8pN5KnpmbJHSIIQQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/gulp-connect/node_modules/http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha512-gMygNskMurDCWfoCdyh1gOeDfSbkAHXqz94QoPj5IHIUjC/BG8/xv7FSEUr7waR5RcAya4j58bft9Wu/wHNeXA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.1", + "statuses": "1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/gulp-connect/node_modules/mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha512-sAaYXszED5ALBt665F0wMQCUXpGuZsGdopoqcHPdL39ZYdi7uHoZlhrfZfhv8WzivhBzr/oXwaj+yiK5wY8MXQ==", + "dev": true, + "bin": { + "mime": "cli.js" + } + }, + "node_modules/gulp-connect/node_modules/ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha512-lRLiIR9fSNpnP6TC4v8+4OU7oStC01esuNowdQ34L+Gk8e5Puoc88IqJ+XAY/B3Mn2ZKis8l8HX90oU8ivzUHg==", + "dev": true + }, + "node_modules/gulp-connect/node_modules/range-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "integrity": "sha512-nDsRrtIxVUO5opg/A8T2S3ebULVIfuh8ECbh4w3N4mWxIiT3QILDJDUQayPqm2e8Q8NUa0RSUkGCfe33AfjR3Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/gulp-connect/node_modules/send": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.2.tgz", + "integrity": "sha512-cQ0rmXHrdO2Iof08igV2bG/yXWD106ANwBg6DkGQNT2Vsznbgq6T0oAIQboy1GoFsIuy51jCim26aA9tj3Z3Zg==", + "dev": true, + "dependencies": { + "debug": "~2.2.0", + "depd": "~1.1.0", + "destroy": "~1.0.4", + "escape-html": "~1.0.3", + "etag": "~1.7.0", + "fresh": "0.3.0", + "http-errors": "~1.3.1", + "mime": "1.3.4", + "ms": "0.7.1", + "on-finished": "~2.3.0", + "range-parser": "~1.0.3", + "statuses": "~1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/gulp-connect/node_modules/statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha512-pVEuxHdSGrt8QmQ3LOZXLhSA6MP/iPqKzZeO6Squ7PNGkA/9MBsSfV0/L+bIxkoDmjF4tZcLpcVq/fkqoHvuKg==", + "dev": true + }, + "node_modules/gulp-flatten": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/gulp-flatten/-/gulp-flatten-0.2.0.tgz", + "integrity": "sha512-8kKeBDfHGx0CEWoB6BPh5bsynUG2VGmSz6hUlX531cfDz/+PRYZa9i3e3+KYuaV0GuCsRZNThSRjBfHOyypy8Q==", + "dev": true, + "dependencies": { + "gulp-util": "^3.0.1", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/gulp-if": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz", + "integrity": "sha512-tV0UfXkZodpFq6CYxEqH8tqLQgN6yR9qOhpEEN3O6N5Hfqk3fFLcbAavSex5EqnmoQjyaZ/zvgwclvlTI1KGfw==", + "dev": true, + "dependencies": { + "gulp-match": "^1.0.3", + "ternary-stream": "^2.0.1", + "through2": "^2.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/gulp-match": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.1.0.tgz", + "integrity": "sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.3" + } + }, + "node_modules/gulp-open": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/gulp-open/-/gulp-open-3.0.1.tgz", + "integrity": "sha512-dohokw+npnt48AsD0hhvCLEHLnDMqM35F+amvIfJlX1H2nNHYUClR0Oy1rI0TvbL1/pHiHGNLmohhk+kvwIKjA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "dependencies": { + "colors": "^1.1.2", + "opn": "5.2.0", + "plugin-log": "^0.1.0", + "through2": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha512-q5oWPc12lwSFS9h/4VIjG+1NuNDlJ48ywV2JKItY4Ycc/n1fXJeYPVQsfu5ZrhQi7FGSDBalwUCLar/GyHXKGw==", + "deprecated": "gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5", + "dev": true, + "dependencies": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/gulp-util/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/gulp-util/node_modules/clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==", + "dev": true + }, + "node_modules/gulp-util/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/gulp-util/node_modules/object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/gulp-util/node_modules/vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha512-P5zdf3WB9uzr7IFoVQ2wZTmUwHL8cMZWJGzLBNCHNZ3NB6HTMsYABtt7z8tAGIINLXyAob9B9a1yzVGMFOYKEA==", + "dev": true, + "dependencies": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/gulp-zip": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-5.1.0.tgz", + "integrity": "sha512-XZr/y91IliK/SpR74g3TkZejGkGEmK7CSDjSghT1jXshgO+dFvpLIz9w9fpuwkew6i7k4F+G24TubNgq1ISzEw==", + "dev": true, + "dependencies": { + "get-stream": "^5.2.0", + "plugin-error": "^1.0.1", + "through2": "^3.0.1", + "vinyl": "^2.1.0", + "yazl": "^2.5.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "gulp": ">=4" + }, + "peerDependenciesMeta": { + "gulp": { + "optional": true + } + } + }, + "node_modules/gulp-zip/node_modules/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==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "node_modules/gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==", + "dev": true, + "dependencies": { + "glogg": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/har-validator/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/har-validator/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha512-+F4GzLjwHNNDEAJW2DC1xXfEoPkRDmUdJ7CBYw4MpqtDwOnqdImJl7GWlpqx+Wko6//J8uKTnIe4wZSv7yCqmw==", + "dev": true, + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/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, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "node_modules/history": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "dependencies": { + "@babel/runtime": "^7.7.6" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==", + "dev": true + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==", + "dev": true + }, + "node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/html-loader": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz", + "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==", + "dev": true, + "dependencies": { + "es6-templates": "^0.2.3", + "fastparse": "^1.1.1", + "html-minifier": "^3.5.8", + "loader-utils": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", + "dev": true + }, + "node_modules/icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dev": true, + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", + "dev": true + }, + "node_modules/ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "dev": true + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", + "dev": true, + "dependencies": { + "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dev": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==", + "dev": true + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/inpath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inpath/-/inpath-1.0.2.tgz", + "integrity": "sha512-DTt55ovuYFC62a8oJxRjV2MmTPUdxN43Gd8I2ZgawxbAha6PvJkDQy/RbZGFCJF5IXrpp4PAYtW1w3aV7jXkew==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==", + "dev": true, + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-subdir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", + "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", + "dev": true, + "dependencies": { + "better-path-resolve": "1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "dependencies": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + } + }, + "node_modules/isomorphic-fetch/node_modules/whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.5.0.tgz", + "integrity": "sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "execa": "^3.2.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-cli": { + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.4.0.tgz", + "integrity": "sha512-usyrj1lzCJZMRN1r3QEdnn8e6E6yCx/QN7+B1sLoA68V7f3WlsxSSQfy0+BAwRiF4Hz2eHauf11GZG3PIfWTXQ==", + "dev": true, + "dependencies": { + "@jest/core": "^25.4.0", + "@jest/test-result": "^25.4.0", + "@jest/types": "^25.4.0", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^25.4.0", + "jest-util": "^25.4.0", + "jest-validate": "^25.4.0", + "prompts": "^2.0.1", + "realpath-native": "^2.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-cli/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest-cli/node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/jest-cli/node_modules/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 + }, + "node_modules/jest-cli/node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "node_modules/jest-cli/node_modules/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, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/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, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-config": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.5.4.tgz", + "integrity": "sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^25.5.4", + "@jest/types": "^25.5.0", + "babel-jest": "^25.5.1", + "chalk": "^3.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^25.5.0", + "jest-environment-node": "^25.5.0", + "jest-get-type": "^25.2.6", + "jest-jasmine2": "^25.5.4", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", + "micromatch": "^4.0.2", + "pretty-format": "^25.5.0", + "realpath-native": "^2.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-config/node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/jest-config/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jest-config/node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/jest-config/node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/jest-environment-jsdom": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz", + "integrity": "sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A==", + "dev": true, + "dependencies": { + "@jest/environment": "^25.5.0", + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", + "jsdom": "^15.2.1" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-config/node_modules/jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "dev": true, + "dependencies": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-config/node_modules/parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true + }, + "node_modules/jest-config/node_modules/pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-config/node_modules/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "dependencies": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-config/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/jest-config/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/jest-config/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-docblock": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.3.0.tgz", + "integrity": "sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-each": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.5.0.tgz", + "integrity": "sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "jest-util": "^25.5.0", + "pretty-format": "^25.5.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.4.0.tgz", + "integrity": "sha512-KTitVGMDrn2+pt7aZ8/yUTuS333w3pWt1Mf88vMntw7ZSBNDkRS6/4XLbFpWXYfWfp1FjcjQTOKzbK20oIehWQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^25.4.0", + "@jest/fake-timers": "^25.4.0", + "@jest/types": "^25.4.0", + "jest-mock": "^25.4.0", + "jest-util": "^25.4.0", + "jsdom": "^15.2.1" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-environment-jsdom/node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/jest-environment-jsdom/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/jest-environment-jsdom/node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/jest-environment-jsdom/node_modules/jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "dev": true, + "dependencies": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-jsdom/node_modules/parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true + }, + "node_modules/jest-environment-jsdom/node_modules/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "dependencies": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-environment-jsdom/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/jest-environment-jsdom/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/jest-environment-node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.5.0.tgz", + "integrity": "sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA==", + "dev": true, + "dependencies": { + "@jest/environment": "^25.5.0", + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-environment-node/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-haste-map": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.5.1.tgz", + "integrity": "sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "@types/graceful-fs": "^4.1.2", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-serializer": "^25.5.0", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 8.3" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/jest-haste-map/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/jest-jasmine2": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz", + "integrity": "sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^25.5.0", + "@jest/source-map": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "co": "^4.6.0", + "expect": "^25.5.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^25.5.0", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-runtime": "^25.5.4", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "pretty-format": "^25.5.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-jasmine2/node_modules/pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-leak-detector": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz", + "integrity": "sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA==", + "dev": true, + "dependencies": { + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-matcher-utils": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", + "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "jest-diff": "^25.5.0", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-matcher-utils/node_modules/diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-message-util": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^25.5.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^1.0.1" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-mock": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.5.0.tgz", + "integrity": "sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-nunit-reporter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jest-nunit-reporter/-/jest-nunit-reporter-1.3.1.tgz", + "integrity": "sha512-yeERKTYPZutqdNIe3EHjoSAjhPxd5J5Svd8ULB/eiqDkn0EI2n8W4OVTuyFwY5b23hw5f0RLDuEvBjy5V95Ffw==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1", + "read-pkg": "^3.0.0", + "xml": "^1.0.1" + } + }, + "node_modules/jest-nunit-reporter/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", + "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", + "dev": true, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-resolve": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.5.1.tgz", + "integrity": "sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "browser-resolve": "^1.11.3", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.1", + "read-pkg-up": "^7.0.1", + "realpath-native": "^2.0.0", + "resolve": "^1.17.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz", + "integrity": "sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "jest-regex-util": "^25.2.6", + "jest-snapshot": "^25.5.1" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-runner": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.5.4.tgz", + "integrity": "sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg==", + "dev": true, + "dependencies": { + "@jest/console": "^25.5.0", + "@jest/environment": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^25.5.4", + "jest-docblock": "^25.3.0", + "jest-haste-map": "^25.5.1", + "jest-jasmine2": "^25.5.4", + "jest-leak-detector": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-resolve": "^25.5.1", + "jest-runtime": "^25.5.4", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-runtime": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.5.4.tgz", + "integrity": "sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ==", + "dev": true, + "dependencies": { + "@jest/console": "^25.5.0", + "@jest/environment": "^25.5.0", + "@jest/globals": "^25.5.2", + "@jest/source-map": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^25.5.4", + "jest-haste-map": "^25.5.1", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.5.1", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", + "realpath-native": "^2.0.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-runtime/node_modules/@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-runtime/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest-runtime/node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-runtime/node_modules/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 + }, + "node_modules/jest-runtime/node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/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, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/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, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-serializer": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.5.0.tgz", + "integrity": "sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-snapshot": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.5.1.tgz", + "integrity": "sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0", + "@jest/types": "^25.5.0", + "@types/prettier": "^1.19.0", + "chalk": "^3.0.0", + "expect": "^25.5.0", + "graceful-fs": "^4.2.4", + "jest-diff": "^25.5.0", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-resolve": "^25.5.1", + "make-dir": "^3.0.0", + "natural-compare": "^1.4.0", + "pretty-format": "^25.5.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-snapshot/node_modules/diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jest-util": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "make-dir": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-validate": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.5.0.tgz", + "integrity": "sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "leven": "^3.1.0", + "pretty-format": "^25.5.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-watcher": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.5.0.tgz", + "integrity": "sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q==", + "dev": true, + "dependencies": { + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "jest-util": "^25.5.0", + "string-length": "^3.1.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-worker": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", + "dev": true, + "dependencies": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest/node_modules/@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "node-notifier": "^8.0.0" + } + }, + "node_modules/jest/node_modules/@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/jest/node_modules/@types/prettier": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz", + "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==", + "dev": true + }, + "node_modules/jest/node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/jest/node_modules/@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest/node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/jest/node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/jest/node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jest/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jest/node_modules/babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "dependencies": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/jest/node_modules/babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@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.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/jest/node_modules/babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/jest/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest/node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/jest/node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/jest/node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest/node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/jest/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest/node_modules/expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/jest/node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/jest/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest/node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest/node_modules/jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest/node_modules/jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/jest/node_modules/jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "dependencies": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest/node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/jest/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest/node_modules/node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "dev": true, + "optional": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node_modules/jest/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/jest/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/jest/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/jest/node_modules/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 + }, + "node_modules/jest/node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jest/node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest/node_modules/stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/jest/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/jest/node_modules/v8-to-istanbul": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/jest/node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest/node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/jest/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest/node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "node_modules/jest/node_modules/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, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/jest/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/jest/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/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, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest/node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/jsdom": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.11.0.tgz", + "integrity": "sha512-ou1VyfjwsSuWkudGxb03FotDajxAto6USAlmMZjE2lc0jCznt7sBWkhfRBRaWwbnmDqdMSTKTLT5d9sBFkkM7A==", + "dev": true, + "dependencies": { + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.3.1 < 0.4.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwsapi": "^2.0.0", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath-plus": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-4.0.0.tgz", + "integrity": "sha512-e0Jtg4KAzDJKKwzbLaUtinCn0RZseWBVRTRGihSpvFlM3wTR7ExSp+PTdeTsDrLNJUe7L7JYJe8mblHX5SCT6A==", + "dev": true, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jszip": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", + "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "node_modules/just-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", + "dev": true + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dev": true, + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dev": true, + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==", + "dev": true, + "dependencies": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dev": true, + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==", + "dev": true, + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "deprecated": "use String.prototype.padStart()", + "dev": true + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/liftoff/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true + }, + "node_modules/load-json-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", + "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "parse-json": "^5.0.0", + "strip-bom": "^4.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/load-json-file/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha512-gkD9aSEG9UGglyPcDJqY9YBTUtCLKaBK6ihD2VP1d1X60lTfFspNZNulGBBbUZLkPygy4LySYHyxBpq+VhjObQ==", + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", + "dev": true + }, + "node_modules/lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha512-mTzAr1aNAv/i7W43vOR/uD/aJ4ngbtsRaCubp2BfZhlGU/eORUjg/7F6X0orNMdv33JOrdgGybtvMN/po3EWrA==", + "dev": true + }, + "node_modules/lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha512-H94wl5P13uEqlCg7OcNNhMQ8KvWSIyqXzOPusRgHC9DK3o54P6P3xtbXlVbRABG4q5gSmp7EDdJ0MSuW9HX6Mg==", + "dev": true + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true + }, + "node_modules/lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", + "dev": true + }, + "node_modules/lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha512-Sjlavm5y+FUVIF3vF3B75GyXrzsfYV8Dlv3L4mEpuB9leg8N6yf/7rU06iLPx9fY0Mv3khVp9p7Dx0mGV6V5OQ==", + "dev": true + }, + "node_modules/lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha512-OrPwdDc65iJiBeUe5n/LIjd7Viy99bKwDdk7Z5ljfZg0uFRFlfQaCy9tZ4YMAag9WAZmlVpe1iZrkIMMSMHD3w==", + "dev": true + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, + "node_modules/lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==", + "dev": true + }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha512-n1PZMXgaaDWZDSvuNZ/8XOcYO2hOKDqZel5adtR30VKQAtoWs/5AOeFA0vPV8moiPzlqe7F4cP2tzpFewQyelQ==", + "dev": true, + "dependencies": { + "lodash._root": "^3.0.0" + } + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true + }, + "node_modules/lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", + "dev": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", + "dev": true, + "dependencies": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", + "dev": true + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "node_modules/lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha512-0B4Y53I0OgHUJkt+7RmlDFWKjVAI/YUpWNiL9GQz5ORDr4ttgfQGo+phBWKFLJbBdtOwgMuUkdOHOnPg45jKmQ==", + "dev": true, + "dependencies": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha512-TcrlEr31tDYnWkHFWDCV3dHYroKEXpJZ2YJYvJdhN+y4AkWMDZ5I4I8XDtUKqSAyG81N7w+I1mFEJtcED+tGqQ==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "dev": true, + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/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, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/make-iterator/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", + "dev": true + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==", + "dev": true, + "dependencies": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/matchdep/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/matchdep/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dev": true, + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/meow/node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/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, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/meow/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dev": true, + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/meow/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.0.3.tgz", + "integrity": "sha512-KgI4P7MSM31MNBftGJ07WBsLYLx7z9mQsL6+bcHk80AdmUA3cPzX69MK6dSgEgSF9TXLOl040pgo0XP/VTMENA==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/micromatch/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/micromatch/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/micromatch/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/minipass": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.34", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz", + "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==", + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/move-concurrently/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/move-concurrently/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/move-concurrently/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/move-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/msal": { + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/msal/-/msal-1.4.17.tgz", + "integrity": "sha512-RjHwP2cCIWQ9iUIk1SziUMb9+jj5mC4OqG2w16E5yig8jySi/TwiFvKlwcjNrPsndph0HtgCtbENnk5julf3yQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/msal/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/msalLegacy": { + "name": "msal", + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/msal/-/msal-1.4.12.tgz", + "integrity": "sha512-gjupwQ6nvNL6mZkl5NIXyUmZhTiEMRu5giNdgHMh8l5EPOnV2Xj6nukY1NIxFacSTkEYUSDB47Pej9GxDYf+1w==", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/msalLegacy/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", + "dev": true + }, + "node_modules/multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha512-7ZxrUybYv9NonoXgwoOqtStIu18D1c3eFZj27hqgf5kBrBF8Q+tE8V0MW8dKM5QLkQPh1JhhbKgHLY9kifov4Q==", + "dev": true, + "dependencies": { + "duplexer2": "0.0.2" + } + }, + "node_modules/mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "dev": true, + "optional": true + }, + "node_modules/nanocolors": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.13.tgz", + "integrity": "sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "deprecated": "This module relies on Node.js's internals and will break at some point. Do not use it, and update to graceful-fs@4.x." + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/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_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "node_modules/node-notifier": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-10.0.1.tgz", + "integrity": "sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==", + "dev": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.5", + "shellwords": "^0.1.1", + "uuid": "^8.3.2", + "which": "^2.0.2" + } + }, + "node_modules/node-notifier/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node_modules/node-zip": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/node-zip/-/node-zip-1.1.1.tgz", + "integrity": "sha512-sXfGL65EcaAJqNSXxuyf//i4D4geUtJgZDYUd7IBo2/CH8XY8vcWh1+CBCxuVVyR+S4vAFc3hr//JkCi2+V5vg==", + "dev": true, + "dependencies": { + "jszip": "2.5.0" + }, + "bin": { + "nodezip": "bin/nodezip" + }, + "engines": { + "node": "*" + } + }, + "node_modules/node-zip/node_modules/jszip": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.5.0.tgz", + "integrity": "sha512-IRoyf8JSYY3nx+uyh5xPc0qdy8pUDTp2UkHOWYNF/IO/3D8nx7899UlSAjD8rf8wUgOmm0lACWx/GbW3EaxIXQ==", + "dev": true, + "dependencies": { + "pako": "~0.2.5" + } + }, + "node_modules/node-zip/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "node_modules/npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-packlist": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.5.tgz", + "integrity": "sha512-KCfK3Vi2F+PH1klYauoQzg81GQ8/GGjQRKYY6tRnpQUPKTs/1gBZSRWtTEd7jGdSn1LZL7gpAmJT+BcS55k2XQ==", + "dev": true, + "dependencies": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-packlist/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-packlist/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", + "dev": true + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", + "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", + "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", + "dev": true, + "dependencies": { + "array.prototype.reduce": "^1.0.4", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/office-ui-fabric-react": { + "version": "7.185.7", + "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.185.7.tgz", + "integrity": "sha512-JiWkrjT/T6OG63ATu6RUlME2PBe4pgxQOwRTOjvbsaq8mlyd9i21ImgwkTEvcNXJpx+4w0bJiuQTcdwSMyf6qA==", + "dependencies": { + "@fluentui/date-time-utilities": "^7.9.1", + "@fluentui/react-focus": "^7.18.4", + "@fluentui/react-window-provider": "^1.0.3", + "@microsoft/load-themed-styles": "^1.10.26", + "@uifabric/foundation": "^7.10.3", + "@uifabric/icons": "^7.7.2", + "@uifabric/merge-styles": "^7.19.2", + "@uifabric/react-hooks": "^7.14.2", + "@uifabric/set-version": "^7.0.24", + "@uifabric/styling": "^7.20.2", + "@uifabric/utilities": "^7.34.1", + "prop-types": "^15.7.2", + "tslib": "^1.10.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "@types/react-dom": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0", + "react-dom": ">=16.8.0 <18.0.0" + } + }, + "node_modules/office-ui-fabric-react/node_modules/@fluentui/date-time-utilities": { + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@fluentui/date-time-utilities/-/date-time-utilities-7.9.1.tgz", + "integrity": "sha512-o8iU1VIY+QsqVRWARKiky29fh4KR1xaKSgMClXIi65qkt8EDDhjmlzL0KVDEoDA2GWukwb/1PpaVCWDg4v3cUQ==", + "dependencies": { + "@uifabric/set-version": "^7.0.24", + "tslib": "^1.10.0" + } + }, + "node_modules/office-ui-fabric-react/node_modules/@fluentui/keyboard-key": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/@fluentui/keyboard-key/-/keyboard-key-0.2.17.tgz", + "integrity": "sha512-iT1bU56rKrKEOfODoW6fScY11qj3iaYrZ+z11T6fo5+TDm84UGkkXjLXJTE57ZJzg0/gbccHQWYv+chY7bJN8Q==", + "dependencies": { + "tslib": "^1.10.0" + } + }, + "node_modules/office-ui-fabric-react/node_modules/@fluentui/react-focus": { + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-7.18.7.tgz", + "integrity": "sha512-BEj1T0MnQpDExyqN+X47vVNsCFX5puDUJATay8sltu/yDtcEijgzHx61Wc2Rxism2ZFwc4PyND8DzTwlsjyquA==", + "dependencies": { + "@fluentui/keyboard-key": "^0.2.12", + "@uifabric/merge-styles": "^7.19.2", + "@uifabric/set-version": "^7.0.24", + "@uifabric/styling": "^7.21.2", + "@uifabric/utilities": "^7.35.0", + "tslib": "^1.10.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "@types/react-dom": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0", + "react-dom": ">=16.8.0 <18.0.0" + } + }, + "node_modules/office-ui-fabric-react/node_modules/@fluentui/react-window-provider": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-1.0.3.tgz", + "integrity": "sha512-nFFhYlEWDSklAFjw87hQuOO5ZQP8or4J12ZJ7Glf+pcifRl0AySBshuGTJsTyZ0QyzgIeQYGSYf6wcPtycS0aA==", + "dependencies": { + "@uifabric/set-version": "^7.0.24", + "tslib": "^1.10.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <18.0.0", + "@types/react-dom": ">=16.8.0 <18.0.0", + "react": ">=16.8.0 <18.0.0", + "react-dom": ">=16.8.0 <18.0.0" + } + }, + "node_modules/office-ui-fabric-react/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opn": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz", + "integrity": "sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha512-DrQ43ngaJ0e36j2CHyoDoIg1K4zbc78GnTQESebK9vu6hj4W5/pvfSFO/kgM620Yd0YnhseSNYsLK3/SszZ5NQ==", + "dev": true, + "dependencies": { + "end-of-stream": "~0.1.5", + "sequencify": "~0.0.7", + "stream-consume": "~0.1.0" + } + }, + "node_modules/orchestrator/node_modules/end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha512-go5TQkd0YRXYhX+Lc3UrXkoKU5j+m72jEP5lHWr2Nh82L8wfZtH8toKgcg4T10o23ELIMGXQdwCbl+qAXIPDrw==", + "dev": true, + "dependencies": { + "once": "~1.3.0" + } + }, + "node_modules/orchestrator/node_modules/once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dev": true, + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/p-each-series": { + "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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-reflect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-2.1.0.tgz", + "integrity": "sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-settle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-4.1.1.tgz", + "integrity": "sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.2", + "p-reflect": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-settle/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" + }, + "node_modules/parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dev": true, + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidof": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pidof/-/pidof-1.0.2.tgz", + "integrity": "sha512-LLJhTVEUCZnotdAM5rd7KiTdLGgk6i763/hsd5pO+8yuF7mdgg0ob8w/98KrTAcPsj6YzGrkFLPVtBOr1uW2ag==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-1.1.3.tgz", + "integrity": "sha512-9hHgE5+Xai/ChrnahNP8Ke0VNF/s41IZIB/d24eMHEaRamdPg+wwlRm2lTb5wMvE8eTIKrYZsrxfuOwt3dpsIQ==", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "load-json-file": "^1.1.0", + "object-assign": "^4.0.1", + "symbol": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-conf/node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-conf/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-conf/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/plugin-error/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-log": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/plugin-log/-/plugin-log-0.1.0.tgz", + "integrity": "sha512-TzmfWRMEFAnrZbI4GfyXv9Gp5E71eby3gmvnP6LEfmYbVC8FPN2RBRhwxg4sjIg+fy8AJ3mczhLXvk0pzHPeMg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "dependencies": { + "chalk": "^1.1.1", + "dateformat": "^1.0.11" + }, + "engines": { + "node": ">= 0.9.0" + } + }, + "node_modules/plugin-log/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-log/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-log/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-log/node_modules/dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha512-5sFRfAAmbHdIts+eKjR9kYJoF0ViCMVX9yqLu5A7S/v+nd077KgCITOMiirmyCBiZpKLDXbBOkYm6tu7rX/TKg==", + "dev": true, + "dependencies": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + }, + "bin": { + "dateformat": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/plugin-log/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/plugin-log/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-log/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/portfinder/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "7.0.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.38.tgz", + "integrity": "sha512-wNrSHWjHDQJR/IZL5IKGxRtFgrYNaAA/UrkW2WqbtZO6uxSLMxMN+s2iqUMwnAWm3fMROlDYZB41dr0Mt7vBwQ==", + "dev": true, + "dependencies": { + "nanocolors": "^0.2.2", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-colormin/node_modules/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 + }, + "node_modules/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values/node_modules/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 + }, + "node_modules/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/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, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/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, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/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, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/postcss-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/postcss-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/postcss-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/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, + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/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 + }, + "node_modules/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, + "dependencies": { + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/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, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/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 + }, + "node_modules/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, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/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 + }, + "node_modules/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, + "dependencies": { + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params/node_modules/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 + }, + "node_modules/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, + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/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, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-modules": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-1.5.0.tgz", + "integrity": "sha512-KiAihzcV0TxTTNA5OXreyIXctuHOfR50WIhqBpc8pe0Q5dcs/Uap9EVlifOI9am7zGGdGOJQ6B1MPYKo2UxgOg==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/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": "sha512-zF9+UIEvtpeqMGxhpeT9XaIevQSrBBCz9fi7SwfkmjVacsSj8DY5eFVgn+wY8I9vvdDDwK5xC8Myq4UkoLFIkA==", + "dev": true, + "dependencies": { + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/postcss-modules-extract-imports/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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": "sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==", + "dev": true, + "dependencies": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/postcss-modules-local-by-default/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw==", + "dev": true, + "dependencies": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-scope/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-modules-scope/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/postcss-modules-scope/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==", + "dev": true, + "dependencies": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + } + }, + "node_modules/postcss-modules-values/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-modules-values/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/postcss-modules-values/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/postcss-modules-values/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-modules-values/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/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, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/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 + }, + "node_modules/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, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/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 + }, + "node_modules/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, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/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 + }, + "node_modules/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, + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/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 + }, + "node_modules/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, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/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 + }, + "node_modules/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, + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/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 + }, + "node_modules/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, + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/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 + }, + "node_modules/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, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/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 + }, + "node_modules/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, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/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 + }, + "node_modules/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, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/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, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/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 + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-svgo/node_modules/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 + }, + "node_modules/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, + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/pretty-format/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/pretty-format/node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/pretty-format/node_modules/@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/pretty-format/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "dev": true, + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true + }, + "node_modules/pseudolocale": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pseudolocale/-/pseudolocale-1.1.0.tgz", + "integrity": "sha512-OZ8I/hwYEJ3beN3IEcNnt8EpcqblH0/x23hulKBXjs+WhTTEle+ijCHCkh2bd+cIIeCuCwSCbBe93IthGG6hLw==", + "dev": true, + "dependencies": { + "commander": "*" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dev": true, + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + }, + "node_modules/ramda": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", + "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dev": true, + "dependencies": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==" + }, + "node_modules/react": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "dependencies": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", + "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + }, + "peerDependencies": { + "react": "^16.13.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-redux": { + "version": "7.2.8", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.8.tgz", + "integrity": "sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw==", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/react-router": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", + "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", + "dependencies": { + "history": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", + "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", + "dependencies": { + "history": "^5.2.0", + "react-router": "6.3.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-test-renderer": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.13.1.tgz", + "integrity": "sha512-Sn2VRyOK2YJJldOqoh8Tn/lWQ+ZiKhyZTPtaO0Q6yNj+QDbmRkVFap6pZPy3YQk8DScRDfyqm/KxKYP9gCMRiQ==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "react-is": "^16.8.6", + "scheduler": "^0.19.1" + }, + "peerDependencies": { + "react": "^16.13.1" + } + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/read-package-json": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", + "dev": true, + "dependencies": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/read-package-json/node_modules/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, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-package-json/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-package-tree": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.1.6.tgz", + "integrity": "sha512-FCX1aT3GWyY658wzDICef4p+n0dB+ENRct8E/Qyvppj6xVpOYerBHfUu7OP5Rt1/393Tdglguf5ju5DEX4wZNg==", + "deprecated": "The functionality that this package provided is now in @npmcli/arborist", + "dev": true, + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "once": "^1.3.0", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg-up/node_modules/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, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg-up/node_modules/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, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg-up/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/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, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-yaml-file": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-2.1.0.tgz", + "integrity": "sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==", + "dev": true, + "dependencies": { + "js-yaml": "^4.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=10.13" + } + }, + "node_modules/read-yaml-file/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/read-yaml-file/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dev": true, + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readdirp/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/realpath-native": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha512-+nixG+3NugceyR8O1bLU45qs84JgI3+8EauyRZafLgC9XbdAOIVgwV1Pe2da0YzGo62KzWoZwUpVEQf6qNAXWA==", + "dev": true, + "dependencies": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/recast/node_modules/esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/recast/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redux": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", + "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/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, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==", + "dev": true, + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "dev": true + }, + "node_modules/requirejs": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", + "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", + "bin": { + "r_js": "bin/r.js", + "r.js": "bin/r.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==", + "dev": true, + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==", + "dev": true + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true, + "engines": { + "node": "6.* || >= 7.*" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/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==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", + "dev": true, + "dependencies": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/sane/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/sane/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/sanitize-html": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.1.tgz", + "integrity": "sha512-oOpe8l4J8CaBk++2haoN5yNI5beekjuHv3JRPKUx/7h40Rdr85pemn4NkvUB3TcBP7yjat574sPlcMAyv4UQig==", + "dependencies": { + "deepmerge": "^4.2.2", + "escape-string-regexp": "^4.0.0", + "htmlparser2": "^6.0.0", + "is-plain-object": "^5.0.0", + "parse-srcset": "^1.0.2", + "postcss": "^8.3.11" + } + }, + "node_modules/sanitize-html/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/sanitize-html/node_modules/postcss": { + "version": "8.4.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", + "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/sass": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.44.0.tgz", + "integrity": "sha512-0hLREbHFXGQqls/K8X+koeP+ogFRPF4ZqetVB19b7Cst9Er8cOR0rc6RU7MaI4W1JmUShd1BPgPoeqmmgMMYFw==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0", + "sass": "^1.3.0", + "webpack": "^4.36.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/sass-loader/node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/sass-loader/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/sass-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/sass-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/sass-loader/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sass/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sass/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/sass/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sass/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/sass/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sass/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sass/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/sass/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dev": true, + "dependencies": { + "xmlchars": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", + "dev": true, + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/selfsigned/node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==", + "dev": true, + "dependencies": { + "sver-compat": "^1.5.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true, + "bin": { + "mime": "cli.js" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha512-YL8BPm0tp6SlXef/VqYpA/ijmTsDP2ZEXzsnqjkaWS7NP7Bfvw18NboL0O8WCIjy67sOCG3MYSK1PB4GC9XdtQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallow-clone/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", + "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "eventsource": "^2.0.2", + "faye-websocket": "^0.11.4", + "inherits": "^2.0.4", + "url-parse": "^1.5.10" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://tidelift.com/funding/github/npm/sockjs-client" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs-client/node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sockjs/node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/sort-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz", + "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==", + "dev": true, + "dependencies": { + "is-plain-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.1.3.tgz", + "integrity": "sha512-6YHeF+XzDOrT/ycFJNI53cgEsp/tHTMl37hi7uVyqFAlTXW109JazaQCkbc+jjoL2637qkH1amLi+JzrIpt5lA==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.2", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "source-map": "^0.6.1", + "whatwg-mimetype": "^2.3.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/source-map-loader/node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/source-map-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/source-map-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/source-map-loader/node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/source-map-loader/node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/source-map-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/source-map-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/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==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/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, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/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, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/stack-utils": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", + "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stateful-process-command-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stateful-process-command-proxy/-/stateful-process-command-proxy-1.0.1.tgz", + "integrity": "sha512-G2Hz3LPNfCnJOmZeEHz466cqsfsfIzDUDdCr+C9BFM2TEDpju4a8slFDSZ+B2inaiRCX/uQxCVnL8tb399AYrw==", + "dev": true, + "dependencies": { + "buffer-builder": "latest", + "fifo": "latest", + "generic-pool": "2.4.4", + "promise": "latest" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", + "dev": true, + "dependencies": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "node_modules/stream-consume": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", + "dev": true + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "dev": true + }, + "node_modules/string-length": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", + "dev": true, + "dependencies": { + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-length/node_modules/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, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/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, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sudo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sudo/-/sudo-1.0.3.tgz", + "integrity": "sha512-3xMsaPg+8Xm+4LQm0b2V+G3lz3YxtDBzlqiU8CXw2AOIIDSvC1kBxIxBjnoCTq8dTTXAy23m58g6mdClUocpmQ==", + "dev": true, + "dependencies": { + "inpath": "~1.0.2", + "pidof": "~1.0.2", + "read": "~1.0.3" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==", + "dev": true, + "dependencies": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dev": true, + "dependencies": { + "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" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/svgo/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/svgo/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/swiped-events": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/swiped-events/-/swiped-events-1.1.6.tgz", + "integrity": "sha512-X0d1FbXes9j4AckSN/k2x6WW2KSTmtEFIjUjThVy8lKrB4Orf89xFPMNbAj2vTZE3Wo2+yaNl6hZoXH9DhC4vg==", + "dependencies": { + "natives": "^1.1.6" + } + }, + "node_modules/symbol": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/symbol/-/symbol-0.2.3.tgz", + "integrity": "sha512-IUW+ek7apEaW5bFhS6WpYoNtVpNTlNoqB/PH7YiMWQTxSPeXCzG4PILVakwXivJt3ZXWeO1fIJnUd/L9A/VeGA==", + "dev": true + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ternary-stream": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.1.1.tgz", + "integrity": "sha512-j6ei9hxSoyGlqTmoMjOm+QNvUKDOIY6bNl4Uh1lhBvl6yjPW2iLqxDUYyfDPZknQ4KdRziFl+ec99iT4l7g0cw==", + "dev": true, + "dependencies": { + "duplexify": "^3.5.0", + "fork-stream": "^0.0.4", + "merge-stream": "^1.0.0", + "through2": "^2.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/ternary-stream/node_modules/merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/terser": { + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.5.tgz", + "integrity": "sha512-AOEDLDxD2zylUGf/wxHxklEkOe2/r+seuyOWujejFrIxHf11brA1/dWQNIgXa1c6/Wkxgu7zvv0JhOWfc2ELEA==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==" + }, + "node_modules/tiny-invariant": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", + "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" + }, + "node_modules/tiny-lr": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", + "integrity": "sha512-cmC4iw/nymXg+dc57AQ8Xv3bHxNQOGyQC3Ht5xLN67hksk6ucshrLk/VKiXuMbnZgToQ2NbnICxYj63xVw+Qbw==", + "dev": true, + "dependencies": { + "body-parser": "~1.14.0", + "debug": "~2.2.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.2.0", + "parseurl": "~1.3.0", + "qs": "~5.1.0" + } + }, + "node_modules/tiny-lr/node_modules/body-parser": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", + "integrity": "sha512-6D9uiWn7dbnDAhlDikccybuqKCmsoest0es3VSQO8Doz/fzx6Ls7kJNxKBYTjbzu4/RzNsf9zuACnS3UYjVH8Q==", + "dev": true, + "dependencies": { + "bytes": "2.2.0", + "content-type": "~1.0.1", + "debug": "~2.2.0", + "depd": "~1.1.0", + "http-errors": "~1.3.1", + "iconv-lite": "0.4.13", + "on-finished": "~2.3.0", + "qs": "5.2.0", + "raw-body": "~2.1.5", + "type-is": "~1.6.10" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/tiny-lr/node_modules/body-parser/node_modules/qs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "integrity": "sha512-VH4FeG98gs6AkHivaW2O14vsOPBL9E80Sj7fITunoDijiYQ1lsVwJYmm1CSL+oLyO2N5HPdo23GXAG64uKOAZQ==", + "dev": true, + "engines": ">=0.10.40" + }, + "node_modules/tiny-lr/node_modules/bytes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", + "integrity": "sha512-zGRpnr2l5w/s8PxkrquUJoVeR06KvqPelrYqiSyQV7QEBqCYivpb6UzXYWC6JDBVtNFOT0rzJRFhkfJgxzmILA==", + "dev": true + }, + "node_modules/tiny-lr/node_modules/debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw==", + "dev": true, + "dependencies": { + "ms": "0.7.1" + } + }, + "node_modules/tiny-lr/node_modules/http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha512-gMygNskMurDCWfoCdyh1gOeDfSbkAHXqz94QoPj5IHIUjC/BG8/xv7FSEUr7waR5RcAya4j58bft9Wu/wHNeXA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.1", + "statuses": "1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/tiny-lr/node_modules/iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha512-QwVuTNQv7tXC5mMWFX5N5wGjmybjNBBD8P3BReTkPmipoxTUFgWM2gXNvldHQr6T14DH0Dh6qBVg98iJt7u4mQ==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tiny-lr/node_modules/ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha512-lRLiIR9fSNpnP6TC4v8+4OU7oStC01esuNowdQ34L+Gk8e5Puoc88IqJ+XAY/B3Mn2ZKis8l8HX90oU8ivzUHg==", + "dev": true + }, + "node_modules/tiny-lr/node_modules/qs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", + "integrity": "sha512-SGDM48EwFLWnYYpNlOkEIRJb4wil5FKJxpR6NVfQjz6qJmX53ki7Xj1cLNEAkb70vUfJmdVLOwODyABgZyDMZw==", + "dev": true, + "engines": ">=0.10.40" + }, + "node_modules/tiny-lr/node_modules/raw-body": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", + "integrity": "sha512-x4d27vsIG04gZ1imkuDXB9Rd/EkAx5kYzeMijIYw1PAor0Ld3nTlkQQwDjKu42GdRUFCX1AfGnTSQB4O57eWVg==", + "dev": true, + "dependencies": { + "bytes": "2.4.0", + "iconv-lite": "0.4.13", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/tiny-lr/node_modules/raw-body/node_modules/bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha512-SvUX8+c/Ga454a4fprIdIUzUN9xfd1YTvYh7ub5ZPJ+ZJ/+K2Bp6IpWGmnw8r3caLTsmhvJAKZz3qjIo9+XuCQ==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==", + "dev": true, + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.0.tgz", + "integrity": "sha512-IVX6AagLelGwl6F0E+hoRpXzuD192cZhAcmT7/eoLr0PnsB1wv2E5c+A2O+V8xth9FlL2p0OstFsWn0bZpVn4w==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/true-case-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", + "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", + "dev": true + }, + "node_modules/ts-jest": { + "version": "26.5.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", + "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^26.1.0", + "json5": "2.x", + "lodash": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "jest": ">=26 <27", + "typescript": ">=3.8 <5.0" + } + }, + "node_modules/ts-jest/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/ts-jest/node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/ts-jest/node_modules/@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/ts-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-jest/node_modules/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", + "dev": true + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker/node_modules/fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==", + "dev": true + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", + "dev": true + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==", + "dev": true + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "dev": true + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-browserslist-db/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "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 + }, + "node_modules/v8-to-istanbul": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", + "integrity": "sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": "8.x.x || >=10.10.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "dev": true, + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/validator": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", + "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==", + "dev": true, + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vinyl/node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "dev": true, + "dependencies": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/webpack": { + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", + "dev": true, + "dependencies": { + "ansi-html-community": "0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/webpack-dev-server/node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/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, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/webpack-dev-server/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server/node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/del/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webpack-dev-server/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/webpack-dev-server/node_modules/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 + }, + "node_modules/webpack-dev-server/node_modules/express": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webpack-dev-server/node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/webpack-dev-server/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/webpack-dev-server/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webpack-dev-server/node_modules/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, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/webpack-dev-server/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webpack-dev-server/node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/webpack-dev-server/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webpack-dev-server/node_modules/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 + }, + "node_modules/webpack-dev-server/node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webpack-dev-server/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-dev-server/node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/webpack-dev-server/node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/webpack-dev-server/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webpack-dev-server/node_modules/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==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/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, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/webpack-dev-server/node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/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, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-log/node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-log/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack/node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-encoding/node_modules/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, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha512-SA2KdOXATOroD3EBUYvcdugsusXS5YiQFqwskSbsp5b1gK8HpNi/YP0jcy/BDpdllp305HMnrsVf9K7Be9GiEQ==" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.7.1.tgz", + "integrity": "sha512-7rwLuNiZQbujtIu7Ibp7mq9X/Swqq90X0+zOWESoViRYcIOoQWtThlRX9K2YQHZLwGZv4CBOdTc4N3/SzAdb6w==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", + "dev": true + }, + "node_modules/window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", + "dev": true, + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/write-yaml-file": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/write-yaml-file/-/write-yaml-file-4.2.0.tgz", + "integrity": "sha512-LwyucHy0uhWqbrOkh9cBluZBeNVxzHjDaE9mwepZG3n3ZlbM4v3ndrFw51zW/NXYFFqP+QWZ72ihtLWTh05e4Q==", + "dev": true, + "dependencies": { + "js-yaml": "^4.0.0", + "write-file-atomic": "^3.0.3" + }, + "engines": { + "node": ">=10.13" + } + }, + "node_modules/write-yaml-file/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/write-yaml-file/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/ws": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" + } + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/xmldoc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.4.tgz", + "integrity": "sha512-rQshsBGR5s7pUNENTEncpI2LTCuzicri0DyE4SCV5XmS0q81JS8j1iPijP0Q5c4WLGbKh3W92hlOwY6N9ssW1w==", + "dev": true, + "dependencies": { + "sax": "^1.2.4" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.6.0.tgz", + "integrity": "sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==", + "dev": true, + "dependencies": { + "camelcase": "^2.0.1", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "pkg-conf": "^1.1.2", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1", + "string-width": "^1.0.1", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.0" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/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, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/yargs/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + }, + "node_modules/yargs/node_modules/yargs-parser/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/z-schema": { + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.18.4.tgz", + "integrity": "sha512-DUOKC/IhbkdLKKiV89gw9DUauTV8U/8yJl1sjf6MtDmzevLKOF2duNJ495S3MFVjqZarr+qNGCPbkg4mu4PpLw==", + "dev": true, + "dependencies": { + "lodash.get": "^4.0.0", + "lodash.isequal": "^4.0.0", + "validator": "^8.0.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "optionalDependencies": { + "commander": "^2.7.1" + } + } + }, + "dependencies": { + "@adobe/css-tools": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.0.1.tgz", + "integrity": "sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==", + "dev": true + }, + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@azure/abort-controller": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", + "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", + "dev": true, + "requires": { + "tslib": "^2.2.0" + } + }, + "@azure/core-asynciterator-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.2.tgz", + "integrity": "sha512-3rkP4LnnlWawl0LZptJOdXNrT/fHp2eQMadoasa6afspXdpGrtPZuAQc2PD0cpgyuoXtUWyC3tv7xfntjGS5Dw==", + "dev": true + }, + "@azure/core-auth": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", + "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", + "dev": true, + "requires": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + } + }, + "@azure/core-http": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-1.2.6.tgz", + "integrity": "sha512-odtH7UMKtekc5YQ86xg9GlVHNXR6pq2JgJ5FBo7/jbOjNGdBqcrIVrZx2bevXVJz/uUTSx6vUf62gzTXTfqYSQ==", + "dev": true, + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-asynciterator-polyfill": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-tracing": "1.0.0-preview.11", + "@azure/logger": "^1.0.0", + "@types/node-fetch": "^2.5.0", + "@types/tunnel": "^0.0.1", + "form-data": "^3.0.0", + "node-fetch": "^2.6.0", + "process": "^0.11.10", + "tough-cookie": "^4.0.0", + "tslib": "^2.2.0", + "tunnel": "^0.0.6", + "uuid": "^8.3.0", + "xml2js": "^0.4.19" + }, + "dependencies": { + "@azure/core-tracing": { + "version": "1.0.0-preview.11", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.11.tgz", + "integrity": "sha512-frF0pJc9HTmKncVokhBxCqipjbql02DThQ1ZJ9wLi7SDMLdPAFyDI5xZNzX5guLz+/DtPkY+SGK2li9FIXqshQ==", + "dev": true, + "requires": { + "@opencensus/web-types": "0.0.7", + "@opentelemetry/api": "1.0.0-rc.0", + "tslib": "^2.0.0" + } + }, + "@opentelemetry/api": { + "version": "1.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.0-rc.0.tgz", + "integrity": "sha512-iXKByCMfrlO5S6Oh97BuM56tM2cIBB0XsL/vWF/AtJrJEKx4MC/Xdu0xDsGXMGcNWpqF7ujMsjjnp0+UHBwnDQ==", + "dev": true + }, + "@types/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "dev": true, + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } + } + }, + "@azure/core-lro": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-1.0.5.tgz", + "integrity": "sha512-0EFCFZxARrIoLWMIRt4vuqconRVIO2Iin7nFBfJiYCCbKp5eEmxutNk8uqudPmG0XFl5YqlVh68/al/vbE5OOg==", + "dev": true, + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-http": "^1.2.0", + "@azure/core-tracing": "1.0.0-preview.11", + "events": "^3.0.0", + "tslib": "^2.0.0" + }, + "dependencies": { + "@azure/core-tracing": { + "version": "1.0.0-preview.11", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.11.tgz", + "integrity": "sha512-frF0pJc9HTmKncVokhBxCqipjbql02DThQ1ZJ9wLi7SDMLdPAFyDI5xZNzX5guLz+/DtPkY+SGK2li9FIXqshQ==", + "dev": true, + "requires": { + "@opencensus/web-types": "0.0.7", + "@opentelemetry/api": "1.0.0-rc.0", + "tslib": "^2.0.0" + } + }, + "@opentelemetry/api": { + "version": "1.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.0-rc.0.tgz", + "integrity": "sha512-iXKByCMfrlO5S6Oh97BuM56tM2cIBB0XsL/vWF/AtJrJEKx4MC/Xdu0xDsGXMGcNWpqF7ujMsjjnp0+UHBwnDQ==", + "dev": true + } + } + }, + "@azure/core-paging": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.3.0.tgz", + "integrity": "sha512-H6Tg9eBm0brHqLy0OSAGzxIh1t4UL8eZVrSUMJ60Ra9cwq2pOskFqVpz2pYoHDsBY1jZ4V/P8LRGb5D5pmC6rg==", + "dev": true, + "requires": { + "tslib": "^2.2.0" + } + }, + "@azure/core-tracing": { + "version": "1.0.0-preview.9", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.9.tgz", + "integrity": "sha512-zczolCLJ5QG42AEPQ+Qg9SRYNUyB+yZ5dzof4YEc+dyWczO9G2sBqbAjLB7IqrsdHN2apkiB2oXeDKCsq48jug==", + "dev": true, + "requires": { + "@opencensus/web-types": "0.0.7", + "@opentelemetry/api": "^0.10.2", + "tslib": "^2.0.0" + } + }, + "@azure/identity": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-1.0.3.tgz", + "integrity": "sha512-yWoOL3WjbD1sAYHdx4buFCGd9mCIHGzlTHgkhhLrmMpBztsfp9ejo5LRPYIV2Za4otfJzPL4kH/vnSLTS/4WYA==", + "dev": true, + "requires": { + "@azure/core-http": "^1.0.0", + "@azure/core-tracing": "1.0.0-preview.7", + "@azure/logger": "^1.0.0", + "@opentelemetry/types": "^0.2.0", + "events": "^3.0.0", + "jws": "^3.2.2", + "msal": "^1.0.2", + "qs": "^6.7.0", + "tslib": "^1.9.3", + "uuid": "^3.3.2" + }, + "dependencies": { + "@azure/core-tracing": { + "version": "1.0.0-preview.7", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.7.tgz", + "integrity": "sha512-pkFCw6OiJrpR+aH1VQe6DYm3fK2KWCC5Jf3m/Pv1RxF08M1Xm08RCyQ5Qe0YyW5L16yYT2nnV48krVhYZ6SGFA==", + "dev": true, + "requires": { + "@opencensus/web-types": "0.0.7", + "@opentelemetry/types": "^0.2.0", + "tslib": "^1.9.3" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "@azure/logger": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.3.tgz", + "integrity": "sha512-aK4s3Xxjrx3daZr3VylxejK3vG5ExXck5WOHDJ8in/k9AqlfIyFMMT1uG7u8mNjX+QRILTIn0/Xgschfh/dQ9g==", + "dev": true, + "requires": { + "tslib": "^2.2.0" + } + }, + "@azure/msal-browser": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.22.0.tgz", + "integrity": "sha512-ZpnbnzjYGRGHjWDPOLjSp47CQvhK927+W9avtLoNNCMudqs2dBfwj76lnJwObDE7TAKmCUueTiieglBiPb1mgQ==", + "requires": { + "@azure/msal-common": "^6.1.0" + } + }, + "@azure/msal-common": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-6.4.0.tgz", + "integrity": "sha512-WZdgq9f9O8cbxGzdRwLLMM5xjmLJ2mdtuzgXeiGxIRkVVlJ9nZ6sWnDFKa2TX8j72UXD1IfL0p/RYNoTXYoGfg==" + }, + "@azure/storage-blob": { + "version": "12.4.1", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.4.1.tgz", + "integrity": "sha512-RH6ru8LbnCC+m1rlVLon6mYUXdHsTcyUXFCJAWRQQM7p0XOwVKPS+UiVk2tZXfvMWd3q/qT/meOrEbHEcp/c4g==", + "dev": true, + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-http": "^1.2.0", + "@azure/core-lro": "^1.0.2", + "@azure/core-paging": "^1.1.1", + "@azure/core-tracing": "1.0.0-preview.9", + "@azure/logger": "^1.0.0", + "@opentelemetry/api": "^0.10.2", + "events": "^3.0.0", + "tslib": "^2.0.0" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz", + "integrity": "sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==", + "dev": true + }, + "@babel/core": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz", + "integrity": "sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.13", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.13", + "@babel/types": "^7.18.13", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "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 + } + } + }, + "@babel/generator": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz", + "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==", + "dev": true, + "requires": { + "@babel/types": "^7.18.13", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "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 + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "dev": true, + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "dev": true, + "requires": { + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.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" + } + }, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "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" + } + } + } + }, + "@babel/parser": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz", + "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "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.12.13" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/runtime": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", + "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz", + "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==", + "dev": true, + "requires": { + "core-js-pure": "^3.20.2", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz", + "integrity": "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.13", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.13", + "@babel/types": "^7.18.13", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz", + "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "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", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "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" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "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 + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@fluentui/date-time-utilities": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@fluentui/date-time-utilities/-/date-time-utilities-8.5.2.tgz", + "integrity": "sha512-u540ACUdnC+Jms1DIHkho80eJmoCg/LtAzR4a/1Tum6PicxWv59UYp9Ba7qFbIw+mrjWnwX/2ZmBpqTy9Rgn7w==", + "requires": { + "@fluentui/set-version": "^8.2.2", + "tslib": "^2.1.0" + } + }, + "@fluentui/dom-utilities": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@fluentui/dom-utilities/-/dom-utilities-2.2.2.tgz", + "integrity": "sha512-puklLc6Jvg279OGagqkSfuHML6ckBhw3gJakdvIZHKeJiduh+34U4Finl3K24yBSXzG2WsN+LwLTd1Vcociy+g==", + "requires": { + "@fluentui/set-version": "^8.2.2", + "tslib": "^2.1.0" + } + }, + "@fluentui/font-icons-mdl2": { + "version": "8.4.8", + "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.4.8.tgz", + "integrity": "sha512-BVbXK/UBa/JfnOBj2atAvz8fzjvRsLJHyO0x8Z8VFgv0YZ2J1+2kv4ijw+nV6obg45bPNDH4PaN/HPgECz9FQA==", + "requires": { + "@fluentui/set-version": "^8.2.2", + "@fluentui/style-utilities": "^8.7.7", + "@fluentui/utilities": "^8.12.0", + "tslib": "^2.1.0" + } + }, + "@fluentui/foundation-legacy": { + "version": "8.2.15", + "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.2.15.tgz", + "integrity": "sha512-OLwCsTF5krheALJn+9ZYtciyRjlVExcuY7NpW/3mvOWeXZTPw22yIFQ2vP2QFvpctV/+Q1LtGcaGrt/afshr3Q==", + "requires": { + "@fluentui/merge-styles": "^8.5.3", + "@fluentui/set-version": "^8.2.2", + "@fluentui/style-utilities": "^8.7.7", + "@fluentui/utilities": "^8.12.0", + "tslib": "^2.1.0" + } + }, + "@fluentui/keyboard-key": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@fluentui/keyboard-key/-/keyboard-key-0.4.2.tgz", + "integrity": "sha512-6WdMrnFpY94uWefUGGRqO4WiS6R+Kso6/FR95SxXMuS6kfnjGJCHzywFGZcN5OU1fX067Zna4aPQ/nDwYMgBPw==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@fluentui/merge-styles": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@fluentui/merge-styles/-/merge-styles-8.5.3.tgz", + "integrity": "sha512-bHWftN3zTp1bbBfmAEH8YK9UURWj2mffw7b7VaW2Og1qxwv3GMSza1cyv/d3EVqpMJ8AVwFv3mbi9p1ieMN9mw==", + "requires": { + "@fluentui/set-version": "^8.2.2", + "tslib": "^2.1.0" + } + }, + "@fluentui/react": { + "version": "8.90.1", + "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.90.1.tgz", + "integrity": "sha512-2yIkuDmUytMKJTRrI1wLBk0qkG1GlCfumjRddcx6fXX+ydffrNQ4NQqRp8Hl8Sk8Ag2WOpM3sFm0/UyCuIjyEQ==", + "requires": { + "@fluentui/date-time-utilities": "^8.5.2", + "@fluentui/font-icons-mdl2": "^8.4.8", + "@fluentui/foundation-legacy": "^8.2.15", + "@fluentui/merge-styles": "^8.5.3", + "@fluentui/react-focus": "^8.8.0", + "@fluentui/react-hooks": "^8.6.7", + "@fluentui/react-portal-compat-context": "^9.0.1", + "@fluentui/react-window-provider": "^2.2.2", + "@fluentui/set-version": "^8.2.2", + "@fluentui/style-utilities": "^8.7.7", + "@fluentui/theme": "^2.6.12", + "@fluentui/utilities": "^8.12.0", + "@microsoft/load-themed-styles": "^1.10.26", + "tslib": "^2.1.0" + } + }, + "@fluentui/react-focus": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.8.0.tgz", + "integrity": "sha512-TzTIMfD1ESCYIgx6dKGokYEWeCMB5xRDyo2F4MeCcYhuwX2fYjrMhxyrA6nK2qrJa7nHYw0USZY4bKwDny1RkA==", + "requires": { + "@fluentui/keyboard-key": "^0.4.2", + "@fluentui/merge-styles": "^8.5.3", + "@fluentui/set-version": "^8.2.2", + "@fluentui/style-utilities": "^8.7.7", + "@fluentui/utilities": "^8.12.0", + "tslib": "^2.1.0" + } + }, + "@fluentui/react-hooks": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.6.7.tgz", + "integrity": "sha512-lQ6TQZEAtKImSVCm87V2Was4HQud4uWWARzEiUO1pQkbwux912REGKyfRgsKC0ZBQDTV8siTCmsC2q103/Am0A==", + "requires": { + "@fluentui/react-window-provider": "^2.2.2", + "@fluentui/set-version": "^8.2.2", + "@fluentui/utilities": "^8.12.0", + "tslib": "^2.1.0" + } + }, + "@fluentui/react-icons-mdl2": { + "version": "1.3.17", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons-mdl2/-/react-icons-mdl2-1.3.17.tgz", + "integrity": "sha512-8lmr6PoeSnjj5+BJ/O/JrohJ6uzwai69/Xpy87giGGclRgHcIjVuUkdXX7FQWfCtPjQ3yH9aUn0QWht50ZGZ/A==", + "requires": { + "@fluentui/react-icon-provider": "^1.3.15", + "@fluentui/set-version": "^8.2.2", + "@fluentui/utilities": "^8.12.0", + "@microsoft/load-themed-styles": "^1.10.26", + "tslib": "^2.1.0" + }, + "dependencies": { + "@fluentui/react-icon-provider": { + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/@fluentui/react-icon-provider/-/react-icon-provider-1.3.15.tgz", + "integrity": "sha512-f9Zar4sGEhASgwY8br9jNgNyZtgBS+gSi0THANCDEQdXHXWy7dFRMwL1AXruYg3QjPAYLibU5J5C7O8C2a5KdA==", + "requires": { + "@fluentui/set-version": "^8.2.2", + "@fluentui/style-utilities": "^8.7.7", + "tslib": "^2.1.0" + } + } + } + }, + "@fluentui/react-portal-compat-context": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal-compat-context/-/react-portal-compat-context-9.0.1.tgz", + "integrity": "sha512-KhOcXy2tvzNoAqFowkaRGFiLuRuPjzn6i1W30iMkhgsSVKxa/9jxso86Z8R0eZwA+16RNO/Ia2nX1gqfUac9mw==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@fluentui/react-window-provider": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-2.2.2.tgz", + "integrity": "sha512-/1uQ01HqGRpUOMozUy1FYmxp6blZZvtKN50rqxnQJr8O1bcpg8lJzhq064E8EjOXfdNh47zKSloP4ebbDI5vrw==", + "requires": { + "@fluentui/set-version": "^8.2.2", + "tslib": "^2.1.0" + } + }, + "@fluentui/set-version": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@fluentui/set-version/-/set-version-8.2.2.tgz", + "integrity": "sha512-Vg20KZ0ufgWjxx6GFbqC5wiVxXZDUWgNT0r0By/Eyj4bUSb1jG6lmf5z1oY1dUX0YS6Cp5e6GnvbNdXg5E7orA==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@fluentui/style-utilities": { + "version": "8.7.7", + "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.7.7.tgz", + "integrity": "sha512-5EcL3QQGDiAi8GJYAZINHlJU10UgVTSgAFR6sF6Jl4+dFr6xrr2+Z53783YiaIyO0bAx9Ljh3/XWuh1cHAe7Ww==", + "requires": { + "@fluentui/merge-styles": "^8.5.3", + "@fluentui/set-version": "^8.2.2", + "@fluentui/theme": "^2.6.12", + "@fluentui/utilities": "^8.12.0", + "@microsoft/load-themed-styles": "^1.10.26", + "tslib": "^2.1.0" + } + }, + "@fluentui/theme": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.12.tgz", + "integrity": "sha512-tnv/XL39KI4LY83CgPeI8yvLEk4bHmeGTwPRH8BiGvKrwEJ1ics23LMQu+K03ltvvo8HDzomyoir+Nb6cD7lDA==", + "requires": { + "@fluentui/merge-styles": "^8.5.3", + "@fluentui/set-version": "^8.2.2", + "@fluentui/utilities": "^8.12.0", + "tslib": "^2.1.0" + } + }, + "@fluentui/utilities": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.12.0.tgz", + "integrity": "sha512-DrC/bgYlOAyXiJxGQlYNVkmEu/zFv7NEZ7Nf0NGzwS2NiRwtv7Qa9lghbKY0gCk08iKrWpwtgCf8h7XxTEPXlQ==", + "requires": { + "@fluentui/dom-utilities": "^2.2.2", + "@fluentui/merge-styles": "^8.5.3", + "@fluentui/set-version": "^8.2.2", + "tslib": "^2.1.0" + } + }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "dev": true, + "peer": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true, + "peer": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz", + "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "jest-message-util": "^25.5.0", + "jest-util": "^25.5.0", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.4.0.tgz", + "integrity": "sha512-h1x9WSVV0+TKVtATGjyQIMJENs8aF6eUjnCoi4jyRemYZmekLr8EJOGQqTWEX8W6SbZ6Skesy9pGXrKeAolUJw==", + "dev": true, + "requires": { + "@jest/console": "^25.4.0", + "@jest/reporters": "^25.4.0", + "@jest/test-result": "^25.4.0", + "@jest/transform": "^25.4.0", + "@jest/types": "^25.4.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.3", + "jest-changed-files": "^25.4.0", + "jest-config": "^25.4.0", + "jest-haste-map": "^25.4.0", + "jest-message-util": "^25.4.0", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.4.0", + "jest-resolve-dependencies": "^25.4.0", + "jest-runner": "^25.4.0", + "jest-runtime": "^25.4.0", + "jest-snapshot": "^25.4.0", + "jest-util": "^25.4.0", + "jest-validate": "^25.4.0", + "jest-watcher": "^25.4.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "realpath-native": "^2.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.5.0.tgz", + "integrity": "sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0" + } + }, + "@jest/fake-timers": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.5.0.tgz", + "integrity": "sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", + "lolex": "^5.0.0" + } + }, + "@jest/globals": { + "version": "25.5.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-25.5.2.tgz", + "integrity": "sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA==", + "dev": true, + "requires": { + "@jest/environment": "^25.5.0", + "@jest/types": "^25.5.0", + "expect": "^25.5.0" + } + }, + "@jest/reporters": { + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.4.0.tgz", + "integrity": "sha512-bhx/buYbZgLZm4JWLcRJ/q9Gvmd3oUh7k2V7gA4ZYBx6J28pIuykIouclRdiAC6eGVX1uRZT+GK4CQJLd/PwPg==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^25.4.0", + "@jest/test-result": "^25.4.0", + "@jest/transform": "^25.4.0", + "@jest/types": "^25.4.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^25.4.0", + "jest-resolve": "^25.4.0", + "jest-util": "^25.4.0", + "jest-worker": "^25.4.0", + "node-notifier": "^6.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^3.1.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^4.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "node-notifier": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", + "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", + "dev": true, + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.1.1", + "semver": "^6.3.0", + "shellwords": "^0.1.1", + "which": "^1.3.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "optional": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@jest/source-map": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.5.0.tgz", + "integrity": "sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, + "@jest/test-result": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz", + "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==", + "dev": true, + "requires": { + "@jest/console": "^25.5.0", + "@jest/types": "^25.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz", + "integrity": "sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA==", + "dev": true, + "requires": { + "@jest/test-result": "^25.5.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", + "jest-runner": "^25.5.4", + "jest-runtime": "^25.5.4" + } + }, + "@jest/transform": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.5.1.tgz", + "integrity": "sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^25.5.0", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^3.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", + "jest-regex-util": "^25.2.6", + "jest-util": "^25.5.0", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "realpath-native": "^2.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + } + }, + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "dependencies": { + "@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@microsoft/api-extractor": { + "version": "7.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.15.2.tgz", + "integrity": "sha512-/Y/n+QOc1vM6Vg3OAUByT/wXdZciE7jV3ay33+vxl3aKva5cNsuOauL14T7XQWUiLko3ilPwrcnFcEjzXpLsuA==", + "dev": true, + "requires": { + "@microsoft/api-extractor-model": "7.13.2", + "@microsoft/tsdoc": "0.13.2", + "@microsoft/tsdoc-config": "~0.15.2", + "@rushstack/node-core-library": "3.38.0", + "@rushstack/rig-package": "0.2.12", + "@rushstack/ts-command-line": "4.7.10", + "colors": "~1.2.1", + "lodash": "~4.17.15", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "source-map": "~0.6.1", + "typescript": "~4.2.4" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.38.0.tgz", + "integrity": "sha512-cmvl0yQx8sSmbuXwiRYJi8TO+jpTtrLJQ8UmFHhKvgPVJAW8cV8dnpD1Xx/BvTGrJZ2XtRAIkAhBS9okBnap4w==", + "dev": true, + "requires": { + "@types/node": "10.17.13", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~3.18.3" + } + }, + "typescript": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", + "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "dev": true + } + } + }, + "@microsoft/api-extractor-model": { + "version": "7.13.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.13.2.tgz", + "integrity": "sha512-gA9Q8q5TPM2YYk7rLinAv9KqcodrmRC13BVmNzLswjtFxpz13lRh0BmrqD01/sddGpGMIuWFYlfUM4VSWxnggA==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.13.2", + "@microsoft/tsdoc-config": "~0.15.2", + "@rushstack/node-core-library": "3.38.0" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.38.0.tgz", + "integrity": "sha512-cmvl0yQx8sSmbuXwiRYJi8TO+jpTtrLJQ8UmFHhKvgPVJAW8cV8dnpD1Xx/BvTGrJZ2XtRAIkAhBS9okBnap4w==", + "dev": true, + "requires": { + "@types/node": "10.17.13", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~3.18.3" + } + } + } + }, + "@microsoft/eslint-config-spfx": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/eslint-config-spfx/-/eslint-config-spfx-1.15.2.tgz", + "integrity": "sha512-GMF1HMzyxI6QR5ncwLElcQoOe9jLRA97ZoSIV3JbELOqCjUGNYyZw7a+kl3TwP622Vj3CYAVXWQWhLC2Te/NTg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.20.0" + } + }, + "@microsoft/eslint-plugin-spfx": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/eslint-plugin-spfx/-/eslint-plugin-spfx-1.15.2.tgz", + "integrity": "sha512-4OObWB0H0SUOD7X5sIliAs1LrTeXsRwxXN2kbiR7puORl8b27iPkWA1ljVUAbw15qNlBRJTFF4aQtTSowDxVUA==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.20.0" + } + }, + "@microsoft/gulp-core-build": { + "version": "3.17.19", + "resolved": "https://registry.npmjs.org/@microsoft/gulp-core-build/-/gulp-core-build-3.17.19.tgz", + "integrity": "sha512-izeW3DDC9KC5NYqwHqddY0KElO7YYLtbXvH30JJnYFVlpaXTl23opv5XFZYpWe6LKGuNVGnbTNwYqEuxiGiTVg==", + "dev": true, + "requires": { + "@jest/core": "~25.4.0", + "@jest/reporters": "~25.4.0", + "@rushstack/node-core-library": "~3.44.1", + "@types/chalk": "0.4.31", + "@types/gulp": "4.0.6", + "@types/jest": "25.2.1", + "@types/node": "10.17.13", + "@types/node-notifier": "8.0.2", + "@types/orchestrator": "0.0.30", + "@types/semver": "7.3.5", + "@types/through2": "2.0.32", + "@types/vinyl": "2.0.3", + "@types/yargs": "0.0.34", + "colors": "~1.2.1", + "del": "^2.2.2", + "end-of-stream": "~1.1.0", + "glob": "~7.0.5", + "glob-escape": "~0.0.2", + "globby": "~5.0.0", + "gulp": "~4.0.2", + "gulp-flatten": "~0.2.0", + "gulp-if": "^2.0.1", + "jest": "~25.4.0", + "jest-cli": "~25.4.0", + "jest-environment-jsdom": "~25.4.0", + "jest-nunit-reporter": "~1.3.1", + "jsdom": "~11.11.0", + "lodash.merge": "~4.6.2", + "merge2": "~1.0.2", + "node-notifier": "~10.0.1", + "object-assign": "~4.1.0", + "orchestrator": "~0.3.8", + "pretty-hrtime": "~1.0.2", + "semver": "~7.3.0", + "through2": "~2.0.1", + "vinyl": "~2.2.0", + "xml": "~1.0.1", + "yargs": "~4.6.0", + "z-schema": "~3.18.3" + }, + "dependencies": { + "@types/jest": { + "version": "25.2.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.2.1.tgz", + "integrity": "sha512-msra1bCaAeEdkSyA0CZ6gW1ukMIvZ5YoJkdXw/qhQdsuuDlFTcEUrUw8CLCPt2rVRUfXlClVvK2gvPs9IokZaA==", + "dev": true, + "requires": { + "jest-diff": "^25.2.1", + "pretty-format": "^25.2.1" + } + }, + "diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true + }, + "jest": { + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.4.0.tgz", + "integrity": "sha512-XWipOheGB4wai5JfCYXd6vwsWNwM/dirjRoZgAa7H2wd8ODWbli2AiKjqG8AYhyx+8+5FBEdpO92VhGlBydzbw==", + "dev": true, + "requires": { + "@jest/core": "^25.4.0", + "import-local": "^3.0.2", + "jest-cli": "^25.4.0" + } + }, + "jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + } + }, + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + } + } + }, + "@microsoft/gulp-core-build-sass": { + "version": "4.15.5", + "resolved": "https://registry.npmjs.org/@microsoft/gulp-core-build-sass/-/gulp-core-build-sass-4.15.5.tgz", + "integrity": "sha512-kDxVDAb4SL/otB7pNAy+oRnIYIdf/cxydc85Y13j2dInNEraaId/bvEFXNxfUn3GxIUF4YJOmLtHklfVhCxIGA==", + "dev": true, + "requires": { + "@microsoft/gulp-core-build": "3.17.19", + "@microsoft/load-themed-styles": "~1.10.172", + "@rushstack/node-core-library": "~3.44.1", + "@types/gulp": "4.0.6", + "@types/node": "10.17.13", + "autoprefixer": "~9.8.8", + "clean-css": "4.2.1", + "glob": "~7.0.5", + "postcss": "7.0.38", + "postcss-modules": "~1.5.0", + "sass": "1.44.0" + } + }, + "@microsoft/gulp-core-build-serve": { + "version": "3.9.21", + "resolved": "https://registry.npmjs.org/@microsoft/gulp-core-build-serve/-/gulp-core-build-serve-3.9.21.tgz", + "integrity": "sha512-Q+sCbf+fSbF48jgp6I74aNftXGHvvCtPEuGD4bpH2l06uiu3IH+tEGiMgCH41GTBckbmkz8cXl+Q8681Tq38bA==", + "dev": true, + "requires": { + "@microsoft/gulp-core-build": "3.17.19", + "@rushstack/debug-certificate-manager": "~1.1.19", + "@rushstack/node-core-library": "~3.44.1", + "@types/node": "10.17.13", + "colors": "~1.2.1", + "express": "~4.16.2", + "gulp": "~4.0.2", + "gulp-connect": "~5.5.0", + "gulp-open": "~3.0.1", + "sudo": "~1.0.3" + } + }, + "@microsoft/gulp-core-build-typescript": { + "version": "8.5.32", + "resolved": "https://registry.npmjs.org/@microsoft/gulp-core-build-typescript/-/gulp-core-build-typescript-8.5.32.tgz", + "integrity": "sha512-jQKLtvzNzixpRO3R38xnkjOswG3r+t7TlC40IPKTFhpGd4p1hgSahS8txejkcSH6jc4k5Rstdmg8xNjZJqKnoQ==", + "dev": true, + "requires": { + "@microsoft/gulp-core-build": "3.17.19", + "@rushstack/node-core-library": "~3.44.1", + "@types/node": "10.17.13", + "decomment": "~0.9.1", + "glob": "~7.0.5", + "glob-escape": "~0.0.2", + "resolve": "~1.17.0" + } + }, + "@microsoft/gulp-core-build-webpack": { + "version": "5.2.27", + "resolved": "https://registry.npmjs.org/@microsoft/gulp-core-build-webpack/-/gulp-core-build-webpack-5.2.27.tgz", + "integrity": "sha512-6vEKnFqgfXie9um+uVcPZZEg9mZQJXLOdz1KQWMZwpPmfM7gf+ND8eHCmZizg2Exksm+WthEn5xn8zgLpdudig==", + "dev": true, + "requires": { + "@microsoft/gulp-core-build": "3.17.19", + "@types/gulp": "4.0.6", + "@types/node": "10.17.13", + "colors": "~1.2.1", + "gulp": "~4.0.2", + "webpack": "~4.44.2" + }, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "ajv": { + "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", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.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==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "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" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.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==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "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, + "optional": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "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 + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "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": { + "randombytes": "^2.1.0" + } + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.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, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "@microsoft/load-themed-styles": { + "version": "1.10.288", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.288.tgz", + "integrity": "sha512-45Z/ROR2pkgFRvWzve+cMSqgHFQZ1EUaC4e4WtX38kjbFYT+P++AFGtvor912WjQe6qS75wS3cPph2a6hPLoEA==" + }, + "@microsoft/loader-load-themed-styles": { + "version": "1.9.147", + "resolved": "https://registry.npmjs.org/@microsoft/loader-load-themed-styles/-/loader-load-themed-styles-1.9.147.tgz", + "integrity": "sha512-x6RmEo/LMJBv7Zn3exVJhnTwdtKayCyFuiUZ1VCDVT4otV6DLg5msvKWNqN4mm1EyGh4JmYFWYqEIO96nvcq8w==", + "dev": true, + "requires": { + "@microsoft/load-themed-styles": "1.10.266", + "loader-utils": "~1.1.0" + }, + "dependencies": { + "@microsoft/load-themed-styles": { + "version": "1.10.266", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.266.tgz", + "integrity": "sha512-xburd5lN4LSFgRbvA2M3bgXIZUa/OlKf9F851gdCu4qMNqyHavZlusRfhGl+H3bsmrWTYU1xlanGZz6ie2zLoA==", + "dev": true + } + } + }, + "@microsoft/microsoft-graph-client": { + "version": "1.7.2-spfx", + "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-client/-/microsoft-graph-client-1.7.2-spfx.tgz", + "integrity": "sha512-BQN50r3tohWYOaQ0de7LJ5eCRjI6eg4RQqLhGDlgRmZIZhWzH0bhR6QBMmmxtYtwKWifhPhJSxYDW+cP67TJVw==", + "requires": { + "es6-promise": "^4.2.6", + "isomorphic-fetch": "^3.0.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@microsoft/microsoft-graph-clientV3": { + "version": "npm:@microsoft/microsoft-graph-client@3.0.2", + "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-client/-/microsoft-graph-client-3.0.2.tgz", + "integrity": "sha512-eYDiApYmiGsm1s1jfAa/rhB2xQCsX4pWt0vCTd1LZmiApMQfT/c0hXj2hvpuGz5GrcLdugbu05xB79rIV57Pjw==", + "requires": { + "@babel/runtime": "^7.12.5", + "tslib": "^2.2.0" + } + }, + "@microsoft/microsoft-graph-types": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-types/-/microsoft-graph-types-2.23.0.tgz", + "integrity": "sha512-4TwjVg/A28K5Df1br17gRmv7Z0iWqYArdUo77xPz+bEtMpDD1hwmKUNj7O7a8r3sN7WIC2nKp6Atb6LXTr1LEA==" + }, + "@microsoft/office-ui-fabric-react-bundle": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/office-ui-fabric-react-bundle/-/office-ui-fabric-react-bundle-1.15.2.tgz", + "integrity": "sha512-iYQvIIRkjvwkoD9RHa3LUqbago9wSL0YUiifbQib7sG4fzl38Hmrht+WA0DPRPZbSwOWCsjzv7FXt1YWy9QxFQ==", + "requires": { + "@microsoft/sp-core-library": "1.15.2", + "@uifabric/icons": "7.7.2", + "office-ui-fabric-react": "7.185.7", + "react": "16.13.1", + "react-dom": "16.13.1", + "tslib": "2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@microsoft/rush-lib": { + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/@microsoft/rush-lib/-/rush-lib-5.70.0.tgz", + "integrity": "sha512-voTwbD33rp3+2KdP8tvgmV63ay5QDeSZyxLIb3gjmzmF2dp6SYi1OPXULFbJBgCEg2c/V09Aa5o7fZ6nHtLuGw==", + "dev": true, + "requires": { + "@pnpm/link-bins": "~5.3.7", + "@rushstack/heft-config-file": "0.8.4", + "@rushstack/node-core-library": "3.45.5", + "@rushstack/package-deps-hash": "3.2.17", + "@rushstack/rig-package": "0.3.11", + "@rushstack/rush-amazon-s3-build-cache-plugin": "5.70.0", + "@rushstack/rush-azure-storage-build-cache-plugin": "5.70.0", + "@rushstack/stream-collator": "4.0.172", + "@rushstack/terminal": "0.3.41", + "@rushstack/ts-command-line": "4.11.0", + "@types/node-fetch": "1.6.9", + "@yarnpkg/lockfile": "~1.0.2", + "builtin-modules": "~3.1.0", + "cli-table": "~0.3.1", + "colors": "~1.2.1", + "git-repo-info": "~2.1.0", + "glob": "~7.0.5", + "glob-escape": "~0.0.2", + "https-proxy-agent": "~5.0.0", + "ignore": "~5.1.6", + "inquirer": "~7.3.3", + "js-yaml": "~3.13.1", + "jszip": "~3.7.1", + "lodash": "~4.17.15", + "node-fetch": "2.6.7", + "npm-package-arg": "~6.1.0", + "npm-packlist": "~2.1.2", + "read-package-tree": "~5.1.5", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "ssri": "~8.0.0", + "strict-uri-encode": "~2.0.0", + "tapable": "2.2.1", + "tar": "~6.1.11", + "true-case-path": "~2.2.1" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "@rushstack/rig-package": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.11.tgz", + "integrity": "sha512-uI1/g5oQPtyrT9nStoyX/xgZSLa2b+srRFaDk3r1eqC7zA5th4/bvTGl2QfV3C9NcP+coSqmk5mFJkUfH6i3Lw==", + "dev": true, + "requires": { + "resolve": "~1.17.0", + "strip-json-comments": "~3.1.1" + } + }, + "@rushstack/ts-command-line": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.11.0.tgz", + "integrity": "sha512-ptG9L0mjvJ5QtK11GsAFY+jGfsnqHDS6CY6Yw1xT7a9bhjfNYnf6UPwjV+pF6UgiucfNcMDNW9lkDLxvZKKxMg==", + "dev": true, + "requires": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } + } + } + }, + "@microsoft/rush-stack-compiler-4.5": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@microsoft/rush-stack-compiler-4.5/-/rush-stack-compiler-4.5-0.2.2.tgz", + "integrity": "sha512-nRlomAZwOYUR3qmFxxVcn8A3wmkjQ4eS3hoKzYylOqEU8SYPFxDFSN4I+2Y+hGTYG0gpm3NSL4Wvb0I180pCbg==", + "dev": true, + "requires": { + "@microsoft/api-extractor": "~7.15.2", + "@rushstack/eslint-config": "~2.5.0", + "@rushstack/node-core-library": "~3.44.1", + "@types/node": "10.17.13", + "eslint": "8.7.0", + "import-lazy": "~4.0.0", + "typescript": "~4.5.5" + }, + "dependencies": { + "@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "ajv": { + "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", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "eslint": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz", + "integrity": "sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.2.0", + "espree": "^9.3.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "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" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "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 + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typescript": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "dev": true + } + } + }, + "@microsoft/sp-build-core-tasks": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-build-core-tasks/-/sp-build-core-tasks-1.15.2.tgz", + "integrity": "sha512-yVpPKGKlMcsDbO9bjVYEf2PZEcVHC8eAx49qYXi4jGbAIOqZC6hjxJKQYLXT/Gh02wA67GFmwr55C7KOO1wMUg==", + "dev": true, + "requires": { + "@microsoft/gulp-core-build": "3.17.19", + "@microsoft/gulp-core-build-serve": "3.9.21", + "@microsoft/gulp-core-build-webpack": "5.2.27", + "@microsoft/spfx-heft-plugins": "1.15.2", + "@rushstack/node-core-library": "3.45.5", + "@types/glob": "5.0.30", + "@types/lodash": "4.14.117", + "@types/webpack": "4.41.24", + "colors": "~1.2.1", + "glob": "~7.0.5", + "gulp": "4.0.2", + "lodash": "4.17.21", + "webpack": "~4.44.2" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "ajv": { + "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", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.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==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "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" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.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==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "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, + "optional": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "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 + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.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==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.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, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } + } + } + }, + "@microsoft/sp-build-web": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-build-web/-/sp-build-web-1.15.2.tgz", + "integrity": "sha512-lS67sxWuqkbTEjPhJHYurARxMQCNc8j0zw5WdnvKG8bt1DrcHe8NLtpfK9pDcPYe7S5YfgI36AOiEvICxjRkqg==", + "dev": true, + "requires": { + "@microsoft/gulp-core-build": "3.17.19", + "@microsoft/gulp-core-build-sass": "4.15.5", + "@microsoft/gulp-core-build-serve": "3.9.21", + "@microsoft/gulp-core-build-typescript": "8.5.32", + "@microsoft/gulp-core-build-webpack": "5.2.27", + "@microsoft/rush-lib": "5.70.0", + "@microsoft/sp-build-core-tasks": "1.15.2", + "@rushstack/node-core-library": "3.45.5", + "@types/webpack": "4.41.24", + "gulp": "4.0.2", + "semver": "~7.3.2", + "true-case-path": "~2.2.1", + "webpack": "~4.44.2", + "yargs": "~4.6.0" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "ajv": { + "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", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.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==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "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" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.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==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "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, + "optional": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "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 + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.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==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.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, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } + } + } + }, + "@microsoft/sp-component-base": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-component-base/-/sp-component-base-1.15.2.tgz", + "integrity": "sha512-Uf7nZ6Ohf68FQ4ABDs+8GVyqAb87rybaTJh/xBYz7DAjUUk/G1urq9wqTih8hSaHGog4P7ovuVeBKNYpmOU3Tg==", + "requires": { + "@microsoft/office-ui-fabric-react-bundle": "1.15.2", + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-dynamic-data": "1.15.2", + "@microsoft/sp-http": "1.15.2", + "@microsoft/sp-lodash-subset": "1.15.2", + "@microsoft/sp-module-interfaces": "1.15.2", + "@microsoft/sp-page-context": "1.15.2", + "tslib": "2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@microsoft/sp-core-library": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-core-library/-/sp-core-library-1.15.2.tgz", + "integrity": "sha512-sEotaC8+jUMZa5wc3lvtDYOGpAzzcl1fSZ0FnANIrJGyBC6tTqred0fzpkXptd4R0G/wi3746ivrccAOkzONkQ==", + "requires": { + "@microsoft/sp-lodash-subset": "1.15.2", + "@microsoft/sp-module-interfaces": "1.15.2", + "@microsoft/sp-odata-types": "1.15.2", + "tslib": "2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@microsoft/sp-css-loader": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-css-loader/-/sp-css-loader-1.15.2.tgz", + "integrity": "sha512-3SjLphivW4kYg/Jl4exVStrBNuEjl0ol69zdJCjkRLT+wZvAstc5Y4RVljMDAap1BgTh14zJ3jT6nztbExlMGA==", + "dev": true, + "requires": { + "@microsoft/load-themed-styles": "1.10.266", + "@rushstack/node-core-library": "3.45.5", + "autoprefixer": "9.7.1", + "css-loader": "3.4.2", + "cssnano": "~4.1.10", + "loader-utils": "1.2.3", + "postcss": "~8.1.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", + "webpack": "~4.44.2" + }, + "dependencies": { + "@microsoft/load-themed-styles": { + "version": "1.10.266", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.266.tgz", + "integrity": "sha512-xburd5lN4LSFgRbvA2M3bgXIZUa/OlKf9F851gdCu4qMNqyHavZlusRfhGl+H3bsmrWTYU1xlanGZz6ie2zLoA==", + "dev": true + }, + "@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "ajv": { + "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", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "autoprefixer": { + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz", + "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==", + "dev": true, + "requires": { + "browserslist": "^4.7.2", + "caniuse-lite": "^1.0.30001006", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.21", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + } + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^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" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "css-loader": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", + "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.23", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.1.1", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.2", + "schema-utils": "^2.6.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + } + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.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==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "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" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.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==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "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, + "optional": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "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 + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "postcss": { + "version": "8.1.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.14.tgz", + "integrity": "sha512-KatkyVPBKfENS+c3dpXJoDXnDD5UZs5exAnDksLqaRJPKwYphEPZt4N0m0i049v2/BtWVQibAhxW4ilXXcolpA==", + "dev": true, + "requires": { + "colorette": "^1.2.1", + "nanoid": "^3.1.20", + "source-map": "^0.6.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, + "requires": {} + }, + "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" + }, + "dependencies": { + "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, + "requires": {} + } + } + }, + "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" + } + }, + "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" + }, + "dependencies": { + "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, + "requires": {} + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "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": { + "randombytes": "^2.1.0" + } + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "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" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.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, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } + } + } + }, + "@microsoft/sp-diagnostics": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-diagnostics/-/sp-diagnostics-1.15.2.tgz", + "integrity": "sha512-9OJQwkdy3kqATQISpI4SG+5OUMB90KesupsWIE31aAyPcQiilh0XGhWmaYnCxCgGATAWcaYrFeptlDOTQNpuiA==", + "requires": { + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-lodash-subset": "1.15.2" + } + }, + "@microsoft/sp-dynamic-data": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-dynamic-data/-/sp-dynamic-data-1.15.2.tgz", + "integrity": "sha512-6ks5GUBSatsijQC8NUjaLjYCv4efAbEJcbSVTj8lySpTVCWu8aKsFtKB1b/Vc3I1g9Adq6z2e9sgTaPwm6HTlA==", + "requires": { + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-lodash-subset": "1.15.2", + "@microsoft/sp-module-interfaces": "1.15.2", + "tslib": "2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@microsoft/sp-http": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-http/-/sp-http-1.15.2.tgz", + "integrity": "sha512-vP3heQlje3YVTgyaGKZmrHksqmWP+zczuhQP116cCl6z52ZdUiuJIZpDcu+WGZaG1HdznAyrNGkkiZauTytIHw==", + "requires": { + "@azure/msal-browser": "2.22.0", + "@microsoft/microsoft-graph-client": "1.7.2-spfx", + "@microsoft/microsoft-graph-clientV3": "npm:@microsoft/microsoft-graph-client@3.0.2", + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-page-context": "1.15.2", + "@types/adal-angular": "1.0.1", + "adal-angular": "1.0.16", + "msalLegacy": "npm:msal@1.4.12", + "tslib": "2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@microsoft/sp-image-helper": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-image-helper/-/sp-image-helper-1.15.2.tgz", + "integrity": "sha512-vNwymXZtGLFdgkNaV0j/Oi5t8Pz2FV9LgS2gnbAKuRzLSXtCSZ9hfP+5eC5LrVBWkSzxHC+8e+gAGaxqbr2asA==", + "requires": { + "@microsoft/office-ui-fabric-react-bundle": "1.15.2", + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-http": "1.15.2", + "@microsoft/sp-loader": "1.15.2", + "@microsoft/sp-lodash-subset": "1.15.2", + "@microsoft/sp-page-context": "1.15.2", + "tslib": "2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@microsoft/sp-list-subscription": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-list-subscription/-/sp-list-subscription-1.15.2.tgz", + "integrity": "sha512-s7YldyAi9YGnUOiQWh0Qq9j/AJDkToV+18LRAB+vpU5vTKQQuDKxQc8h9uze7u1CBBhDl4YiABCNkZwxgaD2EQ==", + "requires": { + "@microsoft/sp-component-base": "1.15.2", + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-http": "1.15.2", + "@microsoft/sp-page-context": "1.15.2", + "tslib": "2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@microsoft/sp-loader": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-loader/-/sp-loader-1.15.2.tgz", + "integrity": "sha512-w1EbIrP7AXH5Oq0cQwKW5OZUK6+c3amiImGUBSAlyHaEyC5/gSKMCDM0XJ0xkrihWs0ICWj/yX2o0aLaaReO3g==", + "requires": { + "@microsoft/office-ui-fabric-react-bundle": "1.15.2", + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-dynamic-data": "1.15.2", + "@microsoft/sp-http": "1.15.2", + "@microsoft/sp-lodash-subset": "1.15.2", + "@microsoft/sp-module-interfaces": "1.15.2", + "@microsoft/sp-odata-types": "1.15.2", + "@microsoft/sp-page-context": "1.15.2", + "@microsoft/sp-polyfills": "1.15.2", + "@rushstack/loader-raw-script": "1.3.228", + "@types/requirejs": "2.1.29", + "office-ui-fabric-react": "7.185.7", + "raw-loader": "~0.5.1", + "react": "16.13.1", + "react-dom": "16.13.1", + "requirejs": "2.3.6", + "tslib": "2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@microsoft/sp-lodash-subset": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-lodash-subset/-/sp-lodash-subset-1.15.2.tgz", + "integrity": "sha512-XLqSltvz9W0hft76fylqVFNUIVS1sLjdUF3+lIQyj0g+4R9kDy9VsGhpxX7qLGAdW10yZ6Z40qfmBWgn8NN4MA==", + "requires": { + "@types/lodash": "4.14.117", + "tslib": "2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@microsoft/sp-module-interfaces": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-module-interfaces/-/sp-module-interfaces-1.15.2.tgz", + "integrity": "sha512-JGOjK8f5ww+r4ax8TBAPDyZhDhGWVg1Jk4PvKE0cU6qjywM0DzWWkzHJFcyFXdjr8UE/+wzJOKasCCtu1RjWQg==", + "requires": { + "@rushstack/node-core-library": "3.45.5", + "z-schema": "4.2.4" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + }, + "dependencies": { + "z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } + } + } + }, + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==" + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "optional": true + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" + }, + "z-schema": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-4.2.4.tgz", + "integrity": "sha512-YvBeW5RGNeNzKOUJs3rTL4+9rpcvHXt5I051FJbOcitV8bl40pEfcG0Q+dWSwS0/BIYrMZ/9HHoqLllMkFhD0w==", + "requires": { + "commander": "^2.7.1", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.6.0" + } + } + } + }, + "@microsoft/sp-odata-types": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-odata-types/-/sp-odata-types-1.15.2.tgz", + "integrity": "sha512-Eb5MAWRAOkRAGXSdacg8p/KdSpYDJBNwyqNCZwrsCbgf/66h28oK0KUqQ6o8Hcy+vAZpa16x6bvpJQw5u1u8ZA==", + "requires": { + "tslib": "2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@microsoft/sp-page-context": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-page-context/-/sp-page-context-1.15.2.tgz", + "integrity": "sha512-gq7q2vq5rzAwkOn4/jpdL/VgHCrtDWNZqjcU62W6iIW4TNT3nVykcof9llpghPcYx5dOuTtrRizXfa+vtQ+rzw==", + "requires": { + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-dynamic-data": "1.15.2", + "@microsoft/sp-lodash-subset": "1.15.2", + "@microsoft/sp-odata-types": "1.15.2", + "tslib": "2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@microsoft/sp-polyfills": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-polyfills/-/sp-polyfills-1.15.2.tgz", + "integrity": "sha512-XxbM/3p6yW/OIahcmzOVFQArKRxySHuDLSveSEdjIY3ycG8UWNX4QXDEd1tZchWCDz3vfO+j4aUsPPSOVW1Wcw==", + "requires": { + "es6-promise": "4.2.4", + "es6-symbol": "3.1.3", + "tslib": "2.3.1", + "whatwg-fetch": "2.0.3", + "whatwg-url": "4.7.1" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@microsoft/sp-property-pane": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-property-pane/-/sp-property-pane-1.15.2.tgz", + "integrity": "sha512-V78aUGZa4gM/MMmOg14iWYPoknHe9jrormvTXpltjcIvipRm5H5bRr6D4SfuzJ7uu0roJ53zfGddCDdvn05ezA==", + "requires": { + "@microsoft/office-ui-fabric-react-bundle": "1.15.2", + "@microsoft/sp-component-base": "1.15.2", + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-dynamic-data": "1.15.2", + "@microsoft/sp-image-helper": "1.15.2", + "@microsoft/sp-lodash-subset": "1.15.2", + "@microsoft/sp-page-context": "1.15.2", + "office-ui-fabric-react": "7.185.7", + "react": "16.13.1", + "react-dom": "16.13.1", + "tslib": "2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@microsoft/sp-webpart-base": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/sp-webpart-base/-/sp-webpart-base-1.15.2.tgz", + "integrity": "sha512-dFQBwmRg81EDyV5RzA7JEhtdKyjk3vjKZBn3pWvaY/4Yo+oGyzKdQ8o/z2A9OO6KwXXlXkFiGJgoau57c/EALQ==", + "requires": { + "@microsoft/sp-component-base": "1.15.2", + "@microsoft/sp-core-library": "1.15.2", + "@microsoft/sp-diagnostics": "1.15.2", + "@microsoft/sp-dynamic-data": "1.15.2", + "@microsoft/sp-http": "1.15.2", + "@microsoft/sp-loader": "1.15.2", + "@microsoft/sp-lodash-subset": "1.15.2", + "@microsoft/sp-module-interfaces": "1.15.2", + "@microsoft/sp-page-context": "1.15.2", + "@microsoft/sp-property-pane": "1.15.2", + "@microsoft/teams-js": "1.12.1", + "@types/office-js": "1.0.36", + "office-ui-fabric-react": "7.185.7", + "react": "16.13.1", + "react-dom": "16.13.1", + "tslib": "2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@microsoft/spfx-heft-plugins": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/spfx-heft-plugins/-/spfx-heft-plugins-1.15.2.tgz", + "integrity": "sha512-92MAbCba3luuofv5se1p6SOnvuSTVmHJDozu/FljR6s3OIFrDOYjEZXSD3DgK0rf1oTijJbH3jXI5Pq6VqmimQ==", + "dev": true, + "requires": { + "@azure/storage-blob": "~12.4.1", + "@microsoft/loader-load-themed-styles": "1.9.147", + "@microsoft/rush-lib": "5.70.0", + "@microsoft/sp-css-loader": "1.15.2", + "@microsoft/sp-module-interfaces": "1.15.2", + "@rushstack/heft-config-file": "0.8.4", + "@rushstack/localization-plugin": "0.11.0", + "@rushstack/module-minifier-plugin": "0.9.0", + "@rushstack/node-core-library": "3.45.5", + "@rushstack/rig-package": "0.3.11", + "@rushstack/set-webpack-public-path-plugin": "3.3.37", + "@rushstack/terminal": "0.3.43", + "@types/tapable": "1.0.6", + "autoprefixer": "9.7.1", + "colors": "~1.2.1", + "copy-webpack-plugin": "~6.0.3", + "css-loader": "~3.2.0", + "cssnano": "~4.1.10", + "express": "4.17.1", + "file-loader": "~1.1.11", + "git-repo-info": "~2.1.1", + "glob": "~7.0.5", + "html-loader": "~0.5.1", + "lodash": "4.17.21", + "mime": "2.5.2", + "node-zip": "~1.1.1", + "postcss-loader": "3.0.0", + "resolve": "~1.17.0", + "sass": "1.44.0", + "sass-loader": "8.0.2", + "source-map": "0.6.1", + "source-map-loader": "1.1.3", + "tapable": "1.1.3", + "true-case-path": "~2.2.1", + "uuid": "~3.1.0", + "webpack": "~4.44.2", + "webpack-dev-server": "~3.11.0", + "webpack-sources": "1.4.3", + "xml": "~1.0.1" + }, + "dependencies": { + "@rushstack/localization-plugin": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@rushstack/localization-plugin/-/localization-plugin-0.11.0.tgz", + "integrity": "sha512-csb0TpH6Flp70yii/WVYFKmgykx1h9WQpzYWDDZCpMqIlCo+TmwnCpJjNZpdFCpzqqQt1bux1sprelNaUh1Nag==", + "dev": true, + "requires": { + "@rushstack/node-core-library": "3.45.5", + "@rushstack/typings-generator": "0.6.24", + "@types/node": "12.20.24", + "@types/tapable": "1.0.6", + "decache": "~4.5.1", + "loader-utils": "~1.1.0", + "lodash": "~4.17.15", + "minimatch": "~3.0.3", + "pseudolocale": "~1.1.0", + "xmldoc": "~1.1.2" + } + }, + "@rushstack/module-minifier-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@rushstack/module-minifier-plugin/-/module-minifier-plugin-0.9.0.tgz", + "integrity": "sha512-DsDeQ5crXB7tNZTPSkGQ74yOxiMrpNVYXCIXTAoUHCqk2T0+oSVaCKb12C8cIRIDRz+EjfLjAc529HqX/cT0Kw==", + "dev": true, + "requires": { + "@rushstack/module-minifier": "0.1.0", + "@rushstack/worker-pool": "0.1.0", + "@types/node": "12.20.24", + "@types/tapable": "1.0.6", + "tapable": "1.1.3" + } + }, + "@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "@rushstack/rig-package": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.11.tgz", + "integrity": "sha512-uI1/g5oQPtyrT9nStoyX/xgZSLa2b+srRFaDk3r1eqC7zA5th4/bvTGl2QfV3C9NcP+coSqmk5mFJkUfH6i3Lw==", + "dev": true, + "requires": { + "resolve": "~1.17.0", + "strip-json-comments": "~3.1.1" + } + }, + "@rushstack/terminal": { + "version": "0.3.43", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.3.43.tgz", + "integrity": "sha512-iJJ+hbPISsFykLvmfUocFfxyzyah1t2PGXU2gSzG1P5ouicPdh0yjM0Tta2ZbaSi9Z2F59+/8iUGHRWk5WE+Tg==", + "dev": true, + "requires": { + "@rushstack/node-core-library": "3.45.5", + "@types/node": "12.20.24", + "wordwrap": "~1.0.0" + } + }, + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "ajv": { + "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", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "autoprefixer": { + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz", + "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==", + "dev": true, + "requires": { + "browserslist": "^4.7.2", + "caniuse-lite": "^1.0.30001006", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.21", + "postcss-value-parser": "^4.0.2" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "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" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "css-loader": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.2.1.tgz", + "integrity": "sha512-q40kYdcBNzMvkIImCL2O+wk8dh+RGwPPV9Dfz3n7XtOYPXqe2Z6VgtvoxjkLHz02gmhepG9sOAJOUlx+3hHsBg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.23", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.1.1", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.2", + "schema-utils": "^2.6.0" + }, + "dependencies": { + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" + }, + "dependencies": { + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.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, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "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" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "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" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.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==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "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, + "optional": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "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 + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "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": { + "randombytes": "^2.1.0" + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + }, + "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" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.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, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } + } + } + }, + "@microsoft/teams-js": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@microsoft/teams-js/-/teams-js-1.12.1.tgz", + "integrity": "sha512-BRy6vZOseN9F/MG0NWTojYpenuo9XlZ4AfAvwnsG+C36UDPPgW0skWlZ6ub+7RBPhOHcxz8sNg2uHOdGRebWkQ==" + }, + "@microsoft/tsdoc": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz", + "integrity": "sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==", + "dev": true + }, + "@microsoft/tsdoc-config": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz", + "integrity": "sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.13.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + }, + "dependencies": { + "ajv": { + "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", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "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" + } + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@opencensus/web-types": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@opencensus/web-types/-/web-types-0.0.7.tgz", + "integrity": "sha512-xB+w7ZDAu3YBzqH44rCmG9/RlrOmFuDPt/bpf17eJr8eZSrLt7nc7LnWdxM9Mmoj/YKMHpxRg28txu3TcpiL+g==", + "dev": true + }, + "@opentelemetry/api": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.10.2.tgz", + "integrity": "sha512-GtpMGd6vkzDMYcpu2t9LlhEgMy/SzBwRnz48EejlRArYqZzqSzAsKmegUK7zHgl+EOIaK9mKHhnRaQu3qw20cA==", + "dev": true, + "requires": { + "@opentelemetry/context-base": "^0.10.2" + } + }, + "@opentelemetry/context-base": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.10.2.tgz", + "integrity": "sha512-hZNKjKOYsckoOEgBziGMnBcX0M7EtstnCmwz5jZUOUYwlZ+/xxX6z3jPu1XVO2Jivk0eLfuP9GP+vFD49CMetw==", + "dev": true + }, + "@opentelemetry/types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/types/-/types-0.2.0.tgz", + "integrity": "sha512-GtwNB6BNDdsIPAYEdpp3JnOGO/3AJxjPvny53s3HERBdXSJTGQw8IRhiaTEX0b3w9P8+FwFZde4k+qkjn67aVw==", + "dev": true + }, + "@pnp/common": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@pnp/common/-/common-2.14.0.tgz", + "integrity": "sha512-GtiV/GfnDtQpoCCTr1GsGpLNI3QC6CRSDduSMbnqFO7uW0MCQXH2xh126/UceH4mwP3BVjNUhi7JZCMEa1lB2A==", + "requires": { + "tslib": "2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "@pnp/graph": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@pnp/graph/-/graph-2.14.0.tgz", + "integrity": "sha512-ASDp/W9UtQEZJlZBZLfFMUb3JHXJD+Jn/9CPSB8kAqfpThB6e7lxaMtlvhWq1nOdWTNs4CBMeKzwqLGcLgDFnQ==", + "requires": { + "@microsoft/microsoft-graph-types": "^2.13.0", + "@pnp/common": "2.14.0", + "@pnp/logging": "2.14.0", + "@pnp/odata": "2.14.0", + "tslib": "2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "@pnp/logging": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@pnp/logging/-/logging-2.14.0.tgz", + "integrity": "sha512-M/7PyG6zf962KI96ORtmnKp+a45x2Wcy5llsz0+i4FYoWRZuXA9UY5ahIO34sRSYB7FZw5tVwmxSlvQKVLWF3w==", + "requires": { + "tslib": "2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "@pnp/odata": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@pnp/odata/-/odata-2.14.0.tgz", + "integrity": "sha512-HuVOLJxXsjiVj/Qi0sDYL+v+Nty6SPquz4Qtb0PDNUdRnH63UKEmI8M19QQDohxmCJvueNL1gNj9iy9yHWnASQ==", + "requires": { + "@pnp/common": "2.14.0", + "@pnp/logging": "2.14.0", + "tslib": "2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "@pnp/sp": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@pnp/sp/-/sp-2.14.0.tgz", + "integrity": "sha512-DP1Hajw6gm2vFfNd5iStYTaSVt1aggGQ0rBpOU+5B9tfJb9WBVOlpwQ8jfvRZXNjc9TRGxFTnO1oH29E4MP2UA==", + "requires": { + "@pnp/common": "2.14.0", + "@pnp/logging": "2.14.0", + "@pnp/odata": "2.14.0", + "tslib": "2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, + "@pnpm/error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pnpm/error/-/error-1.4.0.tgz", + "integrity": "sha512-vxkRrkneBPVmP23kyjnYwVOtipwlSl6UfL+h+Xa3TrABJTz5rYBXemlTsU5BzST8U4pD7YDkTb3SQu+MMuIDKA==", + "dev": true + }, + "@pnpm/link-bins": { + "version": "5.3.25", + "resolved": "https://registry.npmjs.org/@pnpm/link-bins/-/link-bins-5.3.25.tgz", + "integrity": "sha512-9Xq8lLNRHFDqvYPXPgaiKkZ4rtdsm7izwM/cUsFDc5IMnG0QYIVBXQbgwhz2UvjUotbJrvfKLJaCfA3NGBnLDg==", + "dev": true, + "requires": { + "@pnpm/error": "1.4.0", + "@pnpm/package-bins": "4.1.0", + "@pnpm/read-modules-dir": "2.0.3", + "@pnpm/read-package-json": "4.0.0", + "@pnpm/read-project-manifest": "1.1.7", + "@pnpm/types": "6.4.0", + "@zkochan/cmd-shim": "^5.0.0", + "is-subdir": "^1.1.1", + "is-windows": "^1.0.2", + "mz": "^2.7.0", + "normalize-path": "^3.0.0", + "p-settle": "^4.1.1", + "ramda": "^0.27.1" + } + }, + "@pnpm/package-bins": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/package-bins/-/package-bins-4.1.0.tgz", + "integrity": "sha512-57/ioGYLBbVRR80Ux9/q2i3y8Q+uQADc3c+Yse8jr/60YLOi3jcWz13e2Jy+ANYtZI258Qc5wk2X077rp0Ly/Q==", + "dev": true, + "requires": { + "@pnpm/types": "6.4.0", + "fast-glob": "^3.2.4", + "is-subdir": "^1.1.1" + } + }, + "@pnpm/read-modules-dir": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@pnpm/read-modules-dir/-/read-modules-dir-2.0.3.tgz", + "integrity": "sha512-i9OgRvSlxrTS9a2oXokhDxvQzDtfqtsooJ9jaGoHkznue5aFCTSrNZFQ6M18o8hC03QWfnxaKi0BtOvNkKu2+A==", + "dev": true, + "requires": { + "mz": "^2.7.0" + } + }, + "@pnpm/read-package-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@pnpm/read-package-json/-/read-package-json-4.0.0.tgz", + "integrity": "sha512-1cr2tEwe4YU6SI0Hmg+wnsr6yxBt2iJtqv6wrF84On8pS9hx4A2PLw3CIgbwxaG0b+ur5wzhNogwl4qD5FLFNg==", + "dev": true, + "requires": { + "@pnpm/error": "1.4.0", + "@pnpm/types": "6.4.0", + "load-json-file": "^6.2.0", + "normalize-package-data": "^3.0.2" + } + }, + "@pnpm/read-project-manifest": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@pnpm/read-project-manifest/-/read-project-manifest-1.1.7.tgz", + "integrity": "sha512-tj8ExXZeDcMmMUj7D292ETe/RiEirr1X1wpT6Zy85z2MrFYoG9jfCJpps40OdZBNZBhxbuKtGPWKVSgXD0yrVw==", + "dev": true, + "requires": { + "@pnpm/error": "1.4.0", + "@pnpm/types": "6.4.0", + "@pnpm/write-project-manifest": "1.1.7", + "detect-indent": "^6.0.0", + "fast-deep-equal": "^3.1.3", + "graceful-fs": "4.2.4", + "is-windows": "^1.0.2", + "json5": "^2.1.3", + "parse-json": "^5.1.0", + "read-yaml-file": "^2.0.0", + "sort-keys": "^4.1.0", + "strip-bom": "^4.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + } + } + }, + "@pnpm/types": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@pnpm/types/-/types-6.4.0.tgz", + "integrity": "sha512-nco4+4sZqNHn60Y4VE/fbtlShCBqipyUO+nKRPvDHqLrecMW9pzHWMVRxk4nrMRoeowj3q0rX3GYRBa8lsHTAg==", + "dev": true + }, + "@pnpm/write-project-manifest": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@pnpm/write-project-manifest/-/write-project-manifest-1.1.7.tgz", + "integrity": "sha512-OLkDZSqkA1mkoPNPvLFXyI6fb0enCuFji6Zfditi/CLAo9kmIhQFmEUDu4krSB8i908EljG8YwL5Xjxzm5wsWA==", + "dev": true, + "requires": { + "@pnpm/types": "6.4.0", + "json5": "^2.1.3", + "mz": "^2.7.0", + "write-file-atomic": "^3.0.3", + "write-yaml-file": "^4.1.3" + } + }, + "@rushstack/debug-certificate-manager": { + "version": "1.1.67", + "resolved": "https://registry.npmjs.org/@rushstack/debug-certificate-manager/-/debug-certificate-manager-1.1.67.tgz", + "integrity": "sha512-GyBGG+suxoen6EBZLFhxEOPUc9sST8cySYWLEIzIH19d+GqcSmYCmyKrUA9ndvo9TkD3DzemB1AvkBUuRCaj2g==", + "dev": true, + "requires": { + "@rushstack/node-core-library": "3.50.2", + "node-forge": "~1.3.1", + "sudo": "~1.0.3" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "3.50.2", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.50.2.tgz", + "integrity": "sha512-+zpZBcaX5s+wA0avF0Lk3sd5jbGRo5SmsEJpElJbqQd3KGFvc/hcyeNSMqV5+esJ1JuTfnE1QyRt8nvxFNTaQg==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } + } + } + }, + "@rushstack/eslint-config": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-config/-/eslint-config-2.5.1.tgz", + "integrity": "sha512-pcDQ/fmJEIqe5oZiP84bYZ1N7QoDfd+5G+e7GIobOwM793dX/SdRKqcJvGlzyBB92eo6rG7/qRnP2VVQN2pdbQ==", + "dev": true, + "requires": { + "@rushstack/eslint-patch": "1.1.0", + "@rushstack/eslint-plugin": "0.8.4", + "@rushstack/eslint-plugin-packlets": "0.3.4", + "@rushstack/eslint-plugin-security": "0.2.4", + "@typescript-eslint/eslint-plugin": "~5.6.0", + "@typescript-eslint/experimental-utils": "~5.6.0", + "@typescript-eslint/parser": "~5.6.0", + "@typescript-eslint/typescript-estree": "~5.6.0", + "eslint-plugin-promise": "~6.0.0", + "eslint-plugin-react": "~7.27.1", + "eslint-plugin-tsdoc": "~0.2.14" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.6.0.tgz", + "integrity": "sha512-VDoRf3Qj7+W3sS/ZBXZh3LBzp0snDLEgvp6qj0vOAIiAPM07bd5ojQ3CTzF/QFl5AKh7Bh1ycgj6lFBJHUt/DA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.6.0", + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/typescript-estree": "5.6.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + } + } + }, + "@rushstack/eslint-patch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.0.tgz", + "integrity": "sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A==", + "dev": true + }, + "@rushstack/eslint-plugin": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-plugin/-/eslint-plugin-0.8.4.tgz", + "integrity": "sha512-c8cY9hvak+1EQUGlJxPihElFB/5FeQCGyULTGRLe5u6hSKKtXswRqc23DTo87ZMsGd4TaScPBRNKSGjU5dORkg==", + "dev": true, + "requires": { + "@rushstack/tree-pattern": "0.2.2", + "@typescript-eslint/experimental-utils": "~5.3.0" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", + "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", + "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1" + } + }, + "@typescript-eslint/types": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", + "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", + "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", + "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "eslint-visitor-keys": "^3.0.0" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + } + } + }, + "@rushstack/eslint-plugin-packlets": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-plugin-packlets/-/eslint-plugin-packlets-0.3.4.tgz", + "integrity": "sha512-OSA58EZCx4Dw15UDdvNYGGHziQmhiozKQiOqDjn8ZkrCM3oyJmI6dduSJi57BGlb/C4SpY7+/88MImId7Y5cxA==", + "dev": true, + "requires": { + "@rushstack/tree-pattern": "0.2.2", + "@typescript-eslint/experimental-utils": "~5.3.0" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", + "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", + "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1" + } + }, + "@typescript-eslint/types": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", + "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", + "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", + "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "eslint-visitor-keys": "^3.0.0" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + } + } + }, + "@rushstack/eslint-plugin-security": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-plugin-security/-/eslint-plugin-security-0.2.4.tgz", + "integrity": "sha512-MWvM7H4vTNHXIY/SFcFSVgObj5UD0GftBM8UcIE1vXrPwdVYXDgDYXrSXdx7scWS4LYKPLBVoB3v6/Trhm2wug==", + "dev": true, + "requires": { + "@rushstack/tree-pattern": "0.2.2", + "@typescript-eslint/experimental-utils": "~5.3.0" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", + "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", + "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1" + } + }, + "@typescript-eslint/types": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", + "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", + "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", + "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "eslint-visitor-keys": "^3.0.0" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + } + } + }, + "@rushstack/heft-config-file": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@rushstack/heft-config-file/-/heft-config-file-0.8.4.tgz", + "integrity": "sha512-OFvezlWYFQlKSXXIIjuGlBwSIKIl7WXYQ48diK/J5WJWpdVaq/SLVzB3coAxNZPA/a7u+dbs1DcLORBa2e133Q==", + "dev": true, + "requires": { + "@rushstack/node-core-library": "3.45.5", + "@rushstack/rig-package": "0.3.11", + "jsonpath-plus": "~4.0.0" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "@rushstack/rig-package": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.11.tgz", + "integrity": "sha512-uI1/g5oQPtyrT9nStoyX/xgZSLa2b+srRFaDk3r1eqC7zA5th4/bvTGl2QfV3C9NcP+coSqmk5mFJkUfH6i3Lw==", + "dev": true, + "requires": { + "resolve": "~1.17.0", + "strip-json-comments": "~3.1.1" + } + }, + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } + } + } + }, + "@rushstack/loader-raw-script": { + "version": "1.3.228", + "resolved": "https://registry.npmjs.org/@rushstack/loader-raw-script/-/loader-raw-script-1.3.228.tgz", + "integrity": "sha512-yJPiwe4vCEmiZck9qUktYqVgExJV18C5wjO6Vv/l4ZWyI8WgYCei1eIcIJBtz//v3E18b8s6tKnSZDAUw1mhUQ==", + "requires": { + "loader-utils": "~1.1.0" + } + }, + "@rushstack/module-minifier": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@rushstack/module-minifier/-/module-minifier-0.1.0.tgz", + "integrity": "sha512-hHrjM9wMfLjtRPHWvIJzCzRD2qTQGc2DseFdBkGB3/oaUwO8hHyVzyf2LSYjQChHlLYlaZNLLvk1f3g8UJ51dg==", + "dev": true, + "requires": { + "@rushstack/worker-pool": "0.1.0", + "@types/node": "12.20.24", + "serialize-javascript": "6.0.0", + "source-map": "~0.7.3", + "terser": "5.9.0" + }, + "dependencies": { + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + }, + "terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + } + } + } + }, + "@rushstack/node-core-library": { + "version": "3.44.3", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.44.3.tgz", + "integrity": "sha512-Bt+R5LAnVr2BImTJqPpton5rvhJ2Wq8x4BaTqaCHQMmfxqtz5lb4nLYT9kneMJTCDuRMBvvLpSuz4MBj50PV3w==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + }, + "dependencies": { + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } + } + } + }, + "@rushstack/package-deps-hash": { + "version": "3.2.17", + "resolved": "https://registry.npmjs.org/@rushstack/package-deps-hash/-/package-deps-hash-3.2.17.tgz", + "integrity": "sha512-VglZ9hB2ZgG4ov0dCTA9ceTl4DNSJyl2xX68BMUu/vU54t709yHSorx8iKhzYHD1NiF1QA0XfZhDxZWL/m01Nw==", + "dev": true, + "requires": { + "@rushstack/node-core-library": "3.45.5" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } + } + } + }, + "@rushstack/rig-package": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.2.12.tgz", + "integrity": "sha512-nbePcvF8hQwv0ql9aeQxcaMPK/h1OLAC00W7fWCRWIvD2MchZOE8jumIIr66HGrfG2X1sw++m/ZYI4D+BM5ovQ==", + "dev": true, + "requires": { + "resolve": "~1.17.0", + "strip-json-comments": "~3.1.1" + } + }, + "@rushstack/rush-amazon-s3-build-cache-plugin": { + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/@rushstack/rush-amazon-s3-build-cache-plugin/-/rush-amazon-s3-build-cache-plugin-5.70.0.tgz", + "integrity": "sha512-Ky3qmG1+oH1J4Lm5UbbPzDzh7ThTW8jO+mD4lVYwrsbSG7nWEiLSNXKPYVqak2eKQaMJR8HoQ1J8CjPagxBNhA==", + "dev": true, + "requires": { + "@rushstack/node-core-library": "3.45.5", + "@rushstack/rush-sdk": "5.70.0", + "https-proxy-agent": "~5.0.0", + "node-fetch": "2.6.7" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } + } + } + }, + "@rushstack/rush-azure-storage-build-cache-plugin": { + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/@rushstack/rush-azure-storage-build-cache-plugin/-/rush-azure-storage-build-cache-plugin-5.70.0.tgz", + "integrity": "sha512-u8g73HN8LWRcsuxQro0gC9ORew3Y3I7OgNMIbOIpJqwaU2qstZzCwZwxHD4o6UeIr4vUZp0/x/9pKXFFKUdtfA==", + "dev": true, + "requires": { + "@azure/identity": "~1.0.0", + "@azure/storage-blob": "~12.3.0", + "@rushstack/node-core-library": "3.45.5", + "@rushstack/rush-sdk": "5.70.0", + "@rushstack/terminal": "0.3.41" + }, + "dependencies": { + "@azure/storage-blob": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.3.0.tgz", + "integrity": "sha512-nCySzNfm782pEW3sg9GHj1zE4gBeVVMeEBdWb4MefifrCwQQOoz5cXZTNFiUJAJqAO+/72r2UjZcUwHk/QmzkA==", + "dev": true, + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-http": "^1.2.0", + "@azure/core-lro": "^1.0.2", + "@azure/core-paging": "^1.1.1", + "@azure/core-tracing": "1.0.0-preview.9", + "@azure/logger": "^1.0.0", + "@opentelemetry/api": "^0.10.2", + "events": "^3.0.0", + "tslib": "^2.0.0" + } + }, + "@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } + } + } + }, + "@rushstack/rush-sdk": { + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/@rushstack/rush-sdk/-/rush-sdk-5.70.0.tgz", + "integrity": "sha512-44yzEnL9koY/BeRVf8FCXVvLXMCcthHbbKOiIsAc+wjwjJ7rO5i+rGxUR5mdHB6plL1Rv3d4/ljeJhkEZjEPWg==", + "dev": true, + "requires": { + "@rushstack/node-core-library": "3.45.5", + "@types/node-fetch": "1.6.9", + "tapable": "2.2.1" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } + } + } + }, + "@rushstack/set-webpack-public-path-plugin": { + "version": "3.3.37", + "resolved": "https://registry.npmjs.org/@rushstack/set-webpack-public-path-plugin/-/set-webpack-public-path-plugin-3.3.37.tgz", + "integrity": "sha512-PGKZDbA68SxdZVfW3weyvqbO6vN9eir2Yqr5QUqwtDZ1t1KTfzTV2aKPLVMiwq4qsxkp+0GfXQtOwXlZ6nJHTA==", + "dev": true, + "requires": { + "@rushstack/webpack-plugin-utilities": "0.1.4" + } + }, + "@rushstack/stream-collator": { + "version": "4.0.172", + "resolved": "https://registry.npmjs.org/@rushstack/stream-collator/-/stream-collator-4.0.172.tgz", + "integrity": "sha512-lYwRDlsEB6dZMPzF4OJ5BsrLXsfF2NCV/XjONYW1q0lPFxFdxlYANJt746VlSU6p3ykD2OXb0Veywxrgf54qIA==", + "dev": true, + "requires": { + "@rushstack/node-core-library": "3.45.5", + "@rushstack/terminal": "0.3.41" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } + } + } + }, + "@rushstack/terminal": { + "version": "0.3.41", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.3.41.tgz", + "integrity": "sha512-GfDZO4eYTHVXzNUAUY4poxTQ+MmkTmnhSq56J0zDolg5IZb/wVXEj4oeEnOXwlr/3LVE6sBv5yIkCstIo+u5Nw==", + "dev": true, + "requires": { + "@rushstack/node-core-library": "3.45.5", + "@types/node": "12.20.24", + "wordwrap": "~1.0.0" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } + } + } + }, + "@rushstack/tree-pattern": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@rushstack/tree-pattern/-/tree-pattern-0.2.2.tgz", + "integrity": "sha512-0KdqI7hGtVIlxobOBLWet0WGiD70V/QoYQr5A2ikACeQmIaN4WT6Fn9BcvgwgaSIMcazEcD8ql7Fb9N4dKdQlA==", + "dev": true + }, + "@rushstack/ts-command-line": { + "version": "4.7.10", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.7.10.tgz", + "integrity": "sha512-8t042g8eerypNOEcdpxwRA3uCmz0duMo21rG4Z2mdz7JxJeylDmzjlU3wDdef2t3P1Z61JCdZB6fbm1Mh0zi7w==", + "dev": true, + "requires": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, + "@rushstack/typings-generator": { + "version": "0.6.24", + "resolved": "https://registry.npmjs.org/@rushstack/typings-generator/-/typings-generator-0.6.24.tgz", + "integrity": "sha512-5u49+43B+TCSQaCwEJRtaqarjhXBfI8ziWINnUpqtoTWZ+LLMC15QdgamjeyfKeFdAvFrFCIY3tlosfEzA5CeQ==", + "dev": true, + "requires": { + "@rushstack/node-core-library": "3.45.5", + "@types/node": "12.20.24", + "chokidar": "~3.4.0", + "glob": "~7.0.5" + }, + "dependencies": { + "@rushstack/node-core-library": { + "version": "3.45.5", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.45.5.tgz", + "integrity": "sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "timsort": "~0.3.0", + "z-schema": "~5.0.2" + } + }, + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "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" + } + }, + "chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "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" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, + "z-schema": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.3.tgz", + "integrity": "sha512-sGvEcBOTNum68x9jCpCVGPFJ6mWnkD0YxOcddDlJHRx3tKdB2q8pCHExMVZo/AV/6geuVJXG7hljDaWG8+5GDw==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + } + } + } + }, + "@rushstack/webpack-plugin-utilities": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@rushstack/webpack-plugin-utilities/-/webpack-plugin-utilities-0.1.4.tgz", + "integrity": "sha512-CXCSJsI8nOH1tMXSjzTgbl6rIVhByizor5phuzRIqYTkWHdidvjb/HzQ97AB5gRD0OlYp4FhePUMArBDppUBhg==", + "dev": true, + "requires": {} + }, + "@rushstack/worker-pool": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@rushstack/worker-pool/-/worker-pool-0.1.0.tgz", + "integrity": "sha512-68qskCLruYWSLZDIRhYGklAXo8+lVm3drEQ3uQVXNCxb/Ow1byEDvtA0AaJleaZ/ZXZ5PN+Ct8WTzcD+ZxkUrg==", + "dev": true, + "requires": { + "@types/node": "12.20.24" + }, + "dependencies": { + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + } + } + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@testing-library/dom": { + "version": "7.31.2", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz", + "integrity": "sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^4.2.0", + "aria-query": "^4.2.2", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.6", + "lz-string": "^1.4.4", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "@testing-library/jest-dom": { + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz", + "integrity": "sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==", + "dev": true, + "requires": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + } + }, + "@testing-library/react": { + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-11.2.7.tgz", + "integrity": "sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^7.28.1" + } + }, + "@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 + }, + "@types/adal-angular": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/adal-angular/-/adal-angular-1.0.1.tgz", + "integrity": "sha512-2sRGxJYrluhvIz8ae98i5k5woe9Fics4dMFHTcNfY2xAkj5QGZor+sfZzlgM58Fpw7Kklau9Gn6OhgJP25dKug==" + }, + "@types/anymatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-3.0.0.tgz", + "integrity": "sha512-qLChUo6yhpQ9k905NwL74GU7TxH+9UODwwQ6ICNI+O6EDMExqH/Cv9NsbmcZ7yC/rRXJ/AHCzfgjsFRY5fKjYw==", + "dev": true, + "requires": { + "anymatch": "*" + } + }, + "@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true + }, + "@types/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", + "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.0.tgz", + "integrity": "sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/chalk": { + "version": "0.4.31", + "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz", + "integrity": "sha512-nF0fisEPYMIyfrFgabFimsz9Lnuu9MwkNrrlATm2E4E46afKDyeelT+8bXfw1VSc7sLBxMxRgT7PxTC2JcqN4Q==", + "dev": true + }, + "@types/eslint": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "dev": true, + "peer": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "peer": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true, + "peer": true + }, + "@types/glob": { + "version": "5.0.30", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.30.tgz", + "integrity": "sha512-ZM05wDByI+WA153sfirJyEHoYYoIuZ7lA2dB/Gl8ymmpMTR78fNRtDMqa7Z6SdH4fZdLWZNRE6mZpx3XqBOrHw==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/glob-stream": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.1.tgz", + "integrity": "sha512-AGOUTsTdbPkRS0qDeyeS+6KypmfVpbT5j23SN8UPG63qjKXNKjXn6V9wZUr8Fin0m9l8oGYaPK8b2WUMF8xI1A==", + "dev": true, + "requires": { + "@types/glob": "*", + "@types/node": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/gulp": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/gulp/-/gulp-4.0.6.tgz", + "integrity": "sha512-0E8/iV/7FKWyQWSmi7jnUvgXXgaw+pfAzEB06Xu+l0iXVJppLbpOye5z7E2klw5akXd+8kPtYuk65YBcZPM4ow==", + "dev": true, + "requires": { + "@types/undertaker": "*", + "@types/vinyl-fs": "*", + "chokidar": "^2.1.2" + } + }, + "@types/he": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/he/-/he-1.1.2.tgz", + "integrity": "sha512-kSJPcLO1x+oolc0R89pUl2kozldQ/fVQ1C1p5mp8fPoLdF/ZcBvckaTC2M8xXh3GYendXvCpy5m/a2eSbfgNgw==", + "dev": true + }, + "@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "dev": true + }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "26.0.24", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", + "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", + "dev": true, + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.117", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.117.tgz", + "integrity": "sha512-xyf2m6tRbz8qQKcxYZa7PA4SllYcay+eh25DN3jmNYY6gSTL7Htc/bttVdkqj2wfJGbeWlQiX8pIyJpKU+tubw==" + }, + "@types/microsoft-ajax": { + "version": "0.0.37", + "resolved": "https://registry.npmjs.org/@types/microsoft-ajax/-/microsoft-ajax-0.0.37.tgz", + "integrity": "sha512-Y5WhLt8s/ADXSKROE067Qm7rGH/16jPYswPOKxFx9ipxldm2ZXPENzQuzyvuxqkHR2LFvsvbHIswmi05qdUD9g==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "@types/node": { + "version": "10.17.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.13.tgz", + "integrity": "sha512-pMCcqU2zT4TjqYFrWtYHKal7Sl30Ims6ulZ4UFXxI4xbtQqK/qqKwkDoBFCfooRqqmRu9vY3xaJRwxSh673aYg==", + "dev": true + }, + "@types/node-fetch": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-1.6.9.tgz", + "integrity": "sha512-n2r6WLoY7+uuPT7pnEtKJCmPUGyJ+cbyBR8Avnu4+m1nzz7DwBVuyIvvlBzCZ/nrpC7rIgb3D6pNavL7rFEa9g==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@types/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-5v0PhPv0AManpxT7W25Zipmj/Lxp1WqfkcpZHyqSloB+gGoAHRBuzhrCelFKrPvNF5ki3gAcO4kxaGO2/21u8g==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "@types/office-js": { + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/@types/office-js/-/office-js-1.0.36.tgz", + "integrity": "sha512-v5jOXCPS0nbbuVzZThhDMzttuJrpzzvx1GsPo5Qed8Cs9uzMwEV1vdkKN5zLFnAUlEF4s8Szl9KXnhnSvH89Kw==" + }, + "@types/orchestrator": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/orchestrator/-/orchestrator-0.0.30.tgz", + "integrity": "sha512-rT9So631KbmirIGsZ5m6T15FKHqiWhYRULdl03l/WBezzZ8wwhYTS2zyfHjsvAGYFVff1wtmGFd0akRCBDSZrA==", + "dev": true, + "requires": { + "@types/q": "*" + } + }, + "@types/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", + "dev": true + }, + "@types/react": { + "version": "16.9.56", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.56.tgz", + "integrity": "sha512-gIkl4J44G/qxbuC6r2Xh+D3CGZpJ+NdWTItAPmZbR5mUS+JQ8Zvzpl0ea5qT/ZT3ZNTUcDKUVqV3xBE8wv/DyQ==", + "requires": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-beautiful-dnd": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.2.tgz", + "integrity": "sha512-+OvPkB8CdE/bGdXKyIhc/Lm2U7UAYCCJgsqmopFmh9gbAudmslkI8eOrPDjg4JhwSE6wytz4a3/wRjKtovHVJg==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-dom": { + "version": "16.9.16", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.16.tgz", + "integrity": "sha512-Oqc0RY4fggGA3ltEgyPLc3IV9T73IGoWjkONbsyJ3ZBn+UPPCYpU2ec0i3cEbJuEdZtkqcCF2l1zf2pBdgUGSg==", + "requires": { + "@types/react": "^16" + } + }, + "@types/react-redux": { + "version": "7.1.24", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.24.tgz", + "integrity": "sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ==", + "requires": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "@types/react-router": { + "version": "5.1.18", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz", + "integrity": "sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==", + "dev": true, + "requires": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dev": true, + "requires": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "@types/react-test-renderer": { + "version": "16.9.5", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.9.5.tgz", + "integrity": "sha512-C4cN7C2uSSGOYelp2XfdtJb5TsCP+QiZ+0Bm4U3ZfUswN8oN9O/l86XO/OvBSFCmWY7w75fzsQvZ50eGkFN34A==", + "dev": true, + "requires": { + "@types/react": "^16" + } + }, + "@types/requirejs": { + "version": "2.1.29", + "resolved": "https://registry.npmjs.org/@types/requirejs/-/requirejs-2.1.29.tgz", + "integrity": "sha512-61MNgoBY6iEsHhFGiElSjEu8HbHOahJLGh9BdGSfzgAN+2qOuFJKuG3f7F+/ggKr+0yEM3Y4fCWAgxU6es0otg==" + }, + "@types/sanitize-html": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/sanitize-html/-/sanitize-html-2.6.2.tgz", + "integrity": "sha512-7Lu2zMQnmHHQGKXVvCOhSziQMpa+R2hMHFefzbYoYMHeaXR0uXqNeOc3JeQQQ8/6Xa2Br/P1IQTLzV09xxAiUQ==", + "dev": true, + "requires": { + "htmlparser2": "^6.0.0" + } + }, + "@types/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-iotVxtCCsPLRAvxMFFgxL8HD2l4mAZ2Oin7/VJ2ooWO0VOK4EGOGmZWZn1uCq7RofR3I/1IOSjCHlFT71eVK0Q==", + "dev": true + }, + "@types/sharepoint": { + "version": "2016.1.10", + "resolved": "https://registry.npmjs.org/@types/sharepoint/-/sharepoint-2016.1.10.tgz", + "integrity": "sha512-eSt1ONJ4doMdJgXVyvwDZpmPKp7+P8plhkh6yvvd5KnRWPFTY1YqL9NP5kVit5GHqkLCdTj89nS06ETEj6YTKw==", + "dev": true, + "requires": { + "@types/microsoft-ajax": "*" + } + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/tapable": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", + "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", + "dev": true + }, + "@types/testing-library__jest-dom": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz", + "integrity": "sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==", + "dev": true, + "requires": { + "@types/jest": "*" + } + }, + "@types/through2": { + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/@types/through2/-/through2-2.0.32.tgz", + "integrity": "sha512-VYclBauj55V0qPDHs9QMdKBdxdob6zta8mcayjTyOzlRgl+PNERnvNol99W1PBnvQXaYoTTqSce97rr9dz9oXQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/tunnel": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.1.tgz", + "integrity": "sha512-AOqu6bQu5MSWwYvehMXLukFHnupHrpZ8nvgae5Ggie9UwzDR1CCwoXgSSWNZJuyOlCdfdsWMA5F2LlmvyoTv8A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/uglify-js": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.0.tgz", + "integrity": "sha512-3HO6rm0y+/cqvOyA8xcYLweF0TKXlAxmQASjbOi49Co51A1N4nR4bEwBgRoD9kNM+rqFGArjKr654SLp2CoGmQ==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "@types/undertaker": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@types/undertaker/-/undertaker-1.2.8.tgz", + "integrity": "sha512-gW3PRqCHYpo45XFQHJBhch7L6hytPsIe0QeLujlnFsjHPnXLhJcPdN6a9368d7aIQgH2I/dUTPFBlGeSNA3qOg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/undertaker-registry": "*", + "async-done": "~1.3.2" + } + }, + "@types/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha512-Z4TYuEKn9+RbNVk1Ll2SS4x1JeLHecolIbM/a8gveaHsW0Hr+RQMraZACwTO2VD7JvepgA6UO1A1VrbktQrIbQ==", + "dev": true + }, + "@types/vinyl": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.3.tgz", + "integrity": "sha512-hrT6xg16CWSmndZqOTJ6BGIn2abKyTw0B58bI+7ioUoj3Sma6u8ftZ1DTI2yCaJamOVGLOnQWiPH3a74+EaqTA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/vinyl-fs": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-2.4.12.tgz", + "integrity": "sha512-LgBpYIWuuGsihnlF+OOWWz4ovwCYlT03gd3DuLwex50cYZLmX3yrW+sFF9ndtmh7zcZpS6Ri47PrIu+fV+sbXw==", + "dev": true, + "requires": { + "@types/glob-stream": "*", + "@types/node": "*", + "@types/vinyl": "*" + } + }, + "@types/webpack": { + "version": "4.41.24", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.24.tgz", + "integrity": "sha512-1A0MXPwZiMOD3DPMuOKUKcpkdPo8Lq33UGggZ7xio6wJ/jV1dAu5cXDrOfGDnldUroPIRLsr/DT43/GqOA4RFQ==", + "dev": true, + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + } + }, + "@types/webpack-env": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz", + "integrity": "sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg==", + "dev": true + }, + "@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + } + } + }, + "@types/yargs": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-0.0.34.tgz", + "integrity": "sha512-Rrj9a2bqpcPKGYCIyQGkD24PeCZG3ow58cgaAtI4jwsUMe/9hDaCInMpXZ+PaUK3cVwsFUstpOEkSfMdQpCnYA==", + "dev": true + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.6.0.tgz", + "integrity": "sha512-MIbeMy5qfLqtgs1hWd088k1hOuRsN9JrHUPwVVKCD99EOUqScd7SrwoZl4Gso05EAP9w1kvLWUVGJOVpRPkDPA==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.6.0", + "@typescript-eslint/scope-manager": "5.6.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "@typescript-eslint/experimental-utils": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.6.0.tgz", + "integrity": "sha512-VDoRf3Qj7+W3sS/ZBXZh3LBzp0snDLEgvp6qj0vOAIiAPM07bd5ojQ3CTzF/QFl5AKh7Bh1ycgj6lFBJHUt/DA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.6.0", + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/typescript-estree": "5.6.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.20.0.tgz", + "integrity": "sha512-w5qtx2Wr9x13Dp/3ic9iGOGmVXK5gMwyc8rwVgZU46K9WTjPZSyPvdER9Ycy+B5lNHvoz+z2muWhUvlTpQeu+g==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "5.20.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.6.0.tgz", + "integrity": "sha512-YVK49NgdUPQ8SpCZaOpiq1kLkYRPMv9U5gcMrywzI8brtwZjr/tG3sZpuHyODt76W/A0SufNjYt9ZOgrC4tLIQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.6.0", + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/typescript-estree": "5.6.0", + "debug": "^4.3.2" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.6.0.tgz", + "integrity": "sha512-1U1G77Hw2jsGWVsO2w6eVCbOg0HZ5WxL/cozVSTfqnL/eB9muhb8THsP0G3w+BB5xAHv9KptwdfYFAUfzcIh4A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/visitor-keys": "5.6.0" + } + }, + "@typescript-eslint/types": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.6.0.tgz", + "integrity": "sha512-OIZffked7mXv4mXzWU5MgAEbCf9ecNJBKi+Si6/I9PpTaj+cf2x58h2oHW5/P/yTnPkKaayfjhLvx+crnl5ubA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.6.0.tgz", + "integrity": "sha512-92vK5tQaE81rK7fOmuWMrSQtK1IMonESR+RJR2Tlc7w4o0MeEdjgidY/uO2Gobh7z4Q1hhS94Cr7r021fMVEeA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.6.0", + "@typescript-eslint/visitor-keys": "5.6.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + } + } + }, + "@typescript-eslint/utils": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.20.0.tgz", + "integrity": "sha512-lHONGJL1LIO12Ujyx8L8xKbwWSkoUKFSO+0wDAqGXiudWB2EO7WEUT+YZLtVbmOmSllAjLb9tpoIPwpRe5Tn6w==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.20.0", + "@typescript-eslint/types": "5.20.0", + "@typescript-eslint/typescript-estree": "5.20.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.20.0.tgz", + "integrity": "sha512-h9KtuPZ4D/JuX7rpp1iKg3zOH0WNEa+ZIXwpW/KWmEFDxlA/HSfCMhiyF1HS/drTICjIbpA6OqkAhrP/zkCStg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.20.0", + "@typescript-eslint/visitor-keys": "5.20.0" + } + }, + "@typescript-eslint/types": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.20.0.tgz", + "integrity": "sha512-+d8wprF9GyvPwtoB4CxBAR/s0rpP25XKgnOvMf/gMXYDvlUC3rPFHupdTQ/ow9vn7UDe5rX02ovGYQbv/IUCbg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.20.0.tgz", + "integrity": "sha512-36xLjP/+bXusLMrT9fMMYy1KJAGgHhlER2TqpUVDYUQg4w0q/NW/sg4UGAgVwAqb8V4zYg43KMUpM8vV2lve6w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.20.0", + "@typescript-eslint/visitor-keys": "5.20.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.20.0.tgz", + "integrity": "sha512-1flRpNF+0CAQkMNlTJ6L/Z5jiODG/e5+7mk6XwtPOUS3UrTz3UOiAg9jG2VtKsWI6rZQfy4C6a232QNRZTRGlg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.20.0", + "eslint-visitor-keys": "^3.0.0" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.6.0.tgz", + "integrity": "sha512-1p7hDp5cpRFUyE3+lvA74egs+RWSgumrBpzBCDzfTFv0aQ7lIeay80yU0hIxgAhwQ6PcasW35kaOCyDOv6O/Ng==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.6.0", + "eslint-visitor-keys": "^3.0.0" + } + }, + "@uifabric/foundation": { + "version": "7.10.6", + "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-7.10.6.tgz", + "integrity": "sha512-o11QJ4T0kWvhU/Qev11DuVaYsItAvkNV2QAOFKeHQJKiQ5iXvigCNlbRu8/D6ikALppFy+8a+9mSuIEkKnTAyQ==", + "requires": { + "@uifabric/merge-styles": "^7.19.2", + "@uifabric/set-version": "^7.0.24", + "@uifabric/styling": "^7.21.2", + "@uifabric/utilities": "^7.35.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@uifabric/icons": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-7.7.2.tgz", + "integrity": "sha512-3f223BZ5TXTF37J7lG+saGBY7U8vAi5HyMP58ccIoUafOj5551h5sovPFD/hVIYzYFhvT+/VpbUzF3vw+RARHA==", + "requires": { + "@uifabric/set-version": "^7.0.24", + "@uifabric/styling": "^7.20.2", + "@uifabric/utilities": "^7.34.1", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@uifabric/merge-styles": { + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-7.19.2.tgz", + "integrity": "sha512-kTlhwglDqwVgIaJq+0yXgzi65plGhmFcPrfme/rXUGMJZoU+qlGT5jXj5d3kuI59p6VB8jWEg9DAxHozhYeu0g==", + "requires": { + "@uifabric/set-version": "^7.0.24", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@uifabric/react-hooks": { + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@uifabric/react-hooks/-/react-hooks-7.15.1.tgz", + "integrity": "sha512-HPDsBsKiGarKR1SNuM632Q7DlxIUb8AuvABl7YAmPU3gCFZrLSyWfa43ucUwI/2mUxfQLdXKVB4wmMp6aOx+xg==", + "requires": { + "@fluentui/react-window-provider": "^1.0.3", + "@uifabric/set-version": "^7.0.24", + "@uifabric/utilities": "^7.35.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "@fluentui/react-window-provider": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-1.0.3.tgz", + "integrity": "sha512-nFFhYlEWDSklAFjw87hQuOO5ZQP8or4J12ZJ7Glf+pcifRl0AySBshuGTJsTyZ0QyzgIeQYGSYf6wcPtycS0aA==", + "requires": { + "@uifabric/set-version": "^7.0.24", + "tslib": "^1.10.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@uifabric/set-version": { + "version": "7.0.24", + "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-7.0.24.tgz", + "integrity": "sha512-t0Pt21dRqdC707/ConVJC0WvcQ/KF7tKLU8AZY7YdjgJpMHi1c0C427DB4jfUY19I92f60LOQyhJ4efH+KpFEg==", + "requires": { + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@uifabric/styling": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-7.21.2.tgz", + "integrity": "sha512-EeR+UyoHygy5ONYMmG7w3qFghGe3WbgQYLD11kvNKV+21iu4WMNkngsX7LzGWwMiTJyGY8WuhWqqojb9JJmQCQ==", + "requires": { + "@fluentui/theme": "^1.7.7", + "@microsoft/load-themed-styles": "^1.10.26", + "@uifabric/merge-styles": "^7.19.2", + "@uifabric/set-version": "^7.0.24", + "@uifabric/utilities": "^7.35.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "@fluentui/theme": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-1.7.7.tgz", + "integrity": "sha512-m3h0o2Pk0N+Q3VuiLM0uRitakYkb371Eso4moEuJTy/TTkVF+I3UKfoneArA5hycdqZ0xOXVVHSb9jUSaBWHAA==", + "requires": { + "@uifabric/merge-styles": "^7.19.2", + "@uifabric/set-version": "^7.0.24", + "@uifabric/utilities": "^7.35.0", + "tslib": "^1.10.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@uifabric/utilities": { + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.35.0.tgz", + "integrity": "sha512-USbgKKJo70H9c7zBuBfSmP2DRMizjzftLkKwmFQIODZlwb0U4gFzx94aIsCGi5HNFydyVUtO1JOb+wzyLpPvJw==", + "requires": { + "@fluentui/dom-utilities": "^1.1.2", + "@uifabric/merge-styles": "^7.19.2", + "@uifabric/set-version": "^7.0.24", + "prop-types": "^15.7.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "@fluentui/dom-utilities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@fluentui/dom-utilities/-/dom-utilities-1.1.2.tgz", + "integrity": "sha512-XqPS7l3YoMwxdNlaYF6S2Mp0K3FmVIOIy2K3YkMc+eRxu9wFK6emr2Q/3rBhtG5u/On37NExRT7/5CTLnoi9gw==", + "requires": { + "@uifabric/set-version": "^7.0.24", + "tslib": "^1.10.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + }, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + } + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + }, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + } + } + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "peer": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "peer": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true, + "peer": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + }, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + } + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.0.2.tgz", + "integrity": "sha512-MqJ00WXw89ga0rK6GZkdmmgv3bAsxpJixyTthjcix73O44pBqotyU2BejBkLuIsaOBI6SEu77vAnSyLe5iIHkw==", + "dev": true + }, + "@zkochan/cmd-shim": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@zkochan/cmd-shim/-/cmd-shim-5.3.1.tgz", + "integrity": "sha512-xoSqbd1iuV/dSID+OjTjQc/0wId/vhEqYBXbFu9SzpXGxhuzK6QN6CaF8i8v86q0FXX4n3/qD9ewUT6N5ngFQg==", + "dev": true, + "requires": { + "cmd-extension": "^1.0.2", + "is-windows": "^1.0.2" + } + }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true + }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + } + } + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peer": true, + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, + "adal-angular": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/adal-angular/-/adal-angular-1.0.16.tgz", + "integrity": "sha512-tJf2bRwolKA8/J+wcy4CFOTAva8gpueHplptfjz3Wt1XOb7Y1jnwdm2VdkFZQUhxCtd/xPvcRSAQP2+ROtAD5g==" + }, + "agent-base": { + "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" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "requires": {} + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==", + "dev": true + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-escapes": { + "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-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "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" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", + "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "array-includes": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==", + "dev": true, + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "array.prototype.flatmap": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", + "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.reduce": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", + "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true + }, + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha512-qEdtR2UH78yyHX/AUNfXmJTlM48XoFZKBdwi1nzkI1mJL21cmbu0cvjxjpkXJ5NENMq42H+hNs8VLJcqXLerBQ==", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==", + "dev": true, + "requires": { + "async-done": "^1.2.2" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "babel-jest": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.5.1.tgz", + "integrity": "sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==", + "dev": true, + "requires": { + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^25.5.0", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-jest-hoist": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz", + "integrity": "sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz", + "integrity": "sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@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-preset-jest": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz", + "integrity": "sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^25.5.0", + "babel-preset-current-node-syntax": "^0.1.2" + } + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==", + "dev": true, + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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" + } + }, + "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": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha512-3vqtKL1N45I5dV0RdssXZG7X6pCqQrWPNOlBPZPrd+QkE2HEhR57Z04m0KtpbsZH73j+a3F8UD1TQnn+ExTvIA==", + "dev": true + }, + "better-path-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", + "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", + "dev": true, + "requires": { + "is-windows": "^1.0.0" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha512-YQyoqQG3sO8iCmf8+hyVpgHHOv0/hCEFiS4zTGUwTA1HjAFX66wRcNQrVCeJq9pgESMRvUAOvSil5MJlmccuKQ==", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.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" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==", + "dev": true + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "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==", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", + "dev": true + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true + } + } + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001381", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001381.tgz", + "integrity": "sha512-fEnkDOKpvp6qc+olg7+NzE1SqyfiyKf4uci7fAU38M3zxs0YOyKOxW/nMZ2l9sJbt7KZHcDIxUnbI0Iime7V4w==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "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" + } + }, + "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": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "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 + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-table": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "dev": true, + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true + } + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "cmd-extension": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cmd-extension/-/cmd-extension-1.0.2.tgz", + "integrity": "sha512-iWDjmP8kvsMdBmLTHxFaqXikO8EdFRDfim7k6vUHglY/2xJ5jLrPsnQGijdfp4U+sr/BeecG0wKm02dSIAeQ1g==", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.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" + } + }, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "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" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==", + "dev": true, + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dev": true, + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + }, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + } + } + }, + "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 + }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, + "colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressed-json": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/compressed-json/-/compressed-json-1.0.16.tgz", + "integrity": "sha512-fklkJ76BEyTPMbLv75nEEhFyHSLS0dt0AIGECBeCgd7O/IECIg7khOIi+2aKIutrjHaazr5J8M7edVDFEfRA/g==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "connect-livereload": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz", + "integrity": "sha512-3KnRwsWf4VmP01I4hCDQqTc4e2UxOvJIi8i08GiwqX2oymzxNFY7PqjFkwHglYTJ0yzUJkO5yqdPxVaIz3Pbug==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true + }, + "copy-props": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", + "dev": true, + "requires": { + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + } + }, + "copy-webpack-plugin": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.4.tgz", + "integrity": "sha512-zCazfdYAh3q/O4VzZFiadWGpDA2zTs6FC6D7YTHD6H1J40pzo0H4z22h1NYMCl4ArQP4CK8y/KWqPrJ4rVkZ5A==", + "dev": true, + "requires": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^2.7.0", + "serialize-javascript": "^4.0.0", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "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": { + "randombytes": "^2.1.0" + } + } + } + }, + "core-js-pure": { + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.24.1.tgz", + "integrity": "sha512-r1nJk41QLLPyozHUUPmILCEMtMw24NG4oWK6RbsDdjzQgg9ZvrUsPBj1MnG0wXXp1DCDU6j+wUvEmBSrtRbLXg==", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "requires": { + "tiny-invariant": "^1.0.6" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "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": "sha512-XWOBwgy5nwBn76aA+6ybUGL/3JBnCtBX9Ay9/OWIpzKYWlVHMazvJ+WtHumfi+xxdPF440cWK7JCYtt8xDifew==", + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "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" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true + }, + "postcss": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz", + "integrity": "sha512-VbGX1LQgQbf9l3cZ3qbUuC3hGqIEOGQFHAEHQ/Diaeo0yLgpgK5Rb8J+OcamIfQ9PbAU/fzBjVtQX3AhJHUvZw==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + }, + "dependencies": { + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + } + } + } + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "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", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "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 + }, + "csso": { + "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.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "cssstyle": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.3.1.tgz", + "integrity": "sha512-tNvaxM5blOnxanyxI6panOsnfiyLRj3HV4qjqqS45WPNS1usdYWRUQjqTEEELK73lpeP/1KoIGYUwrBn/VcECA==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "csstype": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", + "dev": true + }, + "decache": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/decache/-/decache-4.5.1.tgz", + "integrity": "sha512-5J37nATc6FmOTLbcsr9qx7Nm28qQyg1SK4xyEHqM0IBkNhWFp0Sm+vKoWYHD8wq+OUEb9jLyaKFfzzd1A9hcoA==", + "dev": true, + "requires": { + "callsite": "^1.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "decimal.js": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", + "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", + "dev": true + }, + "decomment": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/decomment/-/decomment-0.9.5.tgz", + "integrity": "sha512-h0TZ8t6Dp49duwyDHo3iw67mnh9/UpFiSSiOb5gDK1sqoXzrfX/SQxIUQd2R2QEiSnqib0KF2fnKnGfAhAs6lg==", + "dev": true, + "requires": { + "esprima": "4.0.1" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "requires": { + "kind-of": "^5.0.2" + } + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.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": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "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": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "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": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==", + "dev": true + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true + }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + }, + "dependencies": { + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-accessibility-api": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz", + "integrity": "sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==", + "dev": true + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", + "dev": true, + "requires": { + "readable-stream": "~1.1.9" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + } + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + }, + "dependencies": { + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.226", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.226.tgz", + "integrity": "sha512-CvevLaSiUp0u12K0e+QhMX1hn724nSUNO9ToBek+FMHk/5RofrQs5MChjrD0re0IwqxDFxFMSZD+uic05i2Z5w==", + "dev": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "end-of-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.1.0.tgz", + "integrity": "sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==", + "dev": true, + "requires": { + "once": "~1.3.0" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "dev": true, + "requires": { + "wrappy": "1" + } + } + } + }, + "enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true, + "peer": true + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-templates": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", + "integrity": "sha512-sziUVwcvQ+lOsrTyUY0Q11ilAPj+dy7AQ1E1MgSaHTaaAFTffaa08QSlGNU61iyVaroyb6nYdBV6oD7nzn6i8w==", + "dev": true, + "requires": { + "recast": "~0.11.12", + "through": "~2.3.6" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "eslint": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", + "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", + "dev": true, + "peer": true, + "requires": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.3", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": 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" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "peer": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "peer": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "peer": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "peer": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "peer": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "peer": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "peer": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "peer": 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, + "peer": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "peer": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "peer": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "peer": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "peer": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "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, + "peer": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "peer": true + } + } + }, + "eslint-plugin-promise": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.0.0.tgz", + "integrity": "sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==", + "dev": true, + "requires": {} + }, + "eslint-plugin-react": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.27.1.tgz", + "integrity": "sha512-meyunDjMMYeWr/4EBLTV1op3iSG3mjT/pz5gti38UzfM4OPpNc2m0t2xvKCOMU5D6FSdd34BIMFOvQbW+i8GAA==", + "dev": true, + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flatmap": "^1.2.5", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.0", + "object.values": "^1.1.5", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.6" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "requires": {} + }, + "eslint-plugin-tsdoc": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.16.tgz", + "integrity": "sha512-F/RWMnyDQuGlg82vQEFHQtGyWi7++XJKdYNn0ulIbyMOFqYIjoJOUdE6olORxgwgLkpJxsCJpJbTHgxJ/ggfXw==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "0.16.1" + }, + "dependencies": { + "@microsoft/tsdoc": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", + "integrity": "sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw==", + "dev": true + }, + "@microsoft/tsdoc-config": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.1.tgz", + "integrity": "sha512-2RqkwiD4uN6MLnHFljqBlZIXlt/SaUT6cuogU1w2ARw4nKuuppSmR0+s+NC+7kXBQykd9zzu0P4HtBpZT5zBpQ==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.14.1", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + } + }, + "ajv": { + "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", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "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" + } + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "espree": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", + "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "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" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "event-stream": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.5.tgz", + "integrity": "sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", + "dev": true + }, + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "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", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "expect": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.5.0.tgz", + "integrity": "sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-styles": "^4.0.0", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-regex-util": "^25.2.6" + } + }, + "express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + } + } + }, + "ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "requires": { + "type": "^2.5.0" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "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" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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" + } + }, + "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": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "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.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fifo": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/fifo/-/fifo-2.4.1.tgz", + "integrity": "sha512-XTbUCNmo54Jav0hcL6VxDuY4x1eCQH61HEF80C2Oww283pfjQ2C8avZeyq4v43sW2S2403kmzssE9j4lbF66Sg==", + "dev": true + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "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" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + } + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "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" + } + }, + "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": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "dependencies": { + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true + }, + "fork-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz", + "integrity": "sha512-Pqq5NnT78ehvUnAk/We/Jr22vSvanRlFTpAmQ88xBY/M1TlHe+P0ILuEyXS595ysdGfaj22634LBkGMA2GTcpA==", + "dev": true + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "generic-names": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz", + "integrity": "sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + } + }, + "generic-pool": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.4.4.tgz", + "integrity": "sha512-9GicuYkryPAwzKW2Vpfus1zC28ER7mwWEZgY7F+6RqpPMK4N8XpkxzAr4CuPf10NrzW0f/kQ4AmeDVgFhdwjAQ==", + "dev": true + }, + "gensync": { + "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-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "git-repo-info": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/git-repo-info/-/git-repo-info-2.1.1.tgz", + "integrity": "sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg==", + "dev": true + }, + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha512-f8c0rE8JiCxpa52kWPAOa3ZaYEnzofDzCQLCn3Vdk0Z5OVLq3BsRFJI4S4ykpeVW6QMGBUkMeUpoEgWnMTnw5Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-escape": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/glob-escape/-/glob-escape-0.0.2.tgz", + "integrity": "sha512-L/cXYz8x7qer1HAyUQ+mbjcUsJVdpRxpAf7CwqHoNBs9vTpABlGfNN4tzkDxt+u3Z7ZncVyKlCNPtzb0R/7WbA==", + "dev": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "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": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, + "glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "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" + } + }, + "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": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true, + "peer": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", + "dev": true + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + } + }, + "gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "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": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "yargs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" + } + }, + "yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + } + } + }, + "gulp-connect": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/gulp-connect/-/gulp-connect-5.5.0.tgz", + "integrity": "sha512-oRBLjw/4EVaZb8g8OcxOVdGD8ZXYrRiWKcNxlrGjxb/6Cp0GDdqw7ieX7D8xJrQS7sbXT+G94u63pMJF3MMjQA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "connect": "^3.6.5", + "connect-livereload": "^0.5.4", + "event-stream": "^3.3.2", + "fancy-log": "^1.3.2", + "send": "^0.13.2", + "serve-index": "^1.9.1", + "serve-static": "^1.13.1", + "tiny-lr": "^0.2.1" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw==", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha512-Mbv5pNpLNPrm1b4rzZlZlfTRpdDr31oiD43N362sIyvSWVNu5Du33EcJGzvEV4YdYLuENB1HzND907cQkFmXNw==", + "dev": true + }, + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha512-akx5WBKAwMSg36qoHTuMMVncHWctlaDGslJASDYAhoLrzDUDCjZlOngNa/iC6lPm9aA0qk8pN5KnpmbJHSIIQQ==", + "dev": true + }, + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha512-gMygNskMurDCWfoCdyh1gOeDfSbkAHXqz94QoPj5IHIUjC/BG8/xv7FSEUr7waR5RcAya4j58bft9Wu/wHNeXA==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "statuses": "1" + } + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha512-sAaYXszED5ALBt665F0wMQCUXpGuZsGdopoqcHPdL39ZYdi7uHoZlhrfZfhv8WzivhBzr/oXwaj+yiK5wY8MXQ==", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha512-lRLiIR9fSNpnP6TC4v8+4OU7oStC01esuNowdQ34L+Gk8e5Puoc88IqJ+XAY/B3Mn2ZKis8l8HX90oU8ivzUHg==", + "dev": true + }, + "range-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "integrity": "sha512-nDsRrtIxVUO5opg/A8T2S3ebULVIfuh8ECbh4w3N4mWxIiT3QILDJDUQayPqm2e8Q8NUa0RSUkGCfe33AfjR3Q==", + "dev": true + }, + "send": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.2.tgz", + "integrity": "sha512-cQ0rmXHrdO2Iof08igV2bG/yXWD106ANwBg6DkGQNT2Vsznbgq6T0oAIQboy1GoFsIuy51jCim26aA9tj3Z3Zg==", + "dev": true, + "requires": { + "debug": "~2.2.0", + "depd": "~1.1.0", + "destroy": "~1.0.4", + "escape-html": "~1.0.3", + "etag": "~1.7.0", + "fresh": "0.3.0", + "http-errors": "~1.3.1", + "mime": "1.3.4", + "ms": "0.7.1", + "on-finished": "~2.3.0", + "range-parser": "~1.0.3", + "statuses": "~1.2.1" + } + }, + "statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha512-pVEuxHdSGrt8QmQ3LOZXLhSA6MP/iPqKzZeO6Squ7PNGkA/9MBsSfV0/L+bIxkoDmjF4tZcLpcVq/fkqoHvuKg==", + "dev": true + } + } + }, + "gulp-flatten": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/gulp-flatten/-/gulp-flatten-0.2.0.tgz", + "integrity": "sha512-8kKeBDfHGx0CEWoB6BPh5bsynUG2VGmSz6hUlX531cfDz/+PRYZa9i3e3+KYuaV0GuCsRZNThSRjBfHOyypy8Q==", + "dev": true, + "requires": { + "gulp-util": "^3.0.1", + "through2": "^2.0.0" + } + }, + "gulp-if": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz", + "integrity": "sha512-tV0UfXkZodpFq6CYxEqH8tqLQgN6yR9qOhpEEN3O6N5Hfqk3fFLcbAavSex5EqnmoQjyaZ/zvgwclvlTI1KGfw==", + "dev": true, + "requires": { + "gulp-match": "^1.0.3", + "ternary-stream": "^2.0.1", + "through2": "^2.0.1" + } + }, + "gulp-match": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.1.0.tgz", + "integrity": "sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.3" + } + }, + "gulp-open": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/gulp-open/-/gulp-open-3.0.1.tgz", + "integrity": "sha512-dohokw+npnt48AsD0hhvCLEHLnDMqM35F+amvIfJlX1H2nNHYUClR0Oy1rI0TvbL1/pHiHGNLmohhk+kvwIKjA==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "opn": "5.2.0", + "plugin-log": "^0.1.0", + "through2": "^2.0.1" + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha512-q5oWPc12lwSFS9h/4VIjG+1NuNDlJ48ywV2JKItY4Ycc/n1fXJeYPVQsfu5ZrhQi7FGSDBalwUCLar/GyHXKGw==", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "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" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha512-P5zdf3WB9uzr7IFoVQ2wZTmUwHL8cMZWJGzLBNCHNZ3NB6HTMsYABtt7z8tAGIINLXyAob9B9a1yzVGMFOYKEA==", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulp-zip": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-5.1.0.tgz", + "integrity": "sha512-XZr/y91IliK/SpR74g3TkZejGkGEmK7CSDjSghT1jXshgO+dFvpLIz9w9fpuwkew6i7k4F+G24TubNgq1ISzEw==", + "dev": true, + "requires": { + "get-stream": "^5.2.0", + "plugin-error": "^1.0.1", + "through2": "^3.0.1", + "vinyl": "^2.1.0", + "yazl": "^2.5.1" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "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", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + } + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "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 + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha512-+F4GzLjwHNNDEAJW2DC1xXfEoPkRDmUdJ7CBYw4MpqtDwOnqdImJl7GWlpqx+Wko6//J8uKTnIe4wZSv7yCqmw==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.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" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "history": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "requires": { + "@babel/runtime": "^7.7.6" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "html-loader": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz", + "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==", + "dev": true, + "requires": { + "es6-templates": "^0.2.3", + "fastparse": "^1.1.1", + "html-minifier": "^3.5.8", + "loader-utils": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "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" + } + }, + "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": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "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": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", + "dev": true + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dev": true, + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", + "dev": true + }, + "ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", + "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": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true + } + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true + } + } + }, + "import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==" + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "inpath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inpath/-/inpath-1.0.2.tgz", + "integrity": "sha512-DTt55ovuYFC62a8oJxRjV2MmTPUdxN43Gd8I2ZgawxbAha6PvJkDQy/RbZGFCJF5IXrpp4PAYtW1w3aV7jXkew==", + "dev": true + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "dev": true + }, + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "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", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "dev": true + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "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 + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.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 + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-subdir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", + "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", + "dev": true, + "requires": { + "better-path-resolve": "1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "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-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "isomorphic-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", + "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", + "requires": { + "node-fetch": "^2.6.1", + "whatwg-fetch": "^3.4.1" + }, + "dependencies": { + "whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "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 + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + }, + "dependencies": { + "@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + } + }, + "@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + } + }, + "@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "node-notifier": "^8.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + } + }, + "@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + } + }, + "@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + } + }, + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/prettier": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz", + "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==", + "dev": true + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, + "requires": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@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.8.3" + } + }, + "babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "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" + } + }, + "expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + } + }, + "jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "requires": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + } + }, + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + } + }, + "jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + } + }, + "jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + } + }, + "jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dev": true, + "requires": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + }, + "jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + } + }, + "jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "requires": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + } + }, + "jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + } + }, + "jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*" + } + }, + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true + }, + "jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + } + }, + "jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + } + }, + "jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "requires": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + } + }, + "jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + } + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + } + }, + "jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "requires": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "dev": true, + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "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.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "stack-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", + "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "optional": true + }, + "v8-to-istanbul": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + } + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "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" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "requires": {} + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "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==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "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" + } + }, + "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" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + } + } + }, + "jest-changed-files": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.5.0.tgz", + "integrity": "sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "execa": "^3.2.0", + "throat": "^5.0.0" + } + }, + "jest-cli": { + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.4.0.tgz", + "integrity": "sha512-usyrj1lzCJZMRN1r3QEdnn8e6E6yCx/QN7+B1sLoA68V7f3WlsxSSQfy0+BAwRiF4Hz2eHauf11GZG3PIfWTXQ==", + "dev": true, + "requires": { + "@jest/core": "^25.4.0", + "@jest/test-result": "^25.4.0", + "@jest/types": "^25.4.0", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^25.4.0", + "jest-util": "^25.4.0", + "jest-validate": "^25.4.0", + "prompts": "^2.0.1", + "realpath-native": "^2.0.0", + "yargs": "^15.3.1" + }, + "dependencies": { + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "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 + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "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" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "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==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "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" + } + }, + "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" + } + } + } + }, + "jest-config": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.5.4.tgz", + "integrity": "sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^25.5.4", + "@jest/types": "^25.5.0", + "babel-jest": "^25.5.1", + "chalk": "^3.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^25.5.0", + "jest-environment-node": "^25.5.0", + "jest-get-type": "^25.2.6", + "jest-jasmine2": "^25.5.4", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", + "micromatch": "^4.0.2", + "pretty-format": "^25.5.0", + "realpath-native": "^2.0.0" + }, + "dependencies": { + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "jest-environment-jsdom": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz", + "integrity": "sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A==", + "dev": true, + "requires": { + "@jest/environment": "^25.5.0", + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", + "jsdom": "^15.2.1" + } + }, + "jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true + }, + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "requires": {} + } + } + }, + "jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true + } + } + }, + "jest-docblock": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.3.0.tgz", + "integrity": "sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.5.0.tgz", + "integrity": "sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "jest-util": "^25.5.0", + "pretty-format": "^25.5.0" + }, + "dependencies": { + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.4.0.tgz", + "integrity": "sha512-KTitVGMDrn2+pt7aZ8/yUTuS333w3pWt1Mf88vMntw7ZSBNDkRS6/4XLbFpWXYfWfp1FjcjQTOKzbK20oIehWQ==", + "dev": true, + "requires": { + "@jest/environment": "^25.4.0", + "@jest/fake-timers": "^25.4.0", + "@jest/types": "^25.4.0", + "jest-mock": "^25.4.0", + "jest-util": "^25.4.0", + "jsdom": "^15.2.1" + }, + "dependencies": { + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "requires": {} + } + } + }, + "jest-environment-node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.5.0.tgz", + "integrity": "sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA==", + "dev": true, + "requires": { + "@jest/environment": "^25.5.0", + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", + "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 + } + } + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + }, + "jest-haste-map": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.5.1.tgz", + "integrity": "sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "@types/graceful-fs": "^4.1.2", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-serializer": "^25.5.0", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7", + "which": "^2.0.2" + }, + "dependencies": { + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + } + } + }, + "jest-jasmine2": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz", + "integrity": "sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^25.5.0", + "@jest/source-map": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "co": "^4.6.0", + "expect": "^25.5.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^25.5.0", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-runtime": "^25.5.4", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "pretty-format": "^25.5.0", + "throat": "^5.0.0" + }, + "dependencies": { + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + } + } + }, + "jest-leak-detector": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz", + "integrity": "sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA==", + "dev": true, + "requires": { + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "dependencies": { + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + } + } + }, + "jest-matcher-utils": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", + "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "jest-diff": "^25.5.0", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "dependencies": { + "diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true + }, + "jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + } + }, + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + } + } + }, + "jest-message-util": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^25.5.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.5.0.tgz", + "integrity": "sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0" + } + }, + "jest-nunit-reporter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jest-nunit-reporter/-/jest-nunit-reporter-1.3.1.tgz", + "integrity": "sha512-yeERKTYPZutqdNIe3EHjoSAjhPxd5J5Svd8ULB/eiqDkn0EI2n8W4OVTuyFwY5b23hw5f0RLDuEvBjy5V95Ffw==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1", + "read-pkg": "^3.0.0", + "xml": "^1.0.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + } + } + }, + "jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", + "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", + "dev": true + }, + "jest-resolve": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.5.1.tgz", + "integrity": "sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "browser-resolve": "^1.11.3", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.1", + "read-pkg-up": "^7.0.1", + "realpath-native": "^2.0.0", + "resolve": "^1.17.0", + "slash": "^3.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz", + "integrity": "sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "jest-regex-util": "^25.2.6", + "jest-snapshot": "^25.5.1" + } + }, + "jest-runner": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.5.4.tgz", + "integrity": "sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg==", + "dev": true, + "requires": { + "@jest/console": "^25.5.0", + "@jest/environment": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^25.5.4", + "jest-docblock": "^25.3.0", + "jest-haste-map": "^25.5.1", + "jest-jasmine2": "^25.5.4", + "jest-leak-detector": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-resolve": "^25.5.1", + "jest-runtime": "^25.5.4", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + } + }, + "jest-runtime": { + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.5.4.tgz", + "integrity": "sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ==", + "dev": true, + "requires": { + "@jest/console": "^25.5.0", + "@jest/environment": "^25.5.0", + "@jest/globals": "^25.5.2", + "@jest/source-map": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^25.5.4", + "jest-haste-map": "^25.5.1", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.5.1", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", + "realpath-native": "^2.0.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.3.1" + }, + "dependencies": { + "@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "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 + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "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" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "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==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "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" + } + }, + "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" + } + } + } + }, + "jest-serializer": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.5.0.tgz", + "integrity": "sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4" + } + }, + "jest-snapshot": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.5.1.tgz", + "integrity": "sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^25.5.0", + "@types/prettier": "^1.19.0", + "chalk": "^3.0.0", + "expect": "^25.5.0", + "graceful-fs": "^4.2.4", + "jest-diff": "^25.5.0", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-resolve": "^25.5.1", + "make-dir": "^3.0.0", + "natural-compare": "^1.4.0", + "pretty-format": "^25.5.0", + "semver": "^6.3.0" + }, + "dependencies": { + "diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true + }, + "jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + } + }, + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "jest-util": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "make-dir": "^3.0.0" + } + }, + "jest-validate": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.5.0.tgz", + "integrity": "sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "leven": "^3.1.0", + "pretty-format": "^25.5.0" + }, + "dependencies": { + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + } + } + }, + "jest-watcher": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.5.0.tgz", + "integrity": "sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q==", + "dev": true, + "requires": { + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "jest-util": "^25.5.0", + "string-length": "^3.1.0" + } + }, + "jest-worker": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "jsdom": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.11.0.tgz", + "integrity": "sha512-ou1VyfjwsSuWkudGxb03FotDajxAto6USAlmMZjE2lc0jCznt7sBWkhfRBRaWwbnmDqdMSTKTLT5d9sBFkkM7A==", + "dev": true, + "requires": { + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.3.1 < 0.4.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwsapi": "^2.0.0", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "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 + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonpath-plus": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-4.0.0.tgz", + "integrity": "sha512-e0Jtg4KAzDJKKwzbLaUtinCn0RZseWBVRTRGihSpvFlM3wTR7ExSp+PTdeTsDrLNJUe7L7JYJe8mblHX5SCT6A==", + "dev": true + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "requires": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + } + }, + "jszip": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", + "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "just-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", + "dev": true + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dev": true, + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dev": true, + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==", + "dev": true, + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "dependencies": { + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true + }, + "load-json-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", + "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "parse-json": "^5.0.0", + "strip-bom": "^4.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "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 + } + } + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha512-gkD9aSEG9UGglyPcDJqY9YBTUtCLKaBK6ihD2VP1d1X60lTfFspNZNulGBBbUZLkPygy4LySYHyxBpq+VhjObQ==", + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + }, + "dependencies": { + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==" + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha512-mTzAr1aNAv/i7W43vOR/uD/aJ4ngbtsRaCubp2BfZhlGU/eORUjg/7F6X0orNMdv33JOrdgGybtvMN/po3EWrA==", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha512-H94wl5P13uEqlCg7OcNNhMQ8KvWSIyqXzOPusRgHC9DK3o54P6P3xtbXlVbRABG4q5gSmp7EDdJ0MSuW9HX6Mg==", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha512-Sjlavm5y+FUVIF3vF3B75GyXrzsfYV8Dlv3L4mEpuB9leg8N6yf/7rU06iLPx9fY0Mv3khVp9p7Dx0mGV6V5OQ==", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha512-OrPwdDc65iJiBeUe5n/LIjd7Viy99bKwDdk7Z5ljfZg0uFRFlfQaCy9tZ4YMAag9WAZmlVpe1iZrkIMMSMHD3w==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", + "dev": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha512-n1PZMXgaaDWZDSvuNZ/8XOcYO2hOKDqZel5adtR30VKQAtoWs/5AOeFA0vPV8moiPzlqe7F4cP2tzpFewQyelQ==", + "dev": true, + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "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.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha512-0B4Y53I0OgHUJkt+7RmlDFWKjVAI/YUpWNiL9GQz5ORDr4ttgfQGo+phBWKFLJbBdtOwgMuUkdOHOnPg45jKmQ==", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha512-TcrlEr31tDYnWkHFWDCV3dHYroKEXpJZ2YJYvJdhN+y4AkWMDZ5I4I8XDtUKqSAyG81N7w+I1mFEJtcED+tGqQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "dev": true + }, + "lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", + "dev": true + }, + "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" + }, + "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 + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + }, + "map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==", + "dev": true, + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "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" + } + }, + "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": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "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": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.0.3.tgz", + "integrity": "sha512-KgI4P7MSM31MNBftGJ07WBsLYLx7z9mQsL6+bcHk80AdmUA3cPzX69MK6dSgEgSF9TXLOl040pgo0XP/VTMENA==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "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, + "requires": { + "fill-range": "^7.0.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==", + "dev": true, + "requires": { + "to-regex-range": "^5.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 + }, + "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" + } + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "mime": { + "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.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.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 + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "minipass": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "moment-timezone": { + "version": "0.5.34", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz", + "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==", + "requires": { + "moment": ">= 2.9.0" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "msal": { + "version": "1.4.17", + "resolved": "https://registry.npmjs.org/msal/-/msal-1.4.17.tgz", + "integrity": "sha512-RjHwP2cCIWQ9iUIk1SziUMb9+jj5mC4OqG2w16E5yig8jySi/TwiFvKlwcjNrPsndph0HtgCtbENnk5julf3yQ==", + "dev": true, + "requires": { + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "msalLegacy": { + "version": "npm:msal@1.4.12", + "resolved": "https://registry.npmjs.org/msal/-/msal-1.4.12.tgz", + "integrity": "sha512-gjupwQ6nvNL6mZkl5NIXyUmZhTiEMRu5giNdgHMh8l5EPOnV2Xj6nukY1NIxFacSTkEYUSDB47Pej9GxDYf+1w==", + "requires": { + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha512-7ZxrUybYv9NonoXgwoOqtStIu18D1c3eFZj27hqgf5kBrBF8Q+tE8V0MW8dKM5QLkQPh1JhhbKgHLY9kifov4Q==", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "dev": true, + "optional": true + }, + "nanocolors": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.13.tgz", + "integrity": "sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==", + "dev": true + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "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" + } + }, + "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": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + } + } + }, + "node-notifier": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-10.0.1.tgz", + "integrity": "sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.5", + "shellwords": "^0.1.1", + "uuid": "^8.3.2", + "which": "^2.0.2" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } + } + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node-zip": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/node-zip/-/node-zip-1.1.1.tgz", + "integrity": "sha512-sXfGL65EcaAJqNSXxuyf//i4D4geUtJgZDYUd7IBo2/CH8XY8vcWh1+CBCxuVVyR+S4vAFc3hr//JkCi2+V5vg==", + "dev": true, + "requires": { + "jszip": "2.5.0" + }, + "dependencies": { + "jszip": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.5.0.tgz", + "integrity": "sha512-IRoyf8JSYY3nx+uyh5xPc0qdy8pUDTp2UkHOWYNF/IO/3D8nx7899UlSAjD8rf8wUgOmm0lACWx/GbW3EaxIXQ==", + "dev": true, + "requires": { + "pako": "~0.2.5" + } + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true + } + } + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, + "npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "npm-packlist": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.5.tgz", + "integrity": "sha512-KCfK3Vi2F+PH1klYauoQzg81GQ8/GGjQRKYY6tRnpQUPKTs/1gBZSRWtTEd7jGdSn1LZL7gpAmJT+BcS55k2XQ==", + "dev": true, + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true + }, + "nwsapi": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", + "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", + "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", + "dev": true, + "requires": { + "array.prototype.reduce": "^1.0.4", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.1" + } + }, + "object.hasown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "dev": true, + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "office-ui-fabric-react": { + "version": "7.185.7", + "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.185.7.tgz", + "integrity": "sha512-JiWkrjT/T6OG63ATu6RUlME2PBe4pgxQOwRTOjvbsaq8mlyd9i21ImgwkTEvcNXJpx+4w0bJiuQTcdwSMyf6qA==", + "requires": { + "@fluentui/date-time-utilities": "^7.9.1", + "@fluentui/react-focus": "^7.18.4", + "@fluentui/react-window-provider": "^1.0.3", + "@microsoft/load-themed-styles": "^1.10.26", + "@uifabric/foundation": "^7.10.3", + "@uifabric/icons": "^7.7.2", + "@uifabric/merge-styles": "^7.19.2", + "@uifabric/react-hooks": "^7.14.2", + "@uifabric/set-version": "^7.0.24", + "@uifabric/styling": "^7.20.2", + "@uifabric/utilities": "^7.34.1", + "prop-types": "^15.7.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "@fluentui/date-time-utilities": { + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@fluentui/date-time-utilities/-/date-time-utilities-7.9.1.tgz", + "integrity": "sha512-o8iU1VIY+QsqVRWARKiky29fh4KR1xaKSgMClXIi65qkt8EDDhjmlzL0KVDEoDA2GWukwb/1PpaVCWDg4v3cUQ==", + "requires": { + "@uifabric/set-version": "^7.0.24", + "tslib": "^1.10.0" + } + }, + "@fluentui/keyboard-key": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/@fluentui/keyboard-key/-/keyboard-key-0.2.17.tgz", + "integrity": "sha512-iT1bU56rKrKEOfODoW6fScY11qj3iaYrZ+z11T6fo5+TDm84UGkkXjLXJTE57ZJzg0/gbccHQWYv+chY7bJN8Q==", + "requires": { + "tslib": "^1.10.0" + } + }, + "@fluentui/react-focus": { + "version": "7.18.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-7.18.7.tgz", + "integrity": "sha512-BEj1T0MnQpDExyqN+X47vVNsCFX5puDUJATay8sltu/yDtcEijgzHx61Wc2Rxism2ZFwc4PyND8DzTwlsjyquA==", + "requires": { + "@fluentui/keyboard-key": "^0.2.12", + "@uifabric/merge-styles": "^7.19.2", + "@uifabric/set-version": "^7.0.24", + "@uifabric/styling": "^7.21.2", + "@uifabric/utilities": "^7.35.0", + "tslib": "^1.10.0" + } + }, + "@fluentui/react-window-provider": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-1.0.3.tgz", + "integrity": "sha512-nFFhYlEWDSklAFjw87hQuOO5ZQP8or4J12ZJ7Glf+pcifRl0AySBshuGTJsTyZ0QyzgIeQYGSYf6wcPtycS0aA==", + "requires": { + "@uifabric/set-version": "^7.0.24", + "tslib": "^1.10.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "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" + } + }, + "opn": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz", + "integrity": "sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true + } + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha512-DrQ43ngaJ0e36j2CHyoDoIg1K4zbc78GnTQESebK9vu6hj4W5/pvfSFO/kgM620Yd0YnhseSNYsLK3/SszZ5NQ==", + "dev": true, + "requires": { + "end-of-stream": "~0.1.5", + "sequencify": "~0.0.7", + "stream-consume": "~0.1.0" + }, + "dependencies": { + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha512-go5TQkd0YRXYhX+Lc3UrXkoKU5j+m72jEP5lHWr2Nh82L8wfZtH8toKgcg4T10o23ELIMGXQdwCbl+qAXIPDrw==", + "dev": true, + "requires": { + "once": "~1.3.0" + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "dev": true, + "requires": { + "wrappy": "1" + } + } + } + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-each-series": { + "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-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "p-limit": { + "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": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + } + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-reflect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-2.1.0.tgz", + "integrity": "sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-settle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-4.1.1.tgz", + "integrity": "sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==", + "dev": true, + "requires": { + "p-limit": "^2.2.2", + "p-reflect": "^2.1.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + } + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.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" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true + }, + "parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "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": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + } + } + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dev": true, + "requires": { + "through": "~2.3" + } + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pidof": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pidof/-/pidof-1.0.2.tgz", + "integrity": "sha512-LLJhTVEUCZnotdAM5rd7KiTdLGgk6i763/hsd5pO+8yuF7mdgg0ob8w/98KrTAcPsj6YzGrkFLPVtBOr1uW2ag==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true + }, + "pkg-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-1.1.3.tgz", + "integrity": "sha512-9hHgE5+Xai/ChrnahNP8Ke0VNF/s41IZIB/d24eMHEaRamdPg+wwlRm2lTb5wMvE8eTIKrYZsrxfuOwt3dpsIQ==", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "load-json-file": "^1.1.0", + "object-assign": "^4.0.1", + "symbol": "^0.2.1" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "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" + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "plugin-log": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/plugin-log/-/plugin-log-0.1.0.tgz", + "integrity": "sha512-TzmfWRMEFAnrZbI4GfyXv9Gp5E71eby3gmvnP6LEfmYbVC8FPN2RBRhwxg4sjIg+fy8AJ3mczhLXvk0pzHPeMg==", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "dateformat": "^1.0.11" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "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" + } + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha512-5sFRfAAmbHdIts+eKjR9kYJoF0ViCMVX9yqLu5A7S/v+nd077KgCITOMiirmyCBiZpKLDXbBOkYm6tu7rX/TKg==", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "requires": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true + }, + "postcss": { + "version": "7.0.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.38.tgz", + "integrity": "sha512-wNrSHWjHDQJR/IZL5IKGxRtFgrYNaAA/UrkW2WqbtZO6uxSLMxMN+s2iqUMwnAWm3fMROlDYZB41dr0Mt7vBwQ==", + "dev": true, + "requires": { + "nanocolors": "^0.2.2", + "source-map": "^0.6.1" + } + }, + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "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-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "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-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.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==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "ajv": { + "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", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "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" + }, + "dependencies": { + "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": { + "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-modules": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-1.5.0.tgz", + "integrity": "sha512-KiAihzcV0TxTTNA5OXreyIXctuHOfR50WIhqBpc8pe0Q5dcs/Uap9EVlifOI9am7zGGdGOJQ6B1MPYKo2UxgOg==", + "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": "sha512-zF9+UIEvtpeqMGxhpeT9XaIevQSrBBCz9fi7SwfkmjVacsSj8DY5eFVgn+wY8I9vvdDDwK5xC8Myq4UkoLFIkA==", + "dev": true, + "requires": { + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.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" + } + }, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "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" + } + }, + "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-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": "sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.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" + } + }, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "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" + } + }, + "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-modules-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw==", + "dev": true, + "requires": { + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.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" + } + }, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "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" + } + }, + "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-modules-values": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.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" + } + }, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "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" + } + }, + "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-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==", + "dev": true + } + } + }, + "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": { + "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-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": { + "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==", + "dev": true + } + } + }, + "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": { + "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-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": { + "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-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": { + "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-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": { + "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-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" + } + }, + "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": { + "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-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.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-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" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "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 + }, + "pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + } + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true + }, + "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==", + "dev": true + }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "dev": true, + "requires": { + "asap": "~2.0.6" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true + }, + "pseudolocale": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pseudolocale/-/pseudolocale-1.1.0.tgz", + "integrity": "sha512-OZ8I/hwYEJ3beN3IEcNnt8EpcqblH0/x23hulKBXjs+WhTTEle+ijCHCkh2bd+cIIeCuCwSCbBe93IthGG6hLw==", + "dev": true, + "requires": { + "commander": "*" + } + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "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" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "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 + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dev": true, + "requires": { + "performance-now": "^2.1.0" + } + }, + "raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + }, + "ramda": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", + "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "dev": true + }, + "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" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==" + }, + "react": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "requires": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + } + }, + "react-dom": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", + "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-redux": { + "version": "7.2.8", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.8.tgz", + "integrity": "sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw==", + "requires": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "dependencies": { + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + } + } + }, + "react-router": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz", + "integrity": "sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==", + "requires": { + "history": "^5.2.0" + } + }, + "react-router-dom": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz", + "integrity": "sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==", + "requires": { + "history": "^5.2.0", + "react-router": "6.3.0" + } + }, + "react-test-renderer": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.13.1.tgz", + "integrity": "sha512-Sn2VRyOK2YJJldOqoh8Tn/lWQ+ZiKhyZTPtaO0Q6yNj+QDbmRkVFap6pZPy3YQk8DScRDfyqm/KxKYP9gCMRiQ==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "react-is": "^16.8.6", + "scheduler": "^0.19.1" + } + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-package-json": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "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 + } + } + }, + "read-package-tree": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.1.6.tgz", + "integrity": "sha512-FCX1aT3GWyY658wzDICef4p+n0dB+ENRct8E/Qyvppj6xVpOYerBHfUu7OP5Rt1/393Tdglguf5ju5DEX4wZNg==", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "once": "^1.3.0", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "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": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "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" + } + }, + "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": { + "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 + } + } + }, + "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.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "read-yaml-file": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-2.1.0.tgz", + "integrity": "sha512-UkRNRIwnhG+y7hpqnycCL/xbTk7+ia9VuVTC0S+zVbwd65DI9eUpRMfsWIGrCWxTU/mi+JW8cHQCrv+zfCbEPQ==", + "dev": true, + "requires": { + "js-yaml": "^4.0.0", + "strip-bom": "^4.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "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==", + "dev": true, + "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" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "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" + } + }, + "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": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "realpath-native": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", + "dev": true + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha512-+nixG+3NugceyR8O1bLU45qs84JgI3+8EauyRZafLgC9XbdAOIVgwV1Pe2da0YzGo62KzWoZwUpVEQf6qNAXWA==", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "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" + } + }, + "redux": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", + "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", + "requires": { + "@babel/runtime": "^7.9.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "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": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==", + "dev": true + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "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 + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "dev": true + }, + "requirejs": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", + "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.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 + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "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": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "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": "sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==", + "dev": true + }, + "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": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "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 + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "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==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "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" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "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" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "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-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" + } + }, + "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": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "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": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "sanitize-html": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.1.tgz", + "integrity": "sha512-oOpe8l4J8CaBk++2haoN5yNI5beekjuHv3JRPKUx/7h40Rdr85pemn4NkvUB3TcBP7yjat574sPlcMAyv4UQig==", + "requires": { + "deepmerge": "^4.2.2", + "escape-string-regexp": "^4.0.0", + "htmlparser2": "^6.0.0", + "is-plain-object": "^5.0.0", + "parse-srcset": "^1.0.2", + "postcss": "^8.3.11" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "postcss": { + "version": "8.4.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", + "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + } + } + }, + "sass": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.44.0.tgz", + "integrity": "sha512-0hLREbHFXGQqls/K8X+koeP+ogFRPF4ZqetVB19b7Cst9Er8cOR0rc6RU7MaI4W1JmUShd1BPgPoeqmmgMMYFw==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0" + }, + "dependencies": { + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "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" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "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" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "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 + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "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" + } + } + } + }, + "sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dev": true, + "requires": { + "xmlchars": "^2.1.1" + } + }, + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "ajv": { + "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", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "selfsigned": { + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + }, + "dependencies": { + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + } + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==", + "dev": true, + "requires": { + "sver-compat": "^1.5.0" + } + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha512-YL8BPm0tp6SlXef/VqYpA/ijmTsDP2ZEXzsnqjkaWS7NP7Bfvw18NboL0O8WCIjy67sOCG3MYSK1PB4GC9XdtQ==", + "dev": true + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==", + "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==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "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": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "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": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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" + } + }, + "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": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "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": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } + } + }, + "sockjs-client": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", + "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "eventsource": "^2.0.2", + "faye-websocket": "^0.11.4", + "inherits": "^2.0.4", + "url-parse": "^1.5.10" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "sort-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz", + "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==", + "dev": true, + "requires": { + "is-plain-obj": "^2.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "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 + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "source-map-loader": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.1.3.tgz", + "integrity": "sha512-6YHeF+XzDOrT/ycFJNI53cgEsp/tHTMl37hi7uVyqFAlTXW109JazaQCkbc+jjoL2637qkH1amLi+JzrIpt5lA==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.2", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "source-map": "^0.6.1", + "whatwg-mimetype": "^2.3.0" + }, + "dependencies": { + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "ajv": { + "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", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "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.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "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.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.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" + } + } + } + }, + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true + }, + "stack-utils": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", + "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "stateful-process-command-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stateful-process-command-proxy/-/stateful-process-command-proxy-1.0.1.tgz", + "integrity": "sha512-G2Hz3LPNfCnJOmZeEHz466cqsfsfIzDUDdCr+C9BFM2TEDpju4a8slFDSZ+B2inaiRCX/uQxCVnL8tb399AYrw==", + "dev": true, + "requires": { + "buffer-builder": "latest", + "fifo": "latest", + "generic-pool": "2.4.4", + "promise": "latest" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "stream-consume": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", + "dev": true + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "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": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "dev": true + }, + "string-length": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "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" + } + } + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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 + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "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==", + "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": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "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": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "sudo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sudo/-/sudo-1.0.3.tgz", + "integrity": "sha512-3xMsaPg+8Xm+4LQm0b2V+G3lz3YxtDBzlqiU8CXw2AOIIDSvC1kBxIxBjnoCTq8dTTXAy23m58g6mdClUocpmQ==", + "dev": true, + "requires": { + "inpath": "~1.0.2", + "pidof": "~1.0.2", + "read": "~1.0.3" + } + }, + "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" + } + }, + "supports-hyperlinks": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==", + "dev": true, + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.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": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.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" + } + }, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "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" + } + } + } + }, + "swiped-events": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/swiped-events/-/swiped-events-1.1.6.tgz", + "integrity": "sha512-X0d1FbXes9j4AckSN/k2x6WW2KSTmtEFIjUjThVy8lKrB4Orf89xFPMNbAj2vTZE3Wo2+yaNl6hZoXH9DhC4vg==", + "requires": { + "natives": "^1.1.6" + } + }, + "symbol": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/symbol/-/symbol-0.2.3.tgz", + "integrity": "sha512-IUW+ek7apEaW5bFhS6WpYoNtVpNTlNoqB/PH7YiMWQTxSPeXCzG4PILVakwXivJt3ZXWeO1fIJnUd/L9A/VeGA==", + "dev": true + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "ternary-stream": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.1.1.tgz", + "integrity": "sha512-j6ei9hxSoyGlqTmoMjOm+QNvUKDOIY6bNl4Uh1lhBvl6yjPW2iLqxDUYyfDPZknQ4KdRziFl+ec99iT4l7g0cw==", + "dev": true, + "requires": { + "duplexify": "^3.5.0", + "fork-stream": "^0.0.4", + "merge-stream": "^1.0.0", + "through2": "^2.0.1" + }, + "dependencies": { + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + } + } + }, + "terser": { + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.5.tgz", + "integrity": "sha512-AOEDLDxD2zylUGf/wxHxklEkOe2/r+seuyOWujejFrIxHf11brA1/dWQNIgXa1c6/Wkxgu7zvv0JhOWfc2ELEA==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": 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" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "requires": {} + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "peer": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==" + }, + "tiny-invariant": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", + "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" + }, + "tiny-lr": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", + "integrity": "sha512-cmC4iw/nymXg+dc57AQ8Xv3bHxNQOGyQC3Ht5xLN67hksk6ucshrLk/VKiXuMbnZgToQ2NbnICxYj63xVw+Qbw==", + "dev": true, + "requires": { + "body-parser": "~1.14.0", + "debug": "~2.2.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.2.0", + "parseurl": "~1.3.0", + "qs": "~5.1.0" + }, + "dependencies": { + "body-parser": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", + "integrity": "sha512-6D9uiWn7dbnDAhlDikccybuqKCmsoest0es3VSQO8Doz/fzx6Ls7kJNxKBYTjbzu4/RzNsf9zuACnS3UYjVH8Q==", + "dev": true, + "requires": { + "bytes": "2.2.0", + "content-type": "~1.0.1", + "debug": "~2.2.0", + "depd": "~1.1.0", + "http-errors": "~1.3.1", + "iconv-lite": "0.4.13", + "on-finished": "~2.3.0", + "qs": "5.2.0", + "raw-body": "~2.1.5", + "type-is": "~1.6.10" + }, + "dependencies": { + "qs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "integrity": "sha512-VH4FeG98gs6AkHivaW2O14vsOPBL9E80Sj7fITunoDijiYQ1lsVwJYmm1CSL+oLyO2N5HPdo23GXAG64uKOAZQ==", + "dev": true + } + } + }, + "bytes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", + "integrity": "sha512-zGRpnr2l5w/s8PxkrquUJoVeR06KvqPelrYqiSyQV7QEBqCYivpb6UzXYWC6JDBVtNFOT0rzJRFhkfJgxzmILA==", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw==", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha512-gMygNskMurDCWfoCdyh1gOeDfSbkAHXqz94QoPj5IHIUjC/BG8/xv7FSEUr7waR5RcAya4j58bft9Wu/wHNeXA==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "statuses": "1" + } + }, + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha512-QwVuTNQv7tXC5mMWFX5N5wGjmybjNBBD8P3BReTkPmipoxTUFgWM2gXNvldHQr6T14DH0Dh6qBVg98iJt7u4mQ==", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha512-lRLiIR9fSNpnP6TC4v8+4OU7oStC01esuNowdQ34L+Gk8e5Puoc88IqJ+XAY/B3Mn2ZKis8l8HX90oU8ivzUHg==", + "dev": true + }, + "qs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", + "integrity": "sha512-SGDM48EwFLWnYYpNlOkEIRJb4wil5FKJxpR6NVfQjz6qJmX53ki7Xj1cLNEAkb70vUfJmdVLOwODyABgZyDMZw==", + "dev": true + }, + "raw-body": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", + "integrity": "sha512-x4d27vsIG04gZ1imkuDXB9Rd/EkAx5kYzeMijIYw1PAor0Ld3nTlkQQwDjKu42GdRUFCX1AfGnTSQB4O57eWVg==", + "dev": true, + "requires": { + "bytes": "2.4.0", + "iconv-lite": "0.4.13", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha512-SvUX8+c/Ga454a4fprIdIUzUN9xfd1YTvYh7ub5ZPJ+ZJ/+K2Bp6IpWGmnw8r3caLTsmhvJAKZz3qjIo9+XuCQ==", + "dev": true + } + } + } + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "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" + } + }, + "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": { + "kind-of": "^6.0.0" + } + }, + "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" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==", + "dev": true, + "requires": { + "through2": "^2.0.3" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tough-cookie": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.0.tgz", + "integrity": "sha512-IVX6AagLelGwl6F0E+hoRpXzuD192cZhAcmT7/eoLr0PnsB1wv2E5c+A2O+V8xth9FlL2p0OstFsWn0bZpVn4w==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + } + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "dev": true + }, + "true-case-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", + "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", + "dev": true + }, + "ts-jest": { + "version": "26.5.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", + "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^26.1.0", + "json5": "2.x", + "lodash": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "dependencies": { + "@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/yargs": { + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "requires": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + } + } + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "tsutils": { + "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" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", + "dev": true + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "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 + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "peer": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true + }, + "undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "dependencies": { + "fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==", + "dev": true + } + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + } + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true + }, + "uri-js": { + "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" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + } + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "requires": {} + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + }, + "v8-compile-cache": { + "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 + }, + "v8-to-istanbul": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", + "integrity": "sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + } + } + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "validator": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", + "integrity": "sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA==", + "dev": true + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + } + } + }, + "vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "dependencies": { + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + } + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "dev": true, + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "peer": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "webpack": { + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "dev": true, + "peer": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": 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" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "peer": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "peer": true + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + } + } + }, + "webpack-dev-server": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", + "dev": true, + "requires": { + "ansi-html-community": "0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "ajv": { + "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", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "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" + } + } + } + }, + "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": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + } + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "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 + }, + "express": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "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" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "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-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "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 + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "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-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "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==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "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" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.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" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "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" + } + } + } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + }, + "dependencies": { + "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" + } + } + } + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha512-SA2KdOXATOroD3EBUYvcdugsusXS5YiQFqwskSbsp5b1gK8HpNi/YP0jcy/BDpdllp305HMnrsVf9K7Be9GiEQ==" + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.7.1.tgz", + "integrity": "sha512-7rwLuNiZQbujtIu7Ibp7mq9X/Swqq90X0+zOWESoViRYcIOoQWtThlRX9K2YQHZLwGZv4CBOdTc4N3/SzAdb6w==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + } + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", + "dev": true + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "write-yaml-file": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/write-yaml-file/-/write-yaml-file-4.2.0.tgz", + "integrity": "sha512-LwyucHy0uhWqbrOkh9cBluZBeNVxzHjDaE9mwepZG3n3ZlbM4v3ndrFw51zW/NXYFFqP+QWZ72ihtLWTh05e4Q==", + "dev": true, + "requires": { + "js-yaml": "^4.0.0", + "write-file-atomic": "^3.0.3" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "ws": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" + } + }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "xmldoc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.4.tgz", + "integrity": "sha512-rQshsBGR5s7pUNENTEncpI2LTCuzicri0DyE4SCV5XmS0q81JS8j1iPijP0Q5c4WLGbKh3W92hlOwY6N9ssW1w==", + "dev": true, + "requires": { + "sax": "^1.2.4" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yargs": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.6.0.tgz", + "integrity": "sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==", + "dev": true, + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "pkg-conf": "^1.1.2", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1", + "string-width": "^1.0.1", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "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": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true + } + } + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3" + } + }, + "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 + }, + "z-schema": { + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.18.4.tgz", + "integrity": "sha512-DUOKC/IhbkdLKKiV89gw9DUauTV8U/8yJl1sjf6MtDmzevLKOF2duNJ495S3MFVjqZarr+qNGCPbkg4mu4PpLw==", + "dev": true, + "requires": { + "commander": "^2.7.1", + "lodash.get": "^4.0.0", + "lodash.isequal": "^4.0.0", + "validator": "^8.0.0" + } + } + } +} diff --git a/samples/react-rhythm-of-business-calendar/package.json b/samples/react-rhythm-of-business-calendar/package.json new file mode 100644 index 000000000..59af610b4 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/package.json @@ -0,0 +1,84 @@ +{ + "name": "rhythm-of-business-calendar", + "version": "1.0.0", + "main": "lib/index.js", + "private": true, + "scripts": { + "build": "gulp bundle", + "clean": "gulp clean", + "deploy": "gulp deploy", + "package": "gulp package", + "test": "./node_modules/.bin/jest" + }, + "resolutions": { + "@types/react": "~16.9.51" + }, + "dependencies": { + "@fluentui/react": "^8.77.2", + "@fluentui/react-hooks": "^8.6.0", + "@fluentui/react-icons-mdl2": "^1.3.11", + "@microsoft/sp-component-base": "^1.15.2", + "@microsoft/sp-core-library": "^1.15.2", + "@microsoft/sp-http": "^1.15.2", + "@microsoft/sp-list-subscription": "^1.15.2", + "@microsoft/sp-loader": "^1.15.2", + "@microsoft/sp-property-pane": "1.15.2", + "@microsoft/sp-webpart-base": "1.15.2", + "@pnp/common": "^2.13.0", + "@pnp/graph": "^2.13.0", + "@pnp/logging": "^2.13.0", + "@pnp/odata": "^2.13.0", + "@pnp/sp": "^2.13.0", + "compressed-json": "^1.0.16", + "he": "^1.2.0", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.21", + "moment-timezone": "^0.5.34", + "office-ui-fabric-react": "7.185.7", + "react": "~16.13.1", + "react-beautiful-dnd": "^13.1.1", + "react-dom": "~16.13.1", + "react-router-dom": "^6.3.0", + "sanitize-html": "^2.7.1", + "swiped-events": "^1.1.6" + }, + "devDependencies": { + "@microsoft/eslint-config-spfx": "^1.15.2", + "@microsoft/eslint-plugin-spfx": "^1.15.2", + "@microsoft/gulp-core-build": "3.17.19", + "@microsoft/rush-stack-compiler-4.5": "0.2.2", + "@microsoft/sp-build-core-tasks": "^1.15.2", + "@microsoft/sp-build-web": "^1.15.2", + "@microsoft/sp-module-interfaces": "^1.15.2", + "@rushstack/eslint-config": "2.5.1", + "@testing-library/jest-dom": "^5.14.1", + "@testing-library/react": "^11.2.7", + "@types/he": "^1.1.2", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/jest": "^26.0.24", + "@types/react": "~16.9.51", + "@types/react-beautiful-dnd": "^13.1.2", + "@types/react-dom": "~16.9.8", + "@types/react-router-dom": "^5.3.3", + "@types/react-test-renderer": "~16.9.5", + "@types/sanitize-html": "^2.3.2", + "@types/sharepoint": "^2016.1.10", + "@types/webpack-env": "^1.16.2", + "acorn": "^8.4.1", + "ajv": "^8.6.1", + "enhanced-resolve": "^5.8.2", + "eslint-plugin-react-hooks": "^4.3.0", + "gulp": "^4.0.2", + "gulp-zip": "^5.1.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^26.6.3", + "json5": "^2.2.0", + "raf": "^3.4.1", + "react-test-renderer": "~16.13.1", + "stateful-process-command-proxy": "^1.0.1", + "ts-jest": "^26.5.6" + }, + "engines": { + "node": ">=16.15.1" + } +} diff --git a/samples/react-rhythm-of-business-calendar/src/apps/LoadingShimmer.tsx b/samples/react-rhythm-of-business-calendar/src/apps/LoadingShimmer.tsx new file mode 100644 index 000000000..611d5565f --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/apps/LoadingShimmer.tsx @@ -0,0 +1,250 @@ +import React, { memo } from "react"; +import { ShimmerElementsGroup, ShimmerElementType, Stack, StackItem } from "@fluentui/react"; + +export const LoadingShimmer = memo(() => { + if (window.outerWidth >= 640) { + return ( + + + + + + + + + + + + + + + ); + } else { + return ( + + + + + + + + + + + + + + + + ); + } +}); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/apps/RhythmOfBusinessCalendarApp.tsx b/samples/react-rhythm-of-business-calendar/src/apps/RhythmOfBusinessCalendarApp.tsx new file mode 100644 index 000000000..385373fa9 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/apps/RhythmOfBusinessCalendarApp.tsx @@ -0,0 +1,98 @@ +import React, { Component, ReactElement } from "react"; +import { MemoryRouter } from "react-router-dom"; +import { BaseClientSideWebPart } from "@microsoft/sp-webpart-base"; +import { SharePointApp } from "common/components"; +import { Root, ConfigurationWizard, Upgrade } from 'components'; +import { + ServicesType, + DeveloperServiceDescriptor, DirectoryServiceDescriptor, TimeZoneServiceDescriptor, SharePointServiceDescriptor, LiveUpdateServiceDescriptor, + ConfigurationServiceDescriptor, EventsServiceDescriptor, + SharePointService, ConfigurationService, DeveloperService, LiveUpdateService +} from "services"; +import { LoadingShimmer } from "./LoadingShimmer"; + +const AppServiceDescriptors = [ + DeveloperServiceDescriptor, + TimeZoneServiceDescriptor, + DirectoryServiceDescriptor, + SharePointServiceDescriptor, + LiveUpdateServiceDescriptor, + ConfigurationServiceDescriptor, + EventsServiceDescriptor +]; + +type AppServices = ServicesType; + +interface IProps { + webpart: BaseClientSideWebPart; +} + +class RhythmOfBusinessCalendarApp extends Component { + constructor(props: IProps) { + super(props); + } + + private readonly _onAfterInitServices = async (services: AppServices) => { + const { + [SharePointService]: spo, + [LiveUpdateService]: liveUpdate + } = services; + + await spo.preflightSchema(); + + liveUpdate.begin(); + + this._registerDevScripts(services); + + } + + private readonly _registerDevScripts = async (services: AppServices) => { + const { [DeveloperService]: dev } = services; + + dev.registerScripts({ + debug: { + } + }); + } + + private readonly _renderApp = (services: AppServices) => { + const { + [ConfigurationService]: configurations + } = services; + + const requiresUpgrade = configurations.active?.schemaRequiresUpgrade; + + if (!configurations.active) { + return this.forceUpdate()} />; + } else if (requiresUpgrade) { + return window.location.reload()} />; + } else { + return ( + + + + ); + } + } + + public render(): ReactElement { + const { webpart } = this.props; + + return ( + } + > + {this._renderApp} + + ); + } +} + +export default RhythmOfBusinessCalendarApp; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/apps/index.ts b/samples/react-rhythm-of-business-calendar/src/apps/index.ts new file mode 100644 index 000000000..83990f744 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/apps/index.ts @@ -0,0 +1 @@ +export { default as RhythmOfBusinessCalendarApp } from './RhythmOfBusinessCalendarApp'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/assets/onboarding/addEventsIllustration.png b/samples/react-rhythm-of-business-calendar/src/assets/onboarding/addEventsIllustration.png new file mode 100644 index 0000000000000000000000000000000000000000..25343ce9c39e539aea229e632f3196b187ce5941 GIT binary patch literal 10409 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 literal 0 HcmV?d00001 diff --git a/samples/react-rhythm-of-business-calendar/src/assets/onboarding/setApproversIllustration.png b/samples/react-rhythm-of-business-calendar/src/assets/onboarding/setApproversIllustration.png new file mode 100644 index 0000000000000000000000000000000000000000..93c35366ea912eb5ff4561c838451daff7fe2f6e GIT binary patch literal 13352 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 literal 0 HcmV?d00001 diff --git a/samples/react-rhythm-of-business-calendar/src/common/AsyncData.ts b/samples/react-rhythm-of-business-calendar/src/common/AsyncData.ts new file mode 100644 index 000000000..fcef670bc --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/AsyncData.ts @@ -0,0 +1,180 @@ +import { flatten } from "lodash"; +import { IComponent } from "./IComponent"; + +export interface IAsyncData { + done: boolean; + loaded: boolean; + saving: boolean; + error: any; + data: T; + promise: Promise; + registerComponentForUpdates(component: IComponent): void; + unregisterComponentForUpdates(component: IComponent): void; +} + +export abstract class AsyncDataBase implements IAsyncData { + private readonly _registeredComponents: Set; + + constructor() { + this._registeredComponents = new Set(); + } + + public abstract done: boolean; + public abstract saving: boolean; + public abstract error: any; + public abstract data: T; + public abstract promise: Promise; + + public get loaded(): boolean { + return this.done && !this.error; + } + + public registerComponentForUpdates(component: IComponent) { + this._registeredComponents.add(component); + } + + public unregisterComponentForUpdates(component: IComponent) { + this._registeredComponents.delete(component); + } + + protected notifyHandlers() { + this._registeredComponents.forEach(component => component.componentShouldRender()); + } +} + +export class AsyncData extends AsyncDataBase { + public static createWithData(data?: T, key?: K) { + const dataAsync = new AsyncData(key); + dataAsync.dataLoaded(data); + return dataAsync; + } + + public static createWithError(error: any, key?: K) { + const dataAsync = new AsyncData(key); + dataAsync.dataFailed(error); + return dataAsync; + } + + private _key: K; + public get key(): K { return this._key; } + + public done: boolean; + public saving: boolean; + public error: any; + public data: T; + + public readonly promise: Promise; + private _promiseResolveFn: (d: T) => void; + private _promiseRejectFn: (e: any) => void; + + constructor(key?: K, promise?: Promise) { + super(); + this._key = key; + this.done = false; + this.error = null; + this.saving = false; + this.data = null; + this.promise = new Promise((resolve, reject) => { this._promiseResolveFn = resolve; this._promiseRejectFn = reject; }); + + promise?.then(this.dataLoaded, this.saveFailed); + } + + public readonly dataLoaded = (data?: T) => { + if (!this.done) { + this.data = data || this.data; + this.done = true; + this._promiseResolveFn(this.data); + this.notifyHandlers(); + } + } + + public readonly dataFailed = (error: any) => { + console.error(error); + this.error = error; + this.done = true; + this._promiseRejectFn(this.error); + this.notifyHandlers(); + } + + public readonly savingStarted = () => { + this.error = null; + this.saving = true; + this.notifyHandlers(); + } + + public readonly saveSuccessful = () => { + this.error = null; + this.saving = false; + this.notifyHandlers(); + } + + public readonly saveFailed = (error: any) => { + console.error(error); + this.error = error; + this.saving = false; + this.notifyHandlers(); + } + + public readonly dataUpdated = () => { + this.notifyHandlers(); + } + + public replaceKey(key: K) { + this._key = key; + } +} + +export class AggregatedAsyncData extends AsyncDataBase { + private readonly _dataAsync: IAsyncData[]; + + public readonly promise: Promise; + + constructor(dataAsync: IAsyncData[]) { + super(); + + this._dataAsync = [...dataAsync]; + + this.promise = Promise.all(this._dataAsync.map(d => d.promise)).then(flatten); + } + + public get done(): boolean { + return this._dataAsync.every(async => async.done); + } + + public get error() { + return this._dataAsync.filter(async => async.error)[0]?.error; + } + + public get loaded(): boolean { + return this._dataAsync.every(async => async.loaded); + } + + public get saving(): boolean { + return this._dataAsync.some(async => async.saving); + } + + public get data(): T[] { + return flatten(this._dataAsync.map(async => async.data instanceof Array ? async.data : [async.data])); + } + + public registerComponentForUpdates(component: IComponent) { + this._dataAsync.forEach(async => async.registerComponentForUpdates(component)); + } + + public unregisterComponentForUpdates(component: IComponent) { + this._dataAsync.forEach(async => async.unregisterComponentForUpdates(component)); + } +} + +export class AsyncDataCache { + private _dataAsync: AsyncData; + + constructor( + private materialize: () => Promise, + private key?: string + ) { } + + public get(): AsyncData { + return this._dataAsync = (this._dataAsync || new AsyncData(this.key, this.materialize())); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/BackEventListener.ts b/samples/react-rhythm-of-business-calendar/src/common/BackEventListener.ts new file mode 100644 index 000000000..fdaf5e0af --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/BackEventListener.ts @@ -0,0 +1,34 @@ +import { Guid } from "@microsoft/sp-core-library"; + +export class BackEventListener { + private readonly _historyStateInstance = { id: Guid.newGuid().toString() }; + + constructor( + private readonly _onBackPressed: () => void + ) { + window.addEventListener('popstate', this._popStateHandler); + } + + public cleanup() { + window.removeEventListener('popstate', this._popStateHandler); + } + + private readonly _popStateHandler = (ev: PopStateEvent) => { + this._onBackPressed(); + } + + public listenForBack() { + if (!this._isCurrentHistoryState()) { + window.history.pushState(this._historyStateInstance, ''); + } + } + + public cancelListeningForBack() { + if (this._isCurrentHistoryState()) + window.history.back(); + } + + private _isCurrentHistoryState(): boolean { + return window.history.state?.id === this._historyStateInstance.id; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/Color.ts b/samples/react-rhythm-of-business-calendar/src/common/Color.ts new file mode 100644 index 000000000..4cd2e3eaa --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/Color.ts @@ -0,0 +1,77 @@ +import { clamp, padStart } from "lodash"; + +export class Color { + public static parse(val: string): Color { + const red = parseInt(val.substring(1, 3), 16); + const green = parseInt(val.substring(3, 5), 16); + const blue = parseInt(val.substring(5, 7), 16); + return new Color(red, green, blue, 1); + } + + private _alpha: number; + private _red: number; + private _green: number; + private _blue: number; + + constructor(red: number, green: number, blue: number, alpha: number = 1.0) { + this.alpha = alpha; + this.red = red; + this.green = green; + this.blue = blue; + } + + public clone(): Color { + return new Color(this.red, this.green, this.blue, this.alpha); + } + + public get alpha(): number { return this._alpha; } + public set alpha(val: number) { this._alpha = clamp(val, 0.0, 1.0); } + + public get red(): number { return this._red; } + public set red(val: number) { this._red = clamp(val, 0, 255); } + + public get green(): number { return this._green; } + public set green(val: number) { this._green = clamp(val, 0, 255); } + + public get blue(): number { return this._blue; } + public set blue(val: number) { this._blue = clamp(val, 0, 255); } + + public opacity(val: number): this { + this.alpha = val; + return this; + } + + public lighten(val: number): Color { + if (val === 0 || isNaN(val)) return this.clone(); + + let { red, green, blue } = this; + red += Math.round((255 - red) * val); + green += Math.round((255 - green) * val); + blue += Math.round((255 - blue) * val); + + return new Color(red, green, blue, this.alpha); + } + + public darken(val: number): Color { + if (val === 0 || isNaN(val)) return this.clone(); + + let { red, green, blue } = this; + red = Math.round(red * (1 - val)); + green = Math.round(green * (1 - val)); + blue = Math.round(blue * (1 - val)); + + return new Color(red, green, blue, this.alpha); + } + + public toCssString(): string { + return `rgba(${this.red}, ${this.green}, ${this.blue}, ${this.alpha})`; + } + + public toHexString(): string { + const toHexComponent = (val: number) => padStart(val.toString(16), 2, '0'); + const red = toHexComponent(this.red); + const green = toHexComponent(this.green); + const blue = toHexComponent(this.blue); + return `#${red}${green}${blue}`; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/Entity.ts b/samples/react-rhythm-of-business-calendar/src/common/Entity.ts new file mode 100644 index 000000000..bd2423ed6 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/Entity.ts @@ -0,0 +1,941 @@ +import { isEqual, isEqualWith, includes, remove, PropertyName, isEmpty, intersection, difference, cloneDeepWith } from 'lodash'; +import { isMoment, isDuration } from 'moment-timezone'; +import { Guid } from '@microsoft/sp-core-library'; +import { User } from "./User"; +import { IUserListChanges } from "./IUserListChanges"; +import { ValidationRule } from "./ValidationRules"; +import { reverseComparer, Comparer, PropsOfType, inverseFilter } from './Utils'; + +const Version: unique symbol = Symbol("Version"); +const Current: unique symbol = Symbol("Current"); +const Previous: unique symbol = Symbol("Previous"); +const Snapshot: unique symbol = Symbol("Snapshot"); +const LiveUpdateTemp: unique symbol = Symbol("Live Update"); + +export const stateIsEqualCustomizer = (value: any, other: any, indexOrKey: PropertyName | undefined, parent: any, otherParent: any, stack: any): boolean | undefined => { + if (indexOrKey === Version) { + return true; + } else if (isMoment(value) && isMoment(other)) { + if (!value.isValid() && !other.isValid()) + return true; + else + return value.isSame(other); + } else if (isDuration(value) && isDuration(other)) { + if (!value.isValid() && !other.isValid()) + return true; + else + return value.asMilliseconds() === other.asMilliseconds(); + } else if (value instanceof Map && other instanceof Map) { + return isEqual(value, other); + } else if (value instanceof Set && other instanceof Set) { + return isEqual(value, other); + } else if (Array.isArray(value) && Array.isArray(other) && indexOrKey) { + return isEqualWith(value, other, stateIsEqualCustomizer); + } else if (value instanceof User && other instanceof User) { + return User.equal(value, other); + } else if (value instanceof Guid && other instanceof Guid) { + return value.equals(other); + } +} + +interface ISnapshot { + readonly hasSnapshot: boolean; + snapshot(): void; + revert(): void; + immortalize(): void; +} + +interface ILiveUpdate { + readonly hasPrevious: boolean; + readonly inLiveUpdate: boolean; + beginLiveUpdate(): void; + endLiveUpdate(): void; +} + +type ExtractEntityStateType = E extends Entity ? S : never; + +type IEntityState = S & { + id: ID; + deleted: boolean; + [Version]: number; +}; +type States = { + [Current]: IEntityState; + [Previous]?: IEntityState; + [Snapshot]?: IEntityState; + [LiveUpdateTemp]?: IEntityState; +}; + +export interface IEntity extends ISnapshot, ILiveUpdate { + readonly id: ID; + readonly displayName: string; + readonly isNew: boolean; + readonly isDeleted: boolean; + readonly softDeleteSupported: boolean; + hasChanges(): boolean; + valid(): boolean; + delete(): void; + snapshotValue(property: string | number | symbol): any; + previousValue(property: string | number | symbol): any; + isSearchMatch(text: string, matchAllWords?: boolean): boolean; +} + +export abstract class Entity implements IEntity { + public static readonly DisplayNameAscComparer = (a: Entity, b: Entity) => a.displayName.localeCompare(b.displayName); + public static readonly DisplayNameDescComparer = reverseComparer(Entity.DisplayNameAscComparer); + + public static readonly NotDeletedFilter = ({ isDeleted }: Entity): boolean => !isDeleted; + public static readonly NewAndDeletedFilter = ({ isNew, isDeleted }: Entity): boolean => isNew && isDeleted; + public static readonly NewAndGhostableFilter = ({ isNew, allowGhosting }: Entity): boolean => isNew && allowGhosting; + + public static search, S>(entities: E[], text: string, matchAllWords?: boolean): E[]; + public static search, S>(entities: readonly E[], text: string, matchAllWords?: boolean): readonly E[]; + public static search, S>(entities: E[] | readonly E[], text: string, matchAllWords: boolean = true): E[] | readonly E[] { + if (text) { + const words = Entity._buildSearchWords(text); + return entities.filter(entity => entity._isSearchMatchCore(words, matchAllWords)); + } else { + return entities; + } + } + + private static _buildSearchWords(text: string): string[] { + return text.toLocaleLowerCase().split(' '); + } + + private readonly _validateRules: ValidationRule>[]; + + private _states: States; + private _activeState: keyof States; + private _peekPriorState: keyof States; + private _searchHelpers: string[]; + private _boundedContextParticipants: Set; + + constructor(id?: ID) { + this._validateRules = this.validationRules() || []; + + this._states = { + [Current]: { + id, + deleted: false, + [Version]: 0 + } as IEntityState + }; + this._activeState = Current; + this._peekPriorState = null; + + this._searchHelpers = null; + this._boundedContextParticipants = new Set(); + } + + public get id(): ID { + return this._states[this._activeState].id; + } + + private _key: Guid; + public get key(): string { + return (this.id || (this._key ||= Guid.newGuid())).toString(); + } + + public abstract get displayName(): string; + + public get isNew(): boolean { + return !this.id; + } + + public get isDeleted(): boolean { + return this._states[this._activeState].deleted; + } + + public setId(id: ID) { + if (this.isNew) { + this._states[this._activeState].id = id; + } + } + + public hasChanges(specificProperty?: string | number | symbol): boolean { + if (this.isNew && !this.allowGhosting) { + return true; + } else if (this.hasSnapshot) { + const current = specificProperty ? this.currentValue(specificProperty) : this._states[Current]; + const snapshot = specificProperty ? this.snapshotValue(specificProperty) : this._states[Snapshot]; + return !isEqualWith(current, snapshot, this.stateIsEqualCustomizer); + } else { + return false; + } + } + + public valid(): boolean { + return this._validateRules.every(rule => rule.validate(this)); + } + + public delete() { + this._states[this._activeState].deleted = true; + } + + public undelete() { + if (this.isDeleted) { + const state = this._states[this._activeState]; + state.deleted = false; + + if (!this.softDeleteSupported) { + if (this.hasPrevious && !this.previousValue("isDeleted") && + this.hasSnapshot && this.snapshotValue("isDeleted")) { + state.id = undefined; + } + } + } + } + + public stateVersion(): number { + return this._states[this._activeState][Version]; + } + + protected includeInBoundedContext(relationship: ISnapshot & ILiveUpdate) { + this._boundedContextParticipants.add(relationship); + } + + public isInBoundedContext(relationship: ISnapshot & ILiveUpdate): boolean { + return this._boundedContextParticipants.has(relationship); + } + + public get hasSnapshot(): boolean { + return !!this._states[Snapshot]; + } + + public get hasPrevious(): boolean { + return !!this._states[Previous]; + } + + public get inLiveUpdate(): boolean { + return !!this._states[LiveUpdateTemp]; + } + + public snapshot() { + if (!this.hasSnapshot) { + this._states[Snapshot] = this._states[Current]; + this._states[Current] = this._copyState(this._states[Current]); + this._boundedContextParticipants.forEach(participant => participant.snapshot()); + } + } + + public revert() { + if (this.hasSnapshot) { + this._states[Current] = this._states[Snapshot]; + this._states[Snapshot] = null; + this._boundedContextParticipants.forEach(participant => participant.revert()); + } + } + + public immortalize() { + if (this.hasSnapshot) { + if (this.hasChanges()) { + this._searchHelpers = null; + this._states[Current][Version]++; + } else + this._states[Current] = this._states[Snapshot]; + + this._states[Snapshot] = null; + this._boundedContextParticipants.forEach(participant => participant.immortalize()); + } + + if (this.hasPrevious) { + this._states[Previous] = null; + } + } + + public isSearchMatch(text: string, matchAllWords: boolean = true): boolean { + return text ? this._isSearchMatchCore(Entity._buildSearchWords(text), matchAllWords) : true; + } + + public get softDeleteSupported(): boolean { + return false; + } + + public get allowGhosting(): boolean { + return false; + } + + protected get state(): S { + return this._states[this._activeState]; + } + + public beginLiveUpdate(isNew: boolean = false) { + if (!this.inLiveUpdate) { + if (this.hasSnapshot) { + this._states[LiveUpdateTemp] = this._states[Snapshot]; + this._states[Snapshot] = this._copyState(this._states[Snapshot]); + this._activeState = Snapshot; + } else { + this._states[LiveUpdateTemp] = this._states[Current]; + this._states[Current] = this._copyState(this._states[Current]); + } + + if (isNew) { + this._states[LiveUpdateTemp].id = undefined; + } + + this._boundedContextParticipants.forEach(participant => participant.beginLiveUpdate()); + } + } + + public endLiveUpdate() { + if (this.inLiveUpdate) { + this._states[Previous] = this._states[Previous] || this._states[LiveUpdateTemp]; + + const isNew = !this._states[Previous].id; + const liveUpdateMadeChanges = !isNew && !isEqualWith(this._states[Previous], this.hasSnapshot ? this._states[Snapshot] : this._states[Current], this.stateIsEqualCustomizer); + + this._activeState = Current; + + if (isNew) { + this._states[Previous] = this._copyState(this._states[Current]); + } else if (this.hasSnapshot) { + if (liveUpdateMadeChanges) { + const copy = this._copyState(this._states[Snapshot]); + + // eslint-disable-next-line guard-for-in + for (const prop in copy) { + const current_value = (this._states[Current] as any)[prop]; + const prior_snapshot_value = (this._states[LiveUpdateTemp] as any)[prop]; + + const propValuesAreEqual = isEqualWith(current_value, prior_snapshot_value, this.stateIsEqualCustomizer); + + if (propValuesAreEqual) { + (this._states[Current] as any)[prop] = (copy as any)[prop]; + } + } + } else { + this._states[Snapshot] = this._states[Previous]; + this._states[Previous] = null; + } + } else if (!liveUpdateMadeChanges) { + this._states[Current] = this._states[Previous]; + this._states[Previous] = null; + } + + this._states[LiveUpdateTemp] = null; + + this._boundedContextParticipants.forEach(participant => participant.endLiveUpdate()); + } + } + + public currentValue(property: string | number | symbol): T { + this.peekCurrent(); + const value = (this as any)[property]; + this.endPeek(); + return value as T; + } + + public previousValue(property: string | number | symbol): T { + this.peekPrevious(); + const value = (this as any)[property]; + this.endPeek(); + return value as T; + } + + public snapshotValue(property: string | number | symbol): T { + this.peekSnapshot(); + const value = (this as any)[property]; + this.endPeek(); + return value as T; + } + + public peekCurrent() { + this._peekPriorState = this._activeState; + this._activeState = Current; + } + + public peekSnapshot() { + this._peekPriorState = this._activeState; + this._activeState = Snapshot; + } + + public peekPrevious() { + this._peekPriorState = this._activeState; + this._activeState = Previous; + } + + public endPeek() { + if (this._peekPriorState) { + this._activeState = this._peekPriorState; + this._peekPriorState = null; + } + } + + protected usersDifference(propertyName: PropsOfType): IUserListChanges { + if (this.hasSnapshot) { + const current = this._states[Current][propertyName] as unknown as User[]; + const snapshot = this._states[Snapshot][propertyName] as unknown as User[]; + + return { + added: User.except(current, snapshot), + removed: User.except(snapshot, current) + }; + } else { + return { added: [], removed: [] }; + } + } + + protected stateIsEqualCustomizer(value: any, other: any, indexOrKey: PropertyName | undefined, parent: any, otherParent: any, stack: any): boolean | undefined { + return stateIsEqualCustomizer(value, other, indexOrKey, parent, other, stack); + } + + protected cloneStateCustomizer(value: any, key: number | string | undefined | symbol, object: T | undefined, stack: any): any { + if (key === Version) + return value + 1; + else if (value instanceof Entity) + return value; + else if (isMoment(value) || isDuration(value)) + return value.clone(); + else if (typeof value?.clone === "function") + return value.clone(); + } + + private _copyState(state: IEntityState): IEntityState { + return cloneDeepWith(state, this.cloneStateCustomizer); + } + + private _createSearchHelpers() { + this._searchHelpers = [ + this.displayName, + ...this.buildSearchHelperStrings() + ].filter(Boolean).map(str => str.toLocaleLowerCase()); + } + + private _searchHelpersContain(text: string) { + if (!this._searchHelpers) { + this._createSearchHelpers(); + } + + return this._searchHelpers.some(helper => helper.includes(text)); + } + + private _isSearchMatchCore(words: string[], matchAllWords: boolean = true): boolean { + if (matchAllWords) + return words.every(word => this._searchHelpersContain(word)); + else + return words.some(word => this._searchHelpersContain(word)); + } + + protected buildSearchHelperStrings(): string[] { return []; } + protected validationRules(): ValidationRule>[] { return []; } +} + + +export enum EntityRelationshipSortOption { + OnImmortalize = 0, + OnAdd = 1, + OnAddAndInsert = 2 +} + +export interface IRelationshipSortingParameters { + comparer: Comparer; + option?: EntityRelationshipSortOption; +} + + +export interface IManyToOneRelationship extends ISnapshot, ILiveUpdate { + get(): TParent; + getSnapshot(): TParent; + getPrevious(): TParent; + set(val: TParent): void; +} + +interface IToManyRelationshipBase extends ISnapshot, ILiveUpdate { + get(): ReadonlyArray; + readonly hasItems: boolean; + hasChanges(): boolean; + add(entity: TRelated): void; + insert(entity: TRelated, index?: number): void; + remove(entity: TRelated): void; + removeAll(): void; + forEach(callbackfn: (value: TRelated, index: number, array: readonly TRelated[]) => void, thisArg?: any): void; + map(callbackfn: (value: TRelated, index: number, array: readonly TRelated[]) => U): U[]; + filter(callbackfn: (value: TRelated, index: number, array: readonly TRelated[]) => unknown): TRelated[]; + find(callbackfn: (value: TRelated, index: number, array: readonly TRelated[]) => boolean): TRelated | undefined; + addNotificationHandler(handler: () => void): void; + removeNotificationHandler(handler: () => void): void; + snapshotValue(): readonly TRelated[]; + previousValue(): readonly TRelated[]; + sorting?: Readonly>; +} + +type ToManyRelationshipState> = { + [Current]: TRelated[]; + [Previous]?: TRelated[]; + [Snapshot]?: TRelated[]; + [LiveUpdateTemp]?: TRelated[]; +}; + +export abstract class ToManyRelationshipBase, TRelated extends Entity> implements IToManyRelationshipBase { + private _states: ToManyRelationshipState; + private _activeState: keyof ToManyRelationshipState; + private _handlers: Set<() => void> = new Set(); + + protected constructor( + protected readonly _parent: TEntity, + public readonly sorting?: Readonly> + ) { + this._states = { + [Current]: [] + }; + this._activeState = Current; + } + + public addNotificationHandler(handler: () => void) { + this._handlers.add(handler); + } + + public removeNotificationHandler(handler: () => void) { + this._handlers.delete(handler); + } + + protected get state(): TRelated[] { + return this._states[this._activeState]; + } + + public get(): ReadonlyArray { + return this.state; + } + + public get hasItems(): boolean { + return !isEmpty(this.state); + } + + public hasChanges(): boolean { + let hasChanges: boolean = false; + + const currentItems = this._states[Current].filter(ToManyRelationshipBase.NotNewAndDeletedFilter); + + if (this.hasSnapshot) { + const snapshotItems = this._states[Snapshot]; + const currentNonGhostableItems = currentItems.filter(ToManyRelationshipBase.NotNewAndGhostableFilter); + hasChanges = !isEqual(currentNonGhostableItems, snapshotItems); + hasChanges ||= currentItems.some(bc => bc.hasChanges()); + } + + return hasChanges; + } + private static readonly NotNewAndDeletedFilter = inverseFilter(Entity.NewAndDeletedFilter); + private static readonly NotNewAndGhostableFilter = inverseFilter(Entity.NewAndGhostableFilter); + + public add(entity: TRelated) { + if (this._insertCore(entity)) { + if (this._shouldSortOnAdd) + this._sort(); + } + } + + public insert(entity: TRelated, index?: number) { + if (this._insertCore(entity, index)) { + if (this._shouldSortOnInsert) + this._sort(); + } + } + + private _insertCore(entity: TRelated, index?: number): boolean { + if (entity && !includes(this.state, entity)) { + if (this._parent.isInBoundedContext(this)) { + if (entity.hasSnapshot) this.snapshot(); + else if (this.hasSnapshot) entity.snapshot(); + + if (entity.inLiveUpdate) this.beginLiveUpdate(); + else if (this.inLiveUpdate) entity.beginLiveUpdate(); + } + + if (index === 0) + this.state.unshift(entity); + else if (index < this.state.length) + this.state.splice(index, 0, entity); + else + this.state.push(entity); + + this.addInRelated(entity); + + this._notifyHandlers(); + + return true; + } else { + return false; + } + } + + protected abstract addInRelated(entity: TRelated): void; + + public remove(entity: TRelated): void { + if (!entity) return; + + remove(this.state, item => item === entity) + .map(item => this.removeInRelated(item)); + + this._notifyHandlers(); + } + + public removeAll(): void { + this.state + .splice(0, this.state.length) + .map(item => this.removeInRelated(item)); + + this._notifyHandlers(); + } + + protected abstract removeInRelated(entity: TRelated): void; + + public forEach(callbackfn: (value: TRelated, index: number, array: readonly TRelated[]) => void): void { + this.state.forEach(callbackfn); + } + + public map(callbackfn: (value: TRelated, index: number, array: readonly TRelated[]) => U): U[] { + return this.state.map(callbackfn); + } + + public filter(callbackfn: (value: TRelated, index: number, array: readonly TRelated[]) => unknown): TRelated[] { + return this.state.filter(callbackfn); + } + + public find(callbackfn: (value: TRelated, index: number, array: readonly TRelated[]) => value is TRelated): TRelated | undefined { + return this.state.find(callbackfn); + } + + public get hasSnapshot(): boolean { + return !!this._states[Snapshot]; + } + + public get hasPrevious(): boolean { + return !!this._states[Previous]; + } + + public get inLiveUpdate(): boolean { + return !!this._states[LiveUpdateTemp]; + } + + public snapshot() { + if (!this.hasSnapshot) { + this._states[Snapshot] = this._states[Current].slice(); + this.forEach(item => item.snapshot()); + } + } + + public revert() { + if (this.hasSnapshot) { + difference(this.snapshotValue(), this.get()).forEach(item => item.revert()); + this._states[Current] = this._states[Snapshot]; + this._states[Snapshot] = null; + this.forEach(item => item.revert()); + } + } + + public immortalize() { + if (this.hasSnapshot) { + if (this.hasChanges()) { + difference(this.snapshotValue(), this.get()).forEach(item => item.immortalize()); + if (this._shouldSortOnImmortalize) this._sort(); + } else { + this._states[Current] = this._states[Snapshot]; + } + + this._states[Snapshot] = null; + this.forEach(item => item.immortalize()); + remove(this.state, Entity.NewAndDeletedFilter).map(item => this.removeInRelated(item)); + remove(this.state, Entity.NewAndGhostableFilter).map(item => this.removeInRelated(item)); + } + + if (this.hasPrevious) { + this._states[Previous] = null; + } + } + + public previousValue(): readonly TRelated[] { + return this._states[Previous]; + } + + public snapshotValue(): readonly TRelated[] { + return this._states[Snapshot]; + } + + public beginLiveUpdate() { + if (!this.inLiveUpdate) { + if (this.hasSnapshot) { + this._states[LiveUpdateTemp] = this._states[Snapshot]; + this._states[Snapshot] = this._states[Snapshot].slice(); + this._activeState = Snapshot; + } else { + this._states[LiveUpdateTemp] = this._states[Current]; + this._states[Current] = this._states[Current].slice(); + } + + this.forEach(item => item.beginLiveUpdate()); + this._parent.beginLiveUpdate(); + } + } + + public endLiveUpdate() { + if (this.inLiveUpdate) { + this._states[Previous] = this._states[Previous] || this._states[LiveUpdateTemp]; + + this._sort(); + + // TODO: need a better way to access this information from the parent entity + const isNew = this._parent.hasPrevious && isEqualWith((this._parent as any)._states[Current], (this._parent as any)._states[Previous], (this._parent as any).stateIsEqualCustomizer); + + const liveUpdateMadeChanges = !isNew && !isEqual(this._states[Previous], this.hasSnapshot ? this._states[Snapshot] : this._states[Current]); + const noItemsHavePrevious = this.state.every(item => !item.hasPrevious); + + if (isNew) { + this._states[Previous] = this._states[Current].slice(); + } if (this.hasSnapshot) { + this._activeState = Current; + + if (liveUpdateMadeChanges) { + // if exists in both current and prior snapshot but not this snapshot, remove it from current + const inBothCurrentAndPriorSnapshot = intersection(this._states[Current], this._states[LiveUpdateTemp]); + const notInSnapshot = difference(inBothCurrentAndPriorSnapshot, this._states[Snapshot]); + remove(this._states[Current], item => notInSnapshot.includes(item)); + + // if exists in snapshot but does not exist in either current or prior snapshot, add it to current + const inSnapshotButNotOthers = difference(this._states[Snapshot], this._states[Current], this._states[LiveUpdateTemp]); + this._states[Current].push(...inSnapshotButNotOthers); + } else if (noItemsHavePrevious) { + this._states[Snapshot] = this._states[Previous]; + this._states[Previous] = null; + } + } else if (!liveUpdateMadeChanges && noItemsHavePrevious) { + this._states[Current] = this._states[Previous]; + this._states[Previous] = null; + } + + this._states[LiveUpdateTemp] = null; + + difference(this.previousValue(), this.get()).forEach(item => item.endLiveUpdate()); + this.forEach(item => item.endLiveUpdate()); + this._parent.endLiveUpdate(); + } + } + + private get _shouldSortOnAdd(): boolean { + if (!!this.sorting) { + switch (this.sorting.option) { + case EntityRelationshipSortOption.OnAdd: + case EntityRelationshipSortOption.OnAddAndInsert: + return true; + case EntityRelationshipSortOption.OnImmortalize: + default: + return !this.hasSnapshot; + } + } else { + return false; + } + } + + private get _shouldSortOnInsert(): boolean { + if (!!this.sorting) { + switch (this.sorting.option) { + case EntityRelationshipSortOption.OnAddAndInsert: + return true; + case EntityRelationshipSortOption.OnAdd: + case EntityRelationshipSortOption.OnImmortalize: + default: + return !this.hasSnapshot; + } + } else { + return false; + } + } + + private get _shouldSortOnImmortalize(): boolean { + if (!!this.sorting) { + switch (this.sorting.option) { + case EntityRelationshipSortOption.OnAdd: + case EntityRelationshipSortOption.OnAddAndInsert: + return false; + case EntityRelationshipSortOption.OnImmortalize: + default: + return true; + } + } else { + return false; + } + } + + private _sort() { + if (!!this.sorting) { + this.state.sort(this.sorting.comparer); + } + } + + private _notifyHandlers() { + this._handlers.forEach(handler => handler()); + } +} + +export interface IOneToManyRelationship extends IToManyRelationshipBase { +} + +export class OneToManyRelationship, TChild extends Entity> extends ToManyRelationshipBase { + public static create, TChild extends Entity>( + parent: TParent, + property: PropsOfType>, + sorting?: IRelationshipSortingParameters + ): IOneToManyRelationship { + return new OneToManyRelationship(parent, property, sorting); + } + + private constructor( + parent: TParent, + private readonly _property: PropsOfType>, + sorting?: Readonly> + ) { + super(parent, sorting); + } + + protected addInRelated(entity: TChild): void { + this._parentRelationship(entity).set(this._parent); + } + + protected removeInRelated(entity: TChild): void { + this._parentRelationship(entity).set(null); + } + + // @internal + public readonly _parentRelationship = (entity: TChild): IManyToOneRelationship => { + return (entity as any)[this._property]; + } +} + +export interface IManyToManyRelationship extends IToManyRelationshipBase { + set(entities: TRelated[]): void; +} + +export class ManyToManyRelationship, TRelated extends Entity> extends ToManyRelationshipBase { + public static create, TRelated extends Entity>( + entity: TEntity, + relatedCollectionProperty: PropsOfType>, + sorting?: IRelationshipSortingParameters + ): IManyToManyRelationship { + return new ManyToManyRelationship(entity, relatedCollectionProperty, sorting); + } + + constructor( + parent: TEntity, + private readonly _property: PropsOfType>, + sorting?: IRelationshipSortingParameters + ) { + super(parent, sorting); + } + + public set(entities: TRelated[]): void { + this.removeAll(); + entities.forEach(entity => this.add(entity)); + } + + protected addInRelated(entity: TRelated): void { + this._parentRelationship(entity).add(this._parent); + } + + protected removeInRelated(entity: TRelated): void { + this._parentRelationship(entity).remove(this._parent); + } + + private _parentRelationship = (entity: TRelated): IManyToManyRelationship => { + return (entity as any)[this._property]; + } +} + +export class ManyToOneRelationship, TParent extends Entity> implements IManyToOneRelationship { + public static create, TParent extends Entity>( + entity: TChild, + childCollectionProperty: PropsOfType>, + stateProperty: keyof ExtractEntityStateType + ): IManyToOneRelationship { + return new ManyToOneRelationship(entity, childCollectionProperty, stateProperty); + } + + private constructor( + private readonly _entity: TChild, + private readonly _childCollectionProperty: PropsOfType>, + private readonly _stateProperty: keyof ExtractEntityStateType + ) { } + + public get(): TParent { + // eslint-disable-next-line dot-notation + return this._entity['state'][this._stateProperty] as TParent; + } + + public getSnapshot(): TParent { + return this._entity.hasSnapshot ? this._entity['_states'][Snapshot][this._stateProperty] as TParent : undefined; + } + + public getPrevious(): TParent { + return this._entity.hasPrevious ? this._entity['_states'][Previous][this._stateProperty] as TParent : undefined; + } + + public set(newParent: TParent) { + const current = this.get(); + + if (current !== newParent) { + // eslint-disable-next-line dot-notation + this._entity['state'][this._stateProperty] = newParent; + + if (!!current) { + this._childRelationship(current).remove(this._entity); + } + + if (newParent) { + this._childRelationship(newParent).add(this._entity); + } + } + } + + public get hasSnapshot(): boolean { + return this.get()?.hasSnapshot; + } + + public get hasPrevious(): boolean { + return this.get()?.hasPrevious; + } + + public get inLiveUpdate(): boolean { + return this.get().inLiveUpdate; + } + + public snapshot() { + this.get()?.snapshot(); + } + + public revert() { + if (this.hasSnapshot) { + const snapshot = this.getSnapshot(); + const current = this.get(); + + if (snapshot !== current) snapshot?.revert(); + current?.revert(); + } + } + + public immortalize() { + if (this.hasSnapshot) { + const snapshot = this.getSnapshot(); + const current = this.get(); + + if (snapshot !== current) snapshot?.immortalize(); + current?.immortalize(); + } + } + + public beginLiveUpdate() { + this.get()?.beginLiveUpdate(); + } + + public endLiveUpdate() { + const previous = this.getPrevious(); + const current = this.get(); + + if (previous !== current) previous?.endLiveUpdate(); + current?.endLiveUpdate(); + } + + private _childRelationship = (entity: TParent): IOneToManyRelationship => { + return (entity as any)[this._childCollectionProperty]; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/ErrorHandler.ts b/samples/react-rhythm-of-business-calendar/src/common/ErrorHandler.ts new file mode 100644 index 000000000..68b3a93aa --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/ErrorHandler.ts @@ -0,0 +1,53 @@ +import { HttpRequestError } from "@pnp/odata"; +import { ValidationError } from "./ValidationError"; + +export class ErrorHandler { + private _error: any; + + public get hasError() { return !!this._error; } + + public readonly catch = (error: any) => { + if (!this.hasError) { + this._error = error; + } + } + + public readonly throwIfError = () => { + if (this.hasError) { + ErrorHandler.throw(this._error); + } + } + + public readonly reportIfError = () => { + if (this.hasError) { + console.error(this._error); + } + } + + public static readonly throw = (error: any) => { + console.error(error); + throw error; + } + + public get is_400_BAD_REQUEST() { return ErrorHandler.is_400_BAD_REQUEST(this._error); } + public static readonly is_400_BAD_REQUEST = (error: any) => ErrorHandler.isErrorCode(error, 400); + + public get is_404_NOT_FOUND() { return ErrorHandler.is_404_NOT_FOUND(this._error); } + public static readonly is_404_NOT_FOUND = (error: any) => ErrorHandler.isErrorCode(error, 404); + + public get is_412_PRECONDITION_FAILED() { return ErrorHandler.is_412_PRECONDITION_FAILED(this._error); } + public static readonly is_412_PRECONDITION_FAILED = (error: any) => ErrorHandler.isErrorCode(error, 412); + + public get is_423_LOCKED() { return ErrorHandler.is_423_LOCKED(this._error); } + public static readonly is_423_LOCKED = (error: any) => ErrorHandler.isErrorCode(error, 423); + + public get is_SPO_ValidationError() { return ErrorHandler.is_SPO_ValidationError(this._error); } + public static readonly is_SPO_ValidationError = (error: any): error is ValidationError => + error && (error instanceof ValidationError) + + private static readonly isErrorCode = (error: any, code: number) => + error && (error as HttpRequestError).isHttpRequestError && (error as HttpRequestError).status === code + + public static readonly message = async (error: any): Promise => + (error && (error as HttpRequestError).isHttpRequestError && (await (error as HttpRequestError).response.clone().json())['odata.error']?.message?.value) || error?.message || error +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/GroupByOption.ts b/samples/react-rhythm-of-business-calendar/src/common/GroupByOption.ts new file mode 100644 index 000000000..23b83a0b0 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/GroupByOption.ts @@ -0,0 +1,7 @@ +export class GroupByOption { + constructor( + public readonly key: string, + public readonly title: string, + public readonly groupByKey: (item: T) => any + ) { } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/IComponent.ts b/samples/react-rhythm-of-business-calendar/src/common/IComponent.ts new file mode 100644 index 000000000..412f1f2d5 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/IComponent.ts @@ -0,0 +1,3 @@ +export interface IComponent { + componentShouldRender(): void; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/IKey.ts b/samples/react-rhythm-of-business-calendar/src/common/IKey.ts new file mode 100644 index 000000000..69a483e73 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/IKey.ts @@ -0,0 +1,3 @@ +export interface IKey { + valueOf(): number; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/IUserListChanges.ts b/samples/react-rhythm-of-business-calendar/src/common/IUserListChanges.ts new file mode 100644 index 000000000..9f8a892d1 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/IUserListChanges.ts @@ -0,0 +1,6 @@ +import { User } from "./User"; + +export interface IUserListChanges { + added: User[]; + removed: User[]; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/Loader.ts b/samples/react-rhythm-of-business-calendar/src/common/Loader.ts new file mode 100644 index 000000000..e0d83df1a --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/Loader.ts @@ -0,0 +1,50 @@ +import { includes, remove, noop } from 'lodash'; +import { Entity } from "./Entity"; + +export abstract class Loader> { + protected readonly _trackedEntities: E[] = []; + protected readonly _entities: E[] = []; + protected readonly _entitiesById: Map = new Map(); + + public abstract entitiesById(): Promise>; + + public get entitiesWithChanges(): readonly E[] { + return [ + ...this._trackedEntities, + ...this._entities.filter(e => e.hasChanges()) + ]; + } + + public track(entity: E): void { + if (!includes(this._trackedEntities, entity) && !includes(this._entities, entity)) { + this._trackedEntities.push(entity); + } + } + + protected untrack(entity: E): void { + remove(this._trackedEntities, entry => entry === entity); + } + + public async persist(singleEntity?: E): Promise { + const previous = this._previousPersistPromise; + await (this._previousPersistPromise = (async () => { + await previous.catch(noop); + await this.persistCore(singleEntity); + })()); + } + protected _previousPersistPromise: Promise = Promise.resolve(); + + protected abstract persistCore(singleEntity?: E): Promise; + + protected readonly refreshEntityCollections = (): void => { + remove(this._entities, entity => !entity.softDeleteSupported && entity.isDeleted); + + const committed = remove(this._trackedEntities, e => !e.isNew); + this._entities.push(...committed); + + this._entitiesById.clear(); + this._entities.forEach(entity => { + this._entitiesById.set(entity.id, entity); + }); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/Localization.ts b/samples/react-rhythm-of-business-calendar/src/common/Localization.ts new file mode 100644 index 000000000..ec8482c6f --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/Localization.ts @@ -0,0 +1,36 @@ +export interface IButtonStrings { + Text: string; + AriaLabel?: string; + Description?: string; + Tooltip?: string; +} + +export interface IFieldStrings { + Label: string; + AriaLabel?: string; + Tooltip?: string; +} + +export interface ITextFieldStrings extends IFieldStrings { + Placeholder?: string; +} + +export interface IToggleFieldStrings extends IFieldStrings { + OnText: string; + OffText: string; +} + +export interface IDialogStrings { + HeadingText: string; + MessageText: string; + AcceptButton?: IButtonStrings; + RejectButton?: IButtonStrings; +} + +export interface IWizardStrings { + StartButton: IButtonStrings; + BackButton: IButtonStrings; + NextButton: IButtonStrings; + FinishButton: IButtonStrings; + CloseButtonAriaLabel: string; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/MomentRange.ts b/samples/react-rhythm-of-business-calendar/src/common/MomentRange.ts new file mode 100644 index 000000000..67e760889 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/MomentRange.ts @@ -0,0 +1,9 @@ +import { Moment, unitOfTime } from "moment-timezone"; + +export class MomentRange { + public start: Moment; + public end: Moment; + + public static overlaps = (range1: MomentRange, range2: MomentRange, units: unitOfTime.StartOf = 'day'): boolean => + !range1.start.isAfter(range2.end) && !range1.end.isBefore(range2.start, units) +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/ReactRouter.tsx b/samples/react-rhythm-of-business-calendar/src/common/ReactRouter.tsx new file mode 100644 index 000000000..06a50e71a --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/ReactRouter.tsx @@ -0,0 +1,9 @@ +import React, { ComponentType } from "react"; +import { Params, useParams } from "react-router-dom"; + +type TParamsProps = { + params: Partial; +}; + +export const withRouterParams =

(WrappedComponent: ComponentType

) => + (props: Omit) => diff --git a/samples/react-rhythm-of-business-calendar/src/common/SortOption.ts b/samples/react-rhythm-of-business-calendar/src/common/SortOption.ts new file mode 100644 index 000000000..dc9726589 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/SortOption.ts @@ -0,0 +1,8 @@ +export class SortOption { + constructor( + public readonly key: string, + public readonly title: string, + public readonly sortAscFn: (a: T, b: T) => number, + public readonly sortDescFn: (a: T, b: T) => number + ) { } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/User.ts b/samples/react-rhythm-of-business-calendar/src/common/User.ts new file mode 100644 index 000000000..04115e909 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/User.ts @@ -0,0 +1,96 @@ +import { first } from 'lodash'; +import { Recipient, User as IUserType } from "@microsoft/microsoft-graph-types"; +import { SPUser } from "@microsoft/sp-page-context"; +import { IPrincipalInfo } from "@pnp/sp"; +import { ISiteUserInfo } from "@pnp/sp/site-users/types"; + +export class User { + public static TitleAscComparer = (a: User, b: User) => a.title?.localeCompare(b.title); + + public static equal(user1: User, user2: User): boolean { + if (user1 && user2) + return (user1.id > 0 && user2.id > 0 && user1.id === user2.id) + || (user1.login && user2.login && user1.login === user2.login) + || (user1.email && user2.email && user1.email === user2.email); + else + return false; + } + + public static except(users1: User[], users2: User[]): User[] { + return users1.filter(om => !users2.some(m => User.equal(om, m))); + } + + public static fromPrincipalInfo(info: IPrincipalInfo): User { + const { PrincipalId, DisplayName, Email, LoginName } = info; + return new User(PrincipalId, DisplayName, Email, LoginName); + } + + public static fromSiteUserInfo(result: ISiteUserInfo): User { + const { Id, Title, Email, LoginName } = result; + return new User(Id, Title, Email, LoginName); + } + + public static fromSPUser(spuser: SPUser): User { + const { displayName, email, loginName } = spuser; + return new User(0, displayName, email, loginName); + } + + public static fromGraphUser(user: IUserType): User { + const { displayName, mail, userPrincipalName } = user; + return new User(0, displayName, mail, userPrincipalName); + } + + public static fromRecipient(recipient: Recipient): User { + const { emailAddress: { name, address } } = recipient || { emailAddress: {} }; + return new User(0, name, address, ''); + } + + private _id: number; + public get id(): number { return this._id; } + + private _login: string; + public get login(): string { return this._login; } + + private _picture: string; + public get picture(): string { return this._picture; } + + constructor( + id: number, + public readonly title: string, + public readonly email: string, + login: string, + picture?: string) { + + this._id = id; + this._login = login; + this._picture = picture || `/_layouts/15/userphoto.aspx?size=S&username=${email}`; + } + + public updateId(id: number) { + this._id = id; + } + + public updateLogin(login: string) { + this._login = login; + } + + public updatePicture(url: string) { + this._picture = url; + } + + public alias(): string { + let alias = (this.login || this.email).toLocaleLowerCase(); + + const atIndex = alias.indexOf('@'); + alias = atIndex > 0 ? alias.slice(0, atIndex) : alias; + + const pipeIndex = alias.lastIndexOf('|'); + alias = pipeIndex > 0 ? alias.slice(pipeIndex + 1) : alias; + + return alias; + } + + public titleWithoutOrganisation(): string { + return first((this.title || '').split('('))?.trim(); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/Utils.ts b/samples/react-rhythm-of-business-calendar/src/common/Utils.ts new file mode 100644 index 000000000..910c255f1 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/Utils.ts @@ -0,0 +1,310 @@ +import { minBy, maxBy, throttle } from 'lodash'; +import moment, { Moment, Duration, MomentZone } from "moment-timezone"; +import { sp, extractWebUrl } from "@pnp/sp"; +import "@pnp/sp/folders"; +import "@pnp/sp/webs"; +import { IWeb, Web } from "@pnp/sp/webs/types"; +import { BaseSyntheticEvent, ChangeEvent } from "react"; +import { ISelectableOption, format } from "@fluentui/react"; +import sanitizeHTML from 'sanitize-html'; + +import { Humanize as strings } from "CommonStrings"; + + +export type ArrayType = A extends Array ? T : never; +export type UnionToIntersectionType = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never; + +export type PropsOfType = keyof Pick; + +export type PartlyPartial = Partial> & Omit; + +export const perf = async (label: string, action: () => Promise): Promise => { + console.time(label); + const result = await action(); + console.timeEnd(label); + return result; +}; + +export const sleep = (ms: number): Promise => { + return new Promise(resolve => setTimeout(resolve, ms)); +}; + +export const now = (zoneName?: string): Moment => { + const n = moment(); + const defaultZone = (moment as any).defaultZone as MomentZone; + const zone = zoneName || (defaultZone && defaultZone.name); + if (zone) n.tz(zone); + return n; +}; + +export const throttleOnSearchChange = (fn: (search: string) => void) => throttle( + (event?: ChangeEvent, search: string = '') => fn(search), + 500, + { leading: false, trailing: true } +); + +export const parseIntOrDefault = (val: string, _default: number = 0.0, radix: number = 10): number => { + const num = parseInt(val, radix); + return isNaN(num) ? _default : num; +}; + +export const parseFloatOrDefault = (val: string, _default: number = 0.0): number => { + const num = parseFloat(val); + return isNaN(num) ? _default : num; +}; + +export const nameofFactory = () => (name: keyof T) => name; + +export const stringToEnum = (o: Array): { [K in T]: K } => { + return o.reduce((res, key) => { + res[key] = key; + return res; + }, Object.create(null)); +}; + +export const mapToArray = (map: ReadonlyMap): V[] => { + return Array.from(map.values()); +}; + +export const mapGetOrAdd = (map: Map, key: K, create: () => V): V => { + if (map.has(key)) { + return map.get(key); + } else { + const value = create(); + map.set(key, value); + return value; + } +}; + +export const arrayToMap = (items: readonly V[], mapFn: (val: V) => K): Map => { + return new Map(items.map(item => [mapFn(item), item] as [K, V])); +}; + +export const distinct = (items: readonly V[], keyFn?: (val: V) => K): V[] => { + if (keyFn) { + const map = new Map(); + items.forEach(item => mapGetOrAdd(map, keyFn(item), () => item)); + return mapToArray(map); + } else { + return [...new Set(items)]; + } +}; + +export const groupBy = (items: readonly V[], mapFn: (val: V) => K): Map => { + const groups = new Map(); + items.forEach(item => { + mapGetOrAdd(groups, mapFn(item), () => []) + .push(item); + }); + return groups; +}; + +export type Filter = (item: T) => boolean; +export const aggregateFilter = (...filters: Filter[]): Filter => + (item: T) => filters.reduce((result, filter) => result && filter(item), true); +export function multifilter(items: T[], ...filters: Filter[]): T[]; +export function multifilter(items: readonly T[], ...filters: Filter[]): readonly T[]; +export function multifilter(items: (T[] | readonly T[]), ...filters: Filter[]) { + return items.filter(aggregateFilter(...filters)); +} +export const inverseFilter = (filter: Filter): Filter => + (item: T) => !filter(item); + +export type Comparer = (a: T, b: T) => number; +export const aggregateComparer = (...comparers: Comparer[]): Comparer => + (a: T, b: T) => comparers.reduce((result, compare) => result || compare(a, b), 0); +export const multisort = (items: T[], ...comparers: Comparer[]): T[] => + items.sort(aggregateComparer(...comparers)); +export const reverseComparer = (comparer: Comparer): Comparer => + (a: T, b: T) => -comparer(a, b); + +export const dropdownTextAscComparer = (opt_a: ISelectableOption, opt_b: ISelectableOption): number => { + if (opt_a.text === opt_b.text) + return 0; + else + return opt_a.text > opt_b.text ? 1 : -1; +}; + +export const dateAscComparer: Comparer = (date_a, date_b) => (date_a?.valueOf() || 0) - (date_b?.valueOf() || 0); + +export const momentAscComparer: Comparer = (date_a, date_b) => date_a.diff(date_b); + +export const durationAscComparer: Comparer = (duration_a, duration_b) => ((duration_a && duration_a.isValid() && duration_a.asMilliseconds()) || 0) - ((duration_b && duration_b.isValid() && duration_b.asMilliseconds()) || 0); + +export const distinctMoments = (dates: readonly Moment[], granularity: moment.unitOfTime.StartOf = 'day'): Moment[] => { + return dates.filter((d1, idx1) => dates.every((d2, idx2) => idx1 >= idx2 || !d1.isSame(d2, granularity))); +}; + +export const todayOrAfter = (date: Moment) => { + return moment.max(now(date.tz()).startOf('day'), date); +}; + +export const timeAsDuration = (date: Moment): Duration => { + return moment.duration(date.diff(moment(date).startOf('day'))); +}; + +export const minDuration = (...durations: Duration[]) => minBy(durations, d => d.asMinutes()); +export const maxDuration = (...durations: Duration[]) => maxBy(durations, d => d.asMinutes()); + +export const countAsString = (val: number, singularUnit: string, pluralUnit: string) => { + return val === 0 ? format(strings.ZeroCount, pluralUnit) : [val, val > 1 ? pluralUnit : singularUnit].join(' '); +}; + +export const humanizeDuration = (duration: Duration) => { + const totalMinutes = duration.asMinutes(); + const totalHours = duration.asHours(); + + if (totalMinutes % 60 > 0 && totalMinutes > 60) { + return [ + countAsString(Math.floor(totalHours), strings.HourShort, strings.HoursShort), + countAsString(duration.minutes(), strings.MinuteShort, strings.MinutesShort) + ].join(' ').trim(); + } else if (totalMinutes < 60) { + return countAsString(totalMinutes, strings.MinuteShort, strings.MinutesShort).trim(); + } else if (duration.asHours() > 0) { + return countAsString(totalHours, strings.HourShort, strings.HoursShort).trim(); + } else { + return ''; + } +}; + +export const humanizeList = (items: readonly string[], separator: string = strings.ListSeparator, conjunction: string = strings.ListConjunction) => { + if (items.length <= 1) { + return items[0] || ''; + } + else if (items.length === 2) { + return `${items[0]} ${conjunction} ${items[1]}`; + } + else { + return `${items.slice(0, -1).join(separator + ' ')}${separator} ${conjunction} ${items.slice(-1)}`; + } +}; + +export const humanizeFixedList = (items: readonly T[], domain: readonly T[], toString: (item: T) => string, sort: boolean = true, allString: string = strings.ListAllItems, exceptString: string = strings.ListExcept, conjunction: string = strings.ListConjunction, separator: string = strings.ListSeparator) => { + const diff = new Set(domain); + items.forEach(item => diff.delete(item)); + + if (diff.size === 0) { + return allString; + } + else if (items.length <= 3) { + const itemStrings = items.map(toString); + if (sort) itemStrings.sort(); + return humanizeList(itemStrings, separator, conjunction); + } + else if (diff.size <= 2) { + const itemStrings = Array.from(diff).map(toString); + if (sort) itemStrings.sort(); + return `${allString} ${exceptString} ${humanizeList(itemStrings, separator, conjunction)}`; + } + else { + const itemStrings = items.map(toString); + if (sort) itemStrings.sort(); + return humanizeList(itemStrings, separator, conjunction); + } +}; + +export const buildCSVString = (headings: string[], items: T[], valuesForItem: (items: T) => string[]): string => { + const buildCell = (value: string) => (value || '').replace(/"/g, '""'); + const buildRow = (values: string[]) => `"${values.map(buildCell).join('","')}"`; + + const headerRow = buildRow(headings); + const itemRows = items.map(valuesForItem).map(buildRow); + const csv = [headerRow, ...itemRows].join('\n'); + + return csv; +}; + +export const buildCSVBlob = (headings: string[], items: T[], valuesForItem: (items: T) => string[]): Blob => { + const csv = buildCSVString(headings, items, valuesForItem); + return new Blob([csv], { type: "text/plain;charset=utf-8" }); +}; + +export const isExecutingInWorkbench = () => window.location.pathname.includes('/_layouts/15/workbench.aspx'); +export const isExecutingInTeamsTab = () => window.location.pathname.includes('/_layouts/15/teamshostedapp.aspx'); + +export const scrollParent = (element: Element): Element => { + if (isExecutingInWorkbench()) return document.getElementById('workbenchPageContent').children[0]; + + const overflowRegex = /(auto|scroll)/; + + try { + let style = getComputedStyle(element); + const excludeStaticParent = style.position === "absolute"; + + if (style.position !== "fixed") { + for (let parent = element; (parent = parent.parentElement);) { + style = getComputedStyle(parent); + + if (excludeStaticParent && style.position === "static") { + continue; + } + + if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) { + return parent; + } + } + } + } + catch (e) { + // swallow any errors + } + + return document.scrollingElement || document.documentElement; +}; + +export const publicMembersOnlyReplacer = (key: string, val: any) => key[0] === '_' ? undefined : val; + +export const stopPropagation = (handler: (e?: BaseSyntheticEvent) => void) => (e: BaseSyntheticEvent) => { handler(e); e.stopPropagation(); }; + +export const currentPageServerRelativeUrl = async (): Promise => { + const pathname = window.location.pathname; + if (pathname.indexOf(".aspx") > 0) { + return pathname; + } else { + const href = window.location.href; + const rootFolder = await sp.web.rootFolder.get(); + return new URL(rootFolder.ServerRelativeUrl + rootFolder.WelcomePage, href).pathname; + } +}; + +export const sanitizeSharePointFolderName = (name: string): string => + name.replace(/[~'"#%&*:<>?/\\{|}.]/g, '-').trim(); // folder name cannot have certain characters + +export const sanitizeSharePointGroupName = (name: string): string => + name.replace(/[\\/[\]|<>+=:;,?*'"@]/g, '-').trim(); // security group name cannot have certain characters + +export const siteCollectionTermGroupName = (siteUrl: string): string => + "Site Collection - " + siteUrl.replace(/^https?:\/\//, '').replace(/\//g, "-"); + +export const sanitizeHTMLWithDefaults = (value: string) => { + return sanitizeHTML(value, { + allowedTags: ['div', 'span', 'strong', 'b', 'p', 'a', 'title', 'h1', 'h2', 'h3', 'h4', 'h5', 'i', 'u', + 'strike', 'ol', 'ul', 'li', 'font', 'br', 'hr', 'link', + 'table', 'th', 'tr', 'td'], + allowedAttributes: { + a: ['href', 'target', 'data-interception'] + }, + allowedStyles: { + '*': { + // Match HEX and RGB + 'color': [/^#(0x)?[0-9a-f]+$/i, /^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/], + 'text-align': [/^left$/, /^right$/, /^center$/], + 'font-size': [/^\d+(?:px|em|rem|%)$/], // Match any number with px, em, rem, or % + 'height': [/^0|\d+(?:px|em|%)$/], // Match '0' or any number with px, em, or % + 'max-height': [/^0|\d+(?:px|em|%)$/], + 'width': [/^0|\d+(?:px|em|%)$/], + 'max-width': [/^0|\d+(?:px|em|%)$/] + }, + 'p': { + 'font-size': [/^\d+(?:px|em|rem|%)$/] + }, + 'table': { + 'table-layout': [/^fixed$/] + } + } + }); +}; + +export const cloneWeb = (web?: IWeb) => + web ? Web(extractWebUrl(web.toUrl())) : sp.web; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/ValidationError.ts b/samples/react-rhythm-of-business-calendar/src/common/ValidationError.ts new file mode 100644 index 000000000..2829d1b08 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/ValidationError.ts @@ -0,0 +1,9 @@ +export class ValidationError extends Error { + constructor( + public readonly fieldName: string, + public readonly fieldErrorMessage: string, + ) { + super(`${fieldName}: ${fieldErrorMessage}`); + Object.setPrototypeOf(this, ValidationError.prototype); // workaround to fix instanceof behavior for Error-derived classes https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/ValidationRules.ts b/samples/react-rhythm-of-business-calendar/src/common/ValidationRules.ts new file mode 100644 index 000000000..cd6305672 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/ValidationRules.ts @@ -0,0 +1,148 @@ +import { isFunction } from "lodash"; +import { Text } from "@microsoft/sp-core-library"; +import { Entity } from './Entity'; + +import * as cstrings from "CommonStrings"; + +type ValOrFunc = T | ((entity: E) => T); + +export class ValidationRule> { + constructor( + public readonly validate: (enitity: E) => boolean, + public readonly failMessage: ValOrFunc + ) { } + + protected static eval, T>(entity: E, input: T | ((entity: E) => T)): T { + return isFunction(input) ? input(entity) : input; + } +} + +export class RequiredValidationRule> extends ValidationRule { + constructor( + field: (entity: E) => string | object, + failMessage: string = cstrings.Validation.Required + ) { + super((e: E) => RequiredValidationRule.hasValue(field(e)), failMessage); + } + + public static hasValue(val: any): boolean { + if (typeof val === "string") { + return !RequiredValidationRule._isBlank(val); + } else if (Array.isArray(val)) { + return val.length > 0; + } else if (typeof val?.isValid === "function") { + return val.isValid(); + } else { + return !!val; + } + } + + private static _isBlank(val: string): boolean { + return (!val || /^\s*$/.test(val)); + } +} + +export class MinValueValidationRule> extends ValidationRule { + constructor( + field: (entity: E) => number | undefined, + minValue: ValOrFunc, + failMessage: string = cstrings.Validation.MinimumValue + ) { + super((e: E) => this._valueOrGreater(field(e), ValidationRule.eval(e, minValue)), e => Text.format(failMessage, ValidationRule.eval(e, minValue))); + } + + private _valueOrGreater(val: number | undefined, minValue: number): boolean { + return (!val && val !== 0) || val >= minValue; + } +} + +export class MaxValueValidationRule> extends ValidationRule { + constructor( + field: (entity: E) => number | undefined, + maxValue: ValOrFunc, + failMessage: string = cstrings.Validation.MaximumValue + ) { + super(e => this._valueOrLess(field(e), ValidationRule.eval(e, maxValue)), e => Text.format(failMessage, ValidationRule.eval(e, maxValue))); + } + + private _valueOrLess(val: number | undefined, maxValue: number): boolean { + return (!val && val !== 0) || val <= maxValue; + } +} + +export class RangeValueValidationRule> extends ValidationRule { + constructor( + field: (entity: E) => number | undefined, + minValue: ValOrFunc, + maxValue: ValOrFunc, + failMessage: string = cstrings.Validation.RangeValue + ) { + super(e => this._isBetween(field(e), ValidationRule.eval(e, minValue), ValidationRule.eval(e, maxValue)), e => Text.format(failMessage, ValidationRule.eval(e, minValue), ValidationRule.eval(e, maxValue))); + } + + private _isBetween(val: number | undefined, minValue: number, maxValue: number): boolean { + return (!val && val !== 0) || (val >= minValue && val <= maxValue); + } +} + +export class MaxLengthValidationRule> extends ValidationRule { + constructor( + field: (entity: E) => string, + maxLength: ValOrFunc, + failMessage: string = cstrings.Validation.MaximumLength + ) { + super((e: E) => field(e)?.length <= ValidationRule.eval(e, maxLength), e => Text.format(failMessage, ValidationRule.eval(e, maxLength))); + } +} + +export class MaxItemsValidationRule> extends ValidationRule { + constructor( + field: (entity: E) => ReadonlyArray, + maxItems: ValOrFunc, + failMessage: string = cstrings.Validation.MaximumItems + ) { + super((e: E) => field(e)?.length <= ValidationRule.eval(e, maxItems), e => Text.format(failMessage, ValidationRule.eval(e, maxItems))); + } +} + +export class UrlValidationRule> extends ValidationRule { + constructor( + field: (entity: E) => string, + failMessage: string = cstrings.Validation.Url + ) { + super((e: E) => this._isUrl(field(e)), failMessage); + } + + private _isUrl(val: any): boolean { + const regexp = /^(((https|http|ftp):\/\/)(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?)?$/i; + return !val || regexp.test(val); + } +} + +export class EmailValidationRule> extends ValidationRule { + constructor( + field: (entity: E) => string, + failMessage: string = cstrings.Validation.Email + ) { + super((e: E) => this._isEmailAddress(field(e)), failMessage); + } + + private _isEmailAddress(val: any): boolean { + const regexp = /^[a-z0-9_\-.+]+@[a-z0-9_-]+(\.[a-z0-9_-]+)*$/i; + return !val || regexp.test(val); + } +} + +export class PhoneValidationRule> extends ValidationRule { + constructor( + field: (entity: E) => string, + failMessage: string = cstrings.Validation.Phone + ) { + super((e: E) => this._isPhoneNumber(field(e)), failMessage); + } + + private _isPhoneNumber(val: any): boolean { + const regexp = /^[0-9]{10}$/i; + return !val || regexp.test(val); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/AsyncDataComponent.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/AsyncDataComponent.tsx new file mode 100644 index 000000000..6d9180acc --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/AsyncDataComponent.tsx @@ -0,0 +1,99 @@ +import sanitize from 'sanitize-html'; +import React, { Component, ReactElement } from "react"; +import { css, Panel, PanelType, DialogFooter, DefaultButton, Link, SpinnerSize } from "@fluentui/react"; +import { IComponent } from "../IComponent"; +import { IAsyncData } from "../AsyncData"; +import { AsyncOverlay } from "./AsyncOverlay"; + +import * as strings from "CommonStrings"; +import styles from "./styles/AsyncLoadComponent.module.scss"; + +interface IProps { + dataAsync: IAsyncData; + children: (data: T) => ReactElement; + className?: string; + hideSpinners?: boolean; + saveLabel?: string; + spinnerSize?: SpinnerSize; +} + +interface IState { + showErrorDetailsPanel: boolean; +} + +export class AsyncDataComponent extends Component, IState> implements IComponent { + constructor(props: IProps) { + super(props); + + this.state = { + showErrorDetailsPanel: false + }; + } + + public componentDidMount() { + const { dataAsync } = this.props; + if (dataAsync) dataAsync.registerComponentForUpdates(this); + } + + public componentWillUnmount() { + const { dataAsync } = this.props; + if (dataAsync) dataAsync.unregisterComponentForUpdates(this); + } + + public componentDidUpdate(prevProps: IProps) { + const { dataAsync: nextAsyncData } = this.props; + const { dataAsync: prevAsyncData } = prevProps; + + if (nextAsyncData !== prevAsyncData) { + if (prevAsyncData) prevAsyncData.unregisterComponentForUpdates(this); + nextAsyncData.registerComponentForUpdates(this); + } + } + + public readonly componentShouldRender = () => + this.forceUpdate() + + private readonly _showErrorDetails = () => + this.setState({ showErrorDetailsPanel: true }) + + private readonly _dismissErrorDetails = () => + this.setState({ showErrorDetailsPanel: false }) + + public render() { + const { saveLabel, dataAsync, hideSpinners, className, children, spinnerSize } = this.props; + const { showErrorDetailsPanel } = this.state; + + if (dataAsync) { + const { loaded, error, data, saving, done } = dataAsync; + const spinnersEnabled = !hideSpinners && !error; + const style = css(className, styles.asyncLoadComponent, { [styles.spinnersEnabled]: spinnersEnabled && !loaded }); + + return ( +

+ ); + } else { + return <>; + } + } +} diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/AsyncOverlay.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/AsyncOverlay.tsx new file mode 100644 index 000000000..467ff10f9 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/AsyncOverlay.tsx @@ -0,0 +1,27 @@ +import React from "react"; +import { css, Overlay, Spinner, SpinnerSize } from '@fluentui/react'; + +import * as cstrings from "CommonStrings"; +import styles from "./styles/AsyncOverlay.module.scss"; + +export interface IAsyncOverlayProps { + show: boolean; + label?: string; + className?: string; + spinnerSize?: SpinnerSize; +} + +export const AsyncOverlay: React.FC = (props: IAsyncOverlayProps) => { + const className: string = css(styles.asyncOverlay, props.className); + return (props.show && + + + + || null + ); +}; + +AsyncOverlay.defaultProps = { + label: cstrings.OneMoment, + spinnerSize: SpinnerSize.large +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/CalendarPicker.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/CalendarPicker.tsx new file mode 100644 index 000000000..8f4209943 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/CalendarPicker.tsx @@ -0,0 +1,73 @@ +import { noop } from "lodash"; +import moment, { Moment, months, monthsShort, weekdays, weekdaysMin } from "moment-timezone"; +import React, { FC, useCallback, useRef } from "react"; +import { ActionButton, Calendar, DayOfWeek, DateRangeType, Callout, DirectionalHint, FocusTrapZone, IIconProps } from '@fluentui/react'; +import { useBoolean } from "@fluentui/react-hooks"; +import { now } from "../Utils"; + +interface IProps { + buttonLabel: string; + dateRangeType?: DateRangeType; + disabled?: boolean; + iconProps?: IIconProps; + date?: Moment; + onSelectDate?: (date: Moment) => void; +} + +export const CalendarDefaultStrings = { + months: months(), + shortMonths: monthsShort(), + days: weekdays(), + shortDays: weekdaysMin(), + goToToday: 'Go to today', + prevMonthAriaLabel: 'Go to previous month', + nextMonthAriaLabel: 'Go to next month', + prevYearAriaLabel: 'Go to previous year', + nextYearAriaLabel: 'Go to next year' +}; + +export const CalendarPicker: FC = ({ + buttonLabel, + dateRangeType = DateRangeType.Day, + disabled, + iconProps, + date = now(), + onSelectDate = noop +}) => { + const buttonRef = useRef(); + const [showCalendar, { setFalse: closeCalendar, toggle: toggleCalendar }] = useBoolean(false); + + const calendarDate = date.clone().tz(moment.tz.guess(), true).toDate(); + + const onCalendarSelectDate = useCallback((d: Date) => { + onSelectDate(moment(d).tz(moment.tz.guess())); + closeCalendar() + }, [onSelectDate, closeCalendar]); + + return ( + + + {buttonLabel} + + {showCalendar && + + + + + + } + + ); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/CalloutColorPicker.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/CalloutColorPicker.tsx new file mode 100644 index 000000000..c7befc6c2 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/CalloutColorPicker.tsx @@ -0,0 +1,65 @@ +import React, { FC, KeyboardEvent, SyntheticEvent, useCallback, useRef } from "react"; +import { ColorPicker, Callout, Label, IColor } from "@fluentui/react"; +import { useBoolean } from "@fluentui/react-hooks"; +import { Color } from "../Color"; + +import styles from "./styles/CalloutColorPicker.module.scss"; + +interface IProps { + label?: string; + ariaLabel?: string; + required?: boolean; + hideAlpha?: boolean; + color: Color; + onChanged: (value: Color) => void; +} + +export const CalloutColorPicker: FC = ({ + label, + ariaLabel, + color, + required, + hideAlpha = true, + onChanged +}) => { + const [isOpen, { toggle: toggleCallout, setFalse: closeCallout }] = useBoolean(false); + const colorPreviewRef = useRef(); + + const onColorPickerChange = useCallback((ev: SyntheticEvent, { str }: IColor) => { + onChanged(Color.parse(str)); + }, [onChanged]); + + const onColorPreviewKeyPress = useCallback((ev: KeyboardEvent) => { + if (ev.key === "Enter" || ev.key === " ") toggleCallout(); + }, [toggleCallout]); + + return ( +
+ {label && } +
+ {isOpen && + + + + } +
+ ); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/ConfirmDialog.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/ConfirmDialog.tsx new file mode 100644 index 000000000..935e0d44d --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/ConfirmDialog.tsx @@ -0,0 +1,56 @@ +import React from "react"; +import { DefaultButton, PrimaryButton, Dialog, DialogFooter, IModalProps } from "@fluentui/react"; +import { IButtonStrings, IDialogStrings } from "../Localization"; + +import * as strings from "CommonStrings"; + +export interface IConfirmDialogProps { + show: boolean; + onAccept: () => void; + onReject: () => void; + disabled?: boolean; + strings?: IDialogStrings; + headingTextOverride?: string; + messageTextOverride?: string; + acceptButtonStringsOverride?: IButtonStrings; + rejectButtonStringsOverride?: IButtonStrings; + hideRejectButton?: boolean; +} + +export const ConfirmDialog: React.FC = (props: IConfirmDialogProps) => { + const dialogStrings = props.strings || strings.ConfirmDialogDefaults; + const heading = props.headingTextOverride || dialogStrings.HeadingText; + const message = props.messageTextOverride || dialogStrings.MessageText; + const acceptButtonStrings = props.acceptButtonStringsOverride || dialogStrings.AcceptButton; + const rejectButtonStrings = props.rejectButtonStringsOverride || dialogStrings.RejectButton; + const disabled = props.disabled || false; + + return ( + + ); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/DataComponentBase.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/DataComponentBase.tsx new file mode 100644 index 000000000..bb1d24c6c --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/DataComponentBase.tsx @@ -0,0 +1,308 @@ +import React, { Component, MutableRefObject, RefObject } from "react"; +import { MessageBar, MessageBarType } from '@fluentui/react'; +import { ErrorHandler } from "../ErrorHandler"; +import { IComponent } from "../IComponent"; +import { AsyncOverlay } from "./AsyncOverlay"; +import { ConfirmDialog } from "./ConfirmDialog"; + +import * as cstrings from "CommonStrings"; + +export type UpdateDataCallback = (update: (data: T) => void, callback?: () => any) => void; + +export enum DataComponentMode { + ReadOnly, + Display, + Edit +} + +export interface IDataComponentBase extends IComponent { + valid(showValidationFeedback: boolean): boolean; + readonly(entity: T): Promise; + display(entity?: T): Promise; + edit(entity?: T): Promise; + inDisplayMode: boolean; + inEditMode: boolean; +} + +export interface IDataComponentBaseProps { + componentRef?: RefObject>; + onDismissed?: () => void; + className?: string; +} + +export interface IDataComponentBaseState { + data: T; + mode: DataComponentMode; + showValidationFeedback: boolean; + submitting: boolean; + showConfirmDiscard: boolean; + showConfirmDelete: boolean; + errorMessage: string; +} + +export abstract class DataComponentBase, S extends IDataComponentBaseState> extends Component implements IDataComponentBase { + private _accept: () => void; + private _discard: () => void; + + constructor(props: P) { + super(props); + + this.state = this.resetState(); + } + + protected resetState(): S { + this._accept = () => { }; + this._discard = () => { }; + + return { + data: null, + mode: DataComponentMode.Display, + showValidationFeedback: false, + submitting: false, + showConfirmDiscard: false, + showConfirmDelete: false, + errorMessage: null + } as S; + } + + public componentDidMount() { + (this.props.componentRef as MutableRefObject>).current = this; + } + + public componentWillUnmount(): void { + (this.props.componentRef as MutableRefObject>).current = null; + } + + public componentShouldRender() { + this.forceUpdate(); + } + + protected get data(): T { + return this.state.data; + } + + protected get isReadOnly(): boolean { + return this.state.mode === DataComponentMode.ReadOnly; + } + + public get inDisplayMode(): boolean { + return this.state.mode === DataComponentMode.Display || this.state.mode === DataComponentMode.ReadOnly; + } + + public get inEditMode(): boolean { + return this.state.mode === DataComponentMode.Edit; + } + + public valid(showValidationFeedback: boolean = true): boolean { + this.setState({ showValidationFeedback }); + return this.validate(); + } + + protected abstract validate(): boolean; + + protected readonly updateField = (update: (data: T) => void, callback?: () => any): void => { + this.setState((prevState: S) => { + const data = prevState.data; + update(data); + return { + ...prevState, + data + }; + }, callback); + } + + public readonly(entity: T): Promise { + entity = entity || this.data; + + this.setState({ + data: entity, + mode: DataComponentMode.ReadOnly, + errorMessage: null + } as S); + + return new Promise((resolve, reject) => { + this._accept = resolve; + this._discard = reject; + }); + } + + public display(entity?: T): Promise { + entity = entity || this.data; + + this.setState({ + data: entity, + mode: DataComponentMode.Display, + showValidationFeedback: false, + errorMessage: null + } as S); + + return new Promise((resolve, reject) => { + this._accept = resolve; + this._discard = reject; + }); + } + + public edit(entity?: T): Promise { + entity = entity || this.data; + + if (!this.isReadOnly) { + this.setState({ + data: entity, + mode: DataComponentMode.Edit + } as S); + } + + return new Promise((resolve, reject) => { + this._accept = resolve; + this._discard = reject; + }); + } + + protected submit(successFn: () => void) { + if (this.valid()) { + this.submitting(true); + this.persistChanges(successFn); + } else { + this.error(cstrings.Validation.ValidationFailed); + } + } + + protected submitting(val: boolean) { + this.setState({ submitting: val }); + } + + protected confirmDelete() { + this.setState({ showConfirmDelete: true }); + } + + protected delete() { + this.submitting(true); + + this.persistChanges(() => { + this.onDeleted(); + this.dismiss(); + }); + } + + protected onDeleted() { + } + + public confirmDiscard() { + this.discard(); + } + + public discard() { + this._discard(); + this.dismiss(); + } + + public dismiss() { + if (this.data) { + this.setState(this.resetState()); + + if (this.props.onDismissed) { + this.props.onDismissed(); + } + } + } + + public error(msg: string = cstrings.GenericError) { + this.setState({ + submitting: false, + errorMessage: msg + }); + } + + protected async persistChanges(successFn: () => void) { + try { + await this.persistChangesCore(); + this.submitting(false); + this._accept(); + successFn(); + } catch (e) { + console.error(e); + this.error(await ErrorHandler.message(e)); + } + } + + protected abstract persistChangesCore(): Promise; + + public render() { + const onDiscard = () => this.discard(); + const onDelete = () => this.delete(); + + const Header = () => this.renderHeader(); + const Footer = () => this.renderFooter(); + + return ( +
+ {this.data &&
} + +
+ {this.state.errorMessage && + + {this.state.errorMessage} + + } + + {this.data && this.renderContent()} + + +
+ + {this.data &&
} + + this.setState({ showConfirmDiscard: false })} /> + this.setState({ showConfirmDelete: false })} /> +
+ ); + } + + protected renderHeader(): JSX.Element { + if (this.isReadOnly) + return this.renderReadOnlyHeader() || this.renderDisplayHeader(); + else if (this.inDisplayMode) + return this.renderDisplayHeader(); + else if (this.inEditMode) + return this.renderEditHeader(); + } + + protected renderReadOnlyHeader(): JSX.Element { return null; } + protected renderDisplayHeader(): JSX.Element { return null; } + protected renderEditHeader(): JSX.Element { return null; } + + protected renderContent(): JSX.Element { + if (this.isReadOnly) + return this.renderReadOnlyContent() || this.renderDisplayContent(); + else if (this.inDisplayMode) + return this.renderDisplayContent(); + else if (this.inEditMode) + return this.renderEditContent(); + } + + protected renderReadOnlyContent(): JSX.Element { return null; } + protected renderDisplayContent(): JSX.Element { return null; } + protected renderEditContent(): JSX.Element { return null; } + + protected renderFooter(): JSX.Element { + if (this.isReadOnly) + return this.renderReadOnlyFooter() || this.renderDisplayFooter(); + else if (this.inDisplayMode) + return this.renderDisplayFooter(); + else if (this.inEditMode) + return this.renderEditFooter(); + } + + protected renderReadOnlyFooter(): JSX.Element { return null; } + protected renderDisplayFooter(): JSX.Element { return null; } + protected renderEditFooter(): JSX.Element { return null; } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/DataDialogBase.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/DataDialogBase.tsx new file mode 100644 index 000000000..1f4ad50d7 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/DataDialogBase.tsx @@ -0,0 +1,320 @@ +import React, { Component, MutableRefObject, RefObject } from "react"; +import { css, Dialog, MessageBar, MessageBarType, IModalProps } from "@fluentui/react"; +import { ErrorHandler } from "../ErrorHandler"; +import { IComponent } from "../IComponent"; +import { AsyncOverlay } from "./AsyncOverlay"; +import { ConfirmDialog } from "./ConfirmDialog"; + +import * as cstrings from "CommonStrings"; +import styles from "./styles/DataDialogBase.module.scss"; + +export type UpdateDataCallback = (update: (data: T) => void, callback?: () => any) => void; + +export enum DataDialogMode { + ReadOnly, + Display, + Edit +} + +export interface IDataDialogBase extends IComponent { + valid(showValidationFeedback: boolean): boolean; + readonly(entity: T): Promise; + display(entity?: T): Promise; + edit(entity?: T): Promise; + inDisplayMode: boolean; + inEditMode: boolean; +} + +export interface IDataDialogBaseProps { + componentRef?: RefObject>; + onDismissed?: () => void; + title?: string; + className?: string; + showCloseButton?: boolean; + wide?: boolean; +} + +export interface IDataDialogBaseState { + hidden: boolean; + data: T; + mode: DataDialogMode; + showValidationFeedback: boolean; + submitting: boolean; + showConfirmDiscard: boolean; + showConfirmDelete: boolean; + errorMessage: string; +} + +export abstract class DataDialogBase, S extends IDataDialogBaseState> extends Component implements IDataDialogBase { + private _accept: () => void; + private _discard: () => void; + + constructor(props: P) { + super(props); + + this.state = this.resetState(); + } + + protected resetState(): S { + this._accept = () => { }; + this._discard = () => { }; + + return { + hidden: true, + data: null, + mode: DataDialogMode.Display, + showValidationFeedback: false, + submitting: false, + showConfirmDiscard: false, + showConfirmDelete: false, + errorMessage: null + } as S; + } + + public componentDidMount() { + (this.props.componentRef as MutableRefObject>).current = this; + } + + public componentWillUnmount(): void { + (this.props.componentRef as MutableRefObject>).current = null; + } + + public componentShouldRender() { + this.forceUpdate(); + } + + protected get title(): string { + return this.props.title; + } + + protected get data(): T { + return this.state.data; + } + + protected get isReadOnly(): boolean { + return this.state.mode === DataDialogMode.ReadOnly; + } + + public get inDisplayMode(): boolean { + return this.state.mode === DataDialogMode.Display || this.state.mode === DataDialogMode.ReadOnly; + } + + public get inEditMode(): boolean { + return this.state.mode === DataDialogMode.Edit; + } + + public valid(showValidationFeedback: boolean = true): boolean { + this.setState({ showValidationFeedback }); + return this.validate(); + } + + protected abstract validate(): boolean; + + protected readonly updateField = (update: (data: T) => void, callback?: () => any): void => { + this.setState((prevState: S) => { + const data = prevState.data; + update(data); + return { + ...prevState, + data + }; + }, callback); + } + + public readonly(entity: T): Promise { + entity = entity || this.data; + + this.setState({ + hidden: false, + data: entity, + mode: DataDialogMode.ReadOnly, + errorMessage: null + } as S); + + return new Promise((resolve, reject) => { + this._accept = resolve; + this._discard = reject; + }); + } + + public display(entity?: T): Promise { + entity = entity || this.data; + + this.setState({ + hidden: false, + data: entity, + mode: DataDialogMode.Display, + showValidationFeedback: false, + errorMessage: null + } as S); + + return new Promise((resolve, reject) => { + this._accept = resolve; + this._discard = reject; + }); + } + + public edit(entity?: T): Promise { + entity = entity || this.data; + + if (!this.isReadOnly) { + this.setState({ + hidden: false, + data: entity, + mode: DataDialogMode.Edit + } as S); + } + + return new Promise((resolve, reject) => { + this._accept = resolve; + this._discard = reject; + }); + } + + protected submit(successFn: () => void) { + if (this.valid()) { + this.submitting(true); + this.persistChanges(successFn); + } else { + this.error(cstrings.Validation.ValidationFailed); + } + } + + protected submitting(val: boolean) { + this.setState({ submitting: val }); + } + + protected confirmDelete() { + this.setState({ showConfirmDelete: true }); + } + + protected delete() { + this.submitting(true); + + this.persistChanges(() => { + this.onDeleted(); + this.dismiss(); + }); + } + + protected onDeleted() { + } + + public confirmDiscard() { + this.discard(); + } + + public discard() { + this._discard(); + this.dismiss(); + } + + public dismiss() { + if (this.data) { + this.setState(this.resetState()); + + if (this.props.onDismissed) { + this.props.onDismissed(); + } + } + } + + public error(msg: string = cstrings.GenericError) { + this.setState({ + submitting: false, + errorMessage: msg + }); + } + + protected async persistChanges(successFn: () => void) { + try { + await this.persistChangesCore(); + this.submitting(false); + this._accept(); + successFn(); + } catch (e) { + console.error(e); + this.error(await ErrorHandler.message(e)); + } + } + + protected abstract persistChangesCore(): Promise; + + public render() { + const { className, wide, showCloseButton } = this.props; + const { hidden, submitting, showConfirmDiscard, showConfirmDelete, errorMessage } = this.state; + + const onConfirmDiscard = () => this.confirmDiscard(); + const onDiscard = () => this.discard(); + const onDelete = () => this.delete(); + + const Footer = () => this.renderFooter(); + + return ( +
+ + this.setState({ showConfirmDelete: false })} /> +
+ ); + } + + protected renderContent(): JSX.Element { + if (this.isReadOnly) + return this.renderReadOnlyContent() || this.renderDisplayContent(); + else if (this.inDisplayMode) + return this.renderDisplayContent(); + else if (this.inEditMode) + return this.renderEditContent(); + } + + protected renderReadOnlyContent(): JSX.Element { return null; } + protected renderDisplayContent(): JSX.Element { return null; } + protected renderEditContent(): JSX.Element { return null; } + + protected renderFooter(): JSX.Element { + if (this.isReadOnly) + return this.renderReadOnlyFooter() || this.renderDisplayFooter(); + else if (this.inDisplayMode) + return this.renderDisplayFooter(); + else if (this.inEditMode) + return this.renderEditFooter(); + } + + protected renderReadOnlyFooter(): JSX.Element { return null; } + protected renderDisplayFooter(): JSX.Element { return null; } + protected renderEditFooter(): JSX.Element { return null; } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/DataPanelBase.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/DataPanelBase.tsx new file mode 100644 index 000000000..8bfaf123b --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/DataPanelBase.tsx @@ -0,0 +1,410 @@ +import { isEmpty } from "lodash"; +import React, { Component, CSSProperties, FC, MutableRefObject, RefObject, useCallback } from "react"; +import { css, CommandBar, IconButton, ICommandBarItemProps, MessageBar, MessageBarType, Panel, PanelType, Stack, StackItem, Text, useTheme, TooltipHost } from '@fluentui/react'; +import { IComponent } from "common"; +import { BackEventListener } from "../BackEventListener"; +import { ErrorHandler } from "../ErrorHandler"; +import { AsyncOverlay } from "./AsyncOverlay"; +import { ConfirmDialog } from "./ConfirmDialog"; + +import * as cstrings from "CommonStrings"; +import styles from "./styles/DataPanelBase.module.scss"; + +interface IPanelNavigationProps { + heading: JSX.Element; + headerCommands: ICommandBarItemProps[]; + hasCloseButton: boolean; + onConfirmDiscard: () => void; + errorMessage: string | undefined; +} + +const PanelNavigation: FC = ({ + heading, + headerCommands, + hasCloseButton, + onConfirmDiscard, + errorMessage +}) => { + const hasHeaderCommands = !isEmpty(headerCommands); + const { semanticColors: { bodyBackground } } = useTheme(); + const navigationStyle = useCallback(() => { + return { + backgroundColor: bodyBackground + } as CSSProperties; + }, [bodyBackground]); + + return ( +
+ + + {hasHeaderCommands + ? + : heading + } + + {hasCloseButton && + + + + + + } + + {hasHeaderCommands && heading} + {errorMessage && {errorMessage}} +
+ ); +}; + +export type UpdateDataCallback = (update: (data: T) => void, callback?: () => any) => void; + +export enum DataPanelMode { + ReadOnly, + Display, + Edit +} + +export interface IDataPanelBase extends IComponent { + valid(showValidationFeedback: boolean): boolean; + readonly(entity: T): Promise; + display(entity?: T): Promise; + edit(entity?: T): Promise; + inDisplayMode: boolean; + inEditMode: boolean; +} + +export interface IDataPanelBaseProps { + componentRef?: RefObject>; + onDismissed?: () => void; + title?: string; + className?: string; + hasCloseButton?: boolean; + panelType?: PanelType; +} + +export interface IDataPanelBaseState { + hidden: boolean; + data: T; + mode: DataPanelMode; + showValidationFeedback: boolean; + submitting: boolean; + showConfirmDiscard: boolean; + showConfirmDelete: boolean; + errorMessage: string; +} + +export abstract class DataPanelBase, S extends IDataPanelBaseState> extends Component implements IDataPanelBase { + private readonly _backEventListener = new BackEventListener(() => { if (this.data) this.confirmDiscard(); }); + + private _promise: Promise; + private _accept: () => void; + private _discard: () => void; + + constructor(props: P) { + super(props); + + this.state = this.resetState(); + } + + protected resetState(): S { + this._resetPromise(); + + return { + hidden: true, + data: null, + mode: DataPanelMode.Display, + showValidationFeedback: false, + submitting: false, + showConfirmDiscard: false, + showConfirmDelete: false, + errorMessage: null + } as S; + } + + public componentDidMount() { + (this.props.componentRef as MutableRefObject>).current = this; + } + + public componentWillUnmount(): void { + (this.props.componentRef as MutableRefObject>).current = null; + + this._backEventListener.cleanup(); + } + + public componentShouldRender() { + this.forceUpdate(); + } + + protected get title(): string { + return this.props.title; + } + + protected get data(): T { + return this.state.data; + } + + protected get isReadOnly(): boolean { + return this.state.mode === DataPanelMode.ReadOnly; + } + + public get inDisplayMode(): boolean { + return this.state.mode === DataPanelMode.Display || this.state.mode === DataPanelMode.ReadOnly; + } + + public get inEditMode(): boolean { + return this.state.mode === DataPanelMode.Edit; + } + + public readonly valid = (showValidationFeedback: boolean = true): boolean => { + this.setState({ showValidationFeedback }); + return this.validate(); + } + + protected abstract validate(): boolean; + + protected readonly updateField = (update: (data: T) => void, callback?: () => any): void => { + this.setState((prevState: S) => { + const data = prevState.data; + update(data); + return { + ...prevState, + data + }; + }, callback); + } + + public readonly(entity: T, resetPromise: boolean = true): Promise { + if (entity && entity !== this.data && resetPromise) this._resetPromise(); + entity = entity || this.data; + + this.setState({ + hidden: false, + data: entity, + mode: DataPanelMode.ReadOnly, + errorMessage: null + }); + + this._backEventListener.listenForBack(); + + return this._promise; + } + + public display(entity?: T, resetPromise: boolean = true): Promise { + if (entity && entity !== this.data && resetPromise) this._resetPromise(); + entity = entity || this.data; + + this.setState({ + hidden: false, + data: entity, + mode: DataPanelMode.Display, + showValidationFeedback: false, + errorMessage: null + }); + + this._backEventListener.listenForBack(); + + return this._promise; + } + + public edit(entity?: T, resetPromise: boolean = true): Promise { + if (entity && entity !== this.data && resetPromise) this._resetPromise(); + entity = entity || this.data; + + if (!this.isReadOnly) { + this.setState({ + hidden: false, + data: entity, + mode: DataPanelMode.Edit + }); + } + + this._backEventListener.listenForBack(); + + return this._promise; + } + + private _resetPromise() { + this._promise = new Promise((resolve, reject) => { + this._accept = resolve; + this._discard = reject; + }); + } + + protected submit(successFn: () => void) { + if (this.valid()) { + this.submitting(true); + this.persistChanges(successFn); + } else { + this.error(cstrings.Validation.ValidationFailed); + } + } + + protected submitting(val: boolean) { + this.setState({ submitting: val }); + } + + protected confirmDelete() { + this.setState({ showConfirmDelete: true }); + } + + protected delete() { + this.submitting(true); + + this.persistChanges(() => { + this.onDeleted(); + this.dismiss(); + }); + } + + protected onDeleted() { + } + + public confirmDiscard() { + this.discard(); + } + + public discard() { + this._discard(); + this.dismiss(); + } + + public dismiss() { + if (this.data) { + this.setState(this.resetState()); + + if (this.props.onDismissed) { + this.props.onDismissed(); + } + } + + this._backEventListener.cancelListeningForBack(); + } + + public error(msg: string = cstrings.GenericError) { + this.setState({ + submitting: false, + errorMessage: msg + }); + } + + protected customSavingLabel(): string { + return cstrings.Saving; + } + + protected async persistChanges(successFn: () => void) { + try { + await this.persistChangesCore(); + this.submitting(false); + this._accept(); + successFn(); + } catch (e) { + console.error(e); + this.error(await ErrorHandler.message(e)); + } + } + + protected abstract persistChangesCore(): Promise; + + public render() { + const { className, hasCloseButton, panelType } = this.props; + const { hidden, submitting, showConfirmDiscard, showConfirmDelete, errorMessage } = this.state; + + const onDiscard = () => this.discard(); + const onConfirmDiscard = () => this.confirmDiscard(); + const onDelete = () => this.delete(); + + const headerCommands = this.data ? this.buildHeaderCommands() : []; + const Heading = () => this.data && this.renderHeader() || + {this.title}; + + const footerContent = this.data && this.renderFooterContent(); + const hasFooterContent = !!footerContent; + + return ( + + } + headerCommands={headerCommands} + hasCloseButton={hasCloseButton} + onConfirmDiscard={onConfirmDiscard} + errorMessage={errorMessage} + /> + } + onRenderFooterContent={hasFooterContent ? () => footerContent : undefined} + isFooterAtBottom={hasFooterContent} + > + {this.data && this.renderContent()} + + + + { this.setState({ showConfirmDiscard: false }); this._backEventListener.listenForBack(); }} /> + this.setState({ showConfirmDelete: false })} /> + + ); + } + + protected renderHeader(): JSX.Element { + if (this.isReadOnly) + return this.renderReadOnlyHeader() || this.renderDisplayHeader(); + else if (this.inDisplayMode) + return this.renderDisplayHeader(); + else if (this.inEditMode) + return this.renderEditHeader() || this.renderDisplayHeader(); + } + + protected renderReadOnlyHeader(): JSX.Element { return null; } + protected renderDisplayHeader(): JSX.Element { return null; } + protected renderEditHeader(): JSX.Element { return null; } + + protected buildHeaderCommands(): ICommandBarItemProps[] { + if (this.isReadOnly) + return this.buildReadOnlyHeaderCommands() || this.buildDisplayHeaderCommands() || []; + else if (this.inDisplayMode) + return this.buildDisplayHeaderCommands() || []; + else if (this.inEditMode) + return this.buildEditHeaderCommands() || []; + } + + protected buildReadOnlyHeaderCommands(): ICommandBarItemProps[] { return null; } + protected buildDisplayHeaderCommands(): ICommandBarItemProps[] { return null; } + protected buildEditHeaderCommands(): ICommandBarItemProps[] { return null; } + + protected renderContent(): JSX.Element { + if (this.isReadOnly) + return this.renderReadOnlyContent() || this.renderDisplayContent(); + else if (this.inDisplayMode) + return this.renderDisplayContent(); + else if (this.inEditMode) + return this.renderEditContent(); + } + + protected renderReadOnlyContent(): JSX.Element { return null; } + protected renderDisplayContent(): JSX.Element { return null; } + protected renderEditContent(): JSX.Element { return null; } + + protected renderFooterContent(): JSX.Element { + if (this.isReadOnly) + return this.renderReadOnlyFooterContent() || this.renderDisplayFooterContent(); + else if (this.inDisplayMode) + return this.renderDisplayFooterContent(); + else if (this.inEditMode) + return this.renderEditFooterContent(); + } + + protected renderReadOnlyFooterContent(): JSX.Element { return null; } + protected renderDisplayFooterContent(): JSX.Element { return null; } + protected renderEditFooterContent(): JSX.Element { return null; } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/DateRotator.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/DateRotator.tsx new file mode 100644 index 000000000..fc0cd7c44 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/DateRotator.tsx @@ -0,0 +1,60 @@ +import { Moment } from "moment-timezone"; +import React, { FC } from "react"; +import { IconButton, DateRangeType, Stack, IStyle, IIconProps, StackItem, FocusZone } from "@fluentui/react"; +import { CalendarPicker } from "./CalendarPicker"; + +import { DateRotator as strings } from 'CommonStrings'; + +const styles = { + root: { + maxWidth: 300, + width: '100%' + } as IStyle +}; + +const defaultPreviousIconProps: IIconProps = { iconName: 'ChevronLeft' }; +const defaultNextIconProps: IIconProps = { iconName: 'ChevronRight' }; + +interface IProps { + date: Moment; + dateString: string; + dateRangeType?: DateRangeType; + previousIconProps?: IIconProps; + nextIconProps?: IIconProps; + onPrevious: () => void; + onNext: () => void; + onDateChanged: (date: Moment) => void; +} + +export const DateRotator: FC = ({ + date, + dateString, + dateRangeType, + previousIconProps = defaultPreviousIconProps, + nextIconProps = defaultNextIconProps, + onPrevious, + onNext, + onDateChanged +}) => + + + + + + + + + \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/EntityComponentBase.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/EntityComponentBase.tsx new file mode 100644 index 000000000..1b8e042d2 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/EntityComponentBase.tsx @@ -0,0 +1,119 @@ +import { isEqual } from 'lodash'; +import { IAsyncData } from 'common'; +import { Entity } from '../Entity'; +import { DataComponentBase, IDataComponentBase, IDataComponentBaseProps, IDataComponentBaseState, DataComponentMode, UpdateDataCallback } from "./DataComponentBase"; + +export { + IDataComponentBase, + IDataComponentBaseState, + DataComponentMode, + UpdateDataCallback +}; + +export interface IEntityComponentProps> extends IDataComponentBaseProps { + asyncWatchers?: IAsyncData[]; +} + +export abstract class EntityComponentBase, P extends IEntityComponentProps, S extends IDataComponentBaseState> extends DataComponentBase { + constructor(props: P) { + super(props); + + this.state = this.resetState(); + } + + public componentDidMount(): void { + super.componentDidMount(); + const { asyncWatchers } = this.props; + (asyncWatchers || []).map((async: IAsyncData) => async.registerComponentForUpdates(this)); + } + + public componentWillUnmount(): void { + super.componentWillUnmount(); + const { asyncWatchers } = this.props; + (asyncWatchers || []).map((async: IAsyncData) => async.unregisterComponentForUpdates(this)); + } + + public componentDidUpdate(prevProps: Readonly

, prevState: Readonly, snapshot?: any): void { + const { asyncWatchers: prevAsyncWatchers } = prevProps; + const { asyncWatchers: nextAsyncWatchers } = this.props; + + if (!isEqual(prevAsyncWatchers, nextAsyncWatchers)) { + (prevAsyncWatchers || []).map((async: IAsyncData) => async.unregisterComponentForUpdates(this)); + (nextAsyncWatchers || []).map((async: IAsyncData) => async.registerComponentForUpdates(this)); + } + } + + protected get entity(): T { + return this.data; + } + + protected get isNew(): boolean { + return this.data && this.data.isNew; + } + + protected hasChanges(): boolean { + return this.data && this.data.hasChanges(); + } + + protected validate(): boolean { + return this.data.valid(); + } + + public readonly(entity: T): Promise { + entity = entity || this.entity; + entity.revert(); + return super.readonly(entity); + } + + public display(entity?: T): Promise { + entity = entity || this.entity; + entity.revert(); + return super.display(entity); + } + + public edit(entity?: T): Promise { + entity = entity || this.entity; + if (!this.isReadOnly) { + entity.snapshot(); + } + return super.edit(entity); + } + + public submit(successFn: () => void) { + super.submit(() => { + this.data.immortalize(); + successFn(); + }); + } + + public delete() { + this.markEntityDeleted(); + super.delete(); + } + + protected onDeleted() { + this.entity.immortalize(); + } + + protected markEntityDeleted() { + this.entity.snapshot(); + this.entity.delete(); + } + + public confirmDiscard() { + if (this.hasChanges() && !this.isNew) { + this.setState({ showConfirmDiscard: true }); + } else { + this.discard(); + } + } + + public discard() { + if (this.entity) { + this.updateField( + entity => entity.revert(), + () => super.discard() + ); + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/EntityDialogBase.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/EntityDialogBase.tsx new file mode 100644 index 000000000..22573049b --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/EntityDialogBase.tsx @@ -0,0 +1,120 @@ +import { isEqual } from 'lodash'; +import { IAsyncData } from 'common'; +import { Entity } from '../Entity'; +import { DataDialogBase, IDataDialogBase, IDataDialogBaseProps, IDataDialogBaseState, DataDialogMode, UpdateDataCallback } from "./DataDialogBase"; + +export { + IDataDialogBase, + IDataDialogBaseState, + DataDialogMode, + UpdateDataCallback +}; + +export interface IEntityDialogProps> extends IDataDialogBaseProps { + asyncWatchers?: IAsyncData[]; +} + + +export abstract class EntityDialogBase, P extends IEntityDialogProps, S extends IDataDialogBaseState> extends DataDialogBase { + constructor(props: P) { + super(props); + + this.state = this.resetState(); + } + + public componentDidMount(): void { + super.componentDidMount(); + const { asyncWatchers } = this.props; + (asyncWatchers || []).map((async: IAsyncData) => async.registerComponentForUpdates(this)); + } + + public componentWillUnmount(): void { + super.componentWillUnmount(); + const { asyncWatchers } = this.props; + (asyncWatchers || []).map((async: IAsyncData) => async.unregisterComponentForUpdates(this)); + } + + public componentDidUpdate(prevProps: Readonly

, prevState: Readonly, snapshot?: any): void { + const { asyncWatchers: prevAsyncWatchers } = prevProps; + const { asyncWatchers: nextAsyncWatchers } = this.props; + + if (!isEqual(prevAsyncWatchers, nextAsyncWatchers)) { + (prevAsyncWatchers || []).map((async: IAsyncData) => async.unregisterComponentForUpdates(this)); + (nextAsyncWatchers || []).map((async: IAsyncData) => async.registerComponentForUpdates(this)); + } + } + + protected get entity(): T { + return this.data; + } + + protected get isNew(): boolean { + return this.data && this.data.isNew; + } + + protected hasChanges(): boolean { + return this.data && this.data.hasChanges(); + } + + protected validate(): boolean { + return this.data.valid(); + } + + public readonly(entity: T): Promise { + entity = entity || this.entity; + entity.revert(); + return super.readonly(entity); + } + + public display(entity?: T): Promise { + entity = entity || this.entity; + entity.revert(); + return super.display(entity); + } + + public edit(entity?: T): Promise { + entity = entity || this.entity; + if (!this.isReadOnly) { + entity.snapshot(); + } + return super.edit(entity); + } + + public submit(successFn: () => void) { + super.submit(() => { + this.data.immortalize(); + successFn(); + }); + } + + public delete() { + this.markEntityDeleted(); + super.delete(); + } + + protected onDeleted() { + this.entity.immortalize(); + } + + protected markEntityDeleted() { + this.entity.snapshot(); + this.entity.delete(); + } + + public confirmDiscard() { + if (this.hasChanges() && !this.isNew) { + this.setState({ showConfirmDiscard: true }); + } else { + this.discard(); + } + } + + public discard() { + if (this.entity) { + this.updateField( + entity => entity.revert(), + () => super.discard() + ); + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/EntityPanelBase.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/EntityPanelBase.tsx new file mode 100644 index 000000000..e95628560 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/EntityPanelBase.tsx @@ -0,0 +1,132 @@ +import { isEqual } from 'lodash'; +import { IAsyncData } from 'common'; +import { Entity } from '../Entity'; +import { DataPanelBase, IDataPanelBase, IDataPanelBaseProps, IDataPanelBaseState, DataPanelMode, UpdateDataCallback } from "./DataPanelBase"; + +export { + IDataPanelBase, + IDataPanelBaseState, + DataPanelMode, + UpdateDataCallback +}; + +export interface IEntityPanelProps> extends IDataPanelBaseProps { + asyncWatchers?: IAsyncData[]; +} + +export abstract class EntityPanelBase, P extends IEntityPanelProps, S extends IDataPanelBaseState> extends DataPanelBase { + constructor(props: P) { + super(props); + + this.state = this.resetState(); + } + + public componentDidMount(): void { + super.componentDidMount(); + const { asyncWatchers } = this.props; + (asyncWatchers || []).map((async: IAsyncData) => async.registerComponentForUpdates(this)); + } + + public componentWillUnmount(): void { + super.componentWillUnmount(); + const { asyncWatchers } = this.props; + (asyncWatchers || []).map((async: IAsyncData) => async.unregisterComponentForUpdates(this)); + } + + public componentDidUpdate(prevProps: Readonly

, prevState: Readonly, snapshot?: any): void { + const { asyncWatchers: prevAsyncWatchers } = prevProps; + const { asyncWatchers: nextAsyncWatchers } = this.props; + + if (!isEqual(prevAsyncWatchers, nextAsyncWatchers)) { + (prevAsyncWatchers || []).map((async: IAsyncData) => async.unregisterComponentForUpdates(this)); + (nextAsyncWatchers || []).map((async: IAsyncData) => async.registerComponentForUpdates(this)); + } + } + + protected get entity(): T { + return this.data; + } + + protected get isNew(): boolean { + return this.data && this.data.isNew; + } + + protected hasChanges(): boolean { + return this.data && this.data.hasChanges(); + } + + protected readonly updateField = (update: (data: T) => void, callback?: () => any): void => { + this.setState((prevState: S) => { + const data = prevState.data; + update(data); + return { + ...prevState, + data + }; + }, callback); + } + + protected validate(): boolean { + return this.data.valid(); + } + + public readonly(entity: T, resetPromise?: boolean): Promise { + entity = entity || this.entity; + entity.revert(); + return super.readonly(entity, resetPromise); + } + + public display(entity?: T, resetPromise?: boolean): Promise { + entity = entity || this.entity; + entity.revert(); + + return super.display(entity, resetPromise); + } + + public edit(entity?: T, resetPromise?: boolean): Promise { + entity = entity || this.entity; + if (!this.isReadOnly) { + entity.snapshot(); + } + + return super.edit(entity, resetPromise); + } + + public submit(successFn: () => void) { + super.submit(() => { + this.data.immortalize(); + successFn(); + }); + } + + public delete() { + this.markEntityDeleted(); + super.delete(); + } + + protected onDeleted() { + this.entity.immortalize(); + } + + protected markEntityDeleted() { + this.entity.snapshot(); + this.entity.delete(); + } + + public confirmDiscard() { + if (this.hasChanges() && !this.isNew) { + this.setState({ showConfirmDiscard: true }); + } else { + this.discard(); + } + } + + public discard() { + if (this.entity) { + this.updateField( + entity => entity.revert(), + () => super.discard() + ); + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/InfoTooltip.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/InfoTooltip.tsx new file mode 100644 index 000000000..7d264d8f3 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/InfoTooltip.tsx @@ -0,0 +1,26 @@ +import React, { CSSProperties, FC, ReactNode } from 'react'; +import { TooltipHost, ITooltipHostProps, Text } from '@fluentui/react'; +import { InfoIcon } from '@fluentui/react-icons-mdl2'; + +const infoIconStyle: CSSProperties = { + fontSize: 12, + marginLeft: 4 +}; + +interface IProps extends ITooltipHostProps { + text: string; + hideIcon?: boolean; + tooltipHostProps?: ITooltipHostProps; + children: ReactNode; +} + +export const InfoTooltip: FC = ({ + text, + hideIcon = false, + tooltipHostProps, + children +}: IProps) => + + {children} + {text && !hideIcon && } + diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/LengthLimitedTextField.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/LengthLimitedTextField.tsx new file mode 100644 index 000000000..d8c1e24af --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/LengthLimitedTextField.tsx @@ -0,0 +1,72 @@ +import React from "react"; +import { Label, TextField, TooltipHost, ITooltipProps } from '@fluentui/react'; +import { InfoSolidIcon } from "@fluentui/react-icons-mdl2"; + +import styles from './styles/LengthLimitedTextfield.module.scss'; + +export enum CharacterLimitLabelPosition { + Top, + Bottom +} + +interface IProps { + label: string; + value: string; + placeholder?: string; + tooltipProps?: ITooltipProps; + tooltipText?: string; + characterLimit: number; + autoFocus?: boolean; + required?: boolean; + multiline?: boolean; + disabled?: boolean; + readonly?: boolean; + rows?: number; + characterLimitLabelPosition?: CharacterLimitLabelPosition; + onChanged: (newValue: string) => void; +} + +const renderLabel = (label: string, required: boolean, tooltipText: string, tooltipProps: ITooltipProps, remainingCharCount: number, showCharacterLimitLabel: boolean) => { + return ( +

+ + + + + {showCharacterLimitLabel && + + } +
+ ); +}; + +export const LengthLimitedTextField: React.FC = (props: IProps) => { + const text = props.value; + const remainingCharCount = Math.max(props.characterLimit - text.length, 0); + const onRenderLabel = () => renderLabel(props.label, props.required, props.tooltipText, props.tooltipProps, remainingCharCount, props.characterLimitLabelPosition === CharacterLimitLabelPosition.Top); + + return ( +
+ props.onChanged(val)} + disabled={props.disabled} + readOnly={props.readonly} + /> + {props.characterLimitLabelPosition === CharacterLimitLabelPosition.Bottom && + + } +
+ ); +}; + +LengthLimitedTextField.defaultProps = { + characterLimitLabelPosition: CharacterLimitLabelPosition.Bottom +}; diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/LengthOfTimePicker.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/LengthOfTimePicker.tsx new file mode 100644 index 000000000..44f1d5d8a --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/LengthOfTimePicker.tsx @@ -0,0 +1,81 @@ +import { duration, Duration } from "moment-timezone"; +import React, { FC } from "react"; +import { Dropdown, IDropdownOption, Label } from "@fluentui/react"; +import { ResponsiveGrid, GridRow, GridCol } from "./ResponsiveGrid"; + +interface IProps { + label?: string; + value: Duration; + className?: string; + onChanged: (val: Duration) => void; +} + +const hoursDropDownOptions: IDropdownOption[] = [ + { key: 0, text: '-' }, + { key: 1, text: '1 hour' }, + { key: 2, text: '2 hours' }, + { key: 3, text: '3 hours' }, + { key: 4, text: '4 hours' }, + { key: 5, text: '5 hours' }, + { key: 6, text: '6 hours' }, + { key: 7, text: '7 hours' }, + { key: 8, text: '8 hours' } +]; + +const minutesDropDownOptions: IDropdownOption[] = [ + { key: 0, text: '0 minutes' }, + { key: 5, text: '5 minutes' }, + { key: 10, text: '10 minutes' }, + { key: 15, text: '15 minutes' }, + { key: 20, text: '20 minutes' }, + { key: 25, text: '25 minutes' }, + { key: 30, text: '30 minutes' }, + { key: 35, text: '35 minutes' }, + { key: 40, text: '40 minutes' }, + { key: 45, text: '45 minutes' }, + { key: 50, text: '50 minutes' }, + { key: 55, text: '55 minutes' }, +]; + +export const LengthOfTimePicker: FC = ({ label, value, className, onChanged }) => { + const hours = value.isValid() ? Math.min(value.hours(), 8) : 0; + const minutes = value.isValid() ? Math.floor(value.minutes() / 5) * 5 : 0; // round down to the closest 5-minute increment + + const onHoursChanged = (option: IDropdownOption) => { + const newHours = option.key as number; + onChanged(duration({ hours: newHours, minutes })); + }; + + const onMinutesChanged = (option: IDropdownOption) => { + const newMinutes = option.key as number; + onChanged(duration({ hours, minutes: newMinutes })); + }; + + return ( + + {label && + + + + } + + + onHoursChanged(opt)} + /> + + + onMinutesChanged(opt)} + /> + + + + ); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/LiveCheckbox.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/LiveCheckbox.tsx new file mode 100644 index 000000000..f0108b93d --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/LiveCheckbox.tsx @@ -0,0 +1,56 @@ +import React, { FormEvent, useCallback } from 'react'; +import { Checkbox, ICheckboxProps, Stack } from '@fluentui/react'; +import { ValidationRule, PropsOfType } from 'common'; +import { ListItemEntity } from 'common/sharepoint'; +import LiveUpdate from './LiveUpdate'; +import { getCurrentValue, LiveType, setValue } from './LiveUtils'; +import { Validation } from './Validation'; + +type DataType = boolean; + +interface IProps, P extends PropsOfType, T extends DataType> extends ICheckboxProps { + entity: E; + propertyName: P; + rules?: ValidationRule[]; + showValidationFeedback?: boolean; + updateField: (update: (data: E) => void, callback?: () => any) => void; +} + +const LiveCheckbox = , P extends PropsOfType, T extends DataType>(props: IProps) => { + const { + entity, + propertyName, + rules, + showValidationFeedback, + label, + ariaLabel = label, + updateField + } = props; + + const value = getCurrentValue(entity, propertyName) as T; + const updateValue = useCallback((val: LiveType) => updateField(e => setValue(e, propertyName, val)), [updateField, propertyName]); + const onChange = useCallback((ev: FormEvent, checked: boolean) => updateField(e => setValue(e, propertyName, checked as LiveType)), [updateField, propertyName]); + + return ( + + + {(renderLiveUpdateMark) => + <> + + {defaultRender(checkboxProps)} + {renderLiveUpdateMark()} + + } + checked={value} + onChange={onChange} + /> + } + + + ); +}; + +export default LiveCheckbox; diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/LiveChoiceGroup.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/LiveChoiceGroup.tsx new file mode 100644 index 000000000..ff07a468c --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/LiveChoiceGroup.tsx @@ -0,0 +1,72 @@ +import React, { ReactNode, useCallback, useMemo } from 'react'; +import { ChoiceGroup, IChoiceGroupProps, Stack, Label, IChoiceGroupOption, useTheme, IChoiceGroupOptionStyles, concatStyleSets } from '@fluentui/react'; +import { ValidationRule } from 'common'; +import { ListItemEntity } from 'common/sharepoint'; +import LiveUpdate from './LiveUpdate'; +import { getCurrentValue, LiveType, setValue } from './LiveUtils'; +import { Validation } from './Validation'; + +interface IProps, P extends keyof E> extends IChoiceGroupProps { + entity: E; + propertyName: P; + getKeyFromValue: (val: LiveType) => string; + getTextFromValue: (val: LiveType) => string; + getValueFromKey: (key: string) => LiveType; + rules?: ValidationRule[]; + showValidationFeedback?: boolean; + updateField: (update: (data: E) => void, callback?: () => any) => void; + renderValue?: (val: LiveType) => ReactNode; +} + +const LiveChoiceGroup = , P extends keyof E>(props: IProps) => { + const { + entity, + propertyName, + getKeyFromValue, + getTextFromValue, + getValueFromKey, + rules, + showValidationFeedback, + label, + required, + updateField, + renderValue, + options + } = props; + + const value = getCurrentValue(entity, propertyName); + const updateValue = useCallback((val: LiveType) => updateField(e => setValue(e, propertyName, val)), [updateField, propertyName]); + const renderValueCallback = useCallback((val: LiveType) => <>{getTextFromValue(val)}, [getTextFromValue]); + const localRenderValue = renderValue || renderValueCallback; + const onChange = useCallback((ev, val: IChoiceGroupOption) => updateField(e => setValue(e, propertyName, getValueFromKey(val.key))), [updateField, propertyName, getValueFromKey]); + + const { palette: { neutralLighterAlt } } = useTheme(); + const fixHighContrastThemeStyle = useMemo(() => { + return { + root: { backgroundColor: neutralLighterAlt } + } as IChoiceGroupOptionStyles; + }, [neutralLighterAlt]); + + options.forEach(option => option.styles = concatStyleSets(fixHighContrastThemeStyle, option.styles)); + + return ( + + + {(renderLiveUpdateMark) => <> + + + {renderLiveUpdateMark()} + + + } + + + ); +}; + +export default LiveChoiceGroup; diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/LiveComboBox.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/LiveComboBox.tsx new file mode 100644 index 000000000..4fc8e0ccb --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/LiveComboBox.tsx @@ -0,0 +1,74 @@ +import React, { FormEvent, useCallback, useEffect, useRef } from 'react'; +import { IComboBoxProps, ComboBox, Stack, IComboBox, IComboBoxOption, } from '@fluentui/react'; +import { PropsOfType, ValidationRule } from 'common'; +import { ListItemEntity } from 'common/sharepoint'; +import LiveUpdate from './LiveUpdate'; +import { getCurrentValue, LiveType, setValue } from './LiveUtils'; +import { Validation } from './Validation'; + +interface IProps, P extends PropsOfType> extends IComboBoxProps { + entity: E; + propertyName: P; + rules?: ValidationRule[]; + showValidationFeedback?: boolean; + autoFocus?: boolean; + updateField: (update: (data: E) => void, callback?: () => any) => void; +} + +const LiveComboBox = , P extends PropsOfType>(props: IProps) => { + const { + entity, + propertyName, + rules, + showValidationFeedback, + autoFocus, + label, + options, + ariaLabel = label, + updateField + } = props; + + const value = getCurrentValue(entity, propertyName) as string; + const updateValue = useCallback((val: LiveType) => updateField(e => setValue(e, propertyName, val)), [updateField, propertyName]); + const renderValue = useCallback((val: LiveType) => <>{val || '-'}, []); + const onChange = useCallback((ev: FormEvent, option: IComboBoxOption, index: number, value: string) => updateField(e => { + let newValue = ''; + if (option) + newValue = option.text; + else if (value) + newValue = value; + + setValue(e, propertyName, newValue as LiveType); + }), [updateField, propertyName]); + + const dropDownRef = useRef(); + useEffect(() => { if (autoFocus) dropDownRef.current?.focus(); }, [autoFocus]); + + const amendedOptions = options.some(opt => opt.key === value) + ? options + : [{ key: value, text: value }, ...options] + + return ( + + + {(renderLiveUpdateMark) => + + + {defaultRender(textFieldProps)} + {renderLiveUpdateMark()} + } + selectedKey={value} + onChange={onChange} + /> + } + + + ); +}; + +export default LiveComboBox; diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/LiveDatePicker.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/LiveDatePicker.tsx new file mode 100644 index 000000000..aa68e36dc --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/LiveDatePicker.tsx @@ -0,0 +1,65 @@ +import moment, { Moment } from 'moment-timezone'; +import React, { useCallback } from 'react'; +import { DatePicker, IDatePickerProps, Label, Stack } from '@fluentui/react'; +import { ValidationRule, PropsOfType } from 'common'; +import { ListItemEntity } from 'common/sharepoint'; +import LiveUpdate from './LiveUpdate'; +import { getCurrentValue, LiveType, setValue } from './LiveUtils'; +import { Validation } from './Validation'; + +type DataType = Moment; + +interface IProps, P extends PropsOfType, T extends DataType> extends Omit { + entity: E; + propertyName: P; + required?: boolean; + rules?: ValidationRule[]; + showValidationFeedback?: boolean; + formatMoment?: (date?: Moment) => string; + updateField: (update: (data: E) => void, callback?: () => any) => void; +} + +const LiveDatePicker = , P extends PropsOfType, T extends DataType>(props: IProps) => { + const { + entity, + propertyName, + rules, + showValidationFeedback, + label, + ariaLabel = label, + required, + formatMoment = date => date?.isValid() ? date.format('l') : '', + updateField + } = props; + + const value = getCurrentValue(entity, propertyName) as T; + const updateValue = useCallback((val: LiveType) => updateField(e => setValue(e, propertyName, val)), [updateField, propertyName]); + const renderValue = useCallback((val: LiveType) => {(val as DataType)?.isValid() ? (val as DataType).format('dddd, MMMM DD, YYYY') : ''}, []); + const formatDate = useCallback((val: Date) => formatMoment(moment(val)), [formatMoment]); + const onChange = useCallback((value: Date) => updateField(e => setValue(e, propertyName, moment(value) as LiveType)), [updateField, propertyName]); + + return ( + + + {(renderLiveUpdateMark) => <> + {label && + + {renderLiveUpdateMark()} + } + + {!label && renderLiveUpdateMark()} + } + + + ); +}; + +export default LiveDatePicker; diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/LiveDropdown.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/LiveDropdown.tsx new file mode 100644 index 000000000..69b34a6a3 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/LiveDropdown.tsx @@ -0,0 +1,82 @@ +import { first } from 'lodash'; +import React, { ReactNode, useCallback, useEffect, useRef } from 'react'; +import { IDropdownProps, Dropdown, Stack, IDropdownOption, IDropdown } from '@fluentui/react'; +import { ValidationRule } from 'common'; +import { ListItemEntity } from 'common/sharepoint'; +import { InfoTooltip } from './InfoTooltip'; +import LiveUpdate, { ITransformer, NonTransformer } from './LiveUpdate'; +import { getCurrentValue, LiveType, RelType, setValue } from './LiveUtils'; +import { Validation } from './Validation'; + +const firstOrItem = (item: T | T[]): T => + item instanceof Array ? first(item) : item; + +interface IProps, P extends keyof E> extends IDropdownProps { + entity: E; + propertyName: P; + getKeyFromValue: (val: RelType) => (string | number); + renderValue?: (val: LiveType) => ReactNode; + transformer?: ITransformer>; + rules?: ValidationRule[]; + showValidationFeedback?: boolean; + autoFocus?: boolean; + tooltip?: string; + updateField: (update: (data: E) => void, callback?: () => any) => void; +} + +const LiveDropdown = , P extends keyof E>(props: IProps) => { + const { + entity, + propertyName, + getKeyFromValue, + renderValue: customValueRenderer, + transformer = new NonTransformer(), + rules, + showValidationFeedback, + autoFocus, + label, + ariaLabel = label, + tooltip, + updateField + } = props; + + const value = firstOrItem(transformer.transform(getCurrentValue(entity, propertyName))); + const updateValue = useCallback((val: LiveType) => updateField(e => setValue(e, propertyName, transformer.reverse(val))), [updateField, propertyName]); + const renderValue = useCallback((val: LiveType) => <>{customValueRenderer(val)}, [customValueRenderer]); + const onChange = useCallback((ev, { data, key }: IDropdownOption) => + updateField(e => { + const value = (data || key) as LiveType; + setValue(e, propertyName, transformer.reverse(value instanceof Array ? [value] as any : value)); + }), + [updateField, propertyName, value] + ); + + const key = getKeyFromValue(value as RelType); + + const dropDownRef = useRef(); + useEffect(() => { if (autoFocus) dropDownRef.current?.focus(); }, [autoFocus]); + + return ( + + + {(renderLiveUpdateMark) => + + + {defaultRender(textFieldProps)} + {renderLiveUpdateMark()} + } + multiSelect={false} + selectedKey={key} + onChange={onChange} + /> + } + + + ); +}; + +export default LiveDropdown; diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/LiveMultiselectDropdown.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/LiveMultiselectDropdown.tsx new file mode 100644 index 000000000..564bb6067 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/LiveMultiselectDropdown.tsx @@ -0,0 +1,100 @@ +import { remove } from 'lodash'; +import React, { ReactNode, useCallback, useEffect, useMemo, useRef } from 'react'; +import { IDropdownProps, Dropdown, Stack, IDropdownOption, IDropdown, useTheme, IDropdownStyles, ICheckStyleProps } from '@fluentui/react'; +import { ValidationRule } from 'common'; +import { ListItemEntity } from 'common/sharepoint'; +import { InfoTooltip } from './InfoTooltip'; +import LiveUpdate, { ITransformer, NonTransformer } from './LiveUpdate'; +import { getCurrentValue, LiveType, RelType, setValue } from './LiveUtils'; +import { Validation } from './Validation'; + +interface IProps, P extends keyof E> extends IDropdownProps { + entity: E; + propertyName: P; + getKeyFromValue: (val: RelType) => string | number; + renderValue?: (val: LiveType) => ReactNode; + transformer?: ITransformer>; + rules?: ValidationRule[]; + showValidationFeedback?: boolean; + autoFocus?: boolean; + tooltip?: string; + updateField: (update: (data: E) => void, callback?: () => any) => void; +} + +const LiveMultiselectDropdown = , P extends keyof E>(props: IProps) => { + const { + entity, + propertyName, + getKeyFromValue, + renderValue: customValueRenderer, + transformer = new NonTransformer(), + rules, + showValidationFeedback, + autoFocus, + label, + ariaLabel = label, + tooltip, + updateField + } = props; + + const values = transformer.transform(getCurrentValue(entity, propertyName)); + const updateValue = useCallback((val: LiveType) => updateField(e => setValue(e, propertyName, transformer.reverse(val))), [updateField, propertyName]); + const renderValue = useCallback((val: LiveType) => <>{customValueRenderer(val)}, [customValueRenderer]); + const onChange = useCallback((ev, { selected, data, key }: IDropdownOption) => + updateField(e => { + const value = (data || key) as LiveType; + + if (selected) + (values as any).push(value); + else + remove(values as any, v => v === value); + + setValue(e, propertyName, transformer.reverse(values)); + }), + [updateField, propertyName, values] + ); + + const keys = (values as any).map(getKeyFromValue); + + const dropDownRef = useRef(); + useEffect(() => { if (autoFocus) dropDownRef.current?.focus(); }, [autoFocus]); + + const { palette: { neutralDark, neutralPrimary } } = useTheme(); + + const fixHighContrastThemeStyles = useMemo(() => { + return { + subComponentStyles: { + multiSelectItem: ({ checked }: ICheckStyleProps) => { + return { + label: { color: checked ? neutralDark : neutralPrimary } + }; + } + } + } as IDropdownStyles; + }, [neutralDark, neutralPrimary]); + + return ( + + + {(renderLiveUpdateMark) => + + + {defaultRender(textFieldProps)} + {renderLiveUpdateMark()} + } + multiSelect + selectedKeys={keys} + onChange={onChange} + styles={fixHighContrastThemeStyles} + /> + } + + + ); +}; + +export default LiveMultiselectDropdown; diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/LiveRelationship.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/LiveRelationship.tsx new file mode 100644 index 000000000..5ceeb9c21 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/LiveRelationship.tsx @@ -0,0 +1,147 @@ +import { difference, includes } from "lodash"; +import React, { ReactNode } from "react"; +import { Comparer, Entity } from "common"; +import { ListItemEntity } from "common/sharepoint"; +import { IOneToManyRelationship, OneToManyRelationship } from "../Entity"; + +enum Status { + added, + deleted, + movedIn, + movedOut, + reordered, + unchanged +} + +type Context = { + entity: E; + index: number; + status: Status; + isAdded: boolean; + isDeleted: boolean; + isMovedIn: boolean; + isMovedOut: boolean; + isReordered: boolean; + isUnchanged: boolean; +}; + +const parentRelationship = (relationship: IOneToManyRelationship, child: ListItemEntity) => { + return (relationship as OneToManyRelationship)._parentRelationship(child); +}; + +interface IProps> { + relationship: IOneToManyRelationship; + excludeRemoved?: boolean; + comparer?: Comparer; + separator?: ReactNode; + children: (context: Context) => ReactNode; +} + +const LiveRelationship = >({ + relationship, + excludeRemoved = false, + comparer, + separator = <>, + children +}: IProps) => { + const output: [E, Status][] = []; + + const current: E[] = relationship.filter(Entity.NotDeletedFilter); + if (comparer) current.sort(comparer); + + const snapshot: E[] = (() => { + if (!relationship.hasSnapshot) return current; + const items = relationship.snapshotValue(); + items.filter(item => item.hasSnapshot).forEach(item => item.peekSnapshot()); + const filteredItems = items.filter(Entity.NotDeletedFilter); + if (comparer) filteredItems.sort(comparer); + items.forEach(item => item.endPeek()); + return filteredItems; + })(); + + const previous: E[] = (() => { + if (!relationship.hasPrevious) return snapshot; + const items = relationship.previousValue(); + items.filter(item => item.hasPrevious).forEach(item => item.peekPrevious()); + const filteredItems = items.filter(Entity.NotDeletedFilter); + if (comparer) filteredItems.sort(comparer); + items.forEach(item => item.endPeek()); + return filteredItems; + })(); + + const added = difference(current, previous); + const removed = difference(previous, current); + + const stableCurrent = difference(current, added); + const stablePrevious = difference(previous, removed); + + const length = stableCurrent.length + added.length + removed.length; + let i_current = 0; + let i_previous = 0; + let i_stable = 0; + + for (let i = 0; i < length; i++) { + const current_item = current[i_current]; + const previous_item = previous[i_previous]; + + if (current_item && includes(added, current_item)) { // added/moved-in locally or remotely + if (includes(snapshot, current_item)) { // added/moved-in remotely + const parent = parentRelationship(relationship, current_item); + if (parent.hasPrevious && parent.getPrevious()) { // moved-in remotely + output.push([current_item, Status.movedIn]); + } else { // added remotely + output.push([current_item, Status.added]); + } + } else { // added/moved-in locally + output.push([current_item, Status.unchanged]); + } + + i_current++; + } else if (previous_item && includes(removed, previous_item)) { // deleted/moved-out locally or remotely + if (!excludeRemoved) { + if (previous_item.isDeleted) { // deleted locally/remotely + if (!previous_item.hasSnapshot || previous_item.snapshotValue('isDeleted') === true) { // deleted remotely + output.push([previous_item, Status.deleted]); + } else { // deleted locally + // do not output + } + } else { // moved-out locally or remotely + if (includes(snapshot, previous_item)) { // moved-out locally + // do not output + } else { // moved-out remotely + output.push([previous_item, Status.movedOut]); + } + } + } + + i_previous++; + } else { + if (stableCurrent[i_stable] !== stablePrevious[i_stable]) { + output.push([current_item, Status.reordered]); + } else { + output.push([current_item, Status.unchanged]); + } + + i_stable++; + i_current++; + i_previous++; + } + } + + return <>{output.map(([entity, status], idx) => <> + {idx > 0 && separator} + {children({ + entity, + index: current.indexOf(entity), + status, + isAdded: status === Status.added, + isDeleted: status === Status.deleted, + isMovedIn: status === Status.movedIn, + isMovedOut: status === Status.movedOut, + isReordered: status === Status.reordered, + isUnchanged: status === Status.unchanged + })} + )}; +}; + +export default LiveRelationship; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/LiveText.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/LiveText.tsx new file mode 100644 index 000000000..4d1a67f1a --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/LiveText.tsx @@ -0,0 +1,51 @@ +import React, { ReactNode } from 'react'; +import { ITextFieldProps, Stack, Label, Text, ILabelStyles } from '@fluentui/react'; +import { ListItemEntity } from 'common/sharepoint'; +import { InfoTooltip } from './InfoTooltip'; +import LiveUpdate, { ITransformer, NonTransformer, StateType } from './LiveUpdate'; +import { getCurrentValue, LiveType } from './LiveUtils'; + +const labelStyles: ILabelStyles = { + root: { display: 'inline-block' } +}; + +interface IProps, P extends keyof E> extends ITextFieldProps { + entity: E; + propertyName: P; + label?: string; + labelAlign?: 'normal' | 'centered'; + tooltip?: string; + transformer?: ITransformer>; + children?: (val: LiveType, state: StateType) => ReactNode; +} + +const LiveText = , P extends keyof E>(props: IProps) => { + const { + entity, + propertyName, + label, + labelAlign = 'normal', + tooltip, + transformer = new NonTransformer(), + children = val => {val || '-'} + } = props; + + const value = transformer.transform(getCurrentValue(entity, propertyName)); + + return ( + + {(renderLiveUpdateMark) => <> + {label && + + + {renderLiveUpdateMark()} + + } + {children(value, 'current')} + {!label && renderLiveUpdateMark()} + } + + ); +}; + +export default LiveText; diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/LiveTextField.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/LiveTextField.tsx new file mode 100644 index 000000000..acb044217 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/LiveTextField.tsx @@ -0,0 +1,76 @@ +import React, { useCallback } from 'react'; +import { ITextFieldProps, TextField, Stack } from '@fluentui/react'; +import { ValidationRule, PropsOfType } from 'common'; +import { ListItemEntity } from 'common/sharepoint'; +import { InfoTooltip } from './InfoTooltip'; +import LiveUpdate from './LiveUpdate'; +import { getCurrentValue, LiveType, setValue } from './LiveUtils'; +import { Validation } from './Validation'; + +type DataType = string | number; + +interface IConverter { + parse: (val: string) => T; + toString: (val: T) => string; +} + +class NonConverter implements IConverter { + public parse(val: string) { return val; } + public toString(val: string) { return val; } +} + +interface IProps, P extends PropsOfType> extends ITextFieldProps { + entity: E; + propertyName: P; + converter?: IConverter>; + rules?: ValidationRule[]; + showValidationFeedback?: boolean; + liveUpdateMarkClassName?: string; + tooltip?: string; + updateField: (update: (data: E) => void, callback?: () => any) => void; +} + +const LiveTextField = , P extends PropsOfType>(props: IProps) => { + const { + entity, + propertyName, + converter = new NonConverter() as unknown as IConverter>, + rules, + showValidationFeedback, + label, + ariaLabel = label, + liveUpdateMarkClassName, + tooltip, + updateField + } = props; + + const value = converter.toString(getCurrentValue(entity, propertyName)); + const updateValue = useCallback((val: LiveType) => updateField(e => setValue(e, propertyName, val)), [updateField, propertyName]); + const renderValue = useCallback((val: LiveType) => <>{(converter ? converter.toString(val) : val) || '-'}, [converter]); + const onChange = useCallback((ev, val) => updateField(e => setValue(e, propertyName, converter ? converter.parse(val) : val as unknown as LiveType)), [updateField, propertyName, converter]); + + return ( + + + {(renderLiveUpdateMark) => <> + { + return label && + {defaultRender(textFieldProps)} + {renderLiveUpdateMark({ className: liveUpdateMarkClassName })} + ; + }} + value={value} + onChange={onChange} + /> + {!label && renderLiveUpdateMark({ className: liveUpdateMarkClassName })} + } + + + ); +}; + +export default LiveTextField; diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/LiveTimePicker.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/LiveTimePicker.tsx new file mode 100644 index 000000000..9ca36c865 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/LiveTimePicker.tsx @@ -0,0 +1,63 @@ +import { Duration } from 'moment-timezone'; +import React, { useCallback } from 'react'; +import { Label, Stack } from '@fluentui/react'; +import { ValidationRule, PropsOfType, now } from 'common'; +import { ListItemEntity } from 'common/sharepoint'; +import { InfoTooltip } from './InfoTooltip'; +import LiveUpdate from './LiveUpdate'; +import { ITimePickerProps, TimePicker } from './TimePicker'; +import { Validation } from './Validation'; +import { getCurrentValue, LiveType, setValue } from './LiveUtils'; + +type DataType = Duration; + +interface IProps, P extends PropsOfType, T extends DataType> extends Omit { + entity: E; + propertyName: P; + rules?: ValidationRule[]; + showValidationFeedback?: boolean; + tooltip?: string; + updateField: (update: (data: E) => void, callback?: () => any) => void; +} + +const LiveTimePicker = , P extends PropsOfType, T extends DataType>(props: IProps) => { + const { + entity, + propertyName, + rules, + showValidationFeedback, + label, + ariaLabel = label, + tooltip, + required, + updateField + } = props; + + const value = getCurrentValue(entity, propertyName) as T; + const updateValue = useCallback((val: LiveType) => updateField(e => setValue(e, propertyName, val)), [updateField, propertyName]); + const renderValue = useCallback((val: LiveType) => {now().startOf('day').add(val as Duration).format('LT')}, []); + const onChange = useCallback((value: Duration) => updateField(e => setValue(e, propertyName, value as LiveType)), [updateField, propertyName]); + + return ( + + + {(renderLiveUpdateMark) => <> + {label && + + {renderLiveUpdateMark()} + } + + {!label && renderLiveUpdateMark()} + } + + + ); +}; + +export default LiveTimePicker; diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/LiveToggle.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/LiveToggle.tsx new file mode 100644 index 000000000..50aa00dc7 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/LiveToggle.tsx @@ -0,0 +1,75 @@ +import React, { useCallback } from 'react'; +import { Toggle, IToggleProps, IToggleStyles, IButtonStyles } from '@fluentui/react'; +import { ValidationRule, PropsOfType } from 'common'; +import { ListItemEntity } from 'common/sharepoint'; +import { InfoTooltip } from './InfoTooltip'; +import LiveUpdate from './LiveUpdate'; +import { getCurrentValue, LiveType, setValue } from './LiveUtils'; +import { Validation } from './Validation'; + +import * as strings from "CommonStrings"; +import { useConst } from '@fluentui/react-hooks'; + +type DataType = boolean; + +const toggleStyles: Partial = { + label: { paddingBottom: 10 } +}; + +interface IProps, P extends PropsOfType> extends IToggleProps { + entity: E; + propertyName: P; + rules?: ValidationRule[]; + showValidationFeedback?: boolean; + tooltip?: string; + updateField: (update: (data: E) => void, callback?: () => any) => void; +} + +const LiveToggle = , P extends PropsOfType>(props: IProps) => { + const { + entity, + propertyName, + rules, + showValidationFeedback, + label, + ariaLabel = typeof label === 'string' ? label : undefined, + tooltip, + onText, + offText, + updateField + } = props; + + const value = getCurrentValue(entity, propertyName) as DataType; + const updateValue = useCallback((val: LiveType) => updateField(e => setValue(e, propertyName, val)), [updateField, propertyName]); + const renderValue = useCallback((val: LiveType) => <>{val ? (onText || strings.LiveUpdate.Toggle.OnText) : (offText || strings.LiveUpdate.Toggle.OffText)}, [onText, offText]); + const onChange = useCallback((ev, val: DataType) => updateField(e => setValue(e, propertyName, val as LiveType)), [updateField, propertyName]); + + const liveUpdateMarkStylesNoLabel: IButtonStyles = useConst({ + root: { position: 'absolute', right: -5, top: 5 } + }); + + return ( + + + {(renderLiveUpdateMark) => <> + + + {label} + {renderLiveUpdateMark()} + } + styles={toggleStyles} + checked={value} + onChange={onChange} + /> + {!label && renderLiveUpdateMark({ styles: liveUpdateMarkStylesNoLabel })} + + } + + + ); +}; + +export default LiveToggle; diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/LiveUpdate.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/LiveUpdate.tsx new file mode 100644 index 000000000..a56e5401f --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/LiveUpdate.tsx @@ -0,0 +1,287 @@ +import { isEqualWith, noop } from 'lodash'; +import { duration, Moment } from 'moment-timezone'; +import React, { FC, ReactNode, createRef, useState, memo, useMemo, CSSProperties } from 'react'; +import { format, IconButton, IButtonProps, Stack, ActionButton, Text, Persona, PersonaSize, IStackTokens, useTheme, IButtonStyles, concatStyleSets, TooltipHost, ICalloutContentStyles, IFocusTrapZoneProps, FocusTrapCallout, FocusZone } from '@fluentui/react'; +import { useConst } from '@fluentui/react-hooks'; +import { LocationFillIcon } from '@fluentui/react-icons-mdl2'; +import { now, PropsOfType, stateIsEqualCustomizer, stopPropagation, User } from 'common'; +import { useDirectoryService } from 'common/services'; +import { ListItemEntity } from 'common/sharepoint'; +import { getCurrentValue, getHasPreviousValue, getHasSnapshotValue, getPreviousValue, getSnapshotValue, LiveType } from './LiveUtils'; + +import { LiveUpdate as strings } from "CommonStrings"; + +import styles from './styles/LiveComponents.module.scss'; + +export type StateType = 'current' | 'previous' | 'snapshot'; + +const DefaultRecentlyModifiedWindow = duration(15, 'minutes'); +const humanizeDurationFromNow = (time: Moment) => duration(time.diff(now())).humanize(true); + +const editorStackTokens: IStackTokens = { childrenGap: 8 }; +const calloutStackTokens: IStackTokens = { childrenGap: 24 }; +const valueComparisonStackTokens: IStackTokens = { childrenGap: 8, padding: '0 0 0 26px' }; +const calloutStyles: Partial = { calloutMain: { padding: 1 } }; + +const EditorDetails: FC<{ label: string, editor: User, modified: Moment }> = memo(({ label, editor, modified }) => { + const { title, email, picture } = editor; + + return ( + + {label}, {humanizeDurationFromNow(modified)} + + + ); +}); + +export type ILiveUpdateMarkProps = IButtonProps; + +export interface ITransformer { + transform: (val: T) => T; + reverse: (val: T) => T; +} + +export class NonTransformer implements ITransformer { + public transform(val: T) { return val; } + public reverse(val: T) { return val; } +} + +export interface ILiveUpdateStyles { + entity: IButtonStyles; + field: IButtonStyles; +} + +interface IProps, P extends PropsOfType> { + entity: E; + propertyName?: P; + onlyShowEntityLifetimeEvents?: boolean; + transformer?: ITransformer>; + liveUpdateMarkStyles?: Partial; + compact?: boolean; + updateValue?: (val: LiveType) => void; + renderValue?: (val: LiveType, state: StateType) => ReactNode; + children: (renderLiveUpdateMark: (props?: ILiveUpdateMarkProps) => ReactNode) => ReactNode; +} + +const LiveUpdate = , P extends PropsOfType>({ + entity, + propertyName, + onlyShowEntityLifetimeEvents = false, + transformer = new NonTransformer(), + liveUpdateMarkStyles, + compact = false, + updateValue = noop, + renderValue = val => <>{val}, + children +}: IProps) => { + const { palette: { themePrimary } } = useTheme(); + const { currentUser } = useDirectoryService(); + const PeopleIconButtonRef = createRef(); + const [isCalloutOpen, setCalloutOpen] = useState(false); + const toggleCallout = stopPropagation(() => setCalloutOpen(!isCalloutOpen)); + const closeCallout = () => setCalloutOpen(false); + + const hasPropertyName = !!propertyName; + const { editor, created, modified, isNew, isDeleted } = entity; + const isMyOwnChange = isNew || (editor && User.equal(editor, currentUser)); + const isRecentlyModified = modified.isSameOrAfter(now().subtract(DefaultRecentlyModifiedWindow)); + const hasSnapshot = getHasSnapshotValue(entity, propertyName); + const hasPrevious = getHasPreviousValue(entity, propertyName) && (isCalloutOpen || hasSnapshot || isRecentlyModified); + const isNewItem = isRecentlyModified && modified.isSame(created); + + const currentValue = transformer.transform(getCurrentValue(entity, propertyName)); + const previousValue = (hasPrevious && hasPropertyName) ? transformer.transform(getPreviousValue(entity, propertyName)) : undefined; + const snapshotValue = (hasSnapshot && hasPropertyName) ? transformer.transform(getSnapshotValue(entity, propertyName)) : undefined; + + const previousValueChanged = hasPrevious && (!hasPropertyName || !isEqualWith(previousValue, hasSnapshot ? snapshotValue : currentValue, stateIsEqualCustomizer)); + const snapshotValueChanged = (hasSnapshot && hasPropertyName && !isEqualWith(currentValue, snapshotValue, stateIsEqualCustomizer)); + + const defaultStyles: ILiveUpdateStyles = useMemo(() => { + return { + entity: { + root: { color: themePrimary, height: 25 }, + label: { fontSize: 12, margin: 0 } + }, + field: { + root: { position: 'relative', top: 2, right: -2, height: 22, width: 22 }, + icon: { fontSize: 12 } + } + }; + }, [themePrimary]); + + const currentChangeDotStyle: CSSProperties = useMemo(() => { + return { color: themePrimary, position: 'absolute', left: 0, top: 2 }; + }, [themePrimary]); + + const renderLiveUpdateMark = (props: ILiveUpdateMarkProps = {}) => { + const entityLiveUpdateMarkStyles = concatStyleSets(defaultStyles.entity, liveUpdateMarkStyles?.entity, props.styles); + const fieldLiveUpdateMarkStyles = concatStyleSets(defaultStyles.field, liveUpdateMarkStyles?.field, props.styles); + + if (!isMyOwnChange) { + if (isNewItem && !hasPropertyName) { + return ( + + + + ); + } else if (isDeleted && !hasPropertyName) { + return ( + + + + ); + } else if (previousValueChanged && !isDeleted && !onlyShowEntityLifetimeEvents) { + if (!hasPropertyName) { + return ( + + + + ); + } else { + return ( + + + + ); + } + } + } + + return <>; + }; + const onRevertToOriginal = () => { updateValue(transformer.reverse(previousValue)); closeCallout(); }; + const onUndelete = () => { entity.undelete(); updateValue(transformer.reverse(currentValue)); closeCallout(); }; + const onTakeTheirs = () => { updateValue(transformer.reverse(snapshotValue)); closeCallout(); }; + const onKeepCurrent = closeCallout; + + const { ItemWasAdded, ItemWasDeleted, ItemWasEdited } = strings.Callout; + + const focusTrapProps = useConst({ + isClickableOutsideFocusTrap: true, + forceFocusInsideTrap: false, + }); + + return <> + {children(renderLiveUpdateMark)} + {(isNewItem || previousValueChanged) && isCalloutOpen && + + + {!hasPropertyName && + + + + + {format( + isNewItem ? ItemWasAdded : (isDeleted ? ItemWasDeleted : ItemWasEdited), + editor?.title, + humanizeDurationFromNow(modified) + )} + + + {isDeleted && hasSnapshot && + + {strings.Callout.UndeleteButton.Text} + + } + + } + + {hasPropertyName && + + {snapshotValueChanged && + + + + {renderValue(currentValue, 'current')} + + {strings.Callout.MyChangeLabel} + + + } + + + {!snapshotValueChanged && } + {renderValue(hasSnapshot ? snapshotValue : currentValue, hasSnapshot ? 'snapshot' : 'current')} + + + {hasSnapshot && (snapshotValueChanged + ? + {strings.Callout.TakeTheirsButton.Text} + + : + {strings.Callout.KeepTheirsButton.Text} + + )} + + + + {renderValue(previousValue, 'previous')} + + + {hasSnapshot && + + {strings.Callout.RevertToOriginalButton.Text} + + } + + + } + + + } + ; +}; + +export default LiveUpdate; diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/LiveUserPicker.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/LiveUserPicker.tsx new file mode 100644 index 000000000..2f7d4d596 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/LiveUserPicker.tsx @@ -0,0 +1,72 @@ +import { last } from 'lodash'; +import React, { useCallback } from 'react'; +import { ILabelStyles, Label, Stack } from '@fluentui/react'; +import { PropsOfType, ValidationRule, User } from 'common'; +import { ListItemEntity } from 'common/sharepoint'; +import { InfoTooltip } from './InfoTooltip'; +import LiveUpdate from './LiveUpdate'; +import { getCurrentValue, LiveType, setValue } from './LiveUtils'; +import { Validation } from './Validation'; +import UserPicker, { IUserPickerProps } from './UserPicker'; + +const labelStyles: ILabelStyles = { + root: { display: 'inline-block' } +}; + +interface IProps, P extends PropsOfType | PropsOfType> extends Omit { + entity: E; + propertyName: P; + rules?: ValidationRule[]; + showValidationFeedback?: boolean; + label?: string; + tooltip?: string; + required?: boolean; + onUsersChanging?: (users: User[]) => User[]; + updateField: (update: (data: E) => void, callback?: () => any) => void; +} + +const LiveUserPicker = , P extends PropsOfType | PropsOfType>(props: IProps) => { + const { + entity, + propertyName, + rules, + showValidationFeedback, + label, + tooltip, + required, + onUsersChanging = users => users, + updateField + } = props; + + const value = getCurrentValue(entity, propertyName) as (User | User[]); + const updateValue = useCallback((val: LiveType) => updateField(e => setValue(e, propertyName, val)), [updateField, propertyName]); + const renderValue = useCallback((val: LiveType) => Array.isArray(val) ? (val as User[]).map((v, idx) => {idx > 0 ? '; ' : ''}{v.title}) : (val as User)?.title || '', []); + const onChanged = useCallback((users: User[]) => { + users = onUsersChanging(users); + updateField(e => setValue(e, propertyName, (Array.isArray(value) ? users : last(users)) as LiveType)); + }, [onUsersChanging, updateField, propertyName, value]); + + return ( + + + {(renderLiveUpdateMark) => <> + {label && + + {renderLiveUpdateMark()} + } + + {!label && renderLiveUpdateMark()} + } + + + ); +}; + +export default LiveUserPicker; diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/LiveUtils.ts b/samples/react-rhythm-of-business-calendar/src/common/components/LiveUtils.ts new file mode 100644 index 000000000..5354fc04d --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/LiveUtils.ts @@ -0,0 +1,103 @@ +import { IManyToManyRelationship, IManyToOneRelationship, IOneToManyRelationship, ManyToManyRelationship, ManyToOneRelationship, OneToManyRelationship } from "common" +import { ListItemEntity } from "common/sharepoint"; + +const isOneToManyRelationship = (obj: any): obj is IOneToManyRelationship => + obj instanceof OneToManyRelationship + +const isManyToManyRelationship = (obj: any): obj is IManyToManyRelationship => + obj instanceof ManyToManyRelationship + +const isManyToOneRelationship = (obj: any): obj is IManyToOneRelationship => + obj instanceof ManyToOneRelationship + +export type LiveType, P extends keyof E> = + E[P] extends IManyToManyRelationship + ? T[] + : (E[P] extends IManyToOneRelationship + ? T + : (E[P] extends IOneToManyRelationship + ? never + : E[P] + ) + ); + +export type RelType, P extends keyof E> = + E[P] extends (IOneToManyRelationship | IManyToManyRelationship | IManyToOneRelationship) ? T : (E[P] extends Array ? T : E[P]); + +export const getCurrentValue = , P extends keyof E>(entity: E, propertyName: P): LiveType => { + const raw: E[P] = entity[propertyName]; + if (isManyToOneRelationship>(raw)) { + return raw.get() as LiveType; + } else if (isManyToManyRelationship>(raw)) { + return raw.get() as LiveType; + } else if (isOneToManyRelationship>(raw)) { + throw new Error('One-to-many relationships are not supported by the LiveUpdate component. Use LiveRelationship instead'); + } else { + return raw as LiveType; + } +}; + +export const getHasSnapshotValue = , P extends keyof E>(entity: E, propertyName: P): boolean => { + const raw: E[P] = entity[propertyName]; + if (isManyToOneRelationship>(raw)) { + return raw.hasSnapshot; + } else if (isManyToManyRelationship>(raw)) { + return raw.hasSnapshot; + } else if (isOneToManyRelationship>(raw)) { + throw new Error('One-to-many relationships are not supported by the LiveUpdate component. Use LiveRelationship instead'); + } else { + return entity.hasSnapshot; + } +}; + +export const getSnapshotValue = , P extends keyof E>(entity: E, propertyName: P): LiveType => { + const raw: E[P] = entity[propertyName]; + if (isManyToOneRelationship>(raw)) { + return raw.getSnapshot() as LiveType; + } else if (isManyToManyRelationship>(raw)) { + return raw.snapshotValue() as LiveType; + } else if (isOneToManyRelationship>(raw)) { + throw new Error('One-to-many relationships are not supported by the LiveUpdate component. Use LiveRelationship instead'); + } else { + return entity.snapshotValue(propertyName) as LiveType; + } +}; + +export const getHasPreviousValue = , P extends keyof E>(entity: E, propertyName: P): boolean => { + const raw: E[P] = entity[propertyName]; + if (isManyToOneRelationship>(raw)) { + return raw.hasPrevious; + } else if (isManyToManyRelationship>(raw)) { + return raw.hasPrevious; + } else if (isOneToManyRelationship>(raw)) { + throw new Error('One-to-many relationships are not supported by the LiveUpdate component. Use LiveRelationship instead'); + } else { + return entity.hasPrevious; + } +}; + +export const getPreviousValue = , P extends keyof E>(entity: E, propertyName: P): LiveType => { + const raw: E[P] = entity[propertyName]; + if (isManyToOneRelationship>(raw)) { + return raw.getPrevious() as LiveType; + } else if (isManyToManyRelationship>(raw)) { + return raw.previousValue() as LiveType; + } else if (isOneToManyRelationship>(raw)) { + throw new Error('One-to-many relationships are not supported by the LiveUpdate component. Use LiveRelationship instead'); + } else { + return entity.previousValue(propertyName) as LiveType; + } +}; + +export const setValue = , P extends keyof E>(entity: E, propertyName: P, val: LiveType) => { + const raw: E[P] = entity[propertyName]; + if (isManyToOneRelationship>(raw)) { + raw.set(val as RelType); + } else if (isManyToManyRelationship>(raw)) { + raw.set(val as RelType[]); + } else if (isOneToManyRelationship>(raw)) { + throw new Error('One-to-many relationships are not supported by the LiveUpdate component. Use LiveRelationship instead'); + } else { + entity[propertyName] = val as E[P]; + } +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/Localize.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/Localize.tsx new file mode 100644 index 000000000..08048f60b --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/Localize.tsx @@ -0,0 +1,22 @@ +import React, { FC, ReactElement } from "react"; +import { Text } from '@fluentui/react'; + +interface IProps { + phrase: string; + skipFirstTextPart?: boolean; + components: { [token: string]: ReactElement }; +} + +export const Localize: FC = ({ phrase, skipFirstTextPart, components }) => { + const matches = [...phrase.matchAll(/{(?.+?)}|(?[^{]+)/g)]; + return <>{matches.map(({ groups: { text: textPart, token: componentPart } }, idx) => { + textPart = textPart?.trim(); + if (textPart && (!skipFirstTextPart || idx > 0)) + return {textPart}; + else if (componentPart) + return components[componentPart]; + })}; +}; + +export const firstTextPart = (phrase: string) => + phrase.match(/{.+?}|(?[^{]+)/).groups.text \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/ResponsiveGrid.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/ResponsiveGrid.tsx new file mode 100644 index 000000000..6b7ca8933 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/ResponsiveGrid.tsx @@ -0,0 +1,124 @@ +import React, { FC, ReactNode } from 'react'; +import { css } from '@fluentui/react'; + +interface IGridProps { + className?: string; + children?: ReactNode; +} + +export const ResponsiveGrid: FC = ({ className, children }) => +
+ {children} +
; + + +interface IRowProps { + className?: string; + children?: ReactNode; +} + +export const GridRow: FC = ({ className, children }) => +
+ {children} +
; + +type ColumnCount = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12; +type PushPullCount = Exclude; + +interface IColumnProps { + className?: string; + children?: ReactNode; + sm?: ColumnCount; + md?: ColumnCount; + lg?: ColumnCount; + xl?: ColumnCount; + xxl?: ColumnCount; + xxxl?: ColumnCount; + + smPush?: PushPullCount; + mdPush?: PushPullCount; + lgPush?: PushPullCount; + xlPush?: PushPullCount; + xxlPush?: PushPullCount; + xxxlPush?: PushPullCount; + + smPull?: PushPullCount; + mdPull?: PushPullCount; + lgPull?: PushPullCount; + xlPull?: PushPullCount; + xxlPull?: PushPullCount; + xxxlPull?: PushPullCount; + + hiddenSm?: boolean; + hiddenMd?: boolean; + hiddenMdDown?: boolean; + hiddenMdUp?: boolean; + hiddenLg?: boolean; + hiddenLgDown?: boolean; + hiddenLgUp?: boolean; + hiddenXl?: boolean; + hiddenXlDown?: boolean; + hiddenXlUp?: boolean; + hiddenXxl?: boolean; + hiddenXxlDown?: boolean; + hiddenXxlUp?: boolean; + hiddenXxxl?: boolean; +} + +const buildGridColClassName = ({ + className, + sm = 12, md, lg, xl, xxl, xxxl, + smPush, mdPush, lgPush, xlPush, xxlPush, xxxlPush, + smPull, mdPull, lgPull, xlPull, xxlPull, xxxlPull, + hiddenSm, hiddenMd, hiddenMdDown, hiddenMdUp, hiddenLg, hiddenLgDown, hiddenLgUp, hiddenXl, hiddenXlDown, hiddenXlUp, hiddenXxl, hiddenXxlDown, hiddenXxlUp, hiddenXxxl +}: IColumnProps) => { + return css( + 'ms-Grid-col', + { + ['ms-sm' + sm]: true, // always specify column count on small and up screens + ['ms-md' + md]: !!md, // only specify column count for medium and up screens if md value is provided + ['ms-lg' + lg]: !!lg, + ['ms-xl' + xl]: !!xl, + ['ms-xxl' + xxl]: !!xxl, + ['ms-xxxl' + xxxl]: !!xxxl + }, + { + ['ms-smPush' + smPush]: !!smPush, + ['ms-mdPush' + mdPush]: !!mdPush, + ['ms-lgPush' + lgPush]: !!lgPush, + ['ms-xlPush' + xlPush]: !!xlPush, + ['ms-xxlPush' + xxlPush]: !!xxlPush, + ['ms-xxxlPush' + xxxlPush]: !!xxxlPush + }, + { + ['ms-smPull' + smPull]: !!smPull, + ['ms-mdPull' + mdPull]: !!mdPull, + ['ms-lgPull' + lgPull]: !!lgPull, + ['ms-xlPull' + xlPull]: !!xlPull, + ['ms-xxlPull' + xxlPull]: !!xxlPull, + ['ms-xxxlPull' + xxxlPull]: !!xxxlPull + }, + { + 'ms-hiddenSm': hiddenSm, + 'ms-hiddenMd': hiddenMd, + 'ms-hiddenMdDown': hiddenMdDown, + 'ms-hiddenMdUp': hiddenMdUp, + 'ms-hiddenLLg': hiddenLg, + 'ms-hiddenLLgDown': hiddenLgDown, + 'ms-hiddenLLgUp': hiddenLgUp, + 'ms-hiddenLXl': hiddenXl, + 'ms-hiddenLXlDown': hiddenXlDown, + 'ms-hiddenLXlUp': hiddenXlUp, + 'ms-hiddenLXxl': hiddenXxl, + 'ms-hiddenLXxlDown': hiddenXxlDown, + 'ms-hiddenLXxlUp': hiddenXxlUp, + 'ms-hiddenLXxxl': hiddenXxxl + }, + className + ); +}; + +export const GridCol: FC = ({ children, ...classNameParameters }) => +
+ {children} +
; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/SharePointApp.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/SharePointApp.tsx new file mode 100644 index 000000000..f08949997 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/SharePointApp.tsx @@ -0,0 +1,130 @@ +import { noop, isEqual } from 'lodash'; +import React, { ReactElement, ReactNode, Component, CSSProperties } from "react"; +import { initializeIcons, Shimmer, ThemeProvider as FluentThemeProvider } from "@fluentui/react"; +import { ISPFXContext } from '@pnp/common'; +import { graph } from "@pnp/graph"; +import { sp } from "@pnp/sp"; +import { ThemeProvider as SPThemeProvider, ThemeChangedEventArgs, IReadonlyTheme, BaseComponent } from '@microsoft/sp-component-base'; +import { IMicrosoftTeams } from '@microsoft/sp-webpart-base'; +import { perf } from 'common'; +import { ServiceManager, ServicesType, ServicesProvider, ServiceDescriptorArray, SpfxContext } from "common/services"; + +require('office-ui-fabric-react/dist/css/fabric.min.css'); + +initializeIcons(); + +const fluentRootStyle: CSSProperties = { height: '100%' }; + +interface IProps { + appName: string; + companyName: string; + spfxComponent: BaseComponent; + spfxContext: SpfxContext; + teams: IMicrosoftTeams; + serviceDescriptors: D; + shimmerElements?: ReactNode; + onInitBeforeServices?: () => Promise; + onInitAfterServices?: (services: ServicesType) => Promise; + children: (services: ServicesType) => ReactElement; +} + +interface IState { + serviceManager: ServiceManager; +} + +export class SharePointApp extends Component, IState> { + private _themeProvider: SPThemeProvider; + private _theme: IReadonlyTheme; + + constructor(props: IProps) { + super(props); + + this.state = { + serviceManager: null + }; + } + + public async componentDidMount() { + const { spfxComponent, spfxContext, onInitBeforeServices = noop, onInitAfterServices } = this.props; + + try { + this._configurePnP(); + + const [ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _unused, + serviceManager + ] = await Promise.all([ + onInitBeforeServices(), + this._createServiceManager() + ]); + + this._themeProvider = spfxContext.serviceScope.consume(SPThemeProvider.serviceKey); + this._themeProvider.themeChangedEvent.add(spfxComponent, this._onThemeChanged); + this._theme = this._themeProvider.tryGetTheme(); + + if (onInitAfterServices) { + await perf('SharePointApp.onInitAfterServices', () => onInitAfterServices(serviceManager.services)); + } + + this.setState({ serviceManager }); + } catch (e) { + console.error(e); + } + } + + public componentWillUnmount() { + const { spfxComponent } = this.props; + + if (this._themeProvider) + this._themeProvider.themeChangedEvent.remove(spfxComponent, this._onThemeChanged); + } + + private readonly _onThemeChanged = ({ theme }: ThemeChangedEventArgs) => { + if (!isEqual(this._theme, theme)) { + this._theme = theme; + this.forceUpdate(); + } + } + + private _configurePnP() { + const { appName, companyName, spfxContext } = this.props; + const { version } = spfxContext.manifest; + const xClientTag = `${companyName}|${appName}/${version}`; + + sp.setup({ + spfxContext: spfxContext as unknown as ISPFXContext, + sp: { + headers: { + "X-ClientTag": xClientTag, + "User-Agent": xClientTag + } + } + }); + + graph.setup(spfxContext as unknown as ISPFXContext); + } + + private readonly _createServiceManager = (): Promise> => { + const { appName, spfxComponent, spfxContext, teams, serviceDescriptors } = this.props; + + return ServiceManager.create(appName, spfxComponent, spfxContext, teams, {}, serviceDescriptors); + } + + public render(): ReactElement> { + const { children, shimmerElements } = this.props; + const { serviceManager } = this.state; + + return ( + + + {!!serviceManager && + + {children(serviceManager.services)} + + } + + + ); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/TimePicker.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/TimePicker.tsx new file mode 100644 index 000000000..482e30d89 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/TimePicker.tsx @@ -0,0 +1,104 @@ +import React, { FC, FormEvent, useCallback, useMemo } from "react"; +import { duration, Duration } from "moment-timezone"; +import { css, DefaultButton, Dropdown, IDropdownOption, Label } from "@fluentui/react"; +import { now } from "common"; + +import styles from "./styles/TimePicker.module.scss"; + +const HoursOptions: IDropdownOption[] = [ + { key: 1, text: '1' }, + { key: 2, text: '2' }, + { key: 3, text: '3' }, + { key: 4, text: '4' }, + { key: 5, text: '5' }, + { key: 6, text: '6' }, + { key: 7, text: '7' }, + { key: 8, text: '8' }, + { key: 9, text: '9' }, + { key: 10, text: '10' }, + { key: 11, text: '11' }, + { key: 0, text: '12' } +]; + +const MinutesOptions: IDropdownOption[] = [ + { key: 0, text: '00' }, + { key: 15, text: '15' }, + { key: 30, text: '30' }, + { key: 45, text: '45' }, +]; + +export interface ITimePickerProps { + className?: string; + disabled?: boolean; + label?: string; + ariaLabel?: string; + required?: boolean; + value: Duration; + onChange: (value: Duration) => void; +} + +export const TimePicker: FC = ({ + className, + disabled, + label, + ariaLabel = label, + required = false, + value = duration({ hours: now().hours() }), + onChange + +}) => { + const time = useMemo(() => { + return { + hour: value.hours() % 12, + minute: Math.floor(value.minutes() / 15) * 15, // round down to the closest 15-minute increment + ampm: value.hours() >= 12 + }; + }, [value]); + + const constructDuration = useCallback((hour: number, minute: number, ampm: boolean) => + duration({ hours: hour + (ampm ? 12 : 0), minutes: minute }) + , []); + + const onHourChanged = useCallback((ev: FormEvent, option: IDropdownOption) => { + const newHour = option.key as number; + onChange(constructDuration(newHour, time.minute, time.ampm)); + }, [time, onChange, constructDuration]); + + const onMinuteChanged = useCallback((ev: FormEvent, option: IDropdownOption) => { + const newMinute = option.key as number; + onChange(constructDuration(time.hour, newMinute, time.ampm)); + }, [time, onChange, constructDuration]); + + const onAMPMClicked = useCallback(() => { + onChange(constructDuration(time.hour, time.minute, !time.ampm)); + }, [time, onChange, constructDuration]); + + return ( +
+ {label && } +
+ + + + {time.ampm ? 'PM' : 'AM'} + +
+
+ ); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/UserList.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/UserList.tsx new file mode 100644 index 000000000..e35600cfe --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/UserList.tsx @@ -0,0 +1,38 @@ +import { isEmpty } from "lodash"; +import React, { FC } from "react"; +import { css, Label, Persona, PersonaSize } from "@fluentui/react"; +import { User } from "../User"; + +import styles from "./styles/UserList.module.scss"; + +interface IProps { + users: User[]; + className?: string; + label?: string; + size?: PersonaSize; +} + +const renderUser = (user: User, size: PersonaSize = PersonaSize.size24) => + ; + +export const UserList: FC = ({ + className, + label, + users, + size +}: IProps) => <> + {label && } +
+ {isEmpty(users) + ? <>  + : users.sort(User.TitleAscComparer).map(user => renderUser(user, size)) + } +
+ ; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/UserPicker.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/UserPicker.tsx new file mode 100644 index 000000000..585999dbd --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/UserPicker.tsx @@ -0,0 +1,181 @@ +import { isEmpty } from "lodash"; +import React, { FC, useCallback, useMemo } from "react"; +import { PrincipalType } from "@pnp/sp"; +import { IPeoplePickerProps, ListPeoplePicker, NormalPeoplePicker, CompactPeoplePicker, IPersonaProps, Label, css, useTheme, PeoplePickerItem, IPeoplePickerItemSelectedProps, IPeoplePickerItemSelectedStyles } from '@fluentui/react'; +import { IDirectoryService, useDirectoryService } from 'common/services'; +import { SharePointGroup } from "common/sharepoint"; +import { User } from '../User'; +import { InfoTooltip } from "./InfoTooltip"; + +import * as cstrings from 'CommonStrings'; +import styles from './styles/UserPicker.module.scss'; + +const maximumSuggestions = 10; + +export enum UserPickerDisplayOption { + Normal, + List, + Compact +} + +export type OnChangedCallback = (users: User[]) => void; + +export interface IUserPickerProps { + className?: string; + label?: string; + ariaLabel?: string; + tooltip?: string; + disabled?: boolean; + required?: boolean; + display?: UserPickerDisplayOption; + users: User[]; + onChanged: OnChangedCallback; + restrictPrincipalType?: PrincipalType; + restrictToGroupMembers?: SharePointGroup; +} + +interface IUserPersonaProps extends IPersonaProps { + user: User; +} + +const userToUserPersona = (user: User): IUserPersonaProps => { + return { + imageUrl: user.picture, + text: user.title, + secondaryText: user.email, + user: user + }; +}; + +const containsUser = (list: User[], user: User) => { + return list.some(item => item.email === user.email); +}; + +const removeDuplicateUsers = (suggestedUsers: User[], currentUsers: User[]) => { + return suggestedUsers.filter(user => !containsUser(currentUsers, user)); +}; + +const extractEmailAddress = (input: string): string => { + const emailAddress = /<.+?>/g.exec(input); + + if (emailAddress && emailAddress[0]) { + return emailAddress[0].substring(1, emailAddress[0].length - 1).trim(); + } else { + return input.trim(); + } +}; +const extractEmailAddresses = (input: string): string[] => { + return input.split(';').map(extractEmailAddress).filter(Boolean).map(e => e.toLocaleLowerCase()); +}; + +const isListOfEmailAddresses = (input: string): boolean => { + return input.indexOf(';') !== -1 && input.length > 10; +}; + +const resolveSuggestions = async (searchText: string, currentUserPersonas: IUserPersonaProps[], directoryService: IDirectoryService, onChangedFn: OnChangedCallback, restrictToGroupMembers?: SharePointGroup, restrictPrincipalType?: PrincipalType): Promise => { + if (!searchText) return []; + searchText = searchText.toLocaleLowerCase(); + + const currentUsers = currentUserPersonas.map(userPersona => userPersona.user); + + if (isListOfEmailAddresses(searchText)) { + const extractedEmails = extractEmailAddresses(searchText); + let resolvedUsers: User[]; + + if (restrictToGroupMembers) + resolvedUsers = restrictToGroupMembers.members.filter(member => extractedEmails.some(email => member.email === email)); + else + resolvedUsers = await directoryService.resolve(extractedEmails); + + const nextUsers = [ + ...currentUsers, + ...removeDuplicateUsers(resolvedUsers, currentUsers) + ]; + + onChangedFn(nextUsers); + + return []; + } + else { + let suggestedUsers: User[]; + + if (restrictToGroupMembers) + suggestedUsers = restrictToGroupMembers.members.filter(member => member.title?.toLocaleLowerCase().includes(searchText) || member.email?.toLocaleLowerCase().includes(searchText)); + else + suggestedUsers = await directoryService.search(searchText, restrictPrincipalType); + + suggestedUsers = suggestedUsers.slice(0, maximumSuggestions); + + return removeDuplicateUsers(suggestedUsers, currentUsers).map(userToUserPersona); + } +}; + +const UserPicker: FC = ({ + className, + display = UserPickerDisplayOption.Normal, + disabled, + label, + ariaLabel, + required, + tooltip, + users, + onChanged, + restrictToGroupMembers, + restrictPrincipalType +}) => { + const { palette: { neutralLight } } = useTheme(); + const directory = useDirectoryService(); + const userPersonas = users.map(userToUserPersona); + const role = !isEmpty(userPersonas) ? "list" : "none"; + + const onChange = (items: IPersonaProps[]) => { + if (!disabled) + onChanged((items as IUserPersonaProps[]).map(userPersona => userPersona.user)); + }; + + const onResolveSuggestions = (filter: string, selectedItems: IPersonaProps[]) => + resolveSuggestions(filter, selectedItems as IUserPersonaProps[], directory, onChanged, restrictToGroupMembers, restrictPrincipalType); + + const fixHighContrastPeoplePickerItemStyles = useMemo(() => { + return { root: { backgroundColor: neutralLight } } as IPeoplePickerItemSelectedStyles; + }, [neutralLight]); + + const onRenderItem = useCallback( + (props: IPeoplePickerItemSelectedProps) => , + [fixHighContrastPeoplePickerItemStyles] + ); + + const renderPicker = () => { + const peoplePickerProps: IPeoplePickerProps = { + selectedItems: userPersonas, + onResolveSuggestions, + onChange, + disabled, + inputProps: { 'aria-label': ariaLabel || label }, + removeButtonAriaLabel: cstrings.UserPicker.RemoveAriaLabel, + onRenderItem + }; + + switch (display) { + case UserPickerDisplayOption.Normal: + return ; + case UserPickerDisplayOption.List: + return ; + case UserPickerDisplayOption.Compact: + return ; + } + }; + + return ( +
+ {label && + + + + } + {renderPicker()} +
+ ); +}; + +export default UserPicker; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/Validation.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/Validation.tsx new file mode 100644 index 000000000..1fc7c7feb --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/Validation.tsx @@ -0,0 +1,48 @@ +import { isFunction } from "lodash"; +import React from "react"; +import { css, DelayedRender } from "@fluentui/react"; +import { ErrorIcon } from "@fluentui/react-icons-mdl2"; +import { Entity } from "../Entity"; +import { ValidationRule } from "../ValidationRules"; + +export interface IValidationProps> extends React.HTMLAttributes>> { + active: boolean; + entity: E; + rules: ValidationRule[]; +} + +export const Validation = >(props: IValidationProps) => { + const { + active, + entity, + rules = [], + children + } = props; + + let valid = true; + let failMessage = ""; + + rules.filter(Boolean).forEach(rule => { + if (valid) { + valid = rule.validate(entity); + if (!valid) { + failMessage = isFunction(rule.failMessage) ? rule.failMessage(entity) : rule.failMessage; + } + } + }); + + return ( +
+ {children} + {active && !valid && + +

+ +   + {failMessage} +

+
+ } +
+ ); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/WebPartTitle.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/WebPartTitle.tsx new file mode 100644 index 000000000..16098d0da --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/WebPartTitle.tsx @@ -0,0 +1,20 @@ +import React from "react"; +import { css, Label } from '@fluentui/react'; + +import styles from "./styles/WebPartTitle.module.scss"; + +export interface IWebPartTitleProps { + title: string; + className?: string; + show?: boolean; + children?: React.ReactNode; +} + +export const WebPartTitle: React.FC = ({ className, show = true, title, children }: IWebPartTitleProps) => { + return ( +
+ {show && } + {children} +
+ ); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/Wizard.tsx b/samples/react-rhythm-of-business-calendar/src/common/components/Wizard.tsx new file mode 100644 index 000000000..edb2d4046 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/Wizard.tsx @@ -0,0 +1,458 @@ +import { noop } from "lodash"; +import React, { Component, ReactElement, ReactNode } from "react"; +import { css, DefaultButton, PrimaryButton, IconButton, MessageBar, MessageBarType, Spinner, SpinnerSize, Stack, StackItem } from "@fluentui/react"; +import { CircleRingIcon, CompletedSolidIcon, RadioBtnOnIcon } from "@fluentui/react-icons-mdl2"; +import { IWizardStrings } from "../Localization"; + +import * as cstrings from "CommonStrings"; +import styles from "./styles/Wizard.module.scss"; + +export type WizardData = {}; + +export interface IButtonRenderProps { + defaultBackButton: ReactNode; + defaultNextButton: ReactNode; + disabled: boolean; + isFowardOnly: boolean; + isFirstStep: boolean; + isLastStep: boolean; + wizardStrings: IWizardStrings; + data: D; + onBack: () => void; + onNext: () => void; +} + +export interface IWizardPageMetadata { + title?: string; + forwardOnly?: boolean; + onRenderButtons?: (props: IButtonRenderProps) => ReactNode; +} + +export interface IWizardPageProps { + data: D; + onClickEdit?: (pageIndex: number) => void; + children?: React.ReactNode; +} + +export interface IWizardStepProps extends IWizardPageProps { + stepNumber?: number; + totalStepCount?: number; + validateFn: (fn: () => boolean) => void; + deactivateFn: (fn: () => Promise) => void; +} + +export type PageRenderer = IWizardPageProps> = React.FC

; +export type StepRenderer = IWizardStepProps> = PageRenderer & IWizardPageMetadata; + +export interface IWizardProps { + data: D; + headingLabel?: string; + heading?: ReactElement; + className?: string; + panel?: boolean; + strings?: Partial; + startPage?: PageRenderer; + stepPages: StepRenderer[]; + successPage?: PageRenderer; + successPageTimeout?: number; + execute?: (config: D) => Promise; + initialize?: () => Promise; + onWizardComplete?: () => void; + onDiscard?: () => void; +} + +export interface IWizardState { + currentPageIndex: number; + error: any; +} + +abstract class WizardPage = IWizardPageProps> { + constructor( + private readonly _renderer: PageRenderer, + protected readonly wizardStrings: IWizardStrings + ) { + } + + public async activate(): Promise { + } + + public valid(): boolean { + return true; + } + + public async deactivate(): Promise { + } + + public get autoContinue(): boolean { + return false; + } + + public renderPage(props: P): React.ReactNode { + const Page = this._renderer; + return ; + } + + public renderFooterButtons(props: IWizardPageProps, disabled: boolean): ReactNode { + return <>; + } +} + +class WizardStartPage extends WizardPage { + constructor( + renderer: PageRenderer, + wizardStrings: IWizardStrings, + private readonly _onClickStart: () => void + ) { + super(renderer, wizardStrings); + } + + public renderFooterButtons(props: IWizardPageProps, disabled: boolean): ReactNode { + return <> + + ; + } +} + +class WizardStepPage extends WizardPage> { + private _validateFn: () => boolean; + private _deactivateFn: () => Promise; + + constructor( + public readonly renderer: StepRenderer, + wizardStrings: IWizardStrings, + private readonly _stepNumber: number, + private readonly _totalStepCount: number, + private readonly _onClickBack: () => void, + private readonly _onClickNext: () => void + ) { + super(renderer, wizardStrings); + } + + public valid(): boolean { + return this._validateFn ? this._validateFn() : true; + } + + public async deactivate(): Promise { + if (this._deactivateFn) + await this._deactivateFn(); + } + + protected get isStep(): boolean { + return !!this._stepNumber; + } + + protected get isFirstStep(): boolean { + return this._stepNumber === 1; + } + + protected get isLastStep(): boolean { + return this._stepNumber === this._totalStepCount; + } + + public renderPage(props: IWizardStepProps): React.ReactNode { + if (this.isStep) { + props.stepNumber = this._stepNumber; + props.totalStepCount = this._totalStepCount; + } + + return super.renderPage({ + ...props, + validateFn: fn => this._validateFn = fn, + deactivateFn: fn => this._deactivateFn = fn + }); + } + + public renderFooterButtons(props: IWizardPageProps, disabled: boolean): ReactNode { + const { BackButton, NextButton, FinishButton } = this.wizardStrings; + const backButtonText = BackButton.Text; + const nextButtonText = this.isLastStep ? FinishButton.Text : NextButton.Text; + const isFowardOnly = !!this.renderer.forwardOnly; + + let defaultBackButton: ReactNode; + let defaultNextButton: ReactNode; + + if (this.isFirstStep || isFowardOnly) { + defaultBackButton = <>; + defaultNextButton = ; + } else { + defaultBackButton = ; + defaultNextButton = ; + } + + const renderProps: IButtonRenderProps = { + data: props.data, + defaultBackButton, + defaultNextButton, + disabled, + isFowardOnly, + isFirstStep: this.isFirstStep, + isLastStep: this.isLastStep, + wizardStrings: this.wizardStrings, + onBack: this._onClickBack, + onNext: this._onClickNext + }; + + const { onRenderButtons } = this.renderer; + return onRenderButtons ? onRenderButtons(renderProps) : this._defaultRenderFooterButtons(renderProps); + } + + private _defaultRenderFooterButtons(props: IButtonRenderProps): ReactNode { + const { defaultBackButton, defaultNextButton } = props; + + return <> + {defaultBackButton} + {defaultNextButton} + ; + } +} + +class WizardInitializePage extends WizardPage { + constructor( + wizardStrings: IWizardStrings, + private readonly _initialize: () => Promise + ) { + super(null, wizardStrings); + } + + public async activate() { + await this._initialize(); + } + + public get autoContinue(): boolean { + return true; + } + + public renderPage(props: IWizardPageProps): React.ReactNode { + return ; + } +} + +class WizardExecutePage extends WizardPage { + constructor( + wizardStrings: IWizardStrings, + private readonly _execute: () => Promise + ) { + super(null, wizardStrings); + } + + public async activate() { + await this._execute(); + } + + public get autoContinue(): boolean { + return true; + } + + public renderPage(props: IWizardPageProps): React.ReactNode { + return ; + } +} + +class WizardSuccessPage extends WizardPage { + constructor( + step: PageRenderer, + wizardStrings: IWizardStrings, + private readonly _timeout: number, + private readonly _onWizardComplete: () => void + ) { + super(step, wizardStrings); + } + + public async activate() { + setTimeout(this._onWizardComplete, this._timeout); + } +} + +export class Wizard extends Component, IWizardState> { + private static readonly defaultProps: Partial> = { + successPageTimeout: 2500, + onWizardComplete: noop + }; + + private readonly _pages: WizardPage[]; + + constructor(props: IWizardProps) { + super(props); + + const wizardStrings = { ...cstrings.Wizard, ...props.strings }; + this._pages = this._buildPages(props, wizardStrings); + + this.state = { + currentPageIndex: -1, + error: null + }; + } + + public componentDidMount() { + this._nextPage(); + } + + private readonly _goToPage = async (pageIndex: number) => { + const currentPageIndex = this.state.currentPageIndex; + const currentPage = this._pages[currentPageIndex]; + const isValid = currentPage ? currentPage.valid() : true; + + if (isValid && pageIndex < this._pages.length) { + if (currentPage) { + await currentPage.deactivate(); + } + + const newPage = this._pages[pageIndex]; + + this.setState({ + currentPageIndex: pageIndex + }); + + try { + await newPage.activate(); + } catch (e) { + console.error(e); + this.setState({ error: e }); + } + } + } + + private readonly _buildPages = (props: IWizardProps, wizardStrings: IWizardStrings): WizardPage[] => { + const pages: WizardPage[] = []; + + if (props.startPage) { + const page = new WizardStartPage(props.startPage, wizardStrings, this._nextPage); + pages.push(page); + } + + if (props.initialize) { + const page = new WizardInitializePage(wizardStrings, props.initialize); + pages.push(page); + } + + props.stepPages.forEach((step, index, steps) => { + const page = new WizardStepPage(step, wizardStrings, index + 1, steps.length, this._previousPage, this._nextPage); + pages.push(page); + }); + + if (props.execute) { + const page = new WizardExecutePage(wizardStrings, () => props.execute(props.data)); + pages.push(page); + } + + if (props.successPage) { + const page = new WizardSuccessPage(props.successPage, wizardStrings, props.successPageTimeout, props.onWizardComplete); + pages.push(page); + } + + return pages; + } + + private readonly _previousPage = () => { + const currentPageIndex = this.state.currentPageIndex; + const newPageIndex = currentPageIndex - 1; + const currentPage = this._pages[currentPageIndex]; + const isValid = currentPage ? currentPage.valid() : true; + + if (isValid) { + if (newPageIndex >= 0) { + this._pages[currentPageIndex].deactivate(); + this._pages[newPageIndex].activate(); + + this.setState({ + currentPageIndex: newPageIndex + }); + } + } + } + + private readonly _nextPage = async () => { + const currentPageIndex = this.state.currentPageIndex; + const newPageIndex = currentPageIndex + 1; + const isLastPage = currentPageIndex === this._pages.length - 1; + const currentPage = this._pages[currentPageIndex]; + const isValid = currentPage ? currentPage.valid() : true; + + if (isValid) { + if (currentPage) { + await currentPage.deactivate(); + } + + if (isLastPage) { + this.props.onWizardComplete(); + } else { + const newPage = this._pages[newPageIndex]; + + this.setState({ + currentPageIndex: newPageIndex + }); + + try { + await newPage.activate(); + } catch (e) { + console.error(e); + this.setState({ error: e }); + } + + if (newPage.autoContinue) { + this._nextPage(); + } + } + } + } + + private readonly _renderProgressBar = () => { + const { onDiscard } = this.props; + const { currentPageIndex } = this.state; + const stepPages = this._pages.filter(page => page instanceof WizardStepPage).map(page => page as WizardStepPage); + + if (this._pages[currentPageIndex] instanceof WizardStartPage || stepPages.length === 0) + return; + + return ( + + {stepPages.map((page, idx) => { + const PageIcon = idx < currentPageIndex ? CompletedSolidIcon : (idx === currentPageIndex ? RadioBtnOnIcon : CircleRingIcon); + const className = css(styles.statusIndicator, { [styles.futurePage]: idx > currentPageIndex }); + return ( + + +

{page.renderer.title}
+ + ); + })} + {onDiscard && + + } + + ); + } + + public render(): React.ReactElement> { + const { data, className, headingLabel, heading } = this.props; + const { currentPageIndex, error } = this.state; + + const currentPage = this._pages[currentPageIndex]; + const pageProps: IWizardPageProps = { + data, + onClickEdit: this._goToPage + }; + + return ( +
+
+ {heading || (headingLabel &&

{headingLabel}

)} +
+ {this._renderProgressBar()} + + {!error + ? currentPage?.renderPage(pageProps) + : {cstrings.GenericError} + } + + + {currentPage?.renderFooterButtons(pageProps, !!error)} + +
+ ); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/index.ts b/samples/react-rhythm-of-business-calendar/src/common/components/index.ts new file mode 100644 index 000000000..2e1437099 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/index.ts @@ -0,0 +1,37 @@ +export { AsyncDataComponent } from './AsyncDataComponent'; +export { AsyncOverlay } from './AsyncOverlay'; +export { ConfirmDialog } from './ConfirmDialog'; +export { CalendarPicker, CalendarDefaultStrings } from "./CalendarPicker"; +export { CalloutColorPicker } from "./CalloutColorPicker"; +export { DataDialogBase, IDataDialogBase, IDataDialogBaseProps, IDataDialogBaseState, DataDialogMode } from './DataDialogBase'; +export { DataPanelBase, IDataPanelBase, IDataPanelBaseProps, IDataPanelBaseState, DataPanelMode, UpdateDataCallback } from './DataPanelBase'; +export { DataComponentBase, IDataComponentBase, IDataComponentBaseProps, IDataComponentBaseState, DataComponentMode } from './DataComponentBase'; +export { DateRotator } from './DateRotator'; +export { EntityDialogBase, IEntityDialogProps } from './EntityDialogBase'; +export { EntityPanelBase, IEntityPanelProps } from './EntityPanelBase'; +export { EntityComponentBase, IEntityComponentProps } from './EntityComponentBase'; +export { InfoTooltip } from './InfoTooltip'; +export { LengthLimitedTextField } from './LengthLimitedTextField'; +export { LengthOfTimePicker } from './LengthOfTimePicker'; +export { default as LiveCheckbox } from './LiveCheckbox'; +export { default as LiveChoiceGroup } from './LiveChoiceGroup'; +export { default as LiveComboBox } from './LiveComboBox'; +export { default as LiveDatePicker } from './LiveDatePicker'; +export { default as LiveDropdown } from './LiveDropdown'; +export { default as LiveMultiselectDropdown } from './LiveMultiselectDropdown'; +export { default as LiveRelationship } from './LiveRelationship'; +export { default as LiveText } from './LiveText'; +export { default as LiveTextField } from './LiveTextField'; +export { default as LiveTimePicker } from './LiveTimePicker'; +export { default as LiveToggle } from './LiveToggle'; +export { default as LiveUpdate, ITransformer, ILiveUpdateMarkProps, StateType } from './LiveUpdate'; +export { default as LiveUserPicker } from './LiveUserPicker'; +export { firstTextPart, Localize } from './Localize'; +export { ResponsiveGrid, GridRow, GridCol } from './ResponsiveGrid'; +export { SharePointApp } from './SharePointApp'; +export { TimePicker } from './TimePicker'; +export { UserList } from './UserList'; +export { default as UserPicker, UserPickerDisplayOption } from './UserPicker'; +export { Validation } from './Validation'; +export { WebPartTitle } from './WebPartTitle'; +export { Wizard, IWizardPageProps, IWizardStepProps, IButtonRenderProps, PageRenderer, StepRenderer } from './Wizard'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/loc/commonstrings.d.ts b/samples/react-rhythm-of-business-calendar/src/common/components/loc/commonstrings.d.ts new file mode 100644 index 000000000..a1ac6e683 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/loc/commonstrings.d.ts @@ -0,0 +1,88 @@ +declare module 'CommonStrings' { + import { IButtonStrings, IDialogStrings, IWizardStrings } from "../Localization"; + + interface IHumanizeStrings { + ZeroCount: string; + HourShort: string; + HoursShort: string; + MinuteShort: string; + MinutesShort: string; + ListSeparator: string; + ListConjunction: string; + ListExcept: string; + ListAllItems: string; + } + + interface IValidationStrings { + ValidationFailed: string; + Required: string; + MinimumValue: string; + MaximumValue: string; + RangeValue: string; + MaximumLength: string; + MaximumItems: string; + Url: string; + Email: string; + Phone: string; + } + + interface IDataRotatorStrings { + PreviousDateButton: IButtonStrings; + NextDateButton: IButtonStrings; + } + + interface IUserPickerStrings { + RemoveAriaLabel: string; + } + + interface ILiveUpdateCalloutStrings { + ItemWasAdded: string; + ItemWasEdited: string; + ItemWasDeleted: string; + MyChangeLabel: string; + TheirChangeLabel: string; + OriginalLabel: string; + KeepMineButton: IButtonStrings; + KeepTheirsButton: IButtonStrings; + TakeTheirsButton: IButtonStrings; + RevertToOriginalButton: IButtonStrings; + UndeleteButton: IButtonStrings; + } + + interface ILiveToggleStrings { + OnText: string; + OffText: string; + } + + interface ILiveUpdateStrings { + New: string; + Updated: string; + Deleted: string; + RecentlyAddedMarkTooltip: string; + RecentlyEditedMarkTooltip: string; + RecentlyDeletedMarkTooltip: string; + Callout: ILiveUpdateCalloutStrings; + Toggle: ILiveToggleStrings; + } + + interface ICommonStrings { + Loading: string; + Saving: string; + OneMoment: string; + GenericError: string; + GenericEmptyListMessage: string; + Close: string; + Humanize: IHumanizeStrings; + Validation: IValidationStrings; + ConfirmDialogDefaults: IDialogStrings; + ConfirmDeleteDialog: IDialogStrings; + ConfirmDiscardDialog: IDialogStrings; + DateRotator: IDataRotatorStrings; + Wizard: IWizardStrings; + UserPicker: IUserPickerStrings; + LiveUpdate: ILiveUpdateStrings; + } + + const strings: ICommonStrings; + export = strings; +} diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/loc/en-us.js b/samples/react-rhythm-of-business-calendar/src/common/components/loc/en-us.js new file mode 100644 index 000000000..65938b039 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/loc/en-us.js @@ -0,0 +1,90 @@ +define([], function () { + return { + Loading: "Loading...", + Saving: "Saving...", + OneMoment: "One moment...", + GenericError: "Sorry, something went wrong.", + GenericEmptyListMessage: "We can't find anything to show here.", + Close: "Close", + Humanize: { + ZeroCount: "no {0}", + HourShort: "hr", + HoursShort: "hrs", + MinuteShort: "min", + MinutesShort: "mins", + ListSeparator: ",", + ListConjunction: "and", + ListExcept: "except", + ListAllItems: "All items" + }, + Validation: { + ValidationFailed: "Please fix all validation errors.", + Required: "This field is required.", + MinimumValue: "This field cannot be less than {0}.", + MaximumValue: "This field cannot be greater than {0}.", + RangeValue: "This field must be from {0} and {1}.", + MaximumLength: "This field cannot have more than {0} characters.", + MaximumItems: "This cannot have more than {0} items.", + Url: "This field must be a valid URL.", + Email: "This field must be a valid e-mail address.", + Phone: "This field must be a valid US phone number" + }, + ConfirmDialogDefaults: { + HeadingText: "Confirm", + MessageText: "Are you sure?", + AcceptButton: { Text: "OK" }, + RejectButton: { Text: "Cancel" } + }, + ConfirmDeleteDialog: { + HeadingText: "Delete", + MessageText: "Are you sure you want to delete?", + AcceptButton: { Text: "Delete" }, + RejectButton: { Text: "Cancel" } + }, + ConfirmDiscardDialog: { + HeadingText: "Discard", + MessageText: "Are you sure you want to discard changes?", + AcceptButton: { Text: "Discard" }, + RejectButton: { Text: "Keep Editing" } + }, + DateRotator: { + PreviousDateButton: { Text: "Previous date" }, + NextDateButton: { Text: "Next date" }, + }, + Wizard: { + StartButton: { Text: "Start" }, + BackButton: { Text: "Back" }, + NextButton: { Text: "Next" }, + FinishButton: { Text: "Finish" }, + CloseButtonAriaLabel: "close wizard button" + }, + UserPicker: { + RemoveAriaLabel: "Remove" + }, + LiveUpdate: { + New: "New!", + Updated: "Updated", + Deleted: "Deleted", + RecentlyAddedMarkTooltip: "Someone added this item recently", + RecentlyEditedMarkTooltip: "Other people have made edits recently", + RecentlyDeletedMarkTooltip: "Someone deleted this item", + Callout: { + ItemWasAdded: "{0} added this item {1}", + ItemWasEdited: "{0} made edits {1}", + ItemWasDeleted: "This item was deleted", + MyChangeLabel: "My edit", + TheirChangeLabel: "Their change", + OriginalLabel: "Original", + KeepMineButton: { Text: "Keep mine" }, + KeepTheirsButton: { Text: "Keep theirs" }, + TakeTheirsButton: { Text: "Take theirs" }, + RevertToOriginalButton: { Text: "Revert to original" }, + UndeleteButton: { Text: "Restore this item" } + }, + Toggle: { + OnText: "On", + OffText: "Off" + } + } + }; +}); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/styles/AsyncLoadComponent.module.scss b/samples/react-rhythm-of-business-calendar/src/common/components/styles/AsyncLoadComponent.module.scss new file mode 100644 index 000000000..5f0e243a1 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/styles/AsyncLoadComponent.module.scss @@ -0,0 +1,22 @@ +@import 'common.module'; + +$spinner-size: 28px /*SpinnerSize.large*/ + 18px /*spinner label size*/; +$spinner-padding: 20px; + +.asyncLoadComponent { + position: relative; + overflow: hidden; + + &.spinnersEnabled { + min-height: $spinner-size + $spinner-padding * 2; + } + + .errorMessage { + background-color: lightpink; + padding: 10px; + } + + .detailsLink { + color: $ms-color-sharedCyanBlue10; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/styles/AsyncOverlay.module.scss b/samples/react-rhythm-of-business-calendar/src/common/components/styles/AsyncOverlay.module.scss new file mode 100644 index 000000000..bcb8f58d9 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/styles/AsyncOverlay.module.scss @@ -0,0 +1,13 @@ +@import 'common.module'; + +.asyncOverlay { + &:global(.ms-Overlay) { + display: flex; + flex-direction: column; + justify-content: center; + } + + :global(.ms-Spinner) { + padding: 20px; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/styles/CalloutColorPicker.module.scss b/samples/react-rhythm-of-business-calendar/src/common/components/styles/CalloutColorPicker.module.scss new file mode 100644 index 000000000..bdd0d3ac9 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/styles/CalloutColorPicker.module.scss @@ -0,0 +1,14 @@ +@import 'common.module'; + +$size: 30px; + +.calloutColorPicker { + .colorPreview { + cursor: pointer; + height: $size; + width: $size; + border: 1px solid; + border-color: $color-neutralSecondary; + border-radius: calc($size / 2); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/styles/DataDialogBase.module.scss b/samples/react-rhythm-of-business-calendar/src/common/components/styles/DataDialogBase.module.scss new file mode 100644 index 000000000..cb16eec1a --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/styles/DataDialogBase.module.scss @@ -0,0 +1,40 @@ +@import 'common.module'; + +.dataDialogBase { + @include md-down { + // need to remove justify center when on a small screen so dialog can use full width + :global(.ms-Dialog) { justify-content: initial; } + } + + :global(.ms-Dialog-main) { + // override built-in max-width so dialog can grow wider + max-width: 500px !important; + + // 100% width on medium and below + & { min-width: 100%; } + + // 80% width on medium to large + @include md-up { + & { min-width: 80%; } + } + + // 500px width on large and above + @include lg-up { + & { min-width: 500px; } + } + } + + &.wide :global(.ms-Dialog-main) { + // override built-in max-width so dialog can grow wider + max-width: 800px !important; + + // 80% width on medium to xx-large + @include md-up { + & { min-width: 80%; } + } + // 800px width on x-large and above + @include lg-up { + & { min-width: 800px; } + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/styles/DataPanelBase.module.scss b/samples/react-rhythm-of-business-calendar/src/common/components/styles/DataPanelBase.module.scss new file mode 100644 index 000000000..e440053b2 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/styles/DataPanelBase.module.scss @@ -0,0 +1,26 @@ +@import 'common.module'; + +.panel { + .headerCommands { + padding-right: 8px; + border-bottom: 1px solid; + border-bottom-color: $color-neutralQuaternary; + } + + .heading { + @include md-down { + @include ms-fontSize-16; + } + + @include lg-up { + @include ms-fontSize-18; + } + + @include ms-fontWeight-semibold; + padding: 24px 24px 12px 24px; + } + + :global(.ms-Panel-footer) :global(.ms-Button) { + margin-right: 8px; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/styles/FloatingPane.module.scss b/samples/react-rhythm-of-business-calendar/src/common/components/styles/FloatingPane.module.scss new file mode 100644 index 000000000..2b34f081e --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/styles/FloatingPane.module.scss @@ -0,0 +1,8 @@ +@import 'common.module'; + +.pane { + position: relative; + transition: top .35s ease-in-out; + overflow-x: hidden; + overflow-y: auto; +} diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/styles/LengthLimitedTextfield.module.scss b/samples/react-rhythm-of-business-calendar/src/common/components/styles/LengthLimitedTextfield.module.scss new file mode 100644 index 000000000..5d98f5003 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/styles/LengthLimitedTextfield.module.scss @@ -0,0 +1,24 @@ +@import 'common.module'; + +.lengthLimitedTextField { + .labelContainer { + .toolTipIcon { + cursor: default; + @include ms-fontSize-xl; + margin: 5px; + } + } + + .remainingCharCountTop { + color: $color-neutralPrimary; + display: block; + margin-left: auto; + } + + .remainingCharCountBottom { + color: $color-neutralPrimary; + text-align: left; + padding: 0px; + font-size: 12px; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/styles/LiveComponents.module.scss b/samples/react-rhythm-of-business-calendar/src/common/components/styles/LiveComponents.module.scss new file mode 100644 index 000000000..8c9c546cd --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/styles/LiveComponents.module.scss @@ -0,0 +1,11 @@ +@import 'common.module'; + +.callout { + @include ms-fontSize-16; + + @include xl-up { + max-width: 800px + } + + padding: 20px 24px; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/styles/Pager.module.scss b/samples/react-rhythm-of-business-calendar/src/common/components/styles/Pager.module.scss new file mode 100644 index 000000000..8c4e2559a --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/styles/Pager.module.scss @@ -0,0 +1,7 @@ +.pager { + display: flex; + + .pages { + align-self: center; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/styles/TimePicker.module.scss b/samples/react-rhythm-of-business-calendar/src/common/components/styles/TimePicker.module.scss new file mode 100644 index 000000000..5d526a47b --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/styles/TimePicker.module.scss @@ -0,0 +1,18 @@ +@import 'common.module'; + +.timePicker { + .controls { + display: flex; + justify-content: space-between; + + :global(.ms-Dropdown-container) { + flex: 1 40%; + margin-right: 4px; + } + + :global(.ms-Button) { + flex: 1 20%; + min-width: auto; + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/styles/UserList.module.scss b/samples/react-rhythm-of-business-calendar/src/common/components/styles/UserList.module.scss new file mode 100644 index 000000000..d72cf3f21 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/styles/UserList.module.scss @@ -0,0 +1,7 @@ +@import 'common.module'; + +.personaList { + .persona { + margin: 5px 0; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/styles/UserPicker.module.scss b/samples/react-rhythm-of-business-calendar/src/common/components/styles/UserPicker.module.scss new file mode 100644 index 000000000..6fc6bd685 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/styles/UserPicker.module.scss @@ -0,0 +1,7 @@ +@import 'common.module'; + +.userPicker { + .label { + display: inline-block; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/styles/WebPartTitle.module.scss b/samples/react-rhythm-of-business-calendar/src/common/components/styles/WebPartTitle.module.scss new file mode 100644 index 000000000..fee1a3952 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/styles/WebPartTitle.module.scss @@ -0,0 +1,8 @@ +@import 'common.module'; + +.webPartTitle { + & > h2 { + @include ms-font-xxl; + margin-bottom: 36px; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/styles/Wizard.module.scss b/samples/react-rhythm-of-business-calendar/src/common/components/styles/Wizard.module.scss new file mode 100644 index 000000000..1146631c9 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/styles/Wizard.module.scss @@ -0,0 +1,30 @@ +@import 'common.module'; + +.wizard { + .header { + margin: 25px; + } + + .progressBar { + background-color: $color-neutralLighterAlt; + padding: 15px 0; + + .statusIndicator { + @include ms-font-m-plus; + flex: 1 auto; + padding: 0 10px; + + &.futurePage { + color: $color-neutralPrimaryAlt; + } + } + } + + .footer { + margin: 25px; + + & :global(.ms-Button) { + min-width: 125px; + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/components/styles/_common.module.scss b/samples/react-rhythm-of-business-calendar/src/common/components/styles/_common.module.scss new file mode 100644 index 000000000..4278cf3f6 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/components/styles/_common.module.scss @@ -0,0 +1,351 @@ +@import '~office-ui-fabric-react/dist/sass/_References.scss'; + +// theme sass variables - adapted from https://n8d.at/how-to-use-theme-colors-in-spfx-web-parts/ +$color-themeAccent: "[theme:themeAccent, default:inherit]"; +$color-themeAccentTranslucent10: "[theme:themeAccentTranslucent10, default:inherit]"; +$color-themeDark: "[theme:themeDark, default:" + $ms-color-themeDark + "]"; +$color-themeDarkAlt: "[theme:themeDarkAlt, default:" + $ms-color-themeDarkAlt + "]"; +$color-themeDarker: "[theme:themeDarker, default:" + $ms-color-themeDarker + "]"; +$color-themeLight: "[theme:themeLight, default:" + $ms-color-themeLight + "]"; +$color-themeLighter: "[theme:themeLighter, default:" + $ms-color-themeLighter + "]"; +$color-themeLighterAlt: "[theme:themeLighterAlt, default:" + $ms-color-themeLighterAlt + "]"; +$color-themePrimary: "[theme:themePrimary, default:" + $ms-color-themePrimary + "]"; +$color-themeSecondary: "[theme:themeSecondary, default:" + $ms-color-themeSecondary + "]"; +$color-themeTertiary: "[theme:themeTertiary, default:" + $ms-color-themeTertiary + "]"; +$color-neutralDark: "[theme:neutralDark, default:" + $ms-color-neutralDark + "]"; +$color-neutralLight: "[theme:neutralLight, default:" + $ms-color-neutralLight + "]"; +$color-neutralLighter: "[theme:neutralLighter, default:" + $ms-color-neutralLighter + "]"; +$color-neutralLighterAlt: "[theme:neutralLighterAlt, default:" + $ms-color-neutralLighterAlt + "]"; +$color-neutralPrimary: "[theme:neutralPrimary, default:" + $ms-color-neutralPrimary + "]"; +$color-neutralPrimaryAlt: "[theme:neutralPrimaryAlt, default:" + $ms-color-neutralPrimaryAlt + "]"; +$color-neutralQuaternary: "[theme:neutralQuaternary, default:" + $ms-color-neutralQuaternary + "]"; +$color-neutralQuaternaryAlt: "[theme:neutralQuaternaryAlt, default:" + $ms-color-neutralQuaternaryAlt + "]"; +$color-neutralSecondary: "[theme:neutralSecondary, default:" + $ms-color-neutralSecondary + "]"; +$color-neutralSecondaryAlt: "[theme:neutralSecondaryAlt, default:" + $ms-color-neutralSecondaryAlt + "]"; +$color-neutralTertiary: "[theme:neutralTertiary, default:" + $ms-color-neutralTertiary + "]"; +$color-neutralTertiaryAlt: "[theme:neutralTertiaryAlt, default:" + $ms-color-neutralTertiaryAlt + "]"; +$color-primaryBackground: "[theme:primaryBackground, default:" + $ms-color-white + "]"; +$color-primaryText: "[theme:primaryText, default:" + $ms-color-gray160 + "]"; +$color-white: "[theme:white, default:" + $ms-color-white + "]"; +$color-orange: "[theme:orange, default:" + $ms-color-orange + "]"; +$color-orangeLight: "[theme:orangeLight, default:" + $ms-color-orangeLight + "]"; +$color-orangeLighter: "[theme:orangeLighter, default:" + $ms-color-orangeLighter + "]"; +$color-greenLight: "[theme:greenLight, default:" + $ms-color-greenLight + "]"; +$color-magenta: "[theme:magenta, default:" + $ms-color-magenta + "]"; +$color-magentaDark: "[theme:magentaDark, default:" + $ms-color-magentaDark + "]"; +$color-magentaLight: "[theme:magentaLight, default:" + $ms-color-magentaLight + "]"; +$color-purple: "[theme:purple, default:" + $ms-color-purple + "]"; +$color-purpleDark: "[theme:purpleDark, default:" + $ms-color-purpleDark + "]"; +$color-purpleLight: "[theme:purpleLight, default:" + $ms-color-purpleLight + "]"; +$color-red: "[theme:red, default:" + $ms-color-red + "]"; +$color-redDark: "[theme:redDark, default:" + $ms-color-redDark + "]"; +$color-success: "[theme:success, default:" + $ms-color-success + "]"; +$color-successBackground: "[theme:successBackground, default:" + $ms-color-successBackground + "]"; +$color-teal: "[theme:teal, default:" + $ms-color-teal + "]"; +$color-tealDark: "[theme:tealDark, default:" + $ms-color-tealDark + "]"; +$color-tealLight: "[theme:tealLight, default:" + $ms-color-tealLight + "]"; +$color-white: "[theme:white, default:" + $ms-color-white + "]"; +$color-whiteTranslucent40: "[theme:whiteTranslucent40, default:rgba(255,255,255,.4)]"; +$color-yellow: "[theme:yellow, default:" + $ms-color-yellow + "]"; +$color-yellowLight: "[theme:yellowLight, default:" + $ms-color-yellowLight + "]"; + +@mixin hide { + display: none !important; +} + +$sm: ( + max: $ms-screen-max-sm +); +$md: ( + min: $ms-screen-min-md, + max: $ms-screen-max-md +); +$lg: ( + min: $ms-screen-min-lg, + max: $ms-screen-max-lg +); +$xl: ( + min: $ms-screen-min-xl, + max: $ms-screen-max-xl +); +$xxl: ( + min: $ms-screen-min-xxl, + max: $ms-screen-max-xxl +); +$xxxl: ( + min: $ms-screen-min-xxxl +); + +$md-up: ( + min: $ms-screen-min-md +); +$lg-up: ( + min: $ms-screen-min-lg +); +$xl-up: ( + min: $ms-screen-min-xl +); +$xxl-up: ( + min: $ms-screen-min-xxl +); + +$md-down: ( + max: $ms-screen-max-md +); +$lg-down: ( + max: $ms-screen-max-lg +); +$xl-down: ( + max: $ms-screen-max-xl +); +$xxl-down: ( + max: $ms-screen-max-xxl +); + +// https://medium.com/developing-with-sass/refactoring-my-simple-sass-breakpoint-mixin-71205dd6badd +@mixin breakpoint($map) { + $query: ""; + + @if map-has-key($map, min) { + $query: append($query, "(min-width: #{map-get($map, min)})") + } + + @if map-has-key($map, min) and map-has-key($map, max) { + $query: append($query, "and") + } + + @if map-has-key($map, max) { + $query: append($query, "(max-width: #{map-get($map, max)})") + } + + @media screen and #{$query} { + @content; + } +} + +@mixin sm() { + @include breakpoint($sm) { + @content; + } +} + +@mixin md() { + @include breakpoint($md) { + @content; + } +} + +@mixin lg() { + @include breakpoint($lg) { + @content; + } +} + +@mixin xl() { + @include breakpoint($xl) { + @content; + } +} + +@mixin xxl() { + @include breakpoint($xxl) { + @content; + } +} + +@mixin xxxl() { + @include breakpoint($xxxl) { + @content; + } +} + +@mixin md-down() { + @include breakpoint($md-down) { + @content; + } +} + +@mixin lg-down() { + @include breakpoint($lg-down) { + @content; + } +} + +@mixin xl-down() { + @include breakpoint($xl-down) { + @content; + } +} + +@mixin xxl-down() { + @include breakpoint($xxl-down) { + @content; + } +} + +@mixin md-up() { + @include breakpoint($md-up) { + @content; + } +} + +@mixin lg-up() { + @include breakpoint($lg-up) { + @content; + } +} + +@mixin xl-up() { + @include breakpoint($xl-up) { + @content; + } +} + +@mixin xxl-up() { + @include breakpoint($xxl-up) { + @content; + } +} + +@mixin hidden-sm() { + @include breakpoint($sm) { + @include hide; + } +} + +@mixin hidden-md() { + @include breakpoint($md) { + @include hide; + } +} + +@mixin hidden-lg() { + @include breakpoint($lg) { + @include hide; + } +} + +@mixin hidden-xl() { + @include breakpoint($xl) { + @include hide; + } +} + +@mixin hidden-xxl() { + @include breakpoint($xxl) { + @include hide; + } +} + +@mixin hidden-xxxl() { + @include breakpoint($xxxl) { + @include hide; + } +} + +@mixin hidden-md-down() { + @include breakpoint($md-down) { + @include hide; + } +} + +@mixin hidden-lg-down() { + @include breakpoint($lg-down) { + @include hide; + } +} + +@mixin hidden-xl-down() { + @include breakpoint($xl-down) { + @include hide; + } +} + +@mixin hidden-xxl-down() { + @include breakpoint($xxl-down) { + @include hide; + } +} + +@mixin hidden-md-up() { + @include breakpoint($md-up) { + @include hide; + } +} + +@mixin hidden-lg-up() { + @include breakpoint($lg-up) { + @include hide; + } +} + +@mixin hidden-xl-up() { + @include breakpoint($xl-up) { + @include hide; + } +} + +@mixin hidden-xxl-up() { + @include breakpoint($xxl-up) { + @include hide; + } +} + + +@mixin nostyles() { + font: unset; +} + +@mixin hide-scrollbar() { + -ms-overflow-style: none; + /* IE and Edge */ + scrollbar-width: none; + + /* Firefox */ + /* Chrome, Safari and Opera */ + &::-webkit-scrollbar { + display: none; + } +} + +// dev helper to make workbench canvas use full page width +@mixin dev-workbench-wide() { + :global(#workbenchPageContent) { + max-width: initial; + + :global(.CanvasZone) { + max-width: initial; + } + } +} + +// dev helper to make workbench canvas simulate full-bleed +@mixin dev-workbench-fullBleed() { + :global(#workbenchPageContent) { + max-width: initial; + left: 0px; + right: 0px; + + :global(.CanvasZone) { + max-width: initial; + + &:global(.CanvasZone--read) { + padding: 0px; + } + + :global(.CanvasSection--read) { + padding-left: 0px; + padding-right: 0px; + + :global(.ControlZone) { + padding: 0px; + margin: 0px; + } + } + } + + :global([class^="content_"]) { + padding: 0px; + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/extensions/IList.ts b/samples/react-rhythm-of-business-calendar/src/common/extensions/IList.ts new file mode 100644 index 000000000..a1c272e23 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/extensions/IList.ts @@ -0,0 +1,17 @@ +import { extendFactory } from "@pnp/odata"; +import { spGet, SharePointQueryable } from "@pnp/sp"; +import { List, IList } from "@pnp/sp/lists"; +import { ICurrentChangeTokenResult } from "common/sharepoint"; + +declare module "@pnp/sp/lists/types" { + interface IList { + currentChangeToken: (this: IList) => Promise; + } +} + +extendFactory(List, { + async currentChangeToken(this: IList): Promise { + const result = await spGet(SharePointQueryable(this, "CurrentChangeToken")) as ICurrentChangeTokenResult; + return result.StringValue; + }, +}); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/extensions/index.ts b/samples/react-rhythm-of-business-calendar/src/common/extensions/index.ts new file mode 100644 index 000000000..d177d3d17 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/extensions/index.ts @@ -0,0 +1 @@ +export * from './IList'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/index.ts b/samples/react-rhythm-of-business-calendar/src/common/index.ts new file mode 100644 index 000000000..74323447e --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/index.ts @@ -0,0 +1,20 @@ +export { IAsyncData, AsyncData, AggregatedAsyncData, AsyncDataCache } from './AsyncData'; +export { BackEventListener } from './BackEventListener'; +export { Color } from './Color'; +export { IEntity, Entity, IOneToManyRelationship, IManyToOneRelationship, IManyToManyRelationship, OneToManyRelationship, ManyToOneRelationship, ManyToManyRelationship, EntityRelationshipSortOption, IRelationshipSortingParameters, stateIsEqualCustomizer } from './Entity'; +export { ErrorHandler } from './ErrorHandler'; +export { GroupByOption } from './GroupByOption'; +export { IComponent } from './IComponent'; +export { IKey } from './IKey'; +export { IUserListChanges } from './IUserListChanges'; +export { Loader } from './Loader'; +export { IButtonStrings, IFieldStrings, IDialogStrings, ITextFieldStrings, IToggleFieldStrings } from './Localization'; +export { MomentRange } from './MomentRange'; +export { withRouterParams } from './ReactRouter'; +export { SortOption } from './SortOption'; +export { User } from './User'; +export { ValidationError } from './ValidationError'; + +export * from './Utils'; +export type { Comparer, Filter } from './Utils'; +export * from './ValidationRules'; diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/IService.ts b/samples/react-rhythm-of-business-calendar/src/common/services/IService.ts new file mode 100644 index 000000000..eddc3c9f1 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/IService.ts @@ -0,0 +1,15 @@ +import { SpfxProp } from "./SpfxContext"; + +export type ServicesProp = { + services: S & SpfxProp; +}; + +export interface IService { + initialize(): Promise; +} + +export type ServiceContext = S & SpfxProp; + +export interface ServiceConstructor { + new(context: ServiceContext): I; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/IServiceDescriptor.ts b/samples/react-rhythm-of-business-calendar/src/common/services/IServiceDescriptor.ts new file mode 100644 index 000000000..7ddb280b6 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/IServiceDescriptor.ts @@ -0,0 +1,10 @@ +import { IService, ServiceConstructor } from "./IService"; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export interface IServiceDescriptor> { + symbol: S; + dependencies: symbol[]; + online: ServiceConstructor; + classic?: ServiceConstructor; + test?: ServiceConstructor; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/ServiceKeyBuilder.ts b/samples/react-rhythm-of-business-calendar/src/common/services/ServiceKeyBuilder.ts new file mode 100644 index 000000000..9b03357a0 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/ServiceKeyBuilder.ts @@ -0,0 +1,40 @@ +import { ServiceKey, EnvironmentType } from "@microsoft/sp-core-library"; +import { IService, ServiceConstructor } from "./IService"; +import { IServiceDescriptor } from "./IServiceDescriptor"; +import { SpfxProp } from "./SpfxContext"; + +export class ServiceKeyBuilder { + constructor( + private readonly _appName: string, + private readonly _environment: EnvironmentType, + private readonly _services: TServices) { + } + + public build>(descriptor: IServiceDescriptor): ServiceKey { + const { symbol, online, classic, test } = descriptor; + + const sharepointServiceKey = online && this.createServiceKey(symbol, online); + const classicSharePointServiceKey = classic && this.createServiceKey(symbol, classic); + const testServiceKey = test && this.createServiceKey(symbol, test); + + switch (this._environment) { + case EnvironmentType.SharePoint: + return sharepointServiceKey; + case EnvironmentType.ClassicSharePoint: + return classicSharePointServiceKey || sharepointServiceKey; + case EnvironmentType.Test: + return testServiceKey || sharepointServiceKey || classicSharePointServiceKey; + default: + throw Error('Unknown SharePoint environment'); + } + } + + private createServiceKey(symbol: symbol, ctor: ServiceConstructor) { + const serviceName = this.buildServiceName(symbol); + return ServiceKey.createCustom(serviceName, () => new ctor(this._services)); + } + + private buildServiceName(symbol: symbol) { + return `${this._appName}.Services.${symbol.toString()}`; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/ServiceManager.ts b/samples/react-rhythm-of-business-calendar/src/common/services/ServiceManager.ts new file mode 100644 index 000000000..7d921b4d6 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/ServiceManager.ts @@ -0,0 +1,115 @@ +import { includes } from 'lodash'; +import { EnvironmentType, Environment, ServiceScope } from "@microsoft/sp-core-library"; +import { IMicrosoftTeams } from '@microsoft/sp-webpart-base'; +import { perf, ArrayType, UnionToIntersectionType } from "../Utils"; +import { IService } from "./IService"; +import { IServiceDescriptor } from "./IServiceDescriptor"; +import { ServiceKeyBuilder } from "./ServiceKeyBuilder"; +import { SpfxContext, SpfxProp, SpfxComponent, Properties, TeamsJs } from "./SpfxContext"; + +export type ServiceDescriptorArray = Record> = Array>; +export type ServiceDescriptorToProp> = D extends IServiceDescriptor ? S extends symbol ? P : never : never; +export type ServicesType = UnionToIntersectionType>> & SpfxProp; + +export class ServiceManager { + public static async create(appName: string, component: SpfxComponent, context: SpfxContext, teams: IMicrosoftTeams, properties: TProperties, descriptors: TDescriptorArray, environment?: EnvironmentType): Promise> { + ServiceManager.throwIfAnyDependencyIsNotDescribed(descriptors); + + const manager = new ServiceManager(descriptors, component, context, teams, properties); + const serviceKeyBuilder = new ServiceKeyBuilder>(appName, environment || Environment.type, manager.services); + await ServiceManager.serviceScopeWhenFinishedAsync(context.serviceScope, scope => manager._init(scope, serviceKeyBuilder)); + return manager; + } + + private static async serviceScopeWhenFinishedAsync(scope: ServiceScope, fn: (scope: ServiceScope) => Promise): Promise { + return new Promise((resolve, reject) => { + scope.whenFinished(async () => { + try { + await fn(scope); + resolve(); + } + catch (e) { + reject(e); + } + }); + }); + } + + private static throwIfAnyDependencyIsNotDescribed(descriptors: ServiceDescriptorArray) { + const describedServiceSymbols = descriptors.map(d => d.symbol); + + for (const descriptor of descriptors) { + for (const dependency of descriptor.dependencies) { + if (!includes(describedServiceSymbols, dependency)) { + throw Error(`No descriptor found for dependency '${dependency.toString()}' of service '${descriptor.symbol.toString()}'`); + } + } + } + } + + public readonly services: ServicesType; + + constructor( + private readonly _descriptors: ServiceDescriptorArray, + component: SpfxComponent, + context: SpfxContext, + teams: IMicrosoftTeams, + properties: TProperties + ) { + this.services = { + [SpfxComponent]: component, + [SpfxContext]: context, + [TeamsJs]: teams, + [Properties]: properties + } as ServicesType; + } + + private async _init(scope: ServiceScope, serviceKeyBuilder: ServiceKeyBuilder>) { + const initGroups = ServiceManager._buildDependencyGroups(this._descriptors); + + for (const initGroup of initGroups) { + const initPromises: Promise[] = []; + + for (const descriptor of initGroup) { + const key = serviceKeyBuilder.build(descriptor); + const service = scope.consume(key); + (this.services as any)[descriptor.symbol] = service; + const perfLabel = `${descriptor.symbol.description} initialize`; + const initPromise = perf(perfLabel, () => service.initialize()); + initPromises.push(initPromise); + } + + await Promise.all(initPromises); + } + } + + private static _buildDependencyGroups(descriptors: ServiceDescriptorArray): ServiceDescriptorArray[] { + const dep = new Map>, symbol[]>(); + descriptors.forEach(descriptor => dep.set(descriptor, [...descriptor.dependencies])); + + const groups: ServiceDescriptorArray[] = []; + + while (dep.size > 0) { + const group: ServiceDescriptorArray = []; + + // push services with no dependencies to this initialization group + dep.forEach((remainingDependencies, descriptor) => { + if (remainingDependencies.length === 0) + group.push(descriptor); + }); + + // remove services with no dependencies from the map + group.forEach(ig => dep.delete(ig)); + + // remove dependencies on services that are in the current initialization group + dep.forEach((dependencies, descriptor) => { + const remainingDependencies = dependencies.filter(dependency => group.every(ig => ig.symbol !== dependency)); + dep.set(descriptor, remainingDependencies); + }); + + groups.push(group); + } + + return groups; + } +} diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/SpfxContext.ts b/samples/react-rhythm-of-business-calendar/src/common/services/SpfxContext.ts new file mode 100644 index 000000000..2903b0ff2 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/SpfxContext.ts @@ -0,0 +1,17 @@ +import { BaseComponent, BaseComponentContext } from "@microsoft/sp-component-base"; +import { IMicrosoftTeams } from "@microsoft/sp-webpart-base"; + +export type SpfxComponent = BaseComponent; +export type SpfxContext = BaseComponentContext; + +export const SpfxComponent: unique symbol = Symbol("SpfxComponent"); +export const SpfxContext: unique symbol = Symbol("SpfxContext"); +export const TeamsJs: unique symbol = Symbol("TeamsJs"); +export const Properties: unique symbol = Symbol("Properties"); + +export type SpfxProp = { + [SpfxComponent]: SpfxComponent; + [SpfxContext]: SpfxContext; + [TeamsJs]: IMicrosoftTeams; + [Properties]: any; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/developer/DeveloperServiceDescriptor.ts b/samples/react-rhythm-of-business-calendar/src/common/services/developer/DeveloperServiceDescriptor.ts new file mode 100644 index 000000000..47ea6701c --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/developer/DeveloperServiceDescriptor.ts @@ -0,0 +1,22 @@ +import { IService } from "../IService"; +import { IServiceDescriptor } from "../IServiceDescriptor"; +import { useServices } from "../withServices"; +import { OnlineDeveloperService } from "./OnlineDeveloperService"; + +export const DeveloperService: unique symbol = Symbol("Developer Service"); + +export interface IDeveloperService extends IService { + registerScripts(scripts: {}): void; +} + +export type DeveloperServiceProp = { + [DeveloperService]: IDeveloperService; +}; + +export const useDeveloperService = () => useServices()[DeveloperService]; + +export const DeveloperServiceDescriptor: IServiceDescriptor = { + symbol: DeveloperService, + dependencies: [], + online: OnlineDeveloperService +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/developer/OnlineDeveloperService.ts b/samples/react-rhythm-of-business-calendar/src/common/services/developer/OnlineDeveloperService.ts new file mode 100644 index 000000000..f71f76642 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/developer/OnlineDeveloperService.ts @@ -0,0 +1,39 @@ +import { isFunction } from "lodash"; +import { IDeveloperService } from "./DeveloperServiceDescriptor"; +import { isExecutingInWorkbench } from "../../Utils"; + +type AnyFunction = (...args: any[]) => any; + +const catchAndReportExceptions = (fn: Func): ((...args: Parameters) => ReturnType) => { + return (...args: Parameters): ReturnType => { + try { + return fn(...args); + } catch (e) { + console.error(e); + throw e; + } + }; +}; + +const isDevParam = new URLSearchParams(window.location.href).get("isDev")?.toLowerCase(); +const isDev = (isDevParam === 'true' || isDevParam === '1'); + +export class OnlineDeveloperService implements IDeveloperService { + public async initialize() { + } + + public registerScripts(scripts: { [g: string]: { [fn: string]: AnyFunction } }): void { + if (isDev || isExecutingInWorkbench()) { + const w: any = window as any; + Object.keys(scripts).forEach(group => { + Object.keys(scripts[group]) + .filter(key => !key.startsWith('_') && isFunction(scripts[group][key])) + .forEach(fnName => { + const fn = scripts[group][fnName]; + scripts[group][fnName] = catchAndReportExceptions(fn); + }); + }); + w.dev = Object.assign(w.dev || {}, scripts); + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/developer/index.ts b/samples/react-rhythm-of-business-calendar/src/common/services/developer/index.ts new file mode 100644 index 000000000..41b0f2aee --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/developer/index.ts @@ -0,0 +1 @@ +export * from "./DeveloperServiceDescriptor"; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/directory/DirectoryServiceDescriptor.ts b/samples/react-rhythm-of-business-calendar/src/common/services/directory/DirectoryServiceDescriptor.ts new file mode 100644 index 000000000..46c4131c0 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/directory/DirectoryServiceDescriptor.ts @@ -0,0 +1,43 @@ +import { SPBatch, PrincipalType } from "@pnp/sp"; +import { IBasePermissions } from "@pnp/sp/security/types"; +import { IWeb } from "@pnp/sp/webs/types"; +import { RoleType, SharePointGroup } from "../../sharepoint"; +import { User } from "../../User"; +import { IService } from "../IService"; +import { IServiceDescriptor } from "../IServiceDescriptor"; +import { useServices } from "../withServices"; +import { OnlineDirectoryService } from "./OnlineDirectoryService"; +import { MockDirectoryService } from "./MockDirectoryService"; + +export const DirectoryService: unique symbol = Symbol("Directory Service"); + +export interface IDirectoryService extends IService { + readonly currentUser: User; + readonly currentUserIsSiteAdmin: boolean; + readonly currentUserEffectivePermissions: IBasePermissions; + resolve(input: string[], web?: IWeb): Promise; + search(input: string, principalType?: PrincipalType): Promise; + ensureUsers(principals: User[], batch?: SPBatch, web?: IWeb): Promise; + roleDefinitionId(type: RoleType): Promise; + siteAdmins(): Promise; + siteOwnersGroup(web?: IWeb): Promise; + siteMembersGroup(web?: IWeb): Promise; + siteVisitorsGroup(web?: IWeb): Promise; + loadGroup(id: number, web?: IWeb): Promise; + findGroupByTitle(title: string, web?: IWeb): Promise; + persistGroup(group: SharePointGroup, web?: IWeb): Promise; + changeGroupOwner(group: SharePointGroup, owner: SharePointGroup | User): Promise; +} + +export type DirectoryServiceProp = { + [DirectoryService]: IDirectoryService; +}; + +export const useDirectoryService = () => useServices()[DirectoryService]; + +export const DirectoryServiceDescriptor: IServiceDescriptor = { + symbol: DirectoryService, + dependencies: [], + online: OnlineDirectoryService, + test: MockDirectoryService +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/directory/MockDirectoryService.ts b/samples/react-rhythm-of-business-calendar/src/common/services/directory/MockDirectoryService.ts new file mode 100644 index 000000000..e13d7d275 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/directory/MockDirectoryService.ts @@ -0,0 +1,71 @@ +import { SPBatch, PrincipalType } from "@pnp/sp"; +import { IBasePermissions } from "@pnp/sp/security/types"; +import { IWeb } from "@pnp/sp/webs/types"; +import { RoleType, SharePointGroup } from "../../sharepoint"; +import { User } from "../../User"; +import { IDirectoryService } from "./DirectoryServiceDescriptor"; + +export class MockDirectoryService implements IDirectoryService { + private readonly _mockCurrentUser: User = new User(1, "Dev User", "user@dev.local", "dev.user@dev.local"); + + public async initialize(): Promise { + } + + public get currentUser(): User { + return this._mockCurrentUser; + } + + public get currentUserIsSiteAdmin(): boolean { + return true; + } + + public get currentUserEffectivePermissions(): IBasePermissions { + return { Low: Number.MAX_VALUE, High: Number.MAX_VALUE }; + } + + public async resolve(input: string[], web?: IWeb): Promise { + return input.map(val => new User(0, val, val, val)); + } + + public async search(input: string, principalType?: PrincipalType): Promise { + return [new User(0, input, input, input)]; + } + + public async ensureUsers(principals: User[], batch?: SPBatch, customWeb?: IWeb): Promise { + return principals; + } + + public async roleDefinitionId(type: RoleType): Promise { + return 0; + } + + public async siteAdmins(): Promise { + return []; + } + + public async siteOwnersGroup(web?: IWeb): Promise { + return new SharePointGroup(1000, "Site Owners", [this.currentUser]); + } + + public async siteMembersGroup(web?: IWeb): Promise { + return new SharePointGroup(1001, "Site Members", [this.currentUser]); + } + + public async siteVisitorsGroup(web?: IWeb): Promise { + return new SharePointGroup(1002, "Site Visitors", [this.currentUser]); + } + + public async loadGroup(id: number, web?: IWeb): Promise { + return new SharePointGroup(id, 'Custom Group', [this.currentUser]); + } + + public async findGroupByTitle(title: string, web?: IWeb): Promise { + return new SharePointGroup(1002, title, [this.currentUser]); + } + + public async persistGroup(group: SharePointGroup, web?: IWeb): Promise { + } + + public async changeGroupOwner(group: SharePointGroup, owner: SharePointGroup | User): Promise { + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/directory/OnlineDirectoryService.ts b/samples/react-rhythm-of-business-calendar/src/common/services/directory/OnlineDirectoryService.ts new file mode 100644 index 000000000..8b96faf3d --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/directory/OnlineDirectoryService.ts @@ -0,0 +1,276 @@ +import { flatten } from "lodash"; +import { sp, PrincipalType, PrincipalSource, SPBatch } from "@pnp/sp"; +import { IBasePermissions } from "@pnp/sp/security/types"; +import "@pnp/sp/site-groups"; +import { ISiteGroup } from "@pnp/sp/site-groups/types"; +import "@pnp/sp/site-users"; +import "@pnp/sp/webs"; +import { IWeb } from "@pnp/sp/webs/types"; +import "@pnp/sp/sputilities"; +import { Guid } from "@microsoft/sp-core-library"; +import { SPHttpClient, ISPHttpClientOptions } from "@microsoft/sp-http"; +import { SPPermission } from "@microsoft/sp-page-context"; +import { RoleType, SharePointGroup } from "../../sharepoint"; +import { ErrorHandler } from "../../ErrorHandler"; +import { User } from "../../User"; +import { mapGetOrAdd, sanitizeSharePointGroupName, cloneWeb } from "../../Utils"; +import { ServiceContext } from "../IService"; +import { SpfxContext } from "../SpfxContext"; +import { IDirectoryService } from "./DirectoryServiceDescriptor"; + +const adminPermissionsCheck = [ + SPPermission.applyThemeAndBorder, + SPPermission.approveItems, + SPPermission.createGroups, + SPPermission.layoutsPage, + SPPermission.manageLists, + SPPermission.managePermissions, + SPPermission.manageWeb +]; + +export class OnlineDirectoryService implements IDirectoryService { + private readonly _siteId: Guid; + private readonly _webAbsoluteUrl: string; + private readonly _spHttpClient: SPHttpClient; + private readonly _currentUser: User; + private readonly _currentUserPermissions: SPPermission; + private readonly _resolveCache = new Map>(); + private readonly _searchCache = new Map>(); + private readonly _ensureUserCache = new Map>(); + private readonly _roleDefinitionIdCache = new Map>(); + + constructor({ + [SpfxContext]: { pageContext, spHttpClient } + }: ServiceContext) { + const { site, web, user } = pageContext; + this._siteId = site.id; + this._webAbsoluteUrl = web.absoluteUrl; + this._spHttpClient = spHttpClient; + this._currentUser = User.fromSPUser(user); + this._currentUserPermissions = web.permissions; + } + + public async initialize(): Promise { + } + + public get currentUser(): User { + return this._currentUser; + } + + public get currentUserIsSiteAdmin(): boolean { + return this._currentUserPermissions.hasAllPermissions(...adminPermissionsCheck); + } + + public get currentUserEffectivePermissions(): IBasePermissions { + return this._currentUserPermissions.value; + } + + public async resolve(inputs: string[], web?: IWeb): Promise { + web = cloneWeb(web); + inputs = inputs || []; + + const batch = web.createBatch(); + const principalGroupPromises = Promise.all(inputs.map(input => this._resolveCore(input, batch))); + await batch.execute(); + + return flatten(await principalGroupPromises); + } + + private readonly _resolveCore = async (input: string, batch?: SPBatch): Promise => { + if (input === null || input.length === 0) { + return []; + } + + return mapGetOrAdd(this._resolveCache, input, async () => { + const batchedUtility = batch ? sp.utility.inBatch(batch) : sp.utility; + const results = await batchedUtility.expandGroupsToPrincipals([input]); + return results.map(User.fromPrincipalInfo); + }); + } + + public search(input: string, principalType: PrincipalType = PrincipalType.All): Promise { + return mapGetOrAdd(this._searchCache, input, async () => { + const results = await sp.utility.searchPrincipals(input, principalType, PrincipalSource.All, "", 10); + return results.map(User.fromPrincipalInfo); + }); + } + + public ensureUsers(users: User[], batch?: SPBatch, web?: IWeb): Promise { + web = cloneWeb(web); + const batchedWeb = batch ? web.inBatch(batch) : web; + + const ensureUserPromises = users.map(async user => { + const ensuredUser = await this._ensureUserCore(user, batchedWeb); + user.updateId(ensuredUser.id); + return ensuredUser; + }); + + return Promise.all(ensureUserPromises); + } + + private _ensureUserCore(user: User, web: IWeb): Promise { + return mapGetOrAdd(this._ensureUserCache, user.email, async () => { + if (!(user.id && user.id > 0)) { + const result = await web.ensureUser(user.email); + user.updateId(result.data.Id); + user.updateLogin(result.data.LoginName); + } + return user; + }); + } + + public async ensureLogin(users: readonly User[], web?: IWeb): Promise { + web = cloneWeb(web); + const batch = web.createBatch(); + const ensureLoginPromises = Promise.all(users.map(user => this._ensureLoginCore(user, batch))); + await batch.execute(); + return ensureLoginPromises; + } + + private _ensureLoginCore = async (user: User, batch?: SPBatch): Promise => { + if (user.login) { + return user; + } else { + const resolvedUsers = await this._resolveCore(user.email, batch); + if (resolvedUsers.length > 1) throw Error(`Login for ${user.title} (${user.email}) cannot be resolved unambiguously`); + user.updateLogin(resolvedUsers[0].login); + } + } + + public async roleDefinitionId(type: RoleType, web?: IWeb): Promise { + web = cloneWeb(web); + + if (type === RoleType.None) return null; + + return mapGetOrAdd(this._roleDefinitionIdCache, type, async () => { + const definition = await sp.web.roleDefinitions.getByType(type).get(); + return definition.Id; + }); + } + + public async siteAdmins(): Promise { + const siteUsers = await sp.web.siteUsers(); + return siteUsers.filter(r => r.IsSiteAdmin && r.PrincipalType === PrincipalType.User).map(User.fromSiteUserInfo); + } + + public async siteOwnersGroup(web?: IWeb): Promise { + web = cloneWeb(web); + const id = (await web.associatedOwnerGroup()).Id; + return this._loadSiteGroup(web.siteGroups.getById(id), web); + } + + public async siteMembersGroup(web?: IWeb): Promise { + web = cloneWeb(web); + const id = (await web.associatedMemberGroup()).Id; + return this._loadSiteGroup(web.siteGroups.getById(id), web); + } + + public async siteVisitorsGroup(web?: IWeb): Promise { + web = cloneWeb(web); + const id = (await web.associatedVisitorGroup()).Id; + return this._loadSiteGroup(web.siteGroups.getById(id), web); + } + + public async loadGroup(id: number, web?: IWeb): Promise { + web = cloneWeb(web); + return this._loadSiteGroup(web.siteGroups.getById(id), web); + } + + public async findGroupByTitle(title: string, web?: IWeb): Promise { + try { + web = cloneWeb(web); + const sanitizedTitle = sanitizeSharePointGroupName(title); + return await this._loadSiteGroup(web.siteGroups.getByName(sanitizedTitle), web); + } catch (e) { + return null; // group does not exist + } + } + + private async _loadSiteGroup(siteGroup: ISiteGroup, web: IWeb): Promise { + const batch = web.createBatch(); + + const results = Promise.all([ + siteGroup.inBatch(batch)(), + siteGroup.users.inBatch(batch)() + ]); + + await batch.execute(); + const [groupResult, userResults] = await results; + const users = userResults.map(User.fromSiteUserInfo); + + return new SharePointGroup(groupResult.Id, groupResult.LoginName, users); + } + + public async persistGroup(group: SharePointGroup, web?: IWeb): Promise { + web = cloneWeb(web); + + if (group.hasChanges() && group.isDeleted && !group.isNew) { + await web.siteGroups.removeById(group.id); + } + else if (group.hasChanges() && !group.isDeleted) { + if (group.hasMetadataChanges()) { + const sanitizedTitle = sanitizeSharePointGroupName(group.title); + const groupProperties = { + Title: sanitizedTitle, + Description: group.description, + AllowRequestToJoinLeave: group.allowRequestToJoinLeave, + AutoAcceptRequestToJoinLeave: group.autoAcceptRequestToJoinLeave, + RequestToJoinLeaveEmailSetting: group.requestToJoinLeaveEmailSetting, + AllowMembersEditMembership: group.allowMembersEditMembership, + OnlyAllowMembersViewMembership: group.onlyAllowMembersViewMembership + }; + + if (group.isNew) { + const saveResult = await web.siteGroups.add(groupProperties); + group.setId(saveResult.data.Id); + } else { + await web.siteGroups.getById(group.id).update(groupProperties); + } + } + + if (group.hasMembershipChanges()) { + const membersDifference = group.membersDifference(); + + await this.ensureLogin(membersDifference.added); + + const eh = new ErrorHandler(); + const usersBatch = web.createBatch(); + const batchedGroupUsers = web.siteGroups.getById(group.id).users.inBatch(usersBatch); + membersDifference.added.forEach(({ login }) => + batchedGroupUsers.add(login).catch(eh.catch) + ); + membersDifference.removed.forEach(({ id }) => + batchedGroupUsers.removeById(id).catch(eh.catch) + ); + await usersBatch.execute(); + eh.throwIfError(); + } + } + + group.immortalize(); + } + + public async changeGroupOwner(group: SharePointGroup, owner: SharePointGroup | User): Promise { + const rootId = '740c6a0b-85e2-48a0-a494-e0f1759d4aa7'; + const processQuery = `${this._webAbsoluteUrl}/_vti_bin/client.svc/ProcessQuery`; + const ownerType = owner instanceof SharePointGroup ? 'g' : 'u'; + + const options: ISPHttpClientOptions = { + body: + ` + + + + + + + + + + + ` + }; + + await this._spHttpClient.post(processQuery, SPHttpClient.configurations.v1, options); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/directory/index.ts b/samples/react-rhythm-of-business-calendar/src/common/services/directory/index.ts new file mode 100644 index 000000000..bbaf93afe --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/directory/index.ts @@ -0,0 +1,2 @@ +export * from "./DirectoryServiceDescriptor"; +export { MockDirectoryService } from './MockDirectoryService'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/domainIsolation/DomainIsolationServiceDescriptor.ts b/samples/react-rhythm-of-business-calendar/src/common/services/domainIsolation/DomainIsolationServiceDescriptor.ts new file mode 100644 index 000000000..a80bb8289 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/domainIsolation/DomainIsolationServiceDescriptor.ts @@ -0,0 +1,31 @@ +import { IItem } from "@pnp/sp/items/types"; +import { IService } from "../IService"; +import { IServiceDescriptor } from "../IServiceDescriptor"; +import { useServices } from "../withServices"; +import { OnlineDomainIsolationService } from "./OnlineDomainIsolationService"; +import { MockDomainIsolationService } from "./MockDomainIsolationService"; + +export const DomainIsolationService: unique symbol = Symbol("Domain Isolation Service"); + +export interface IDomainIsolationService extends IService { + readonly originalUrl: string; + readonly currentSitePrimaryUrl: string; + readonly currentPageListItem: IItem; + readonly currentPageRelativeUrl: string; + convertToAppDomainUrl(url: string): string; + convertToPrimaryUrl(url: string): string; + siteCompositeId(url: string): Promise; +} + +export type DomainIsolationServiceProp = { + [DomainIsolationService]: IDomainIsolationService; +}; + +export const useDomainIsolationService = () => useServices()[DomainIsolationService]; + +export const DomainIsolationServiceDescriptor: IServiceDescriptor = { + symbol: DomainIsolationService, + dependencies: [], + online: OnlineDomainIsolationService, + test: MockDomainIsolationService +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/domainIsolation/MockDomainIsolationService.ts b/samples/react-rhythm-of-business-calendar/src/common/services/domainIsolation/MockDomainIsolationService.ts new file mode 100644 index 000000000..9c3c39504 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/domainIsolation/MockDomainIsolationService.ts @@ -0,0 +1,34 @@ +import { IItem } from "@pnp/sp/items/types"; +import { IDomainIsolationService } from "./DomainIsolationServiceDescriptor"; + +export class MockDomainIsolationService implements IDomainIsolationService { + public readonly currentSitePrimaryUrl: string; + public readonly originalUrl: string; + + constructor() { + this.originalUrl = window.location.href; + } + + public async initialize(): Promise { + } + + public get currentPageListItem(): IItem { + return null; + } + + public get currentPageRelativeUrl(): string { + return '/'; + } + + public convertToAppDomainUrl(url: string): string { + return url; + } + + public convertToPrimaryUrl(url: string): string { + return url; + } + + public async siteCompositeId(url: string): Promise { + return url; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/domainIsolation/OnlineDomainIsolationService.ts b/samples/react-rhythm-of-business-calendar/src/common/services/domainIsolation/OnlineDomainIsolationService.ts new file mode 100644 index 000000000..a2e7b8681 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/domainIsolation/OnlineDomainIsolationService.ts @@ -0,0 +1,89 @@ +import { sp } from "@pnp/sp"; +import "@pnp/sp/files"; +import "@pnp/sp/items"; +import { IItem, Item } from "@pnp/sp/items/types"; +import "@pnp/sp/sites"; +import { Site } from "@pnp/sp/sites/types"; +import "@pnp/sp/webs"; +import { Web } from "@pnp/sp/webs/types"; +import { isExecutingInWorkbench, isExecutingInTeamsTab } from "../../Utils"; +import { ServiceContext } from "../IService"; +import { SpfxContext } from "../SpfxContext"; +import { IDomainIsolationService } from "./DomainIsolationServiceDescriptor"; + +export class OnlineDomainIsolationService implements IDomainIsolationService { + public readonly originalUrl: string; + + private readonly _spfxContext: SpfxContext; + + private _currentSitePrimaryUrl: string; + private _currentPageListItem: IItem; + private _currentPageRelativeUrl: string; + + constructor({ + [SpfxContext]: spfxContext + }: ServiceContext) { + this.originalUrl = window.location.href; + this._spfxContext = spfxContext; + } + + public async initialize(): Promise { + this._currentSitePrimaryUrl = (await sp.site()).PrimaryUri; + + const url = new URL(this.originalUrl); + + if (url.pathname.includes("/_layouts/15/webpart.aspx")) { + if (url.searchParams.has("list") && url.searchParams.has("id")) { + // executing inside isolated domain iframe - get list and item id for current page from the query string + const listId = url.searchParams.get("list"); + const itemId = parseInt(url.searchParams.get("id"), 10); + this._currentPageListItem = sp.web.lists.getById(listId).items.getById(itemId); + } else { + this._currentPageListItem = null; + } + } else if (!isExecutingInWorkbench() && !isExecutingInTeamsTab()) { + const { list, listItem } = this._spfxContext.pageContext; + this._currentPageListItem = sp.web.lists.getById(list.id.toString()).items.getById(listItem.id); + } + + if (isExecutingInWorkbench() || !this._currentPageListItem) + this._currentPageRelativeUrl = url.pathname; + else + this._currentPageRelativeUrl = (await this._currentPageListItem.file()).ServerRelativeUrl; + } + + public get currentSitePrimaryUrl(): string { + return this._currentSitePrimaryUrl; + } + + public get currentPageRelativeUrl(): string { + return this._currentPageRelativeUrl; + } + + public get currentPageListItem(): IItem { + return this._currentPageListItem?.clone(Item); // clone the Item so callers can't modify this._currentPageListItem + } + + public convertToAppDomainUrl(url: string): string { + const original = new URL(url, this.originalUrl); + return new URL(original.pathname + original.search, this.originalUrl).toString(); + } + + public convertToPrimaryUrl(url: string): string { + const original = new URL(url, this._currentSitePrimaryUrl); + return new URL(original.pathname + original.search, this._currentSitePrimaryUrl).toString(); + } + + public async siteCompositeId(url: string): Promise { + const appDomainUrl = this.convertToAppDomainUrl(url); + const primaryUrl = this.convertToPrimaryUrl(url); + + const [site, web] = await Promise.all([ + Site(appDomainUrl).select("Id")(), + Web(appDomainUrl).select("Id,Url")() + ]); + + const hostName = new URL(primaryUrl).hostname; + return `${hostName},${site.Id},${web.Id}`; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/domainIsolation/index.ts b/samples/react-rhythm-of-business-calendar/src/common/services/domainIsolation/index.ts new file mode 100644 index 000000000..a45be8aa1 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/domainIsolation/index.ts @@ -0,0 +1 @@ +export * from "./DomainIsolationServiceDescriptor"; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/index.ts b/samples/react-rhythm-of-business-calendar/src/common/services/index.ts new file mode 100644 index 000000000..287794a93 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/index.ts @@ -0,0 +1,11 @@ +export * from './liveUpdate'; +export * from './developer'; +export * from './directory'; +export * from './domainIsolation'; +export * from './sharepoint'; +export * from './timezones'; +export { IService, ServicesProp, ServiceContext } from './IService'; +export { IServiceDescriptor } from './IServiceDescriptor'; +export { ServiceManager, ServicesType, ServiceDescriptorArray } from './ServiceManager'; +export { SpfxContext, SpfxComponent, TeamsJs, Properties } from './SpfxContext'; +export { withServices, useServices, useSpfxComponent, useSpfxContext, useTeamsJS, useProperties, ServicesProvider } from './withServices'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/liveUpdate/LiveUpdateServiceDescriptor.ts b/samples/react-rhythm-of-business-calendar/src/common/services/liveUpdate/LiveUpdateServiceDescriptor.ts new file mode 100644 index 000000000..3acb85bc6 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/liveUpdate/LiveUpdateServiceDescriptor.ts @@ -0,0 +1,27 @@ +import { FastLoadFunctions, IListDefinition, IViewDefinition, ListItemCache, ListItemEntity } from "common/sharepoint"; +import { DirectoryService } from "../directory"; +import { IService } from "../IService"; +import { IServiceDescriptor } from "../IServiceDescriptor"; +import { useServices } from "../withServices"; +import { OnlineLiveUpdateService } from "./OnlineLiveUpdateService"; + +export const LiveUpdateService: unique symbol = Symbol("Live Update Service"); + +export interface ILiveUpdateService extends IService { + register(list: IListDefinition, callback: () => void): void; + begin(): Promise; + createCache>(view: IViewDefinition, functions: FastLoadFunctions): ListItemCache; + purgeCaches(): Promise; +} + +export type LiveUpdateServiceProp = { + [LiveUpdateService]: ILiveUpdateService; +}; + +export const useLiveUpdateService = () => useServices()[LiveUpdateService]; + +export const LiveUpdateServiceDescriptor: IServiceDescriptor = { + symbol: LiveUpdateService, + dependencies: [DirectoryService], + online: OnlineLiveUpdateService +}; diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/liveUpdate/OnlineLiveUpdateService.ts b/samples/react-rhythm-of-business-calendar/src/common/services/liveUpdate/OnlineLiveUpdateService.ts new file mode 100644 index 000000000..d88f64b1e --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/liveUpdate/OnlineLiveUpdateService.ts @@ -0,0 +1,93 @@ +import { Guid } from '@microsoft/sp-core-library'; +import { ListSubscriptionFactory, IListSubscription } from '@microsoft/sp-list-subscription'; +import { FastLoadFunctions, IListDefinition, IViewDefinition, ListId, ListItemCache, ListItemEntity } from 'common/sharepoint'; +import { DeveloperService, DeveloperServiceProp, IDeveloperService } from '../developer'; +import { DirectoryService, DirectoryServiceProp, IDirectoryService } from '../directory'; +import { ServiceContext } from "../IService"; +import { SpfxComponent, SpfxContext } from "../SpfxContext"; +import { ILiveUpdateService } from "./LiveUpdateServiceDescriptor"; + +interface IListRegistration { + list: IListDefinition; + callback: () => void; + subscription?: IListSubscription; +} + +export class OnlineLiveUpdateService implements ILiveUpdateService { + private readonly _context: SpfxContext; + private readonly _directory: IDirectoryService; + private readonly _dev: IDeveloperService; + private readonly _factory: ListSubscriptionFactory; + private readonly _registrations: IListRegistration[]; + + private _cache: Cache; + + constructor({ + [SpfxContext]: context, + [SpfxComponent]: component, + [DeveloperService]: dev, + [DirectoryService]: directory + }: ServiceContext) { + this._context = context; + this._dev = dev; + this._directory = directory; + + this._factory = new ListSubscriptionFactory(component); + this._registrations = []; + } + + public async initialize() { + this._cache = await caches.open(this._cacheName()); + this._dev.registerScripts(this._devScripts); + } + + public register(list: IListDefinition, callback: () => void) { + this._registrations.push({ list, callback }); + } + + public async begin(): Promise { + for (const registration of this._registrations) { + const { list, callback } = registration; + + const subscription = await this._factory.createSubscription({ + listId: Guid.parse(list[ListId]), + callbacks: { + notification: () => callback(), + connect: () => console.debug(new Date().toLocaleTimeString(), 'Subscribed to', list.title), + disconnect: () => console.debug(new Date().toLocaleTimeString(), 'Disconnected', list.title) + } + }); + + registration.subscription = subscription; + } + } + + public createCache>(view: IViewDefinition, functions: FastLoadFunctions): ListItemCache { + const siteUrl = this._context.pageContext.web.absoluteUrl; + return new ListItemCache(siteUrl, this._cache, view, functions); + } + + public async purgeCaches(): Promise { + const result = await caches.delete(this._cacheName()); + this._cache = await caches.open(this._cacheName()); + return result; + } + + private _cacheName() { + const { currentUser: { login } } = this._directory; + return `SPFxFastLoad-${login}`; + } + + private readonly _devScripts = { + liveUpdate: { + purgeCaches: async () => { + console.log(`Starting 'clearCache()'`); + + const result = await this.purgeCaches(); + console.log('Result:', result); + + console.log(`Completed 'clearCache()'`); + } + } + }; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/liveUpdate/index.ts b/samples/react-rhythm-of-business-calendar/src/common/services/liveUpdate/index.ts new file mode 100644 index 000000000..58150862d --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/liveUpdate/index.ts @@ -0,0 +1 @@ +export * from './LiveUpdateServiceDescriptor'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/IPagedListDataStream.ts b/samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/IPagedListDataStream.ts new file mode 100644 index 000000000..d8f40ccb0 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/IPagedListDataStream.ts @@ -0,0 +1,7 @@ +export interface IPagedListDataStream { + readonly results: readonly T[]; + readonly hasNext: boolean; + readonly hasPrevious: boolean; + next(): Promise>; + previous(): Promise>; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/ListDataAsStream.ts b/samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/ListDataAsStream.ts new file mode 100644 index 000000000..7997a6374 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/ListDataAsStream.ts @@ -0,0 +1,94 @@ +import { spPost } from "@pnp/sp"; +import "@pnp/sp/lists"; +import { IList, IRenderListDataParameters, List } from "@pnp/sp/lists/types"; +import { IViewInfo } from "@pnp/sp/views/types"; +import { IRenderListDataAsStreamResult, IListItemResult } from '../../sharepoint'; +import { IPagedListDataStream } from "./IPagedListDataStream"; + +export class ListDataAsStream implements IPagedListDataStream { + public static beginStream(list: IList, view: IViewInfo, search: string, parameters: IRenderListDataParameters, overrideParameters: any, rowMap: (row: TRow) => T | Promise): Promise> { + const listDataAsStream = new ListDataAsStream(list, view, search, parameters, overrideParameters, rowMap); + return listDataAsStream._renderPage(); + } + + constructor( + private readonly _list: IList, + private readonly _view: IViewInfo, + private readonly _search: string, + private readonly _parameters: IRenderListDataParameters, + private readonly _overrideParameters: any, + private readonly _rowMap: (row: TRow) => T | Promise, + private readonly _nextPageHref?: string, + private readonly _previousPageHref?: string, + private readonly _results?: T[] + ) { + _parameters.ViewXml = _parameters.ViewXml || _view.ListViewXml; + } + + public get hasNext(): boolean { + return this._nextPageHref?.length > 0; + } + + public get hasPrevious(): boolean { + return this._previousPageHref?.length > 0; + } + + public get results(): readonly T[] { + return this._results; + } + + public async next(): Promise> { + if (this.hasNext) { + return this._renderPage(this._nextPageHref); + } else { + return this; + } + } + + public async previous(): Promise> { + if (this.hasPrevious) { + return this._renderPage(this._previousPageHref); + } else { + return this; + } + } + + private async _renderPage(pagingHref: string = ''): Promise> { + const rldas = List(this._list, "RenderListDataAsStream"); + + const body = { + overrideParameters: { + "__metadata": { "type": "SP.RenderListDataOverrideParameters" }, + ...this._overrideParameters + }, + parameters: { + "__metadata": { "type": "SP.RenderListDataParameters" }, + ...this._parameters + } + }; + + if (this._search && this._search.length > 0) { + rldas.query.set("InplaceSearchQuery", encodeURIComponent(this._search)); + } + + pagingHref.split("&").filter(Boolean).forEach(kvp => { + const [key, value] = kvp.split("="); + rldas.query.set(key, value); + }); + + rldas.query.set("View", this._view.Id); + + const data = await spPost(rldas, { body: JSON.stringify(body) }) as IRenderListDataAsStreamResult; + + const nextPageHref = (data.NextHref || "").slice(1); + const previousPageHref = (data.PrevHref || "").slice(1); + + const results: T[] = []; + for (const row of data.Row) { + const result = await this._rowMap(row); + results.push(result); + } + + return new ListDataAsStream(this._list, this._view, this._search, this._parameters, this._overrideParameters, this._rowMap, nextPageHref, previousPageHref, results); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/OnlineSharePointService.ts b/samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/OnlineSharePointService.ts new file mode 100644 index 000000000..4d62fe76f --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/OnlineSharePointService.ts @@ -0,0 +1,326 @@ +import { Guid } from "@microsoft/sp-core-library"; +import { sp, SPBatch, SharePointQueryable, spPost } from "@pnp/sp"; +import { IFieldInfo } from '@pnp/sp/fields/types'; +import { Items } from '@pnp/sp/items/types'; +import "@pnp/sp/lists/web"; +import { IList, RenderListDataOptions, IRenderListDataParameters, IListItemFormUpdateValue } from "@pnp/sp/lists/types"; +import "@pnp/sp/sites"; +import "@pnp/sp/webs"; +import { IWeb } from "@pnp/sp/webs/types"; +import "@pnp/sp/views/list"; +import { IViewInfo } from "@pnp/sp/views/types"; +import { cloneWeb, now, User, ErrorHandler, arrayToMap, ValidationError } from "common"; +import "common/extensions"; +import { IChoiceFieldInfo, IRenderListDataAsStreamResult, IListItemResult, IAddListItemResult, IListDefinition, ModeratedUpdateListItem, ChoiceFieldValue, ListItemEntity, CamlQuery, ModerationStatus, IViewDefinition, FieldType, InternalName, IUpdateListItem, ListDefinition, ListItemEntityTypeFullName, ListId, RateableListItemEntity, ViewId, CurrentChangeToken, SPField } from "common/sharepoint"; +import { IDirectoryService, DirectoryService, DirectoryServiceProp } from "../directory"; +import { ITimeZoneService, TimeZoneService, TimeZoneServiceProp } from "../timezones"; +import { ServiceContext } from "../IService"; +import { SpfxContext } from "../SpfxContext"; +import { IPagedListDataStream } from "./IPagedListDataStream"; +import { ListDataAsStream } from "./ListDataAsStream"; +import { ISharePointService } from "./SharePointServiceDescriptor"; + +const ENSURE_USERS_BATCH_SIZE = 100; +const ENSURE_UNIQUEIDS_BATCH_SIZE = 50; + +const PendingStatusUpdateListItem: ModeratedUpdateListItem = { + Title: undefined, + OData__ModerationStatus: ModerationStatus.Pending.value +}; +function isPendingModeratedItem(updateListItem: any): updateListItem is ModeratedUpdateListItem { + if (updateListItem instanceof ModeratedUpdateListItem) + return updateListItem.OData__ModerationStatus === ModerationStatus.Pending.value; + else + return false; +} +function shouldCallValidateUpdateListItem(updateListItem: any): updateListItem is IListItemFormUpdateValue[] { + return updateListItem instanceof Array; +} + +const listFromTitle = (listTitle: string, web?: IWeb): IList => + (web || sp.web).lists.getByTitle(listTitle); + +const listFromDefinition = (listDefinition: IListDefinition, web?: IWeb): IList => + listFromTitle(listDefinition.title, web); + +const preflightRegisteredLists = new Set(); +const preflightRegisteredViews = new Set(); +const listViewCache = new Map(); + +export class OnlineSharePointService implements ISharePointService { + private readonly _directory: IDirectoryService; + private readonly _timezones: ITimeZoneService; + private readonly _context: SpfxContext; + + constructor({ + [DirectoryService]: directory, + [TimeZoneService]: timezones, + [SpfxContext]: context + }: ServiceContext) { + this._directory = directory; + this._timezones = timezones; + this._context = context; + } + + public async initialize() { + } + + public get currentWebServerRelativeUrl(): string { + return this._context.pageContext.web.serverRelativeUrl; + } + + public registerListForPreflight(listDefinition: IListDefinition) { + preflightRegisteredLists.add(listDefinition); + } + + public registerViewForPreflight(viewDefinition: IViewDefinition) { + preflightRegisteredViews.add(viewDefinition); + } + + public async preflightSchema(web?: IWeb): Promise { + const eh = new ErrorHandler(); + const batch = (web || sp.web).createBatch(); + + const lietfnPromises = [...preflightRegisteredLists.values()].map(async listDefinition => { + if (!listDefinition[ListItemEntityTypeFullName] || !listDefinition[CurrentChangeToken]) { + const result = await listFromDefinition(listDefinition, web).select('ID', 'ListItemEntityTypeFullName', "CurrentChangeToken").inBatch(batch)(); + listDefinition[CurrentChangeToken] = result.CurrentChangeToken.StringValue; + listDefinition[ListItemEntityTypeFullName] = result.ListItemEntityTypeFullName; + listDefinition[ListId] = result.Id; + } + await Promise.all(listDefinition.fields + .filter(field => field.type === FieldType.Taxonomy && field.multi) + .map(async field => { + const result = await listFromDefinition(listDefinition, web).fields.usingCaching().getByInternalNameOrTitle(field.name + '_0')(); + field[InternalName] = result.InternalName; + })); + }); + + const viewPromises = [...preflightRegisteredViews.values()].map(async viewDefinition => { + if (!listViewCache.has(viewDefinition)) { + const view = await listFromDefinition(viewDefinition[ListDefinition], web).views.getByTitle(viewDefinition.title).inBatch(batch)(); + listViewCache.set(viewDefinition, view); + viewDefinition[ViewId] = view.Id; + } + }); + + await batch.execute().catch(eh.catch); + await Promise.all(lietfnPromises).catch(eh.catch); + await Promise.all(viewPromises).catch(eh.catch); + eh.reportIfError(); + } + + public async preflightEnsureUsers(principals: readonly User[], web?: IWeb): Promise { + const usersToEnsure = principals.slice(0); + while (usersToEnsure.length > 0) { + const batch = sp.createBatch(); + const batchOfUsersToEnsure = usersToEnsure.splice(0, ENSURE_USERS_BATCH_SIZE); + this._directory.ensureUsers(batchOfUsersToEnsure, batch, web); + await batch.execute(); + } + } + + public async preflightEnsureUniqueIds>(entities: T[], listDefinition: IListDefinition, web?: IWeb): Promise { + const entitiesToEnsure = entities.filter(e => !e.isNew && (!e.uniqueId || Guid.empty.equals(e.uniqueId))); + while (entitiesToEnsure.length > 0) { + const batch = sp.createBatch(); + const batchOfEntitiesToEnsure = entitiesToEnsure.splice(0, ENSURE_UNIQUEIDS_BATCH_SIZE); + const list = listFromDefinition(listDefinition, cloneWeb(web)); + for (const entity of batchOfEntitiesToEnsure) { + list.items.getById(entity.id).select("UniqueId").inBatch(batch).get() + .then((result: IListItemResult) => entity.setId(entity.id, Guid.parse(result.UniqueId))); + } + await batch.execute(); + } + } + + public async pagedListItems( + viewDefinition: IViewDefinition, + search: string, + rowMap: (row: TRow) => T | Promise, + web?: IWeb, + datesInUtc: boolean = undefined + ): Promise> { + + const renderParams: IRenderListDataParameters = { + DatesInUtc: datesInUtc, + RenderOptions: RenderListDataOptions.ListData + }; + + const list = listFromDefinition(viewDefinition[ListDefinition], web); + const view = listViewCache.get(viewDefinition) || await list.views.getByTitle(viewDefinition.title)(); + + return ListDataAsStream.beginStream(list, view, search, renderParams, null, rowMap); + } + + public async listItems( + listDefinition: IListDefinition, + rowLimit: number, + viewFields: string[], + query: CamlQuery, + rowMap: (row: TRow) => T | Promise, + web?: IWeb, + datesInUtc: boolean = undefined + ): Promise { + return this.serverRelativeListItems(listDefinition, undefined, false, rowLimit, viewFields, query, rowMap, web, datesInUtc); + } + + public async serverRelativeListItems( + listDefinition: IListDefinition, + folderServerRelativeUrl: string, + recursive: boolean, + rowLimit: number, + viewFields: string[], + query: CamlQuery, + rowMap: (row: TRow) => T | Promise, + web?: IWeb, + datesInUtc: boolean = undefined + ): Promise { + const queryXml: string = query ? `${query.caml}` : ""; + const viewFieldXml: string = viewFields.map(field => ``).join(""); + const rowLimitXml: string = `${rowLimit}`; + const scope: string = recursive ? `Scope='Recursive'` : ``; + const params: IRenderListDataParameters = { + ViewXml: `${queryXml}${viewFieldXml}${rowLimitXml}`, + RenderOptions: RenderListDataOptions.ListData, + FolderServerRelativeUrl: folderServerRelativeUrl, + DatesInUtc: datesInUtc + }; + + const list = listFromDefinition(listDefinition, web); + const data = await list.renderListDataAsStream(params) as IRenderListDataAsStreamResult; + + const results: T[] = []; + for (const row of data.Row) { + const result = await rowMap(row); + results.push(result); + } + + return results; + } + + public field(fieldName: string, listDefinition?: IListDefinition): Promise { + const fields = listDefinition ? listFromDefinition(listDefinition).fields : sp.web.fields; + return fields.getByInternalNameOrTitle(fieldName)(); + } + + public async fieldChoices( + choiceFieldValueType: { new(name: string): T }, + fieldName: string, + listDefinition?: IListDefinition + ): Promise { + const field = await this.field(fieldName, listDefinition); + return field.Choices.map(choice => new choiceFieldValueType(choice)); + } + + public async fieldChoicesAsMap(choiceFieldValueType: { new(name: string): T }, fieldName: string, listDefinition?: IListDefinition): Promise> { + const choices = await this.fieldChoices(choiceFieldValueType, fieldName, listDefinition); + return arrayToMap(choices, choice => choice.name); + } + + public async persistEntity>(entity: T, listDefinition: IListDefinition, toUpdateListItem: (entity: T) => IUpdateListItem | IListItemFormUpdateValue[], batch?: SPBatch, web?: IWeb): Promise { + let entityPromise: Promise = Promise.resolve(); + + if (entity.hasChanges()) { + const items = listFromDefinition(listDefinition, web).items; + + if (entity.isDeleted && !entity.softDeleteSupported && !entity.isNew) { + const listItem = items.getById(entity.id); + const batchedItem = (batch ? listItem.inBatch(batch) : listItem); + entityPromise = batchedItem.delete(); + } + else if (!entity.isDeleted || entity.softDeleteSupported) { + const listItemEntityTypeFullName = listDefinition[ListItemEntityTypeFullName]; + const updateListItem = toUpdateListItem(entity); + + if (entity.isNew) { + const batchedItems = (batch ? Items(items, '').inBatch(batch) : items); + entityPromise = batchedItems.add(updateListItem, listItemEntityTypeFullName).then(async result => { + const timeZone = await this._timezones.timeZoneForWeb(web); + const { currentUser } = this._directory; + const data = result.data as IAddListItemResult; + const modified = SPField.fromDateTime(data, 'Created', timeZone); + const etag = parseInt(data['odata.etag'].slice(1, -1)); + entity.setEditor(currentUser, modified, etag); + entity.setId(parseInt(data.ID, 10)); + }); + } + else { + const item = items.getById(entity.id); + const batchedItem = batch ? item.inBatch(batch) : item; + + // Need to force the item in to Pending status if the list uses moderation, + // otherwise a new draft version will be created rather than replacing the existing approved version + if (isPendingModeratedItem(updateListItem)) { + entityPromise = batchedItem.update(PendingStatusUpdateListItem, undefined, listItemEntityTypeFullName); + updateListItem.OData__ModerationStatus = undefined; + + if (!batch) await entityPromise; + } + + if (shouldCallValidateUpdateListItem(updateListItem)) + entityPromise = batchedItem.validateUpdateListItem(updateListItem, false).then(this._handleValidateUpdateListItemResponse); + else + entityPromise = batchedItem.update(updateListItem, `"${entity.uniqueId},${entity.etag}"`, listItemEntityTypeFullName).then(result => { + const { currentUser } = this._directory; + entity.setEditor(currentUser, now(), entity.etag + 1); + }); + } + } + } + + if (entity instanceof RateableListItemEntity && entity.rating.hasChanges() && (!entity.isDeleted || entity.softDeleteSupported)) { + entityPromise = entityPromise.then(async () => { + const { currentUser } = this._directory; + const itemId = entity.id; + const listId = listDefinition[ListId]; + const rating = entity.rating.forUser(currentUser); + + if (rating && !Number.isNaN(rating)) { + entity.setEditor(currentUser, now(), entity.etag + 1); + return spPost(SharePointQueryable((web || sp.web), `../Microsoft.Office.Server.ReputationModel.Reputation.SetRating(listID=@a1,itemID=@a2,rating=@a3)?@a1=${encodeURIComponent(`'{${listId}}'`)}&@a2=${encodeURIComponent(`'${itemId}'`)}&@a3=${rating}`)); + } + }); + } + + return entityPromise; + } + + private readonly _handleValidateUpdateListItemResponse = (fields: IListItemFormUpdateValue[]) => { + for (const field of fields) { + const { HasException, ErrorMessage, FieldName } = field; + if (HasException) { + throw new ValidationError(FieldName, ErrorMessage); + } + } + } + + public async configureEntityPermissions>(entity: T, listDefinition: IListDefinition, permissions?: Map, web?: IWeb): Promise { + if (entity.isNew) throw new Error('This entity must be persisted to SharePoint before configuring permissions'); + + const items = listFromDefinition(listDefinition, web).items; + const listItem = items.getById(entity.id); + + const hasUniqueRoleAssignments = (await listItem.select('HasUniqueRoleAssignments').get())?.HasUniqueRoleAssignments; + + if (hasUniqueRoleAssignments) { + await listItem.resetRoleInheritance(); + } + + if (permissions) { + await listItem.breakRoleInheritance(false, false); + + const eh = new ErrorHandler(); + const batch = (web || sp.web).createBatch(); + + permissions.forEach((users, roleId) => { + users.forEach(user => + listItem.roleAssignments.inBatch(batch).add(user.id, roleId).catch(eh.catch) + ); + }); + + await batch.execute(); + eh.throwIfError(); + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/SharePointServiceDescriptor.ts b/samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/SharePointServiceDescriptor.ts new file mode 100644 index 000000000..0c0129fe7 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/SharePointServiceDescriptor.ts @@ -0,0 +1,81 @@ +import { SPBatch } from "@pnp/sp"; +import { IFieldInfo } from "@pnp/sp/fields/types"; +import { IListItemFormUpdateValue } from "@pnp/sp/lists/types"; +import { IWeb } from "@pnp/sp/webs/types"; +import { User } from "common"; +import { IListDefinition, IListItemResult, CamlQuery, ChoiceFieldValue, ListItemEntity, IViewDefinition, IUpdateListItem } from "common/sharepoint"; +import { DirectoryService } from "../directory"; +import { IService } from "../IService"; +import { IServiceDescriptor } from "../IServiceDescriptor"; +import { useServices } from "../withServices"; +import { OnlineSharePointService } from "./OnlineSharePointService"; +import { IPagedListDataStream } from "./IPagedListDataStream"; + +export const SharePointService: unique symbol = Symbol("SharePoint Service"); + +export interface ISharePointService extends IService { + readonly currentWebServerRelativeUrl: string; + + registerListForPreflight(listDefinition: IListDefinition): void; + registerViewForPreflight(viewDefinition: IViewDefinition): void; + preflightSchema(web?: IWeb): Promise; + + preflightEnsureUsers(principals: User[], web?: IWeb): Promise; + preflightEnsureUniqueIds>(entities: T[], listDefinition: IListDefinition, web?: IWeb): Promise; + + pagedListItems( + viewDefinition: IViewDefinition, + search: string, + rowMap: (row: TRow) => T | Promise, + web?: IWeb, + datesInUtc?: boolean + ): Promise>; + + listItems( + listDefinition: IListDefinition, + rowLimit: number, + viewFields: string[], + query: CamlQuery, + rowMap: (row: TRow) => T, + web?: IWeb, + datesInUtc?: boolean + ): Promise; + + serverRelativeListItems( + listDefinition: IListDefinition, + folderServerRelativeUrl: string, + recursive: boolean, + rowLimit: number, + viewFields: string[], + query: CamlQuery, + rowMap: (row: TRow) => T, + web?: IWeb, + datesInUtc?: boolean + ): Promise; + + field(fieldName: string, listDefinition?: IListDefinition): Promise; + + fieldChoices( + choiceFieldValueType: { new(name: string): T }, + fieldName: string, + listDefinition?: IListDefinition + ): Promise; + + fieldChoicesAsMap(choiceFieldValueType: { new(name: string): T }, fieldName: string, listDefinition?: IListDefinition): Promise>; + + persistEntity>(entity: T, listDefinition: IListDefinition, toUpdateListItem: (entity: T) => IUpdateListItem | IListItemFormUpdateValue[], batch?: SPBatch, web?: IWeb): Promise; + + configureEntityPermissions>(entity: T, listDefinition: IListDefinition, permissions?: Map, web?: IWeb): Promise; +} + +export type SharePointServiceProp = { + [SharePointService]: ISharePointService; +}; + +export const useSharePointService = () => useServices()[SharePointService]; + +export const SharePointServiceDescriptor: IServiceDescriptor = { + symbol: SharePointService, + dependencies: [DirectoryService], + online: OnlineSharePointService +}; diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/index.ts b/samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/index.ts new file mode 100644 index 000000000..4830a1394 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/sharepoint/index.ts @@ -0,0 +1,2 @@ +export * from "./SharePointServiceDescriptor"; +export { IPagedListDataStream } from './IPagedListDataStream'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/timezones/OnlineTimeZoneService.ts b/samples/react-rhythm-of-business-calendar/src/common/services/timezones/OnlineTimeZoneService.ts new file mode 100644 index 000000000..890c637d3 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/timezones/OnlineTimeZoneService.ts @@ -0,0 +1,140 @@ +import { ICachingOptions } from '@pnp/odata'; +import { extractWebUrl, sp } from '@pnp/sp'; +import "@pnp/sp/regional-settings"; +import { IWeb } from '@pnp/sp/webs/types'; +import { arrayToMap, cloneWeb, now, } from '../../Utils'; +import { DeveloperService, DeveloperServiceProp, IDeveloperService } from '../developer'; +import { ServiceContext } from '../IService'; +import { SpfxContext } from '../SpfxContext'; +import { ITimeZone, ITimeZoneService } from './TimeZoneServiceDescriptor'; + +interface TimeZoneMapping { + readonly name: string; + readonly momentId: string; + readonly sharepointId: number; +} +const timezoneMappings = require('./timezone-mappings.json') as TimeZoneMapping[]; +const timezoneMappingsBySharePointId = arrayToMap(timezoneMappings, tz => tz.sharepointId); + +class TimeZoneResult { + public Id: number; + public Description: string; + public Information: { + Bias: number; + DaylightBias: number; + StandardBias: number; + }; +} + +class TimeZone implements ITimeZone { + public static fromTimeZoneResult(result: TimeZoneResult): TimeZone { + return new TimeZone(result.Id, result.Description); + } + + private readonly _mapping: TimeZoneMapping; + + public get hasMomentMapping(): boolean { return !!this._mapping; } + public get momentId(): string { return this._mapping.momentId; } + + constructor( + public readonly id: number, + public readonly description: string + ) { + this._mapping = timezoneMappingsBySharePointId.get(id); + } +} + +export class OnlineTimeZoneService implements ITimeZoneService { + private readonly _dev: IDeveloperService; + private readonly _currentWebUrl: string; + private readonly _siteTimeZoneCache: Map; + + private _timeZones: TimeZone[]; + private _timeZonesBySharePointId: Map; + + public get timeZones(): ITimeZone[] { + return this._timeZones; + } + + public get siteTimeZone(): ITimeZone { + return this._siteTimeZoneCache.get(sp.web.toUrl()); + } + + public timeZoneFromId(id: number): ITimeZone { + return this._timeZonesBySharePointId.get(id); + } + + constructor({ + [DeveloperService]: dev, + [SpfxContext]: context + }: ServiceContext) { + this._dev = dev; + this._currentWebUrl = context.pageContext.web.absoluteUrl; + this._siteTimeZoneCache = new Map(); + } + + public async initialize(): Promise { + const [ + timeZoneResults, + siteTimeZone + ] = await Promise.all([ + sp.web.regionalSettings.timeZones.usingCaching(this._cacheOptions(sp.web, 'timezones'))(), + this._getTimeZone(sp.web) + ]); + + this._timeZones = timeZoneResults.map(TimeZone.fromTimeZoneResult).filter(tz => tz.hasMomentMapping); + this._timeZonesBySharePointId = arrayToMap(this._timeZones, tz => tz.id); + + this._siteTimeZoneCache.set(sp.web.toUrl(), siteTimeZone); + + this._dev.registerScripts(this._devScripts); + } + + public async timeZoneForWeb(web?: IWeb): Promise { + web = cloneWeb(web); + const key = extractWebUrl(web.toUrl()) || this._currentWebUrl; + + if (!this._siteTimeZoneCache.has(key)) { + const timeZone = await this._getTimeZone(web); + this._siteTimeZoneCache.set(key, timeZone); + } + + return this._siteTimeZoneCache.get(key); + } + + private async _getTimeZone(web: IWeb): Promise { + const timeZoneResult = await web.regionalSettings.timeZone.usingCaching(this._cacheOptions(web, 'timezone'))(); + const timeZone = TimeZone.fromTimeZoneResult(timeZoneResult); + + const { hasMomentMapping, id, description } = timeZone; + if (!hasMomentMapping) { + console.warn(`Site time zone (${id} - ${description}) cannot be mapped to an IANA time zone for moment library.`); + } + + return timeZone; + } + + private readonly _cacheOptions = (web: IWeb, key: string) => { + return { + expiration: now().add(1, 'day').toDate(), + storeName: 'local', + key: `${extractWebUrl(web.toUrl()) || this._currentWebUrl}-${key}` + } as ICachingOptions; + } + + private readonly _devScripts = { + timezones: { + list: () => { + console.log(`Listing known timezones`); + + const tzToString = (tz: ITimeZone) => `'${tz.description}' (SPO ID: ${tz.id}, Moment ID: ${tz.momentId})`; + + this._timeZones.forEach((tz, idx) => { + console.log(`${idx} ${tzToString(tz)}`); + }); + + console.log(`Site time zone: ${tzToString(this.siteTimeZone)}`); + } + } + }; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/timezones/TimeZoneServiceDescriptor.ts b/samples/react-rhythm-of-business-calendar/src/common/services/timezones/TimeZoneServiceDescriptor.ts new file mode 100644 index 000000000..b14225193 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/timezones/TimeZoneServiceDescriptor.ts @@ -0,0 +1,33 @@ +import { IWeb } from "@pnp/sp/webs/types"; +import { IService } from "../IService"; +import { IServiceDescriptor } from "../IServiceDescriptor"; +import { useServices } from "../withServices"; +import { OnlineTimeZoneService } from "./OnlineTimeZoneService"; + +export const TimeZoneService: unique symbol = Symbol("Time Zone Service"); + +export interface ITimeZone { + readonly id: number; + readonly description: string; + readonly hasMomentMapping: boolean; + readonly momentId: string; +} + +export interface ITimeZoneService extends IService { + readonly timeZones: ITimeZone[]; + readonly siteTimeZone: ITimeZone; + timeZoneFromId(id: number): ITimeZone; + timeZoneForWeb(web?: IWeb): Promise; +} + +export type TimeZoneServiceProp = { + [TimeZoneService]: ITimeZoneService; +}; + +export const useTimeZoneService = () => useServices()[TimeZoneService]; + +export const TimeZoneServiceDescriptor: IServiceDescriptor = { + symbol: TimeZoneService, + dependencies: [], + online: OnlineTimeZoneService +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/timezones/index.ts b/samples/react-rhythm-of-business-calendar/src/common/services/timezones/index.ts new file mode 100644 index 000000000..1b49302cf --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/timezones/index.ts @@ -0,0 +1 @@ +export * from "./TimeZoneServiceDescriptor"; diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/timezones/timezone-mappings.json b/samples/react-rhythm-of-business-calendar/src/common/services/timezones/timezone-mappings.json new file mode 100644 index 000000000..fb0f85ee5 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/timezones/timezone-mappings.json @@ -0,0 +1,537 @@ +[ + { + "name": "(UTC-12:00) International Date Line West", + "momentId": "Etc/GMT+12", + "sharepointId": 39 + }, + { + "name": "(UTC-11:00) Coordinated Universal Time-11", + "momentId": "Etc/GMT+11", + "sharepointId": 95 + }, + { + "name": "(UTC-10:00) Hawaii", + "momentId": "Pacific/Honolulu", + "sharepointId": 15 + }, + { + "name": "(UTC-09:00) Alaska", + "momentId": "America/Anchorage", + "sharepointId": 14 + }, + { + "name": "(UTC-08:00) Baja California", + "momentId": "America/Tijuana", + "sharepointId": 78 + }, + { + "name": "(UTC-08:00) Pacific Time (US & Canada)", + "momentId": "America/Los_Angeles", + "sharepointId": 13 + }, + { + "name": "(UTC-07:00) Arizona", + "momentId": "America/Phoenix", + "sharepointId": 38 + }, + { + "name": "(UTC-07:00) Chihuahua, La Paz, Mazatlan", + "momentId": "America/Chihuahua", + "sharepointId": 77 + }, + { + "name": "(UTC-07:00) Mountain Time (US & Canada)", + "momentId": "America/Denver", + "sharepointId": 12 + }, + { + "name": "(UTC-06:00) Central America", + "momentId": "America/Guatemala", + "sharepointId": 55 + }, + { + "name": "(UTC-06:00) Central Time (US & Canada)", + "momentId": "America/Chicago", + "sharepointId": 11 + }, + { + "name": "(UTC-06:00) Guadalajara, Mexico City, Monterrey", + "momentId": "America/Mexico_City", + "sharepointId": 37 + }, + { + "name": "(UTC-06:00) Saskatchewan", + "momentId": "America/Regina", + "sharepointId": 36 + }, + { + "name": "(UTC-05:00) Bogota, Lima, Quito, Rio Branco", + "momentId": "America/Bogota", + "sharepointId": 35 + }, + { + "name": "(UTC-05:00) Eastern Time (US & Canada)", + "momentId": "America/New_York", + "sharepointId": 10 + }, + { + "name": "(UTC-05:00) Indiana (East)", + "momentId": "America/Indianapolis", + "sharepointId": 34 + }, + { + "name": "(UTC-04:00) Asuncion", + "momentId": "America/Asuncion", + "sharepointId": 91 + }, + { + "name": "(UTC-04:00) Atlantic Time (Canada)", + "momentId": "America/Halifax", + "sharepointId": 9 + }, + { + "name": "(UTC-04:00) Caracas", + "momentId": "America/Caracas", + "sharepointId": 88 + }, + { + "name": "(UTC-04:00) Cuiaba", + "momentId": "America/Cuiaba", + "sharepointId": 81 + }, + { + "name": "(UTC-04:00) Georgetown, La Paz, Manaus, San Juan", + "momentId": "America/La_Paz", + "sharepointId": 33 + }, + { + "name": "(UTC-04:00) Santiago", + "momentId": "America/Santiago", + "sharepointId": 65 + }, + { + "name": "(UTC-03:30) Newfoundland", + "momentId": "America/St_Johns", + "sharepointId": 28 + }, + { + "name": "(UTC-03:00) Brasilia", + "momentId": "America/Sao_Paulo", + "sharepointId": 8 + }, + { + "name": "(UTC-03:00) Cayenne, Fortaleza", + "momentId": "America/Cayenne", + "sharepointId": 32 + }, + { + "name": "(UTC-03:00) City of Buenos Aires", + "momentId": "America/Buenos_Aires", + "sharepointId": 85 + }, + { + "name": "(UTC-03:00) Greenland", + "momentId": "America/Godthab", + "sharepointId": 60 + }, + { + "name": "(UTC-03:00) Montevideo", + "momentId": "America/Montevideo", + "sharepointId": 90 + }, + { + "name": "(UTC-03:00) Salvador", + "momentId": "America/Bahia", + "sharepointId": 103 + }, + { + "name": "(UTC-02:00) Coordinated Universal Time-02", + "momentId": "Etc/GMT+2", + "sharepointId": 96 + }, + { + "name": "(UTC-01:00) Azores", + "momentId": "Atlantic/Azores", + "sharepointId": 29 + }, + { + "name": "(UTC-01:00) Cabo Verde Is.", + "momentId": "Atlantic/Cape_Verde", + "sharepointId": 53 + }, + { + "name": "UTC", + "momentId": "Etc/GMT", + "sharepointId": 93 + }, + { + "name": "(UTC) Casablanca", + "momentId": "Africa/Casablanca", + "sharepointId": 86 + }, + { + "name": "(UTC+00:00) Dublin, Edinburgh, Lisbon, London", + "momentId": "Europe/London", + "sharepointId": 2 + }, + { + "name": "(UTC+00:00) Monrovia, Reykjavik", + "momentId": "Atlantic/Reykjavik", + "sharepointId": 31 + }, + { + "name": "(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna", + "momentId": "Europe/Berlin", + "sharepointId": 4 + }, + { + "name": "(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague", + "momentId": "Europe/Budapest", + "sharepointId": 6 + }, + { + "name": "(UTC+01:00) Brussels, Copenhagen, Madrid, Paris", + "momentId": "Europe/Paris", + "sharepointId": 3 + }, + { + "name": "(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb", + "momentId": "Europe/Warsaw", + "sharepointId": 57 + }, + { + "name": "(UTC+01:00) West Central Africa", + "momentId": "Africa/Lagos", + "sharepointId": 69 + }, + { + "name": "(UTC+02:00) Amman", + "momentId": "Asia/Amman", + "sharepointId": 79 + }, + { + "name": "(UTC+02:00) Athens, Bucharest", + "momentId": "Europe/Bucharest", + "sharepointId": 5 + }, + { + "name": "(UTC+02:00) Beirut", + "momentId": "Asia/Beirut", + "sharepointId": 80 + }, + { + "name": "(UTC+02:00) Cairo", + "momentId": "Africa/Cairo", + "sharepointId": 49 + }, + { + "name": "(UTC+02:00) Damascus", + "momentId": "Asia/Damascus", + "sharepointId": 98 + }, + { + "name": "(UTC+02:00) Harare, Pretoria", + "momentId": "Africa/Johannesburg", + "sharepointId": 50 + }, + { + "name": "(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius", + "momentId": "Europe/Kiev", + "sharepointId": 59 + }, + { + "name": "(UTC+02:00) Jerusalem", + "momentId": "Asia/Jerusalem", + "sharepointId": 27 + }, + { + "name": "(UTC+02:00) Kaliningrad", + "momentId": "Europe/Kaliningrad", + "sharepointId": 100 + }, + { + "name": "(UTC+02:00) Windhoek", + "momentId": "Africa/Windhoek", + "sharepointId": 83 + }, + { + "name": "(UTC+03:00) Baghdad", + "momentId": "Asia/Baghdad", + "sharepointId": 26 + }, + { + "name": "(UTC+03:00) Istanbul", + "momentId": "Europe/Istanbul", + "sharepointId": 101 + }, + { + "name": "(UTC+03:00) Kuwait, Riyadh", + "momentId": "Asia/Riyadh", + "sharepointId": 74 + }, + { + "name": "(UTC+03:00) Minsk", + "momentId": "Europe/Minsk", + "sharepointId": 109 + }, + { + "name": "(UTC+03:00) Moscow, St. Petersburg", + "momentId": "Europe/Moscow", + "sharepointId": 51 + }, + { + "name": "(UTC+03:00) Nairobi", + "momentId": "Africa/Nairobi", + "sharepointId": 56 + }, + { + "name": "(UTC+03:30) Tehran", + "momentId": "Asia/Tehran", + "sharepointId": 25 + }, + { + "name": "(UTC+04:00) Abu Dhabi, Muscat", + "momentId": "Asia/Dubai", + "sharepointId": 24 + }, + { + "name": "(UTC+04:00) Astrakhan, Ulyanovsk", + "momentId": "Europe/Astrakhan", + "sharepointId": 110 + }, + { + "name": "(UTC+04:00) Baku", + "momentId": "Asia/Baku", + "sharepointId": 54 + }, + { + "name": "(UTC+04:00) Izhevsk, Samara", + "momentId": "Europe/Samara", + "sharepointId": 106 + }, + { + "name": "(UTC+04:00) Port Louis", + "momentId": "Indian/Mauritius", + "sharepointId": 89 + }, + { + "name": "(UTC+04:00) Tbilisi", + "momentId": "Asia/Tbilisi", + "sharepointId": 82 + }, + { + "name": "(UTC+04:00) Yerevan", + "momentId": "Asia/Yerevan", + "sharepointId": 84 + }, + { + "name": "(UTC+04:30) Kabul", + "momentId": "Asia/Kabul", + "sharepointId": 48 + }, + { + "name": "(UTC+05:00) Ashgabat, Tashkent", + "momentId": "Asia/Tashkent", + "sharepointId": 47 + }, + { + "name": "(UTC+05:00) Ekaterinburg", + "momentId": "Asia/Yekaterinburg", + "sharepointId": 58 + }, + { + "name": "(UTC+05:00) Islamabad, Karachi", + "momentId": "Asia/Karachi", + "sharepointId": 87 + }, + { + "name": "(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi", + "momentId": "Asia/Calcutta", + "sharepointId": 23 + }, + { + "name": "(UTC+05:30) Sri Jayawardenepura", + "momentId": "Asia/Colombo", + "sharepointId": 66 + }, + { + "name": "(UTC+05:45) Kathmandu", + "momentId": "Asia/Katmandu", + "sharepointId": 62 + }, + { + "name": "(UTC+06:00) Astana", + "momentId": "Asia/Almaty", + "sharepointId": 71 + }, + { + "name": "(UTC+06:00) Dhaka", + "momentId": "Asia/Dhaka", + "sharepointId": 102 + }, + { + "name": "(UTC+06:00) Omsk", + "momentId": "Asia/Omsk", + "sharepointId": 115 + }, + { + "name": "(UTC+06:30) Yangon (Rangoon)", + "momentId": "Asia/Rangoon", + "sharepointId": 61 + }, + { + "name": "(UTC+07:00) Bangkok, Hanoi, Jakarta", + "momentId": "Asia/Bangkok", + "sharepointId": 22 + }, + { + "name": "(UTC+07:00) Barnaul, Gorno-Altaysk", + "momentId": "Asia/Barnaul", + "sharepointId": 111 + }, + { + "name": "(UTC+07:00) Krasnoyarsk", + "momentId": "Asia/Krasnoyarsk", + "sharepointId": 64 + }, + { + "name": "(UTC+07:00) Novosibirsk", + "momentId": "Asia/Novosibirsk", + "sharepointId": 46 + }, + { + "name": "(UTC+07:00) Tomsk", + "momentId": "Asia/Tomsk", + "sharepointId": 112 + }, + { + "name": "(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi", + "momentId": "Asia/Shanghai", + "sharepointId": 45 + }, + { + "name": "(UTC+08:00) Irkutsk", + "momentId": "Asia/Irkutsk", + "sharepointId": 63 + }, + { + "name": "(UTC+08:00) Kuala Lumpur, Singapore", + "momentId": "Asia/Singapore", + "sharepointId": 21 + }, + { + "name": "(UTC+08:00) Perth", + "momentId": "Australia/Perth", + "sharepointId": 73 + }, + { + "name": "(UTC+08:00) Taipei", + "momentId": "Asia/Taipei", + "sharepointId": 75 + }, + { + "name": "(UTC+08:00) Ulaanbaatar", + "momentId": "Asia/Ulaanbaatar", + "sharepointId": 94 + }, + { + "name": "(UTC+09:00) Osaka, Sapporo, Tokyo", + "momentId": "Asia/Tokyo", + "sharepointId": 20 + }, + { + "name": "(UTC+09:00) Seoul", + "momentId": "Asia/Seoul", + "sharepointId": 72 + }, + { + "name": "(UTC+09:00) Yakutsk", + "momentId": "Asia/Yakutsk", + "sharepointId": 70 + }, + { + "name": "(UTC+09:30) Adelaide", + "momentId": "Australia/Adelaide", + "sharepointId": 19 + }, + { + "name": "(UTC+09:30) Darwin", + "momentId": "Australia/Darwin", + "sharepointId": 44 + }, + { + "name": "(UTC+10:00) Brisbane", + "momentId": "Australia/Brisbane", + "sharepointId": 18 + }, + { + "name": "(UTC+10:00) Canberra, Melbourne, Sydney", + "momentId": "Australia/Sydney", + "sharepointId": 76 + }, + { + "name": "(UTC+10:00) Guam, Port Moresby", + "momentId": "Pacific/Port_Moresby", + "sharepointId": 43 + }, + { + "name": "(UTC+10:00) Hobart", + "momentId": "Australia/Hobart", + "sharepointId": 42 + }, + { + "name": "(UTC+10:00) Vladivostok", + "momentId": "Asia/Vladivostok", + "sharepointId": 68 + }, + { + "name": "(UTC+11:00) Chokurdakh", + "momentId": "Asia/Srednekolymsk", + "sharepointId": 107 + }, + { + "name": "(UTC+11:00) Magadan", + "momentId": "Asia/Magadan", + "sharepointId": 99 + }, + { + "name": "(UTC+11:00) Sakhalin", + "momentId": "Asia/Sakhalin", + "sharepointId": 114 + }, + { + "name": "(UTC+11:00) Solomon Is., New Caledonia", + "momentId": "Pacific/Guadalcanal", + "sharepointId": 41 + }, + { + "name": "(UTC+12:00) Anadyr, Petropavlovsk-Kamchatsky", + "momentId": "Asia/Kamchatka", + "sharepointId": 108 + }, + { + "name": "(UTC+12:00) Auckland, Wellington", + "momentId": "Pacific/Auckland", + "sharepointId": 17 + }, + { + "name": "(UTC+12:00) Coordinated Universal Time+12", + "momentId": "Etc/GMT-12", + "sharepointId": 97 + }, + { + "name": "(UTC+12:00) Fiji", + "momentId": "Pacific/Fiji", + "sharepointId": 40 + }, + { + "name": "(UTC+13:00) Nuku'alofa", + "momentId": "Pacific/Tongatapu", + "sharepointId": 67 + }, + { + "name": "(UTC+13:00) Samoa", + "momentId": "Pacific/Apia", + "sharepointId": 16 + } +] \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/services/withServices.tsx b/samples/react-rhythm-of-business-calendar/src/common/services/withServices.tsx new file mode 100644 index 000000000..e7b8a81dc --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/services/withServices.tsx @@ -0,0 +1,37 @@ +import React, { createContext, Component, ComponentType, useContext } from "react"; +import hoistNonReactStatics from 'hoist-non-react-statics'; +import { ServicesProp } from './IService'; +import { Properties, SpfxComponent, SpfxContext, SpfxProp, TeamsJs } from "./SpfxContext"; + +const ServicesContext = createContext({}); +export const ServicesProvider = ServicesContext.Provider; +export const ServicesConsumer = ServicesContext.Consumer; + +type ComponentTypeWithoutServices

= { + WithoutServices: ComponentType

; +}; + +export const withServices =

>( + ServicedComponent: ComponentType

+): ComponentType>> & ComponentTypeWithoutServices

=> { + class ComponentWithServices extends Component

{ + public static displayName = `withServices(${ServicedComponent.displayName || ServicedComponent.name})`; + public static WithoutServices: ComponentType

= ServicedComponent; + + public render() { + return ( + + {services => } + + ); + } + } + + return hoistNonReactStatics(ComponentWithServices, ServicedComponent); +}; + +export const useServices = () => useContext(ServicesContext) as S; +export const useSpfxComponent = () => useServices()[SpfxComponent]; +export const useSpfxContext = () => useServices()[SpfxContext]; +export const useTeamsJS = () => useServices()[TeamsJs]; +export const useProperties =

() => useServices()[Properties] as P; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/CamlQuery.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/CamlQuery.ts new file mode 100644 index 000000000..a20f5c56f --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/CamlQuery.ts @@ -0,0 +1,52 @@ +export class CamlQuery { + constructor( + public readonly caml: string + ) { + } + + public static readonly none: CamlQuery = null; + + public static id(id: number) { + return new CamlQuery(`${id}`); + } + + public static lookup(column: string, id: number) { + return new CamlQuery(`${id}`); + } + + public static and(q1: string, q2: string): string { + return `${q1}${q2}`; + } + + public static isnull(column: string): string { + return ``; + } + + public static or(q1: string, q2: string): string { + return `${q1}${q2}`; + } + + public static where(q: string): string { + return `${q}`; + } + + public static eq(column: string, val: string, type: string) { + return `${val}`; + } + + public static neq(column: string, val: string, type: string) { + return `${val}`; + } + + public static geq(column: string, val: number, type: string) { + return `${val}`; + } + + public static orderBy(column: string, dir: 'ascending' | 'descending' = 'ascending') { + return ``; + } + + public static leq(column: string, val: number, type: string) { + return `${val}`; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/ChoiceFieldValue.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/ChoiceFieldValue.ts new file mode 100644 index 000000000..b262e1793 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/ChoiceFieldValue.ts @@ -0,0 +1,6 @@ +export class ChoiceFieldValue { + constructor( + public readonly name: string + ) { + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/ListItemCache.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/ListItemCache.ts new file mode 100644 index 000000000..0a3d2867e --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/ListItemCache.ts @@ -0,0 +1,225 @@ +import { compress, decompress } from 'compressed-json'; +import moment from 'moment-timezone'; +import { User, arrayToMap, now } from "common"; +import { IListItemResult, IUserInfoResult } from "./query_"; +import { CurrentChangeToken, FieldType, InternalName, ParentSchema, IViewDefinition, ListDefinition, ViewId } from "./schema"; +import { IUpdateListItem, UpdateHyperlink, UpdateMultiChoice, UpdateMultiLookup, UpdateTaxonomy } from './update'; +import { ListItemEntity } from "./ListItemEntity"; +import { RateableListItemEntity } from './RateableListItemEntity'; + +type CacheUserMap = { [id: number]: IUserInfoResult }; +type CacheItem = { + timestamp: string; + changeToken: string; + schemaVersion: number; + users: CacheUserMap; + results: IListItemResult[]; +}; + +export type ListItemFunctions> = { + toEntity: (row: IListItemResult) => Promise; + updateListItem: (entity: E) => IUpdateListItem; + extractReferencedUsers: (entity: E) => User[]; +}; + +export class ListItemCache> { + private readonly _functions: ListItemFunctions; + + constructor( + private readonly _siteUrl: string, + private readonly _cache: Cache, + private readonly _view: IViewDefinition, + functions: ListItemFunctions + ) { + this._functions = functions; + } + + private _extractAllUsersById(entities: E[]): Map { + const allUsersById = new Map(); + + entities.forEach(e => { + this._functions.extractReferencedUsers(e).filter(Boolean).forEach(u => allUsersById.set(u.id, u)); + allUsersById.set(e.author.id, e.author); + allUsersById.set(e.editor.id, e.editor); + }); + + return allUsersById; + } + + public async save(entities: E[]): Promise { + const { [ListDefinition]: list } = this._view; + const fieldsByName = arrayToMap(list.fields, f => f.name); + list.fields.filter(f => f[InternalName]).forEach(f => fieldsByName.set(f[InternalName], f)); + list.fields.filter(f => f.type === FieldType.User || f.type === FieldType.Lookup).forEach(f => fieldsByName.set(`${f.name}Id`, f)); + + const toUserInfoResult = ({ id, title, login, email }: User): IUserInfoResult => { + return { id: id.toString(), title, picture: undefined, sip: login, email }; + }; + + const entitiesToDehydrate = entities.filter(e => !e.isDeleted || e.softDeleteSupported); + + const allUsersById = this._extractAllUsersById(entitiesToDehydrate); + + const results = entitiesToDehydrate.map(e => { + const uli: IUpdateListItem & { [p: string]: any } = this._functions.updateListItem(e); + + Object.entries(uli).forEach(([k, v]) => { + const field = fieldsByName.get(k); + if (!field) return; + + switch (field.type) { + case FieldType.Text: break; // no conversion necessary + case FieldType.DateTime: + case FieldType.Number: + case FieldType.Currency: + delete uli[k]; + uli[`${k}.`] = v; + break; + case FieldType.Hyperlink: + if (v instanceof UpdateHyperlink) { + uli[k] = v.Url; + } + break; + case FieldType.Boolean: + delete uli[k]; + uli[`${k}.value`] = (v as boolean) ? "1" : "0"; + break; + case FieldType.Choice: + if (field.multi && v instanceof UpdateMultiChoice) { + uli[k] = v.results; + } + break; + case FieldType.Lookup: { + delete uli[k]; + const lookupIDs = (v instanceof UpdateMultiLookup) ? v.results : [v as number]; + uli[field.name] = lookupIDs.filter(Boolean).map(id => ({ lookupId: id, lookupValue: '-' })); + break; + } + case FieldType.User: { + delete uli[k]; + const userIDs = (v instanceof UpdateMultiLookup) ? v.results : [v as number]; + uli[field.name] = userIDs.filter(Boolean); + break; + } + case FieldType.Taxonomy: + if (v instanceof UpdateTaxonomy) { + const { TermGuid } = v; + uli[k] = { TermGuid }; + } else if (field.multi && typeof v === "string") { + delete uli[k]; + uli[field.name] = v.split(';#').filter(i => i !== "-1").map(i => { + const TermID = i.split("|")[1]; + return { TermID }; + }); + } + break; + case FieldType.Recurrence: + uli[k] = (v as boolean) ? "1" : "0"; + break; + // case FieldType.Image: break; - TODO + // case FieldType.Picture: break; - TODO + // case FieldType.Calculated: break; - TODO + // case FieldType.Thumbnail: break; - TODO + } + }); + + if (e instanceof RateableListItemEntity) { + e.rating.ratedBy.forEach(u => allUsersById.set(u.id, u)); + uli.RatedBy = e.rating.ratedBy.map(u => u.id); + uli.Ratings = e.rating.ratings.join(',') + } + + uli.ID = e.id.toString(); + uli.owshiddenversion = e.etag.toString(); + uli.UniqueId = e.uniqueId.toString(); + uli.Author = e.author.id; + uli.Editor = e.editor?.id || uli.Author; + uli["Created."] = e.created.toISOString(); + uli["Modified."] = e.modified.toISOString(); + + return uli as IListItemResult; + }); + + const users: CacheUserMap = {}; + allUsersById.forEach((v, k) => users[k] = toUserInfoResult(v)); + + const cacheItem: CacheItem = { + timestamp: now().toISOString(), + changeToken: list[CurrentChangeToken], + schemaVersion: list[ParentSchema].version, + users, + results + }; + + const json = JSON.stringify(compress(cacheItem)); + const cacheKey = this._cacheKey(); + await this._cache.put(new Request(cacheKey), new Response(json, { status: 200 })); + } + + public async load(expiration: number): Promise { + const { title, [ListDefinition]: list } = this._view; + + const cacheKey = this._cacheKey(); + console.log('Attempting to rehydrate', title, 'from cache with key', cacheKey); + + const response = await this._cache.match(cacheKey); + const data = await response?.json(); + + if (!data) { + console.log('No data in cache', title); + return false; + } + + let success = false; + try { + const cacheItem: CacheItem = decompress(data); + + const userFieldNames = list.fields.filter(f => f.type === FieldType.User).map(f => f.name); + + cacheItem.results.forEach((r: { [p: string]: any }) => { + r.Author = [cacheItem.users[r.Author]]; + r.Editor = [cacheItem.users[r.Editor]]; + userFieldNames.forEach(fieldName => { + r[fieldName] = (r[fieldName] as number[]).map(id => cacheItem.users[id]); + }); + if (r.RatedBy) r.RatedBy = (r.RatedBy as number[]).map(id => cacheItem.users[id]); + }); + + const isExpired = this._isExpired(cacheItem, expiration); + const sameSchema = this._sameSchema(cacheItem); + + if (!isExpired && sameSchema) { + for (const r of cacheItem.results) { + await this._functions.toEntity(r); + } + list[CurrentChangeToken] = cacheItem.changeToken; + success = true; + } else { + console.log(title, 'cache data is stale', `expired: ${isExpired}, same schema: ${sameSchema}`); + } + } catch (ex) { + console.error('rehydrate', title, 'from cache failed'); + await this._cache.delete(cacheKey); + } + + return success; + } + + public async purge(): Promise { + const cacheKey = this._cacheKey(); + console.log('Purging cache with key', cacheKey); + await this._cache.delete(cacheKey); + } + + private _cacheKey(): string { + return `${this._siteUrl}?view=${this._view[ViewId]}`; + } + + private _isExpired(cacheItem: CacheItem, expiration: number): boolean { + return now().diff(moment(cacheItem.timestamp), 'days') > expiration; + } + + private _sameSchema(cacheItem: CacheItem): boolean { + return cacheItem.schemaVersion === this._view[ListDefinition][ParentSchema].version; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/ListItemEntity.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/ListItemEntity.ts new file mode 100644 index 000000000..84f61f204 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/ListItemEntity.ts @@ -0,0 +1,109 @@ +import { Moment } from "moment-timezone"; +import { Guid } from "@microsoft/sp-core-library"; +import { Entity, IEntity } from "../Entity"; +import { User } from "../User"; +import { momentAscComparer, now, reverseComparer } from "../Utils"; + +export interface IListItemEntity extends IEntity { + readonly title: string; + readonly created: Moment; + readonly modified: Moment; + readonly author: User; + readonly editor: User; +} + +interface IState { + title: string; + created: Moment; + modified: Moment; + author: User; + editor: User; +} + +export abstract class ListItemEntity extends Entity implements IListItemEntity { + public static readonly TitleAscComparer = (a: ListItemEntity, b: ListItemEntity) => a.title.localeCompare(b.title); + public static readonly TitleDescComparer = reverseComparer(ListItemEntity.TitleAscComparer); + + public static readonly ModifiedAscComparer = (a: ListItemEntity, b: ListItemEntity) => momentAscComparer(a.modified, b.modified); + public static readonly ModifiedDescComparer = reverseComparer(ListItemEntity.ModifiedAscComparer); + + private _uniqueId: Guid; + private _etag: number; + + constructor(author?: User, editor?: User, created?: Moment, modified?: Moment, id: number = 0, uniqueId: Guid = Guid.empty, etag: number = 0) { + super(id); + this.state.title = ""; + this.state.created = created || now(); + this.state.modified = modified || this.state.created; + this.state.author = author; + this.state.editor = editor || this.state.author; + this._uniqueId = uniqueId; + this._etag = etag; + } + + public get title(): string { return this.state.title; } + public set title(val: string) { + const oldTitle = this.state.title; + this.state.title = val; + if (oldTitle !== val) this.onTitleChanged(oldTitle, val); + } + + public get created(): Moment { return this.state.created; } + public get modified(): Moment { return this.state.modified; } + public get author(): User { return this.state.author; } + public get editor(): User { return this.state.editor; } + public get uniqueId(): Guid { return this._uniqueId; } + public get etag(): number { return this._etag; } + + public get displayName(): string { + return this.title; + } + + public delete() { + super.delete(); + + if (!this.softDeleteSupported) { + this.state.modified = now(); + this.state.editor = undefined; + } + } + + public undelete() { + if (this.isDeleted) { + super.undelete(); + + if (!this.softDeleteSupported) { + if (this.hasPrevious && !this.previousValue("isDeleted") && + this.hasSnapshot && this.snapshotValue("isDeleted")) { + const state = this.state; + state.created = state.modified = now(); + state.author = undefined; + state.editor = undefined; + this._uniqueId = Guid.empty; + this._etag = 0; + } + } + } + } + + public setId(id: number, uniqueId?: Guid) { + if (this.isNew) { + this.state.modified = this.state.created = now(); + } + this._uniqueId = uniqueId || this._uniqueId; + super.setId(id); + } + + public setEditor(editor: User, modified?: Moment, etag?: number) { + if (this.isNew) { + this.state.author = editor; + if (modified) this.state.created = modified; + } + this.state.editor = editor; + if (modified) this.state.modified = modified; + if (etag) this._etag = etag; + } + + protected onTitleChanged(oldTitle: string, newTitle: string) { + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/ListItemRating.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/ListItemRating.ts new file mode 100644 index 000000000..6a2ac8689 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/ListItemRating.ts @@ -0,0 +1,71 @@ +import { sum } from 'lodash'; +import { Entity } from "../Entity"; +import { User } from "../User"; +import { IListItemEntity } from './ListItemEntity'; + +interface IState { + ratings: number[]; + ratedBy: User[]; +} + +export class ListItemRating extends Entity { + constructor(private readonly _item: IListItemEntity) { + super(1); + + this.state.ratings = []; + this.state.ratedBy = []; + } + + public get id(): number { + return this._item.id; + } + + public get displayName(): string { + return `${this.averageRating} stars`; + } + + public get ratingsCount(): number { + const { ratings } = this.state; + return ratings.length; + } + + public get averageRating(): number { + const { ratings } = this.state; + return ratings.length > 0 ? sum(ratings) / ratings.length : Number.NaN; + } + + public get ratings(): number[] { return this.state.ratings; } + public set ratings(val: number[]) { this.state.ratings = val; } + + public get ratedBy(): User[] { return this.state.ratedBy; } + public set ratedBy(val: User[]) { this.state.ratedBy = val; } + + public forUser(user: User): number { + const { ratings, ratedBy } = this.state; + + for (let i = 0; i < ratings.length; i++) { + if (User.equal(ratedBy[i], user)) { + return ratings[i]; + } + } + + return Number.NaN; + } + + public rate(user: User, rating: number) { + const { ratings, ratedBy } = this.state; + + let rated = false; + for (let i = 0; i < ratings.length; i++) { + if (User.equal(ratedBy[i], user)) { + ratings[i] = rating; + rated = true; + } + } + + if (!rated) { + ratings.push(rating); + ratedBy.push(user); + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/ModerationStatus.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/ModerationStatus.ts new file mode 100644 index 000000000..a1d14661c --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/ModerationStatus.ts @@ -0,0 +1,25 @@ +export class ModerationStatus { + public static readonly Approved = new ModerationStatus("Approved", 0); + public static readonly Rejected = new ModerationStatus("Rejected", 1); + public static readonly Pending = new ModerationStatus("Pending", 2); + public static readonly Draft = new ModerationStatus("Draft", 3); + public static readonly Scheduled = new ModerationStatus("Scheduled", 4); + + public static readonly all = [ + ModerationStatus.Approved, + ModerationStatus.Rejected, + ModerationStatus.Pending, + ModerationStatus.Draft, + ModerationStatus.Scheduled + ] as const; + private static readonly _statusesByName = new Map(ModerationStatus.all.map(s => [s.name, s] as const)); + + private constructor( + public readonly name: string, + public readonly value: number) { + } + + public static fromName(name: string) { + return ModerationStatus._statusesByName.get(name); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/PagedViewLoader.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/PagedViewLoader.ts new file mode 100644 index 000000000..13aa3349a --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/PagedViewLoader.ts @@ -0,0 +1,362 @@ +import { first, flatten } from 'lodash'; +import { sp } from '@pnp/sp'; +import '@pnp/sp/lists'; +import { IWeb, Web } from "@pnp/sp/webs/types"; +import { IListItemFormUpdateValue, IChangeLogItemQuery } from '@pnp/sp/lists/types'; +import { ErrorHandler, User, cloneWeb, AsyncDataCache, perf } from "common"; +import { ISharePointService, IPagedListDataStream, ILiveUpdateService, ITimeZoneService, ITimeZone } from 'common/services'; +import { Loader } from "../Loader"; +import { IListItemResult } from "./query_"; +import { IViewDefinition, ListDefinition, ListId, ViewId, CurrentChangeToken } from "./schema"; +import { IUpdateListItem } from './update'; +import { createEntity, ListItemEntityConstructor } from './createEntity'; +import { CamlQuery } from './CamlQuery'; +import { ListItemCache } from './ListItemCache'; +import { ListItemEntity } from "./ListItemEntity"; + +const PERSIST_BATCH_SIZE = 50; +const FAST_LOAD_EXPIRATION_DAYS = 5; + +export enum ErrorDiagnosis { + Critical, + Ignore, + Propogate +} + +interface IFastLoadConfiguration { + useCache: boolean; + expiration?: number; +} + +export interface IPagedViewLoaderConfiguration> { + ctor: ListItemEntityConstructor; + view: IViewDefinition; + timezones: ITimeZoneService; + spo: ISharePointService; + liveUpdate?: ILiveUpdateService; + siteURL?: string; + fastLoad?: IFastLoadConfiguration; +} + +export abstract class PagedViewLoader> extends Loader { + private readonly _ctor: ListItemEntityConstructor; + private readonly _web: IWeb; + private readonly _fastLoadConfig: IFastLoadConfiguration; + private readonly _fastLoad: ListItemCache; + private readonly _dependencies: Set>; + private readonly _entitiesAsync: AsyncDataCache; + + private _timezone: ITimeZone; + + public readonly view: IViewDefinition; + protected readonly timezones: ITimeZoneService; + protected readonly spo: ISharePointService; + + constructor({ ctor: ctor, view, timezones, spo, liveUpdate, siteURL, fastLoad }: IPagedViewLoaderConfiguration) { + super(); + + if (siteURL && fastLoad?.useCache) + throw new Error('Cannot use fast load with non-local SPO site'); + + this._ctor = ctor; + this._web = siteURL ? Web(siteURL) : null; + this._fastLoadConfig = Object.assign({ useCache: false, expiration: FAST_LOAD_EXPIRATION_DAYS }, fastLoad); + + if (this._fastLoadConfig.useCache && !liveUpdate) + throw new Error('FastLoad cache requires Live Update service'); + + this._fastLoad = liveUpdate.createCache(view, { + toEntity: this._toEntityIgnoreAlreadyLoaded, + updateListItem: (e) => this.updateListItem(e), + extractReferencedUsers: (e) => this.extractReferencedUsers(e) + }); + + this._dependencies = new Set(); + this._entitiesAsync = new AsyncDataCache(async () => { + await Promise.all([ + ...[...this._dependencies.values()].map(dependency => dependency.ensureLoaded()), + this.ensureLoaded() + ]); + return this.all(); + }); + + this.view = view; + this.timezones = timezones; + this.spo = spo; + + spo.registerListForPreflight(view[ListDefinition]); + spo.registerViewForPreflight(view); + + if (liveUpdate) liveUpdate.register(view[ListDefinition], this._ensureLatest); + } + + public registerDependency(dependency: PagedViewLoader) { + this._dependencies.add(dependency); + } + + protected abstract readonly toEntity: (row: IListItemResult, entity: E) => void | Promise; + protected readonly updateListItem: (entity: E) => IUpdateListItem = null; + protected readonly validateUpdateListItem: (entity: E) => IListItemFormUpdateValue[] = null; + protected readonly diagnosePersistError: (error: any) => ErrorDiagnosis = () => ErrorDiagnosis.Critical; + + protected readonly prepareToLoadEntities: () => Promise = async () => { }; + protected readonly extractReferencedUsers: (entity: E) => User[] = () => []; + + public readonly asyncData = () => this._entitiesAsync.get(); + + public readonly all = async (): Promise => { + await this.ensureLoaded(); + return this._entities; + } + + public readonly getById = async (id: number): Promise => { + await this.ensureLoaded(); + + let entity = this._entitiesById.get(id); + + if (!entity) { + await this._ensureLatest(); + entity = this._entitiesById.get(id); + } + + return entity; + } + + public async entitiesById(): Promise> { + await this.ensureLoaded(); + return this._entitiesById; + } + + private _ensureLoadedPromise: Promise = null; + public async ensureLoaded(): Promise { + try { + await (this._ensureLoadedPromise = (this._ensureLoadedPromise || perf(this.view.title, () => this._loadEntities()))); + } catch (e) { + this._ensureLoadedPromise = null; + } + } + + protected async persistCore(singleEntity?: E): Promise { + if (this.entitiesWithChanges.length === 0) return; + + const async = this._entitiesAsync.get(); + + try { + async.savingStarted(); + + const eh = new ErrorHandler(); + const updateListItem = this.validateUpdateListItem || this.updateListItem; + + const entitiesToPersist = (singleEntity ? [singleEntity] : this.entitiesWithChanges.slice(0)).reverse(); + + const referencedUsers = flatten(entitiesToPersist.map(this.extractReferencedUsers)).filter(Boolean); + await this.spo.preflightEnsureUsers(referencedUsers, this._web); + + await this.spo.preflightEnsureUniqueIds(entitiesToPersist, this.view[ListDefinition], this._web); + + while (entitiesToPersist.length > 0) { + const web = cloneWeb(this._web); + const batch = web.createBatch(); + + const persistEntity = (entity: E) => + this.spo.persistEntity(entity, this.view[ListDefinition], updateListItem, batch, web) + .catch(e => { + eh.catch(e); + if (entity.isNew) this.untrack(entity); + }); + + const batchOfEntitiesToPersist = entitiesToPersist.splice(0, PERSIST_BATCH_SIZE); + const persistPromises = Promise.all(batchOfEntitiesToPersist.map(persistEntity)); + + await batch.execute(); + eh.throwIfError(); + + await persistPromises; + } + + this.refreshEntityCollections(); + + async.saveSuccessful(); + + await this._dehydrate(); + } catch (error) { + const diagnosis = this.diagnosePersistError(error) || ErrorDiagnosis.Critical; + switch (diagnosis) { + case ErrorDiagnosis.Ignore: + async.saveSuccessful(); + break; + case ErrorDiagnosis.Critical: + if (this._fastLoadConfig.useCache) this._fastLoad.purge(); + async.saveFailed(error); + break; + case ErrorDiagnosis.Propogate: + async.saveSuccessful(); + throw error; + } + } + } + + private readonly _toEntityIgnoreAlreadyLoaded = async (row: IListItemResult) => { + this._timezone = this._timezone || await this.timezones.timeZoneForWeb(this._web); + + try { + const id = parseInt(row.ID, 10); + + if (!this._entitiesById.has(id)) { + const entity = createEntity(this._ctor, row, this._timezone); + await this.toEntity(row, entity); + this._entities.push(entity); + this._entitiesById.set(entity.id, entity); + + return entity; + } + } catch (e) { + console.warn(e); + } + + return null; + }; + + private async _loadEntities(): Promise { + await this.prepareToLoadEntities(); + + let cacheSuccess = false; + + if (this._fastLoadConfig.useCache) { + cacheSuccess = await this._fastLoad.load(this._fastLoadConfig.expiration); + + if (cacheSuccess) { + console.log('rehydrated', this.view.title, 'from local storage'); + this._queryForLatestChanges().then(this._dehydrate); + } + } + + if (!cacheSuccess) { + console.log('loading', this.view.title, 'from sharepoint'); + return new Promise((resolve, reject) => { + let modelsPagedPromise = this.spo.pagedListItems(this.view, null, this._toEntityIgnoreAlreadyLoaded, this._web); + + const fetchPage = () => modelsPagedPromise.then((stream: IPagedListDataStream) => { + if (stream.hasNext) { + this._entitiesAsync.get().dataUpdated(); + modelsPagedPromise = stream.next(); + fetchPage(); + } else { + this._dehydrate().then(resolve, reject); + } + }, reject); + + fetchPage(); + }); + } + } + + private _ensureLatestPromise: Promise = null; + private readonly _ensureLatest = async () => { + console.log('Processing live update for', this.view[ListDefinition].title); + try { + this._dependencies.forEach(dependency => dependency._ensureLatest()); + await (this._ensureLatestPromise = (this._ensureLatestPromise || this._queryForLatestChanges())); + } finally { + this._ensureLatestPromise = null; + } + } + + private async _queryForLatestChanges() { + const { + [ListDefinition]: list, + [ViewId]: viewId, + fields + } = this.view; + const { + [ListId]: listId, + [CurrentChangeToken]: currentChangeToken + } = list; + + const query: IChangeLogItemQuery = { + ChangeToken: currentChangeToken, + ViewName: viewId.toString(), + QueryOptions: ` + + FALSE + FALSE + FALSE + FALSE + `, + ViewFields: ` + + + ` + }; + + const result = await sp.web.lists.getById(listId).getListItemChangesSinceToken(query); + const timezone = await this.timezones.timeZoneForWeb(this._web); + + const parser = new DOMParser(); + const dom = parser.parseFromString(result, "application/xml"); + const changesElement = dom.querySelector("Changes"); + if (!changesElement) return; + + const nextChangeToken = changesElement.attributes.getNamedItem("LastChangeToken").value; + list[CurrentChangeToken] = nextChangeToken; + + const updatedEntities: E[] = []; + + const deletes = dom.querySelectorAll('Changes Id[ChangeType="Delete"]'); + deletes.forEach(change => { + const id = parseInt(change.textContent); + const existingEntity = this._entitiesById.get(id); + if (existingEntity) { + existingEntity.beginLiveUpdate(); + existingEntity.delete(); + updatedEntities.push(existingEntity); + } + }); + + const changePromises: Promise[] = []; + const changes = dom.querySelectorAll('row'); + changes.forEach(({ attributes }) => { + const promise = (async () => { + const id = parseInt(attributes.getNamedItem("ows_ID").value); + const etag = parseInt(attributes.getNamedItem("ows_owshiddenversion").value); + const existingEntity = this._entitiesById.get(id); + + if (existingEntity?.etag !== etag) { + existingEntity?.beginLiveUpdate(false); + + const toEntity = async (row: IListItemResult) => { + const entity = createEntity(this._ctor, row, timezone, existingEntity); + entity.beginLiveUpdate(true); + await this.toEntity(row, entity); + return entity; + }; + + const updatedEntity = await first(await this.spo.listItems(list, 1, fields, CamlQuery.id(id), toEntity)); + + if (!existingEntity) { + this._entities.push(updatedEntity); + this._entitiesById.set(updatedEntity.id, updatedEntity); + } + + updatedEntities.push(updatedEntity); + } + })(); + + changePromises.push(promise); + }); + + await Promise.all(changePromises); + updatedEntities.forEach(entity => entity.endLiveUpdate()); + this._entitiesAsync.get().dataUpdated(); + } + + private readonly _dehydrate = async () => { + if (this._fastLoadConfig.useCache) { + try { + await this._fastLoad.save(this._entities); + } catch (ex) { + console.warn('Dehydrate failed', ex); + } + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/RangedListItemLoader.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/RangedListItemLoader.ts new file mode 100644 index 000000000..94a41a5ba --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/RangedListItemLoader.ts @@ -0,0 +1,271 @@ +import moment, { Moment } from "moment-timezone"; +import { IPagedListDataStream } from "../services/sharepoint"; +import { AsyncData } from "../AsyncData"; +import { Entity } from "../Entity"; +import { IKey } from "../IKey"; +import { mapGetOrAdd, now } from "../Utils"; + +export interface IRangedListItemLoaderKey extends IKey { + date: Moment; +} + +export class DateKey implements IRangedListItemLoaderKey { + constructor( + public readonly date: Moment + ) { } + + public valueOf(): number { + return this.date.valueOf(); + } +} + +export type CadenceGeneratorFn = (start: Moment, end: Moment, callbackFn: (key: K) => T) => T[]; + +enum ListItemLoaderState { + initial, + pageRequested, + pageLoaded, + done +} + +class DateRange { + private _start: Moment; + private _end: Moment; + + constructor(start: Moment, end: Moment) { + this._start = start; + this._end = end; + } + + public get start(): Moment { return this._start.clone(); } + public get end(): Moment { return this._end.clone(); } + + public expand(date: Moment) { + this._start = moment.min(this._start, date); + this._end = moment.max(this._end, date); + } +} + +class PagedListItemLoader, TState> { + private readonly _fetchInitialPageFn: () => Promise>; + private readonly _allEntitiesInRangeAreLoaded: () => void; + private readonly _isRangeCovered: (date: Moment) => boolean; + private readonly _processPageResults: (entities: readonly TEntity[]) => Moment; + + private _state: ListItemLoaderState; + private _currentPage: IPagedListDataStream; + + constructor( + fetchInitialPageFn: () => Promise>, + allEntitiesInRangeAreLoaded: () => void, + isRangeCovered: (date: Moment) => boolean, + processPageResults: (entities: TEntity[]) => Moment + ) { + this._fetchInitialPageFn = fetchInitialPageFn; + this._allEntitiesInRangeAreLoaded = allEntitiesInRangeAreLoaded; + this._isRangeCovered = isRangeCovered; + this._processPageResults = processPageResults; + + this._state = ListItemLoaderState.initial; + this._currentPage = null; + } + + public loadMoreItems() { + let pagePromise: Promise> = null; + + switch (this._state) { + case ListItemLoaderState.initial: + pagePromise = this._fetchInitialPageFn(); + this._state = ListItemLoaderState.pageRequested; + break; + case ListItemLoaderState.pageRequested: + return; + case ListItemLoaderState.pageLoaded: + if (this._currentPage.hasNext) { + pagePromise = this._currentPage.next(); + this._state = ListItemLoaderState.pageRequested; + break; + } else { + this._state = ListItemLoaderState.done; + this._currentPage = null; + this._allEntitiesInRangeAreLoaded(); + return; + } + case ListItemLoaderState.done: + this._allEntitiesInRangeAreLoaded(); + return; + } + + pagePromise.then(page => { + const finalDate = this._processPageResults(page.results); + + this._currentPage = page; + this._state = ListItemLoaderState.pageLoaded; + + if (!finalDate || this._isRangeCovered(finalDate)) { + this._allEntitiesInRangeAreLoaded(); + } else { + this.loadMoreItems(); + } + }); + } +} + +export abstract class RangedListItemLoader, TState, TKey extends IRangedListItemLoaderKey, TAsyncDataEntity, TAsyncData extends AsyncData> { + private readonly _generateCadenceFn: CadenceGeneratorFn; + private readonly _entitiesById: Map; + private readonly _entitiesAsyncCache: Map; + private readonly _pastItemsLoader: PagedListItemLoader; + private readonly _futureItemsLoader: PagedListItemLoader; + + private _range: DateRange = null; + + constructor( + initialPastPagePromiseFn: () => Promise>, + initialFuturePagePromiseFn: () => Promise>, + generateDatesFn: CadenceGeneratorFn + ) { + this._generateCadenceFn = generateDatesFn; + this._entitiesById = new Map(); + this._entitiesAsyncCache = new Map(); + + this._pastItemsLoader = new PagedListItemLoader( + initialPastPagePromiseFn, + this._allEntitiesInPastRangeAreLoaded, + this._isPastRangeCovered, + this._processPageResults + ); + this._futureItemsLoader = new PagedListItemLoader( + initialFuturePagePromiseFn, + this._allEntitiesInFutureRangeAreLoaded, + this._isFutureRangeCovered, + this._processPageResults + ); + } + + public get entitiesById(): Map { + return this._entitiesById; + } + + public get entitiesAsyncCache(): Map { + return this._entitiesAsyncCache; + } + + public loadEntitiesInRange(start: Moment, end: Moment): TAsyncData[] { + if (this._range) { + this._range.expand(start); + this._range.expand(end); + } else { + this._range = new DateRange(start, end); + } + + const entitiesAsync = this._generateCadenceFn(start, end, key => { + return this.entityAsyncForKey(key); + }); + + const rangeIncludesPast = entitiesAsync.some(async => async.key.date.isBefore(now(), 'day')); + const rangeIncludesFuture = entitiesAsync.some(async => async.key.date.isSameOrAfter(now(), 'day')); + + if (rangeIncludesPast) + this._pastItemsLoader.loadMoreItems(); + + if (rangeIncludesFuture) + this._futureItemsLoader.loadMoreItems(); + + return entitiesAsync; + } + + public entityAsyncForKey(key: TKey): TAsyncData { + return mapGetOrAdd(this._entitiesAsyncCache, key.valueOf(), () => this.newEntityAsync(key)); + } + + protected entityLoaded(entity: TEntity) { + this._entitiesById.set(entity.id, entity); + } + + protected abstract entityKey(item: TEntity): TKey; + protected abstract newEntityAsync(key: TKey): TAsyncData; + protected abstract allEntitiesAreLoaded(entityAsync: TAsyncData): void; + + private readonly _processPageResults = (entities: TEntity[]): Moment => { + let finalKey: TKey = null; + + entities.filter(entity => !!entity).forEach(entity => { + const entityKey = this.entityKey(entity); + if (finalKey !== null && finalKey.valueOf() !== entityKey.valueOf()) { + this.allEntitiesAreLoaded(this.entityAsyncForKey(finalKey)); + } + finalKey = entityKey; + this._range.expand(finalKey.date); + this.entityLoaded(entity); + }); + + return finalKey && finalKey.date; + } + + private readonly _allEntitiesInPastRangeAreLoaded = () => { + this._allEntitiesAreLoadedInRange(this._range.start, now(), "[)"); + } + + private readonly _allEntitiesInFutureRangeAreLoaded = () => { + this._allEntitiesAreLoadedInRange(now(), this._range.end, "[]"); + } + + private readonly _allEntitiesAreLoadedInRange = (start: Moment, end: Moment, inclusivity: '()' | '[)' | '(]' | '[]') => { + this._entitiesAsyncCache.forEach((entityAsync) => { + if (!entityAsync.done && entityAsync.key.date.isBetween(start, end, 'day', inclusivity)) { + this.allEntitiesAreLoaded(entityAsync); + } + }); + } + + private readonly _isPastRangeCovered = (date: Moment) => { + return date.isBefore(this._range.start); + } + + private readonly _isFutureRangeCovered = (date: Moment) => { + return date.isAfter(this._range.end); + } +} + +export abstract class ParentRangedListItemLoader, TState, TKey extends IRangedListItemLoaderKey, TAsyncData extends AsyncData> + extends RangedListItemLoader { + + constructor( + initialPastPagePromiseFn: () => Promise>, + initialFuturePagePromiseFn: () => Promise>, + cadenceGeneratorFn: CadenceGeneratorFn + ) { + super(initialPastPagePromiseFn, initialFuturePagePromiseFn, cadenceGeneratorFn); + } + + public loadEntitiesInRange(start: Moment, end: Moment): TAsyncData[] { + const entitiesAsync = super.loadEntitiesInRange(start, end); + this.loadChildEntitiesInRange(start, end); + return entitiesAsync; + } + + protected abstract loadChildEntitiesInRange(start: Moment, end: Moment): void; +} + +export abstract class ChildRangedListItemLoader, TState, TKey extends IRangedListItemLoaderKey, TAsyncData extends AsyncData, TParentEntity> + extends RangedListItemLoader { + + private _parentEntitiesById = new Map(); + + constructor( + initialPastPagePromiseFn: () => Promise>, + initialFuturePagePromiseFn: () => Promise>, + cadenceGeneratorFn: CadenceGeneratorFn + ) { + super(initialPastPagePromiseFn, initialFuturePagePromiseFn, cadenceGeneratorFn); + } + + public get parentEntitiesById(): Map { + return this._parentEntitiesById; + } + + public setParentEntityLookup(parentEntitiesById: Map) { + this._parentEntitiesById = parentEntitiesById; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/RateableListItemEntity.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/RateableListItemEntity.ts new file mode 100644 index 000000000..c92978732 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/RateableListItemEntity.ts @@ -0,0 +1,50 @@ +import { Moment } from "moment-timezone"; +import { Guid } from "@microsoft/sp-core-library"; +import { User } from "../User"; +import { ListItemEntity } from "./ListItemEntity"; +import { ListItemRating } from "./ListItemRating"; + +export abstract class RateableListItemEntity extends ListItemEntity { + public static RatingAscComparer(a: RateableListItemEntity, b: RateableListItemEntity) { + return a.rating.averageRating - b.rating.averageRating; + } + public static RatingDescComparer(a: RateableListItemEntity, b: RateableListItemEntity) { + return -RateableListItemEntity.RatingAscComparer(a, b); + } + + constructor(author: User, editor?: User, created?: Moment, modified?: Moment, id: number = 0, uniqueId: Guid = Guid.empty, etag: number = 0) { + super(author, editor, created, modified, id, uniqueId, etag); + + this.rating = new ListItemRating(this); + } + + public readonly rating: ListItemRating; + + public hasChanges(): boolean { + return super.hasChanges() || this.rating.hasChanges(); + } + + public stateVersion(): number { + return super.stateVersion() + this.rating.stateVersion(); + } + + public snapshot() { + super.snapshot(); + this.rating.snapshot(); + } + + public immortalize() { + super.immortalize(); + this.rating.immortalize(); + } + + public beginLiveUpdate(isNew?: boolean): void { + super.beginLiveUpdate(isNew); + this.rating.beginLiveUpdate(isNew); + } + + public endLiveUpdate(): void { + super.endLiveUpdate(); + this.rating.endLiveUpdate(); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/SPField.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/SPField.ts new file mode 100644 index 000000000..60a339779 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/SPField.ts @@ -0,0 +1,250 @@ +import { first } from "lodash"; +import moment, { Moment } from "moment-timezone"; +import { ITimeZone } from '../services'; +import { Entity } from "../Entity"; +import { User } from "../User"; +import { parseFloatOrDefault, parseIntOrDefault, PropsOfType } from '../Utils'; +import { ILookupResult, ITaxonomyResult, IUserInfoResult, IThumbnailResult } from "./query_"; +import { TaxonomyTermEntity } from "./TaxonomyTermEntity"; +import { UpdateHyperlink, UpdateMultiChoice, UpdateMultiLookup, UpdateTaxonomy } from "./update"; +import { ListItemRating } from "./ListItemRating"; +import { ITitleFieldDefinition, ITextFieldDefinition, INumberFieldDefinition, IBooleanFieldDefinition, ITaxonomyFieldDefinition, IDateTimeFieldDefinition, IHyperlinkFieldDefinition, IUserFieldDefinition, AllowedIntegerFieldNames } from "./schema"; +import { Guid } from "@microsoft/sp-core-library"; + +const BooleanDescriminator = Symbol("Boolean Descriminator"); +const ChoiceDescriminator = Symbol("Choice Descriminator"); +const ChoiceMultiDescriminator = Symbol("ChoiceMulti Descriminator"); +const CurrencyDescriminator = Symbol("Currency Descriminator"); +const DateTimeDescriminator = Symbol("DateTime Descriminator"); +const LookupDescriminator = Symbol("Lookup Descriminator"); +const LookupMultiDescriminator = Symbol("LookupMulti Descriminator"); +const NumberDescriminator = Symbol("Number Descriminator"); +const TextDescriminator = Symbol("Text Descriminator"); +const TextMultiDescriminator = Symbol("TextMulti Descriminator"); +const UserDescriminator = Symbol("User Descriminator"); +const UserMultiDescriminator = Symbol("UserMulti Descriminator"); +const HyperlinkDescriminator = Symbol("Hyperlink Descriminator"); +const ThumbnailDescriminator = Symbol("Thumbnail Descriminator"); +const TaxonomyDescriminator = Symbol("Taxonomy Descriminator"); +const TaxonomyMultiDescriminator = Symbol("TaxonomyMulti Descriminator"); +const GuidDescriminator = Symbol("Guid Descriminator"); +const IntegerDescriminator = Symbol("Integer Descriminator"); +const RecurrenceDescriminator = Symbol("Recurrence Descriminator"); + +const sharepointDateTimeFormat = 'M/D/YYYY h:mm A'; + +export type Query_Boolean = string & { [BooleanDescriminator]: never; }; +export type Query_Choice = string & { [ChoiceDescriminator]: never; }; +export type Query_ChoiceMulti = string[] & { [ChoiceMultiDescriminator]: never; }; +export type Query_Currency = string & { [CurrencyDescriminator]: never; }; +export type Query_DateTime = string & { [DateTimeDescriminator]: never; }; +export type Query_Lookup = (ILookupResult & { [LookupDescriminator]: never; })[]; +export type Query_LookupMulti = (ILookupResult & { [LookupMultiDescriminator]: never; })[]; +export type Query_Number = string & { [NumberDescriminator]: never; }; +export type Query_Text = string & { [TextDescriminator]: never; }; +export type Query_TextMultiLine = string & { [TextMultiDescriminator]: never; }; +export type Query_User = (IUserInfoResult & { [UserDescriminator]: never; })[]; +export type Query_UserMulti = (IUserInfoResult & { [UserMultiDescriminator]: never; })[]; +export type Query_Hyperlink = string & { [HyperlinkDescriminator]: never; }; +export type Query_Thumbnail = IThumbnailResult & { [ThumbnailDescriminator]: never; }; +export type Query_Taxonomy = ITaxonomyResult & { [TaxonomyDescriminator]: never; }; +export type Query_TaxonomyMulti = (ITaxonomyResult & { [TaxonomyMultiDescriminator]: never; })[]; +export type Query_Guid = (string & { [GuidDescriminator]: never; })[]; +export type Query_Integer = (string & { [IntegerDescriminator]: never; })[]; +export type Query_Recurrence = (string & { [RecurrenceDescriminator]: never; })[]; + +export type Update_Boolean = boolean; +export type Update_Choice = string; +export type Update_ChoiceMulti = UpdateMultiChoice; +export type Update_Currency = number; +export type Update_DateTime = string; +export type Update_LookupId = number; +export type Update_LookupIdMulti = UpdateMultiLookup; +export type Update_Number = number; +export type Update_Text = string; +export type Update_TextMultiLine = string; +export type Update_UserId = number; +export type Update_UserIdMulti = UpdateMultiLookup; +export type Update_Hyperlink = UpdateHyperlink; +// export type Update_Thumbnail = string; +export type Update_Taxonomy = UpdateTaxonomy; +export type Update_TaxonomyMulti = string; +export type Update_Guid = string; +export type Update_Integer = number; +export type Update_Recurrence = boolean; + +const toUserCore = ({ id, title, email, sip, picture }: IUserInfoResult): User => { + return new User(parseInt(id), title, email, sip, picture); +}; + +export const toUser = (result: Query_User): User => { + return first((result || []).map(toUserCore)); +}; + +export const toUsers = (results: Query_UserMulti): User[] => { + return (results || []).map(toUserCore); +}; + +export const fromUser = (user: User): Update_UserId => { + return user?.id || null; +}; + +export const fromUsers = (users: User[]): Update_UserIdMulti => { + return new UpdateMultiLookup(users.map(u => u.id)); +}; + +export const fromDateTime = (row: T, fieldName: PropsOfType, { momentId }: ITimeZone): Moment => { + const value: string = (row as any)[`${String(fieldName)}.`]; + return value ? moment.tz(value, [moment.ISO_8601, sharepointDateTimeFormat], momentId) : null; +}; + +export const toDateTime = (dateTime: Moment): Update_DateTime => { + return dateTime ? dateTime.toISOString() : null; +}; + +export const toDateOnly = (dateTime: Moment): Update_DateTime => { + return dateTime ? dateTime.format('MM-DD-YYYY') : null; +}; + +export const fromYesNo = (row: T, fieldName: PropsOfType, defaultValue: boolean = false): boolean => { + const value: string = (row as any)[`${String(fieldName)}.value`]; + switch (value) { + case "0": return false; + case "1": return true; + default: return defaultValue; + } +}; + +export const fromInteger = (row: T, fieldName: PropsOfType & AllowedIntegerFieldNames): number => { + const value: string = (row as any)[fieldName]; + return parseIntOrDefault(value, undefined, 10); +}; + +export const fromInt = (row: T, fieldName: PropsOfType, defaultValue: number = Number.NaN, radix: number = 10): number => { + const value: string = (row as any)[`${String(fieldName)}.`]; + return parseIntOrDefault(value, defaultValue, radix); +}; + +export const fromFloat = (row: T, fieldName: PropsOfType, defaultValue: number = Number.NaN): number => { + const value: string = (row as any)[`${String(fieldName)}.`]; + return parseFloatOrDefault(value, defaultValue); +}; + +export const fromCurrency = (row: T, fieldName: PropsOfType, defaultValue: number = Number.NaN): number => { + const value: string = (row as any)[`${String(fieldName)}.`]; + return parseFloatOrDefault(value, defaultValue); +}; + +export const fromGuid = (row: T, fieldName: PropsOfType): Guid => { + const value: string = (row as any)[fieldName]; + return Guid.tryParse(value); +}; + +export const fromRecurrence = (row: T, fieldName: PropsOfType & "fRecurrence"): boolean => { + const value: string = (row as any)[fieldName]; + switch (value) { + case "0": return false; + case "1": return true; + default: return false; + } +}; + +export const tofRecurrence = (recurrence: boolean): Update_Recurrence => { + return recurrence; +}; + +export const toLookupMulti = >(entities: ReadonlyArray): Update_LookupIdMulti => { + return new UpdateMultiLookup(entities.map(e => e.id)); +}; + +export const lookupHasValue = (value: Query_Lookup | Query_LookupMulti) => { + return value && value.length > 0 && value[0].lookupId > 0 && !!value[0].lookupValue; +}; + +export const fromLookup = (value: Query_Lookup, lookup: ReadonlyMap) => { + return lookupHasValue(value) ? lookup.get(first(value).lookupId) : null; +}; + +export const fromLookupMulti = (values: Query_LookupMulti, lookup: ReadonlyMap) => { + return lookupHasValue(values) ? values.map(value => lookup.get(value.lookupId)) : []; +}; + +export const fromLookupAsync = async (value: Query_Lookup, lookup: (id: number) => T | Promise) => { + return lookupHasValue(value) ? await lookup(value[0].lookupId) : null; +}; + +export const fromLookupMultiAsync = async (values: Query_LookupMulti, lookup: (id: number) => T | Promise) => { + return lookupHasValue(values) ? await Promise.all(values.map(value => lookup(value.lookupId))) : []; +}; + +export const toTaxonomy = >(term: T): Update_Taxonomy => { + return term ? new UpdateTaxonomy(term.label, term.termId.toString()) : null; +}; + +export const toTaxonomyMulti = >(terms: readonly T[]): Update_TaxonomyMulti => { + return (terms || []).map(term => `-1;#${term.label}|${term.termId.toString()}`).join(';#'); +}; + +export const fromTaxonomy = >(value: Query_Taxonomy, lookup: ReadonlyMap) => { + return lookup.get(value?.TermID || value?.TermGuid); +}; + +export const fromTaxonomyMulti = >(values: Query_TaxonomyMulti, lookup: ReadonlyMap) => { + return (values || []).map(value => lookup.get(value.TermID)).filter(Boolean); +}; + +export const fromTaxonomyAsync = async >(value: Query_Taxonomy, lookup: (guid: string) => T | Promise) => { + return lookup(value?.TermID); +}; + +export const fromTaxonomyMultiAsync = async >(values: Query_TaxonomyMulti, lookup: (guid: string) => T | Promise) => { + return Promise.all((values || []).map(value => lookup(value.TermID))); +}; + +export const fromThumbnail = (value: Query_Thumbnail): string => { + return value?.serverRelativeUrl; +}; + +export const toRating = (entity: ListItemRating, row: { RatedBy: Query_UserMulti, Ratings: Query_Text }): void => { + entity.ratedBy = toUsers(row.RatedBy); + entity.ratings = (row.Ratings || '').split(',').filter(Boolean).map(r => parseInt(r, 10)); +}; + +export const Form = { + Title: (field: ITitleFieldDefinition, value: string) => { + return { FieldName: field.name, FieldValue: value }; + }, + Text: (field: ITextFieldDefinition, value: string) => { + return { FieldName: field.name, FieldValue: value }; + }, + Number: (field: INumberFieldDefinition, value: number) => { + return { FieldName: field.name, FieldValue: value?.toString() || '' }; + }, + Boolean: (field: IBooleanFieldDefinition, value: boolean) => { + return { FieldName: field.name, FieldValue: value ? '1' : '2' }; + }, + User: (field: IUserFieldDefinition, value: User) => { + return { FieldName: field.name, FieldValue: value ? JSON.stringify([{ Key: value.login }]) : '' }; + }, + UserMulti: (field: IUserFieldDefinition, value: User[]) => { + return { FieldName: field.name, FieldValue: value.length > 0 ? "[" + value.map(user => `{ "Key": "${user.login}" }`).join(',') + "]" : '' }; + }, + Date: (field: IDateTimeFieldDefinition, value: Moment) => { + return { FieldName: field.name, FieldValue: value ? value.format('MM/DD/YYYY') : '' }; + }, + DateTime: (field: IDateTimeFieldDefinition, value: Moment) => { + return { FieldName: field.name, FieldValue: value ? value.format('MM/DD/YYYY HH:MM A') : '' }; + }, + Hyperlink: (field: IHyperlinkFieldDefinition, value: string) => { + return { FieldName: field.name, FieldValue: value?.toString() || '' }; + }, + SingleMMD: >(field: ITaxonomyFieldDefinition, value: T) => { + return { FieldName: field.name, FieldValue: value ? `${value.label}|${value.termId.toString()};` : '' }; + }, + MultiMMD: >(field: ITaxonomyFieldDefinition, value: T[]) => { + return { FieldName: field.name, FieldValue: value?.map(term => `${term.label}|${term.termId.toString()}`).join(';') || '' }; + }, + FileLeafRef: (value: string) => { + return { FieldName: 'FileLeafRef', FieldValue: value }; + } +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/SharePointGroup.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/SharePointGroup.ts new file mode 100644 index 000000000..cac73d71c --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/SharePointGroup.ts @@ -0,0 +1,89 @@ +import { isEqualWith } from 'lodash'; +import { Entity } from "../Entity"; +import { User } from "../User"; +import { IUserListChanges } from "../IUserListChanges"; + +interface State { + title: string; + members: User[]; + description?: string; + allowMembersEditMembership?: boolean; + allowRequestToJoinLeave?: boolean; + autoAcceptRequestToJoinLeave?: boolean; + onlyAllowMembersViewMembership?: boolean; + requestToJoinLeaveEmailSetting?: string; + hasMembershipChanges: boolean; + hasMetadataChanges: boolean; +} + +export class SharePointGroup extends Entity { + constructor(id?: number, name: string = '', members: User[] = []) { + super(id); + + this.state.title = name; + this.state.members = members.slice(); + this.state.description = ''; + this.state.requestToJoinLeaveEmailSetting = ''; + this.state.allowMembersEditMembership = true; + this.state.allowRequestToJoinLeave = false; + this.state.autoAcceptRequestToJoinLeave = false; + this.state.onlyAllowMembersViewMembership = false; + } + + public containsUser(user: User): boolean { + return this.members.some(m => User.equal(m, user)); + } + + public get displayName(): string { return this.state.title; } + + public get title(): string { return this.state.title; } + public set title(val: string) { this.state.title = val; } + + public get members(): User[] { return this.state.members; } + public set members(val: User[]) { this.state.members = val; } + + public get description(): string { return this.state.description; } + public set description(val: string) { this.state.description = val; } + + public get requestToJoinLeaveEmailSetting(): string { return this.state.requestToJoinLeaveEmailSetting; } + public set requestToJoinLeaveEmailSetting(val: string) { this.state.requestToJoinLeaveEmailSetting = val; } + + public get allowMembersEditMembership(): boolean { return this.state.allowMembersEditMembership; } + public set allowMembersEditMembership(val: boolean) { this.state.allowMembersEditMembership = val; } + + public get allowRequestToJoinLeave(): boolean { return this.state.allowRequestToJoinLeave; } + public set allowRequestToJoinLeave(val: boolean) { this.state.allowRequestToJoinLeave = val; } + + public get autoAcceptRequestToJoinLeave(): boolean { return this.state.autoAcceptRequestToJoinLeave; } + public set autoAcceptRequestToJoinLeave(val: boolean) { this.state.autoAcceptRequestToJoinLeave = val; } + + public get onlyAllowMembersViewMembership(): boolean { return this.state.onlyAllowMembersViewMembership; } + public set onlyAllowMembersViewMembership(val: boolean) { this.state.onlyAllowMembersViewMembership = val; } + + public hasMetadataChanges(): boolean { + if (this.isNew) { + return true; + } else if (this.hasSnapshot) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { members, ...metadata } = this.state; + + this.peekSnapshot(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { members: membersOriginal, ...metadataOriginal } = this.state; + this.endPeek(); + + return !isEqualWith(metadata, metadataOriginal, this.stateIsEqualCustomizer); + } else { + return false; + } + } + + public hasMembershipChanges(): boolean { + const diff = this.membersDifference(); + return diff.added.length > 0 || diff.removed.length > 0; + } + + public membersDifference(): IUserListChanges { + return this.usersDifference('members'); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/TaxonomyTermEntity.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/TaxonomyTermEntity.ts new file mode 100644 index 000000000..5bf147531 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/TaxonomyTermEntity.ts @@ -0,0 +1,52 @@ +import { Guid } from '@microsoft/sp-core-library'; +import { Entity, IManyToOneRelationship, ManyToOneRelationship, IOneToManyRelationship, OneToManyRelationship } from 'common'; +import { flatten } from 'lodash'; + +interface IState { + termId: Guid; + label: string; + labels: string[]; + parent: T; +} + +export class TaxonomyTermEntity> extends Entity> { + constructor(label: string = '', termId: Guid = Guid.empty, labels: string[] = []) { + super(-1); + + this.state.termId = termId; + this.state.label = label; + this.state.labels = labels; + + this.parent = ManyToOneRelationship.create, any>(this as unknown as Entity, 'children', 'parent'); + this.children = OneToManyRelationship.create(this, 'parent'); + } + + public readonly parent: IManyToOneRelationship; + public readonly children: IOneToManyRelationship; + + public get ancestors(): T[] { + const parent = this.parent.get(); + const ancestors = parent?.ancestors; + return parent ? [parent, ...ancestors] : []; + } + + public get allDescendants(): T[] { + return [this as unknown as T, ...flatten(this.children.map(c => c.allDescendants))]; + } + + public get displayName(): string { return this.label; } + + public get termId(): Guid { return this.state.termId; } + + public get label(): string { return this.state.label; } + public set label(val: string) { this.state.label = val; } + + public get labels(): string[] { return this.state.labels; } + + protected buildSearchHelperStrings(): string[] { + return [ + this.label.normalize("NFD").replace(/\p{Diacritic}/gu, ""), + ...this.labels + ]; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/compressed-json.d.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/compressed-json.d.ts new file mode 100644 index 000000000..2db6db343 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/compressed-json.d.ts @@ -0,0 +1,4 @@ +declare module 'compressed-json' { + declare function compress(src: any, options?: { reservedKeys: string[], reservedValues: string[] }): any; + declare function decompress(compressed: any, options?: { reservedKeys: string[], reservedValues: string[] }): any; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/createEntity.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/createEntity.ts new file mode 100644 index 000000000..6494baf9e --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/createEntity.ts @@ -0,0 +1,28 @@ +import { Moment } from "moment-timezone"; +import { Guid } from "@microsoft/sp-core-library"; +import { Entity } from "common"; +import { ITimeZone } from "common/services"; +import { User } from "../User"; +import { IListItemResult } from "./query_"; +import { ListItemEntity } from "./ListItemEntity"; +import * as SPField from "./SPField"; + +export type ListItemEntityConstructor> = { new(author: User, editor?: User, created?: Moment, modified?: Moment, id?: number, uniqueId?: Guid, etag?: number): E }; + +export const createEntity = >(EntityType: ListItemEntityConstructor, row: IListItemResult, siteTimeZone: ITimeZone, existing?: E) => { + const etag = parseInt(row.owshiddenversion); + const editor = SPField.toUser(row.Editor); + const modified = SPField.fromDateTime(row, 'Modified', siteTimeZone); + + if (existing) { + existing.setEditor(editor, modified, etag); + return existing; + } else { + const id = parseInt(row.ID, 10); + const uniqueId = Guid.parse(row.UniqueId); + const author = SPField.toUser(row.Author); + const created = SPField.fromDateTime(row, 'Created', siteTimeZone); + + return new EntityType(author, editor, created, modified, id, uniqueId, etag); + } +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/index.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/index.ts new file mode 100644 index 000000000..8fa94cfb9 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/index.ts @@ -0,0 +1,19 @@ +export * from './query_'; +export * from './schema'; +export * from './update'; + +export { ChoiceFieldValue } from './ChoiceFieldValue'; +export { createEntity } from './createEntity'; +export type { ListItemEntityConstructor } from './createEntity'; +export { ListItemFunctions as FastLoadFunctions, ListItemCache } from './ListItemCache'; +export { IListItemEntity, ListItemEntity } from './ListItemEntity'; +export { ListItemRating } from './ListItemRating'; +export { ModerationStatus } from './ModerationStatus'; +export { ErrorDiagnosis, PagedViewLoader } from './PagedViewLoader'; +export { CamlQuery } from './CamlQuery'; +export { RangedListItemLoader, ParentRangedListItemLoader, ChildRangedListItemLoader, IRangedListItemLoaderKey, DateKey } from './RangedListItemLoader'; +export { RateableListItemEntity } from './RateableListItemEntity'; +export { SharePointGroup } from './SharePointGroup'; +import * as SPField from './SPField'; +export { SPField }; +export { TaxonomyTermEntity } from './TaxonomyTermEntity'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IAddListItemResult.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IAddListItemResult.ts new file mode 100644 index 000000000..bfa9f94e6 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IAddListItemResult.ts @@ -0,0 +1,9 @@ +import * as SPField from "../SPField"; + +export interface IAddListItemResult { + readonly ID: string; + readonly Title: SPField.Query_Text; + readonly Created: SPField.Query_DateTime; + readonly Modified: SPField.Query_DateTime; + readonly ['odata.etag']: string; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IChoiceFieldInfo.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IChoiceFieldInfo.ts new file mode 100644 index 000000000..23221f416 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IChoiceFieldInfo.ts @@ -0,0 +1,6 @@ +import { IFieldInfo } from "@pnp/sp/fields/types"; + +export interface IChoiceFieldInfo extends IFieldInfo { + readonly Choices: string[]; + readonly FillInChoice: boolean; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/ICurrentChangeTokenResult.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/ICurrentChangeTokenResult.ts new file mode 100644 index 000000000..749521108 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/ICurrentChangeTokenResult.ts @@ -0,0 +1,3 @@ +export interface ICurrentChangeTokenResult { + readonly StringValue: string; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IFolderResult.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IFolderResult.ts new file mode 100644 index 000000000..3f776f20a --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IFolderResult.ts @@ -0,0 +1,10 @@ +export interface IFolderResult { + readonly Exists: boolean; + readonly ItemCount: number; + readonly Name: string; + readonly ServerRelativeUrl: string; + readonly TimeCreated: string; + readonly TimeLastModified: string; + readonly UniqueId: string; + readonly WelcomePage: string; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IListItemResult.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IListItemResult.ts new file mode 100644 index 000000000..c10b555d9 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IListItemResult.ts @@ -0,0 +1,12 @@ +import * as SPField from "../SPField"; + +export interface IListItemResult { + readonly ID: string; + readonly Title: SPField.Query_Text; + readonly Created: SPField.Query_DateTime; + readonly Modified: SPField.Query_DateTime; + readonly Author: SPField.Query_User; + readonly Editor: SPField.Query_User; + readonly UniqueId: string; + readonly owshiddenversion: string; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/ILookupResult.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/ILookupResult.ts new file mode 100644 index 000000000..cb7087c67 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/ILookupResult.ts @@ -0,0 +1,4 @@ +export interface ILookupResult { + readonly lookupId: number; + readonly lookupValue: string; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IRenderListDataAsStreamResult.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IRenderListDataAsStreamResult.ts new file mode 100644 index 000000000..0c732a114 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IRenderListDataAsStreamResult.ts @@ -0,0 +1,8 @@ +import { IRenderListDataAsStreamResult as IRenderListDataAsStreamResult_PNP } from "@pnp/sp/lists/types"; +import { IListItemResult } from "./IListItemResult"; + +export interface IRenderListDataAsStreamResult extends IRenderListDataAsStreamResult_PNP { + readonly NextHref: string; + readonly PrevHref: string; + readonly Row: T[]; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/ITaxonomyResult.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/ITaxonomyResult.ts new file mode 100644 index 000000000..e9c2557ab --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/ITaxonomyResult.ts @@ -0,0 +1,5 @@ +export interface ITaxonomyResult { + readonly Label: number; + readonly TermID: string; + readonly TermGuid: string; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IThumbnailResult.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IThumbnailResult.ts new file mode 100644 index 000000000..6eda5cd78 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IThumbnailResult.ts @@ -0,0 +1,11 @@ +export interface IThumbnailResult { + readonly fileName: string; + readonly id: string; + readonly serverRelativeUrl: string; + readonly serverUrl: string; + readonly thumbnailRenderer: { + readonly fileVersion: number; + readonly spItemUrl: string; + readonly sponsorToken: string; + }; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IUserInfoResult.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IUserInfoResult.ts new file mode 100644 index 000000000..6c7638b6d --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IUserInfoResult.ts @@ -0,0 +1,7 @@ +export interface IUserInfoResult { + readonly id: string; + readonly title: string; + readonly picture: string; + readonly sip: string; + readonly email: string; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IWebAllPropertiesResult.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IWebAllPropertiesResult.ts new file mode 100644 index 000000000..597ac5d74 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/IWebAllPropertiesResult.ts @@ -0,0 +1,10 @@ +export interface IWebAllPropertiesResult { + FollowLinkEnabled: 'TRUE' | 'FALSE'; + GroupAlias: string; // ex: "MyAppDevSite" + GroupDocumentListId: string; // GUID + GroupDocumentsUrl: string; // ex: "Shared Documents" + GroupId: string; // GUID + GroupType: 'Public' | 'Private'; + SiteNotebookGuid: string; // GUID + taxonomyHiddenList: string; // GUID +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/index.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/index.ts new file mode 100644 index 000000000..cb1badd34 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/query_/index.ts @@ -0,0 +1,11 @@ +export { IAddListItemResult } from './IAddListItemResult'; +export { IChoiceFieldInfo } from './IChoiceFieldInfo'; +export { IRenderListDataAsStreamResult } from './IRenderListDataAsStreamResult'; +export { ICurrentChangeTokenResult } from './ICurrentChangeTokenResult'; +export { IFolderResult } from './IFolderResult'; +export { IListItemResult } from './IListItemResult'; +export { ILookupResult } from './ILookupResult'; +export { ITaxonomyResult } from './ITaxonomyResult'; +export { IUserInfoResult } from './IUserInfoResult'; +export { IThumbnailResult } from './IThumbnailResult'; +export { IWebAllPropertiesResult } from './IWebAllPropertiesResult'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/AddListFieldUpgradeAction.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/AddListFieldUpgradeAction.ts new file mode 100644 index 000000000..3160e5a2b --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/AddListFieldUpgradeAction.ts @@ -0,0 +1,22 @@ +import { ElementProvisioner } from './ElementProvisioner'; +import { IListDefinition, IFieldDefinition } from "./IElementDefinitions"; +import { IUpgradeAction } from "./IUpgradeAction"; + +export abstract class AddListFieldUpgradeAction implements IUpgradeAction { + constructor( + private readonly _listDefinition: IListDefinition, + private readonly _fieldDefinition: IFieldDefinition + ) { } + + public get description(): string { + const fieldName = this._fieldDefinition.displayName || this._fieldDefinition.name; + const listTitle = this._listDefinition.title; + + return `Adding field '${fieldName}' to list '${listTitle}'`; + } + + public async execute(): Promise { + const provisioner: ElementProvisioner = new ElementProvisioner(); + await provisioner.ensureField(this._fieldDefinition, this._listDefinition); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/AddOrUpdateViewUpgradeAction.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/AddOrUpdateViewUpgradeAction.ts new file mode 100644 index 000000000..6c7b9485c --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/AddOrUpdateViewUpgradeAction.ts @@ -0,0 +1,22 @@ +import { ElementProvisioner } from './ElementProvisioner'; +import { IListDefinition, IViewDefinition } from "./IElementDefinitions"; +import { IUpgradeAction } from "./IUpgradeAction"; + +export abstract class AddOrUpdateViewUpgradeAction implements IUpgradeAction { + constructor( + private readonly _listDefinition: IListDefinition, + private readonly _viewDefinition: IViewDefinition + ) { } + + public get description(): string { + const viewTitle = this._viewDefinition.title; + const listTitle = this._listDefinition.title; + + return `Updating view '${viewTitle}' on list '${listTitle}'`; + } + + public async execute(): Promise { + const provisioner: ElementProvisioner = new ElementProvisioner(); + await provisioner.addOrUpdateView(this._viewDefinition, this._listDefinition); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/CreateListUpgradeAction.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/CreateListUpgradeAction.ts new file mode 100644 index 000000000..3ced9e81c --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/CreateListUpgradeAction.ts @@ -0,0 +1,18 @@ +import { ElementProvisioner } from './ElementProvisioner'; +import { IListDefinition } from "./IElementDefinitions"; +import { IUpgradeAction } from "./IUpgradeAction"; + +export abstract class CreateListUpgradeAction implements IUpgradeAction { + constructor( + private readonly _listDefinition: IListDefinition + ) { } + + public get description(): string { + return `Creating list '${this._listDefinition.title}'`; + } + + public async execute(): Promise { + const provisioner: ElementProvisioner = new ElementProvisioner(); + await provisioner.ensureList(this._listDefinition); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/DeleteListFieldUpgradeAction.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/DeleteListFieldUpgradeAction.ts new file mode 100644 index 000000000..23a315842 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/DeleteListFieldUpgradeAction.ts @@ -0,0 +1,22 @@ +import { ElementProvisioner } from './ElementProvisioner'; +import { IListDefinition, IFieldDefinition } from "./IElementDefinitions"; +import { IUpgradeAction } from "./IUpgradeAction"; + +export abstract class DeleteListFieldUpgradeAction implements IUpgradeAction { + constructor( + private readonly _listDefinition: IListDefinition, + private readonly _fieldDefinition: IFieldDefinition + ) { } + + public get description(): string { + const fieldName = this._fieldDefinition.displayName || this._fieldDefinition.name; + const listTitle = this._listDefinition.title; + + return `Deleting field '${fieldName}' from list '${listTitle}'`; + } + + public async execute(): Promise { + const provisioner: ElementProvisioner = new ElementProvisioner(); + await provisioner.deleteField(this._fieldDefinition, this._listDefinition); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/DeleteListViewUpgradeAction.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/DeleteListViewUpgradeAction.ts new file mode 100644 index 000000000..4db7f456d --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/DeleteListViewUpgradeAction.ts @@ -0,0 +1,22 @@ +import { ElementProvisioner } from './ElementProvisioner'; +import { IListDefinition } from "./IElementDefinitions"; +import { IUpgradeAction } from "./IUpgradeAction"; + +export abstract class DeleteListViewUpgradeAction implements IUpgradeAction { + constructor( + private readonly _listDefinition: IListDefinition, + private readonly _viewTitle: string + ) { } + + public get description(): string { + const viewName = this._viewTitle; + const listTitle = this._listDefinition.title; + + return `Deleting view '${viewName}' from list '${listTitle}'`; + } + + public async execute(): Promise { + const provisioner: ElementProvisioner = new ElementProvisioner(); + await provisioner.deleteView(this._viewTitle, this._listDefinition); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/DeleteSiteFieldUpgradeAction.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/DeleteSiteFieldUpgradeAction.ts new file mode 100644 index 000000000..908cdde41 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/DeleteSiteFieldUpgradeAction.ts @@ -0,0 +1,20 @@ +import { ElementProvisioner } from './ElementProvisioner'; +import { IFieldDefinition } from "./IElementDefinitions"; +import { IUpgradeAction } from "./IUpgradeAction"; + +export abstract class DeleteSiteFieldUpgradeAction implements IUpgradeAction { + constructor( + private readonly _fieldDefinition: IFieldDefinition + ) { } + + public get description(): string { + const fieldName = this._fieldDefinition.displayName || this._fieldDefinition.name; + + return `Deleting field '${fieldName}' from site`; + } + + public async execute(): Promise { + const provisioner: ElementProvisioner = new ElementProvisioner(); + await provisioner.deleteSiteField(this._fieldDefinition); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/ElementProvisioner.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/ElementProvisioner.ts new file mode 100644 index 000000000..eb63e15c1 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/ElementProvisioner.ts @@ -0,0 +1,846 @@ +/* eslint-disable no-bitwise */ +import { find, first } from "lodash"; +import { Guid } from "@microsoft/sp-core-library"; +import { SPComponentLoader } from '@microsoft/sp-loader'; +import { getGUID } from "@pnp/common/util"; +import { sp, SPBatch, PrincipalType, PrincipalSource } from "@pnp/sp"; +import "@pnp/sp/fields"; +import { IFields, UrlFieldFormatType, AddFieldOptions, IFieldInfo, IFieldCreationProperties, DateTimeFieldFormatType, FieldTypes } from "@pnp/sp/fields/types"; +import "@pnp/sp/lists"; +import { IList, IListInfo } from "@pnp/sp/lists/types"; +import "@pnp/sp/site-groups"; +import { IGroupAddResult } from "@pnp/sp/site-groups/types"; +import "@pnp/sp/security"; +import { IBasePermissions, PermissionKind } from "@pnp/sp/security/types"; +import "@pnp/sp/taxonomy"; +import "@pnp/sp/webs"; +import { IWeb } from "@pnp/sp/webs/types"; +import { User, ErrorHandler, mapGetOrAdd, siteCollectionTermGroupName } from "common"; +import { RoleType, IListDefinition, IFieldDefinition, FieldType, RoleOperation, IListPermissions, IUserRole, WriteAccess, ReadAccess, ISiteGroup, IViewDefinition, IElementDefinitions, DraftVisibilityType, IPermissionLevel, LookupListId, TermGroupId, TermSetId, TermStoreId, AnchorTermId, DefaultTerm, ReputationSiteFields, ParentList, ListTemplateType } from './IElementDefinitions'; + +const AutomaticListFields = { + allLists: ["Created", "Modified", "Author", "Editor"], + [ListTemplateType.GenericList]: [] as string[], + [ListTemplateType.EventsList]: ["Category", "EventDate", "EndDate", "Location", "fAllDayEvent", "fRecurrence", "EventType", "UID", "RecurrenceID", "MasterSeriesItemID", "RecurrenceData"], + [ListTemplateType.DocumentLibrary]: ["_ExtendedDescription", "CheckoutUser"], + [ListTemplateType.PictureLibrary]: ["Comments", "ImageCreateDate", "Keywords", "AlternateThumbnailUrl"] as string[], + [ListTemplateType.UserInformation]: [] as string[] +}; + +class ResolvedUserRole { + constructor( + public readonly userRole: IUserRole, + public readonly principalId: number, + public readonly roleDefinitionId: number + ) { } +} + +export class ElementProvisioner { + private readonly _ensureFieldsPromiseCache: Map>; + + constructor() { + this._ensureFieldsPromiseCache = new Map>(); + } + + public async ensureElements(elementDefinitions: IElementDefinitions, web?: IWeb): Promise { + try { + const { permissionLevels, siteGroups, siteFields, lists } = elementDefinitions; + web = web || sp.web; + + if (permissionLevels) { + await Promise.all(permissionLevels.map(level => this._ensurePermissionLevel(web, level))); + } + + if (siteGroups) { + await Promise.all(siteGroups.map(siteGroup => this._ensureSiteGroup(web, siteGroup))); + } + + if (siteFields) { + await Promise.all(siteFields.map(siteField => this._ensureField(web, web.fields, siteField))); + } + + if (lists) { + await this._ensureListsRespectingDependencies(web, lists); + } + } catch (e) { + ErrorHandler.throw(e); + } + } + + public async ensureList(listDefinition: IListDefinition, web?: IWeb): Promise { + web = web || sp.web; + + try { + await this._ensureListsRespectingDependencies(web, [listDefinition]); + } catch (e) { + ErrorHandler.throw(e); + } + } + + public async ensureField(fieldDefinition: IFieldDefinition, listDefinition: IListDefinition, web?: IWeb): Promise { + web = web || sp.web; + const list = web.lists.getByTitle(listDefinition.title); + + try { + const retrieveLookupListIdBatch = web.createBatch(); + this._retrieveLookupListId(web, fieldDefinition, retrieveLookupListIdBatch); + await retrieveLookupListIdBatch.execute(); + + await this._retrieveTaxonomyIds(web, fieldDefinition); + + await this._ensureField(web, list.fields, fieldDefinition); + } catch (e) { + ErrorHandler.throw(e); + } + } + + public async updateField(fieldDefinition: IFieldDefinition, listDefinition: IListDefinition, web?: IWeb): Promise { + web = web || sp.web; + const list = web.lists.getByTitle(listDefinition.title); + const eh = new ErrorHandler(); + const batch = web.createBatch(); + this._updateField(fieldDefinition, list.fields, batch, eh); + await batch.execute(); + eh.throwIfError(); + } + + public async deleteField(fieldDefinition: IFieldDefinition, listDefinition: IListDefinition, web?: IWeb): Promise { + web = web || sp.web; + const list = web.lists.getByTitle(listDefinition.title); + const field = list.fields.getByInternalNameOrTitle(fieldDefinition.name); + + try { + try { + await field(); // check if the field exists before attempting to delete + } catch (e) { + return; // field does not exist + } + + await field.delete(); + } catch (e) { + ErrorHandler.throw(e); + } + } + + public async addOrUpdateView(viewDefinition: IViewDefinition, listDefinition: IListDefinition, web?: IWeb): Promise { + web = web || sp.web; + const list = web.lists.getByTitle(listDefinition.title); + + try { + await list.views.getByTitle(viewDefinition.title) + .delete() + .catch(() => { }); // if view doesn't exist, swallow the exception + await this._createView(web, list, viewDefinition); + } catch (e) { + ErrorHandler.throw(e); + } + } + + public async deleteSiteField(fieldDefinition: IFieldDefinition, web?: IWeb): Promise { + web = web || sp.web; + + try { + await web.fields.getByInternalNameOrTitle(fieldDefinition.name) + .delete() + .catch(() => { }); // if column doesn't exist, swallow the exception + } catch (e) { + ErrorHandler.throw(e); + } + } + + public async deleteView(viewTitle: string, listDefinition: IListDefinition, web?: IWeb): Promise { + web = web || sp.web; + const list = web.lists.getByTitle(listDefinition.title); + + try { + await list.views.getByTitle(viewTitle).delete(); + } catch (e) { + ErrorHandler.throw(e); + } + } + + public async configurePermissions(listDefinition: IListDefinition, web?: IWeb, forcePermissionReset: boolean = false): Promise { + web = web || sp.web; + + try { + await this._configurePermissions(listDefinition, web, forcePermissionReset); + } catch (e) { + ErrorHandler.throw(e); + } + } + + private async _ensureListsRespectingDependencies(web: IWeb, listDefinitions: IListDefinition[]): Promise { + for (const list of listDefinitions) { + if (list.dependencies && list.dependencies.length > 0) { + await this._ensureListsRespectingDependencies(web, list.dependencies); + } + + await this._ensureList(web, list); + } + } + + private async _ensureList(web: IWeb, listDefinition: IListDefinition): Promise { + const { + title, description, template, readSecurity, writeSecurity, enableModeration, + enableVersioning, enableMinorVersions, majorVersionLimit, majorWithMinorVersionsLimit, draftVersionVisibility + } = listDefinition; + + const listSettings: Partial = { + EnableModeration: enableModeration, + EnableVersioning: enableVersioning, + ReadSecurity: readSecurity || ReadAccess.ByAll, + WriteSecurity: writeSecurity || WriteAccess.ByAll, + DraftVersionVisibility: enableModeration ? (draftVersionVisibility || DraftVisibilityType.Reader) : undefined, + EnableMinorVersions: enableVersioning ? enableMinorVersions : undefined, + MajorVersionLimit: majorVersionLimit || undefined, + MajorWithMinorVersionsLimit: majorWithMinorVersionsLimit || undefined + }; + + const listEnsureResult = await web.lists.ensure(title, description, template, false, listSettings); + + if (listEnsureResult.created) + await this._configureList(web, listDefinition, listEnsureResult.list); + } + + private async _configureList(web: IWeb, listDefinition: IListDefinition, list: IList): Promise { + const siteFields = listDefinition.siteFields || []; + const siteGroups = listDefinition.siteGroups || []; + const fields = listDefinition.fields || []; + const views = listDefinition.views || []; + + const retrieveLookupListIdsBatch = web.createBatch(); + const retrieveLookupListIdsPromises = fields.map(field => this._retrieveLookupListId(web, field, retrieveLookupListIdsBatch)); + await retrieveLookupListIdsBatch.execute(); + await Promise.all(retrieveLookupListIdsPromises); + + await Promise.all(fields.map(field => this._retrieveTaxonomyIds(web, field))); + + await Promise.all(siteGroups.map(siteGroup => this._ensureSiteGroup(web, siteGroup))); + const siteFieldResults = await Promise.all(siteFields.map(field => this._ensureField(web, web.fields, field))); + + const eh = new ErrorHandler(); + const fieldsBatch = web.createBatch(); + fields.forEach(field => this._createField(field, list.fields, fieldsBatch, eh)); + siteFieldResults.forEach(field => this._addSiteField(field, list.fields, fieldsBatch, eh)); + + await fieldsBatch.execute(); + eh.throwIfError(); + + await this._configureRatings(listDefinition, list, web); + + for (const view of views) { + await this._createView(web, list, view); + } + + await this._configurePermissions(listDefinition, web, false); + await this._createPrepopulatedListItems(listDefinition, list, web); + } + + private async _configureRatings(listDefinition: IListDefinition, list: IList, web: IWeb): Promise { + const { title, ratingSettings } = listDefinition; + + if (ratingSettings === 'Ratings' || ratingSettings === 'Likes') { + await SPComponentLoader.loadScript('/_layouts/15/init.js', { globalExportsName: '$_global_init' }); + await SPComponentLoader.loadScript('/_layouts/15/MicrosoftAjax.js', { globalExportsName: 'Sys' }); + await SPComponentLoader.loadScript('/_layouts/15/SP.Runtime.js', { globalExportsName: 'SP' }); + await SPComponentLoader.loadScript('/_layouts/15/SP.js', { globalExportsName: 'SP' }); + + const siteFieldResults = await Promise.all(ReputationSiteFields.map(field => this._ensureField(web, web.fields, field))); + + const eh = new ErrorHandler(); + const batch = web.createBatch(); + siteFieldResults.forEach(field => this._addSiteField(field, list.fields, batch, eh)); + await batch.execute(); + eh.throwIfError(); + + const context = new SP.ClientContext((await web()).Url); + const rootFolder = context.get_web().get_lists().getByTitle(title).get_rootFolder(); + const properties = rootFolder.get_properties(); + properties.set_item("Ratings_VotingExperience", ratingSettings); + rootFolder.update(); + + await new Promise((resolve, reject) => { + context.executeQueryAsync(resolve, (sender: any, args: SP.ClientRequestFailedEventArgs) => { + reject(args.get_message()); + }); + }); + } + } + + private async _createView(web: IWeb, list: IList, view: IViewDefinition): Promise { + const viewSettings = { + RowLimit: view.rowLimit === undefined ? 30 : view.rowLimit, + Paged: view.paged === undefined ? true : view.paged, + DefaultView: view.default === undefined ? false : view.default, + ViewQuery: view.query || '' + }; + + const viewAddResult = await list.views.add(view.title, false, viewSettings); + + const eh = new ErrorHandler(); + const batch = web.createBatch(); + const batchedFields = viewAddResult.view.fields.inBatch(batch); + + batchedFields.removeAll().catch(eh.catch); + view.fields.forEach(field => batchedFields.add(field).catch(eh.catch)); + + await batch.execute(); + + eh.throwIfError(); + } + + private async _configurePermissions(listDefinition: IListDefinition, web: IWeb, forcePermissionReset: boolean): Promise { + const { permissions } = listDefinition; + + const eh = new ErrorHandler(); + const batch = web.createBatch(); + const list = web.lists.getByTitle(listDefinition.title).inBatch(batch); + + if (forcePermissionReset) { + list.resetRoleInheritance().catch(eh.catch); + } + + if (permissions) { + const [ + roles, + adminRoleDefinition, + currentUser + ] = await Promise.all([ + Promise.all(this._resolveUserRoles(web, permissions)), + web.roleDefinitions.getByType(RoleType.Administrator)(), + web.currentUser() + ]); + + list.breakRoleInheritance(permissions.copyRoleAssignments, false).catch(eh.catch); + + roles.filter(role => !!role.roleDefinitionId).forEach(role => { + const assignments = list.roleAssignments.inBatch(batch); + + switch (role.userRole.operation) { + case RoleOperation.Add: + assignments.add(role.principalId, role.roleDefinitionId).catch(eh.catch); + break; + case RoleOperation.Remove: + assignments.remove(role.principalId, role.roleDefinitionId).catch(eh.catch); + break; + } + }); + + list.roleAssignments.inBatch(batch).remove(currentUser.Id, adminRoleDefinition.Id).catch(eh.catch); + } + + await batch.execute(); + eh.throwIfError(); + } + + private async _ensureField(web: IWeb, fields: IFields, fieldDefinition: IFieldDefinition): Promise { + const name = fieldDefinition.name; + const cacheKey = fields.toUrlAndQuery() + name; + + return mapGetOrAdd(this._ensureFieldsPromiseCache, cacheKey, async () => { + try { + return await fields.getByInternalNameOrTitle(name)(); + } catch (e) { + const eh = new ErrorHandler(); + const batch = web.createBatch(); + this._createField(fieldDefinition, fields, batch, eh); + await batch.execute(); + eh.throwIfError(); + return fields.getByInternalNameOrTitle(name)(); + } + }); + } + + private _updateField(fieldDefinition: IFieldDefinition, fields: IFields, batch: SPBatch, eh: ErrorHandler) { + const name = fieldDefinition.name; + const displayName = fieldDefinition.displayName || name; + const description = fieldDefinition.description || ''; + const required = fieldDefinition.required || false; + + const field = fields.getByInternalNameOrTitle(name); + const batchedField = field.inBatch(batch); + + const properties = { + Title: displayName, + Description: description, + Required: required + }; + const fieldType = this._getFieldType(fieldDefinition); + + batchedField.update(properties, fieldType).catch(eh.catch); + + if (fieldDefinition.type === FieldType.Choice) { + batchedField.update({ Choices: { results: fieldDefinition.choices } }, fieldType).catch(eh.catch); + } + } + + private _createField(fieldDefinition: IFieldDefinition, fields: IFields, batch: SPBatch, eh: ErrorHandler) { + const name = fieldDefinition.name; + + // we allow the Title field to be updated + if (name === "Title") { + this._updateField(fieldDefinition, fields, batch, eh); + return; + } + + // we do not allow creating or changing built-in fields + if (AutomaticListFields.allLists.includes(name) || + AutomaticListFields[fieldDefinition[ParentList].template].includes(name)) { + return; + } + + const batchedFields = fields.inBatch(batch); + + const displayName = fieldDefinition.displayName || name; + const description = fieldDefinition.description || ''; + const defaultValue = fieldDefinition.default || ''; + const required = fieldDefinition.required || false; + const hidden = fieldDefinition.hidden || false; + const readonly = fieldDefinition.readonly || false; + const uniqueValues = fieldDefinition.uniqueValues || false; + const indexed = fieldDefinition.indexed || uniqueValues; // turning on Unique Values requires that the column also be indexed + const hideInDisplayForm = fieldDefinition.hideInDisplayForm || false; + const hideInNewForm = fieldDefinition.hideInNewForm || false; + const hideInEditForm = fieldDefinition.hideInEditForm || false; + + const baseProperties: IFieldCreationProperties = { + Description: description, + DefaultValue: defaultValue, + Hidden: hidden, + ReadOnlyField: readonly, + Required: required, + EnforceUniqueValues: uniqueValues, + Indexed: indexed + }; + + const boolProp = (propName: string, val: boolean, emitOnFalse: boolean = true) => { + if (val || emitOnFalse) + return `${propName}="${val ? "TRUE" : "FALSE"}"`; + else + return ''; + }; + const requiredProp = () => boolProp("Required", required); + const hiddenProp = () => boolProp("Hidden", hidden); + const readonlyProp = () => boolProp("ReadOnly", readonly); + + switch (fieldDefinition.type) { + case FieldType.Text: + if (fieldDefinition.multi) { + const richText = fieldDefinition.richText || false; + const unlimitedLengthInDocumentLibraryProp = () => boolProp("UnlimitedLengthInDocumentLibrary", fieldDefinition.unlimitedLengthInDocumentLibrary); + if (richText === 'enhanced') { + const schemaMultilineEnhancedRichText = + ` + ${defaultValue} + `; + batchedFields.createFieldAsXml(schemaMultilineEnhancedRichText).catch(eh.catch); + } else { + batchedFields.addMultilineText(name, 3, richText, false, false, false, baseProperties).catch(eh.catch); + } + } + else { + batchedFields.addText(name, fieldDefinition.maxLength, baseProperties).catch(eh.catch); + } + break; + + case FieldType.DateTime: + batchedFields.addDateTime(name, fieldDefinition.dateTimeFormat, undefined, undefined, baseProperties).catch(eh.catch); + break; + + case FieldType.Number: { + const numberBaseProperties = { + ...baseProperties, + ShowAsPercentage: fieldDefinition.showAsPercentage || false + }; + batchedFields.addNumber(name, fieldDefinition.min, fieldDefinition.max, numberBaseProperties).catch(eh.catch); + break; + } + + case FieldType.Hyperlink: + batchedFields.addUrl(name, UrlFieldFormatType.Hyperlink, baseProperties).catch(eh.catch); + break; + + case FieldType.Picture: + batchedFields.addUrl(name, UrlFieldFormatType.Image, baseProperties).catch(eh.catch); + break; + + case FieldType.Currency: + batchedFields.addCurrency(name, fieldDefinition.min, fieldDefinition.max, fieldDefinition.currencyLocaleId, baseProperties).catch(eh.catch); + break; + + case FieldType.Calculated: { + switch (fieldDefinition.outputType) { + case FieldType.Text: + batchedFields.addCalculated(name, fieldDefinition.formula, DateTimeFieldFormatType.DateOnly, FieldTypes.Text, baseProperties).catch(eh.catch); + break; + case FieldType.Number: { + const calculatedNumberBaseProperties = { + ...baseProperties, + ShowAsPercentage: fieldDefinition.showAsPercentage || false + }; + batchedFields.addCalculated(name, fieldDefinition.formula, DateTimeFieldFormatType.DateOnly, FieldTypes.Number, calculatedNumberBaseProperties).catch(eh.catch); + break; + } + case FieldType.Currency: { + const calculatedCurrencyBaseProperties = { + ...baseProperties, + CurrencyLocaleId: fieldDefinition.currencyLocaleId || undefined + }; + batchedFields.addCalculated(name, fieldDefinition.formula, DateTimeFieldFormatType.DateOnly, FieldTypes.Currency, calculatedCurrencyBaseProperties).catch(eh.catch); + break; + } + case FieldType.DateTime: + batchedFields.addCalculated(name, fieldDefinition.formula, fieldDefinition.dateFormat, FieldTypes.DateTime, baseProperties).catch(eh.catch); + break; + case FieldType.Boolean: + batchedFields.addCalculated(name, fieldDefinition.formula, DateTimeFieldFormatType.DateOnly, FieldTypes.Boolean, baseProperties).catch(eh.catch); + break; + } + break; + } + + case FieldType.Boolean: { + const schemaBoolean = + ` + ${defaultValue === 'Yes' ? 1 : 0} + `; + batchedFields.createFieldAsXml(schemaBoolean).catch(eh.catch); + break; + } + case FieldType.Choice: { + const schemaChoice = + ` + + ${fieldDefinition.choices.map(choice => `${choice}`).join('')} + + ${defaultValue} + `; + batchedFields.createFieldAsXml(schemaChoice).catch(eh.catch); + break; + } + case FieldType.Lookup: { + const multProp = () => boolProp("Mult", fieldDefinition.multi, false); + const listId = fieldDefinition[LookupListId].toString(); + const schemaLookup = + ` + `; + batchedFields.createFieldAsXml(schemaLookup).catch(eh.catch); + break; + } + + case FieldType.User: { + const multProp = () => boolProp("Mult", fieldDefinition.multi, false); + const schemaUser = + ``; + batchedFields.createFieldAsXml(schemaUser).catch(eh.catch); + break; + } + + case FieldType.Taxonomy: { + const multProp = () => boolProp("Mult", fieldDefinition.multi, false); + const allowFillIn = fieldDefinition.allowFillIn || false; + const defaultTermId = fieldDefinition[DefaultTerm] || ''; + const schemaTaxonomy = + ` + + + + TextField + {${getGUID()}} + + + Open + ${allowFillIn} + + + + ${defaultTermId} + `; + batchedFields.createFieldAsXml(schemaTaxonomy).catch(eh.catch); + break; + } + + case FieldType.Thumbnail: { + const schemaThumbnail = + ``; + batchedFields.createFieldAsXml(schemaThumbnail).catch(eh.catch); + break; + } + + default: break; + } + + const batchedField = fields.getByInternalNameOrTitle(name).inBatch(batch); + + if (displayName !== name) + batchedField.update({ Title: displayName }, this._getFieldType(fieldDefinition)).catch(eh.catch); + if (hideInDisplayForm) + batchedField.setShowInDisplayForm(!hideInDisplayForm).catch(eh.catch); + if (hideInNewForm) + batchedField.setShowInNewForm(!hideInNewForm).catch(eh.catch); + if (hideInEditForm) + batchedField.setShowInEditForm(!hideInEditForm).catch(eh.catch); + if (fieldDefinition.type === FieldType.Taxonomy) { + const termStoreId = fieldDefinition[TermStoreId].toString(); + const termSetId = fieldDefinition[TermSetId].toString(); + const anchorTermId = fieldDefinition[AnchorTermId]?.toString() || undefined; + const properties = { SspId: termStoreId, TermSetId: termSetId, TargetTemplate: '', AnchorId: anchorTermId }; + batchedField.update(properties, this._getFieldType(fieldDefinition)).catch(eh.catch); + } + } + + private _addSiteField(fieldToAdd: IFieldInfo, fields: IFields, batch: SPBatch, eh: ErrorHandler) { + fields.inBatch(batch).createFieldAsXml({ SchemaXml: fieldToAdd.SchemaXml, Options: AddFieldOptions.AddFieldInternalNameHint }).catch(eh.catch); + } + + private async _createPrepopulatedListItems(listDefinition: IListDefinition, list: IList, web: IWeb): Promise { + const eh = new ErrorHandler(); + const itemBatch = web.createBatch(); + const items = (listDefinition.listItems || []); + + items.forEach(item => { + list.items.inBatch(itemBatch).add(item).catch(eh.catch); + }); + + await itemBatch.execute(); + + eh.throwIfError(); + } + + private _getFieldType(fieldDefinition: IFieldDefinition): string { + switch (fieldDefinition.type) { + case FieldType.Text: + return fieldDefinition.multi ? "SP.FieldMultiLineText" : "SP.FieldText"; + case FieldType.DateTime: + return "SP.FieldDateTime"; + case FieldType.Number: + return "SP.FieldNumber"; + case FieldType.Hyperlink: + case FieldType.Picture: + return "SP.FieldUrl"; + case FieldType.Currency: + return "SP.FieldCurrency"; + case FieldType.Calculated: + return "SP.FieldCalculated"; + case FieldType.Boolean: + return "SP.Field"; + case FieldType.Choice: + return fieldDefinition.multi ? "SP.FieldMultiChoice" : "SP.FieldChoice"; + case FieldType.Lookup: + return "SP.FieldLookup"; + case FieldType.User: + return "SP.FieldUser"; + case FieldType.Taxonomy: + return "SP.Taxonomy.TaxonomyField"; + case FieldType.Thumbnail: + return "SP.Thumbnail"; + case FieldType.AverageRating: + return "SP.FieldAverageRating"; + case FieldType.Guid: + return "SP.FieldGuid"; + case FieldType.Integer: + throw new Error("Cannot create fields of type Integer"); + case FieldType.Recurrence: + throw new Error("Cannot create fields of type Recurrence"); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + default: { const missing: never = fieldDefinition; } + } + } + + private async _ensureSiteGroup(web: IWeb, siteGroup: ISiteGroup): Promise { + try { + await web.siteGroups.getByName(siteGroup.name)(); + } catch (e) { + await this._createSiteGroup(web, siteGroup); + } + } + + private async _createSiteGroup(web: IWeb, siteGroup: ISiteGroup): Promise { + const properties = { + Title: siteGroup.name, + Description: siteGroup.description || '', + AllowMembersEditMembership: siteGroup.allowMembersEditMembership || false, + AllowRequestToJoinLeave: siteGroup.allowRequestToJoinLeave || false, + AutoAcceptRequestToJoinLeave: siteGroup.autoAcceptRequestToJoinLeave || false, + OnlyAllowMembersViewMembership: siteGroup.onlyAllowMembersViewMembership || false, + RequestToJoinLeaveEmailSetting: siteGroup.requestToJoinLeaveEmailSetting || '' + }; + + return await web.siteGroups.add(properties); + } + + private _resolveUserRoles(web: IWeb, permissions: IListPermissions): Promise[] { + return permissions.userRoles.map(async userRole => { + let principalId: number; + + switch (userRole.userType) { + case 'ownerGroup': + principalId = (await web.associatedOwnerGroup()).Id; + break; + case 'memberGroup': + principalId = (await web.associatedMemberGroup()).Id; + break; + case 'visitorGroup': + principalId = (await web.associatedVisitorGroup()).Id; + break; + case 'custom': { + const principals = await sp.utility.searchPrincipals(userRole.customName, PrincipalType.All, PrincipalSource.All, '', 1); + const principal = principals[0]; + const user = User.fromPrincipalInfo(principal); + + if (principal.PrincipalType === PrincipalType.User) { + const result = await web.ensureUser(user.login); + user.updateId(result.data.Id); + } else { + user.updateId(principal.PrincipalId); + } + + principalId = user.id; + break; + } + } + + let definition = null; + if (typeof userRole.roleType === "string") + definition = await web.roleDefinitions.getByName(userRole.roleType)(); + else if (userRole.roleType !== RoleType.None) + definition = await web.roleDefinitions.getByType(userRole.roleType)(); + + return new ResolvedUserRole(userRole, principalId, definition?.Id); + }); + } + + private async _ensurePermissionLevel(web: IWeb, levelDefinition: IPermissionLevel): Promise { + const { name, description, copyFrom, permissions } = levelDefinition; + + let basePermissions: IBasePermissions = null; + if (copyFrom) { + const roleDefinition = await web.roleDefinitions.getByType(copyFrom).get(); + basePermissions = this._buildBasePermissions(permissions, roleDefinition.BasePermissions); + } else { + basePermissions = this._buildBasePermissions(permissions); + } + + try { + // check for an existing permission level with the same name and update it + const existingRoleDefinition = await web.roleDefinitions.getByName(name)(); + + basePermissions = { + Low: basePermissions.Low | existingRoleDefinition.BasePermissions.Low, + High: basePermissions.High | existingRoleDefinition.BasePermissions.High, + }; + + await web.roleDefinitions.getByName(name).update({ + Description: description, + BasePermissions: basePermissions + }); + } catch { + // no existing permission level exists with this name, so create a new one + await web.roleDefinitions.add(name, description, 0, basePermissions); + } + } + + private _buildBasePermissions(permissions: PermissionKind[], basePerm?: IBasePermissions): IBasePermissions { + const newPerm: IBasePermissions = { + Low: basePerm ? basePerm.Low : 0, + High: basePerm ? basePerm.High : 0 + }; + + permissions.forEach(permission => { + if (permission === PermissionKind.FullMask) { + newPerm.Low = newPerm.High = 0xFFFFFFFF; + } else if (permission === PermissionKind.EmptyMask) { + // do nothing + } else { + const mask = 0x1 << (permission - 1); + if (permission <= 32) + newPerm.Low |= mask; + else // if (permission > 32) + newPerm.High |= mask; + } + }); + + return newPerm; + } + + private _retrieveLookupListId(web: IWeb, fieldDefinition: IFieldDefinition, batch: SPBatch): Promise { + if (fieldDefinition.type === FieldType.Lookup && !fieldDefinition[LookupListId]) { + const list = web.lists.getByTitle(fieldDefinition.lookupListTitle); + return list.inBatch(batch)().then(result => { + fieldDefinition[LookupListId] = Guid.parse(result.Id); + }, ErrorHandler.throw); + } + } + + private async _retrieveTaxonomyIds(web: IWeb, fieldDefinition: IFieldDefinition) { + if (fieldDefinition.type === FieldType.Taxonomy) { + const termStore = await sp.termStore(); + fieldDefinition[TermStoreId] = Guid.parse(termStore.id); + + let termGroupId = Guid.tryParse(fieldDefinition.termGroup); + if (!termGroupId && !fieldDefinition[TermGroupId]) { + const displayName = fieldDefinition.termGroup === 'sitecollection' ? siteCollectionTermGroupName((await web()).Url) : fieldDefinition.termGroup; + const groups = sp.termStore.groups.filter(`DisplayName eq '${displayName}'`); + const termGroups = await groups(); + termGroupId = Guid.parse(first(termGroups).id); + } + fieldDefinition[TermGroupId] = termGroupId; + + let termSetId = Guid.tryParse(fieldDefinition.termSet); + if (!termSetId && !fieldDefinition[TermSetId]) { + const sets = sp.termStore.groups.getById(termGroupId.toString()).sets; + const termSets = await sets(); + termSetId = Guid.parse(find(termSets, ts => ts.localizedNames.some(ln => ln.name === fieldDefinition.termSet)).id); + } + fieldDefinition[TermSetId] = termSetId; + + if (fieldDefinition.anchorTerm) { + let anchorTermId = Guid.tryParse(fieldDefinition.anchorTerm); + if (!anchorTermId && !fieldDefinition[AnchorTermId]) { + const children = sp.termStore.groups.getById(termGroupId.toString()).sets.getById(termSetId.toString()).children; + const terms = await children(); + anchorTermId = Guid.parse(find(terms, ts => ts.labels.some(l => l.name === fieldDefinition.anchorTerm)).id); + } + fieldDefinition[AnchorTermId] = anchorTermId; + } + + if (fieldDefinition.default) { + let defaultTermId = Guid.tryParse(fieldDefinition.default); + let defaultTermLabel = fieldDefinition.default; + if (!fieldDefinition[DefaultTerm]) { + const children = sp.termStore.groups.getById(termGroupId.toString()).sets.getById(termSetId.toString()).children; + const terms = await children(); + if (defaultTermId) + defaultTermLabel = find(find(terms, ts => Guid.parse(ts.id).equals(defaultTermId)).labels, l => l.isDefault).name; + else + defaultTermId = Guid.parse(find(terms, ts => ts.labels.some(l => l.name === defaultTermLabel)).id); + } + fieldDefinition[DefaultTerm] = `-1;#${defaultTermLabel}|${defaultTermId.toString()}`; + } + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/IElementDefinitions.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/IElementDefinitions.ts new file mode 100644 index 000000000..10a0537de --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/IElementDefinitions.ts @@ -0,0 +1,414 @@ +import { Guid } from "@microsoft/sp-core-library"; +import { ITypedHash } from "@pnp/common/collections"; +import { DateTimeFieldFormatType } from "@pnp/sp/fields/types"; +import { PermissionKind } from "@pnp/sp/security/types"; +import { IUpgradeAction } from "./IUpgradeAction"; + +export enum RoleType { + None = 0, + Guest = 1, + Reader = 2, + Contributor = 3, + WebDesigner = 4, + Administrator = 5, + Editor = 6, + System = 7 +} + +export enum FieldType { + Text, + DateTime, + Number, + Image, + Hyperlink, + Picture, + Boolean, + Currency, + Choice, + Lookup, + User, + Calculated, + Taxonomy, + Thumbnail, + AverageRating, + Recurrence, + Integer, + Guid +} + +export enum ListTemplateType { + GenericList = 100, + DocumentLibrary = 101, + EventsList = 106, + PictureLibrary = 109, + UserInformation = 112 +} + +export enum RoleOperation { + Add, + Remove +} + +export enum ReadAccess { + ByAll = 1, + ByAuthor = 2 +} + +export enum WriteAccess { + ByAll = 1, + ByAuthor = 2, + None = 4 +} + +export enum DraftVisibilityType { + /** Any user who can read items */ + Reader = 0, + /** Only users who can edit items */ + Author = 1, + /** Only users who can approve items (and the author of the item) */ + Approver = 2 +} + +export const InternalName = Symbol("InternalName"); +export const ParentList = Symbol("ParentList"); +interface ICommonFieldDefinition { + type: FieldType; + name: string; + displayName?: string; + description?: string; + required?: boolean; + hidden?: boolean; + readonly?: boolean; + indexed?: boolean; + uniqueValues?: boolean; + hideInDisplayForm?: boolean; + hideInNewForm?: boolean; + hideInEditForm?: boolean; + default?: string; + [InternalName]?: string; + [ParentList]?: IListDefinition; +} + +export interface IBooleanFieldDefinition extends ICommonFieldDefinition { + type: FieldType.Boolean; + default?: 'Yes' | 'No'; +} + +export interface ITitleFieldDefinition extends ICommonFieldDefinition { + type: FieldType.Text; + name: 'Title'; + maxLength?: number; + multi?: false; +} + +export interface ITextFieldDefinition extends ICommonFieldDefinition { + type: FieldType.Text; + multi?: boolean; + richText?: boolean | 'enhanced'; + maxLength?: number; + unlimitedLengthInDocumentLibrary?: boolean; +} + +export interface IDateTimeFieldDefinition extends ICommonFieldDefinition { + type: FieldType.DateTime; + dateTimeFormat: DateTimeFieldFormatType; +} + +export interface INumberFieldDefinition extends ICommonFieldDefinition { + type: FieldType.Number; + min?: number; + max?: number; + // decimalPlaces?: number | 'automatic'; + showAsPercentage?: boolean; +} + +export interface ICurrencyFieldDefinition extends ICommonFieldDefinition { + type: FieldType.Currency; + min?: number; + max?: number; + currencyLocaleId?: number; + // decimalPlaces?: number | 'automatic'; +} + +interface ICommonCalculatedFieldDefinition extends ICommonFieldDefinition { + type: FieldType.Calculated; + formula: string; +} +export interface ICalculatedTextFieldDefinition extends ICommonCalculatedFieldDefinition { + outputType: FieldType.Text; +} +export interface ICalculatedNumberFieldDefinition extends ICommonCalculatedFieldDefinition { + outputType: FieldType.Number; + // decimalPlaces?: number | 'automatic'; + showAsPercentage?: boolean; +} +export interface ICalculatedCurrencyFieldDefinition extends ICommonCalculatedFieldDefinition { + outputType: FieldType.Currency; + currencyLocaleId?: number; + // decimalPlaces?: number | 'automatic'; +} +export interface ICalculatedDateTimeFieldDefinition extends ICommonCalculatedFieldDefinition { + outputType: FieldType.DateTime; + dateFormat: DateTimeFieldFormatType; +} +export interface ICalculatedBooleanFieldDefinition extends ICommonCalculatedFieldDefinition { + outputType: FieldType.Boolean; +} +type ICalculatedFieldDefinition = ICalculatedTextFieldDefinition | ICalculatedNumberFieldDefinition | ICalculatedCurrencyFieldDefinition | ICalculatedDateTimeFieldDefinition | ICalculatedBooleanFieldDefinition; + +export interface IHyperlinkFieldDefinition extends ICommonFieldDefinition { + type: FieldType.Hyperlink; +} + +export interface IPictureFieldDefinition extends ICommonFieldDefinition { + type: FieldType.Picture; +} + +export interface IUserFieldDefinition extends ICommonFieldDefinition { + type: FieldType.User; + multi?: boolean; + userSelectionMode: "PeopleOnly" | "PeopleAndGroups"; +} + +export interface IChoiceFieldDefinition extends ICommonFieldDefinition { + type: FieldType.Choice; + multi?: boolean; + choices: string[]; +} + +export const LookupListId = Symbol("LookupListId"); +export interface ILookupFieldDefinition extends ICommonFieldDefinition { + type: FieldType.Lookup; + multi?: boolean; + lookupListTitle: string; + showField?: string; + [LookupListId]?: Guid; +} + +export const TermStoreId = Symbol("TermStoreId"); +export const TermGroupId = Symbol("TermGroupId"); +export const TermSetId = Symbol("TermSetId"); +export const AnchorTermId = Symbol("AnchorTermId"); +export const DefaultTerm = Symbol("DefaultTerm"); +export interface ITaxonomyFieldDefinition extends ICommonFieldDefinition { + type: FieldType.Taxonomy; + multi?: boolean; + termGroup: string | 'sitecollection'; + termSet: string; + anchorTerm?: string; + allowFillIn?: boolean; + [TermStoreId]?: Guid; + [TermGroupId]?: Guid; + [TermSetId]?: Guid; + [AnchorTermId]?: Guid; + [DefaultTerm]?: string; +} + +export interface IThumbnailFieldDefinition extends ICommonFieldDefinition { + type: FieldType.Thumbnail; +} + +export interface IAverageRatingFieldDefinition extends ICommonFieldDefinition { + type: FieldType.AverageRating; +} + +export interface IRecurrenceFieldDefinition extends ICommonFieldDefinition { + type: FieldType.Recurrence; +} + +export interface IGuidFieldDefinition extends ICommonFieldDefinition { + type: FieldType.Guid; +} + +export type AllowedIntegerFieldNames = 'ID' | 'EventType' | 'MasterSeriesItemID' | 'Duration'; +export interface IIntegerFieldDefinition extends ICommonFieldDefinition { + type: FieldType.Integer; + name: AllowedIntegerFieldNames; +} + +export type IFieldDefinition = ITitleFieldDefinition | IBooleanFieldDefinition | ITextFieldDefinition | IDateTimeFieldDefinition | INumberFieldDefinition | ICurrencyFieldDefinition | ICalculatedFieldDefinition | IHyperlinkFieldDefinition | IPictureFieldDefinition | IUserFieldDefinition | IChoiceFieldDefinition | ILookupFieldDefinition | ITaxonomyFieldDefinition | IThumbnailFieldDefinition | IAverageRatingFieldDefinition | IRecurrenceFieldDefinition | IGuidFieldDefinition | IIntegerFieldDefinition; + +export const viewFields = (...fields: (string | IFieldDefinition)[]) => { + return fields.map(f => (f as IFieldDefinition).name || f as string); +}; + +export const includeStandardViewFields = (...fields: (string | IFieldDefinition)[]) => { + return [ + "ID", + "Title", + ...viewFields(...fields), + "Author", + "Created", + "Editor", + "Modified" + ]; +}; + +export const includeStandardLibraryViewFields = (...fields: (string | IFieldDefinition)[]) => { + return includeStandardViewFields( + "DocIcon", + "LinkFilename", + ...fields + ); +}; + +export const ListDefinition = Symbol("ListDefinition"); +export const ViewId = Symbol("ViewId"); +export interface IViewDefinition { + title: string; + default?: boolean; + rowLimit?: number; + paged?: boolean; + query?: string; + fields: string[]; + [ListDefinition]?: IListDefinition; + [ViewId]?: string; +} + +export interface IPrepopulatedListItem extends ITypedHash { + Title?: string; +} + +export interface IPermissionLevel { + name: string; + description: string; + copyFrom?: RoleType; + permissions: PermissionKind[]; +} + +export interface ISiteGroup { + name: string; + description?: string; + allowMembersEditMembership?: boolean; + allowRequestToJoinLeave?: boolean; + autoAcceptRequestToJoinLeave?: boolean; + onlyAllowMembersViewMembership?: boolean; + requestToJoinLeaveEmailSetting?: string; +} + +export interface IUserRole { + operation: RoleOperation; + roleType: RoleType | string; + userType: "custom" | "ownerGroup" | "memberGroup" | "visitorGroup"; + customName?: string; +} + +export interface IListPermissions { + copyRoleAssignments: boolean; + userRoles: IUserRole[]; +} + +export const ListId = Symbol("ListId"); +export const ListItemEntityTypeFullName = Symbol("ListItemEntityTypeFullName"); +export const CurrentChangeToken = Symbol("CurrentChangeToken"); +export const ParentSchema = Symbol("ParentSchema"); +export interface IListDefinition { + title: string; + description: string; + template: ListTemplateType; + readSecurity?: ReadAccess; + writeSecurity?: WriteAccess; + draftVersionVisibility?: DraftVisibilityType; + siteFields?: IFieldDefinition[]; + fields: IFieldDefinition[]; + listItems?: IPrepopulatedListItem[]; + siteGroups?: ISiteGroup[]; + permissions?: IListPermissions; + enableModeration?: boolean; + enableVersioning?: boolean; + enableMinorVersions?: boolean; + majorVersionLimit?: number; + majorWithMinorVersionsLimit?: number; + ratingSettings?: 'Ratings' | 'Likes' | 'Off'; + views?: IViewDefinition[]; + dependencies?: IListDefinition[]; + [ListId]?: string; + [ListItemEntityTypeFullName]?: string; + [CurrentChangeToken]?: string; + [ParentSchema]?: IElementDefinitions; +} + +export interface IUpgrade { + fromVersion: number; + toVersion: number; + actions: IUpgradeAction[]; +} + +export interface IElementDefinitions { + version: number; + permissionLevels?: IPermissionLevel[]; + siteGroups?: ISiteGroup[]; + siteFields?: IFieldDefinition[]; + lists?: IListDefinition[]; + upgrades?: IUpgrade[]; +} + +const AverageRatingSiteField: IAverageRatingFieldDefinition = { + type: FieldType.AverageRating, + name: 'AverageRating', + displayName: 'Rating (0-5)' +}; + +const RatingsSiteField: ITextFieldDefinition = { + type: FieldType.Text, + name: 'Ratings', + displayName: 'User Ratings', + multi: true +}; + +const RatingCountSiteField: INumberFieldDefinition = { + type: FieldType.Number, + name: 'RatingCount', + displayName: 'Number of Ratings' +}; + +const RatedBySiteField: IUserFieldDefinition = { + type: FieldType.User, + name: 'RatedBy', + displayName: 'Rated By', + userSelectionMode: 'PeopleOnly', + multi: true +}; + +const LikesCountSiteField: INumberFieldDefinition = { + type: FieldType.Number, + name: 'LikesCount', + displayName: 'Number of Likes' +}; + +const LikedBySiteField: IUserFieldDefinition = { + type: FieldType.User, + name: 'LikedBy', + displayName: 'Liked By', + userSelectionMode: 'PeopleOnly', + multi: true +}; + +export const ReputationSiteFields = [ + AverageRatingSiteField, + RatingCountSiteField, + RatingsSiteField, + RatedBySiteField, + LikesCountSiteField, + LikedBySiteField +]; + +export const buildLiveList = (list: T): T => { + list.views.forEach(view => { + if (view[ListDefinition] && view[ListDefinition] !== list) throw Error(`View object instance '${view.title}' of list '${list?.title}' has already been used with another list. Did you forget to use a function to create a new instance for each schema?`); + view[ListDefinition] = list; + }); + + list.fields.forEach(field => { + field.displayName = field.displayName || field.name; + field[ParentList] = list; + }); + + return list; +}; + +export const buildLiveSchema = (schema: T): T => { + schema.lists.forEach(list => list[ParentSchema] = schema); + schema.lists.forEach(buildLiveList); + return schema; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/IUpgradeAction.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/IUpgradeAction.ts new file mode 100644 index 000000000..7f57dee78 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/IUpgradeAction.ts @@ -0,0 +1,5 @@ +export interface IUpgradeAction { + description: string; + shared?: boolean; + execute(services: {}): Promise; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/UpdateListFieldUpgradeAction.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/UpdateListFieldUpgradeAction.ts new file mode 100644 index 000000000..37dc5adac --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/UpdateListFieldUpgradeAction.ts @@ -0,0 +1,22 @@ +import { ElementProvisioner } from './ElementProvisioner'; +import { IListDefinition, IFieldDefinition } from "./IElementDefinitions"; +import { IUpgradeAction } from "./IUpgradeAction"; + +export abstract class UpdateListFieldUpgradeAction implements IUpgradeAction { + constructor( + private readonly _listDefinition: IListDefinition, + private readonly _fieldDefinition: IFieldDefinition + ) { } + + public get description(): string { + const fieldName = this._fieldDefinition.displayName || this._fieldDefinition.name; + const listTitle = this._listDefinition.title; + + return `Updating field '${fieldName}' on list '${listTitle}'`; + } + + public async execute(): Promise { + const provisioner: ElementProvisioner = new ElementProvisioner(); + await provisioner.updateField(this._fieldDefinition, this._listDefinition); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/UpdateUserRolesUpgradeAction.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/UpdateUserRolesUpgradeAction.ts new file mode 100644 index 000000000..633ca5144 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/UpdateUserRolesUpgradeAction.ts @@ -0,0 +1,20 @@ +import { ElementProvisioner } from './ElementProvisioner'; +import { IListDefinition } from "./IElementDefinitions"; +import { IUpgradeAction } from "./IUpgradeAction"; + +export abstract class UpdateUserRolesUpgradeAction implements IUpgradeAction { + constructor( + private readonly _listDefinition: IListDefinition + ) { } + + public get description(): string { + const listTitle = this._listDefinition.title; + + return `Updating security for ${listTitle} list`; + } + + public async execute(): Promise { + const provisioner: ElementProvisioner = new ElementProvisioner(); + await provisioner.configurePermissions(this._listDefinition, undefined, true); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/index.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/index.ts new file mode 100644 index 000000000..623e258e8 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/schema/index.ts @@ -0,0 +1,11 @@ +export * from './IElementDefinitions'; +export { AddListFieldUpgradeAction } from './AddListFieldUpgradeAction'; +export { UpdateListFieldUpgradeAction } from './UpdateListFieldUpgradeAction'; +export { DeleteListFieldUpgradeAction } from './DeleteListFieldUpgradeAction'; +export { DeleteSiteFieldUpgradeAction } from './DeleteSiteFieldUpgradeAction'; +export { DeleteListViewUpgradeAction } from './DeleteListViewUpgradeAction'; +export { AddOrUpdateViewUpgradeAction } from './AddOrUpdateViewUpgradeAction'; +export { CreateListUpgradeAction } from './CreateListUpgradeAction'; +export { UpdateUserRolesUpgradeAction } from './UpdateUserRolesUpgradeAction'; +export { ElementProvisioner } from './ElementProvisioner'; +export { IUpgradeAction } from './IUpgradeAction'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/IUpdateListItem.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/IUpdateListItem.ts new file mode 100644 index 000000000..85a2dfccd --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/IUpdateListItem.ts @@ -0,0 +1,3 @@ +export interface IUpdateListItem { + readonly Title: string; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/ModeratedUpdateListItem.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/ModeratedUpdateListItem.ts new file mode 100644 index 000000000..ea79f2a59 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/ModeratedUpdateListItem.ts @@ -0,0 +1,15 @@ +import { ModerationStatus } from "../ModerationStatus"; +import { IUpdateListItem } from "./IUpdateListItem"; + +export interface IModeratedUpdateListItem extends IUpdateListItem { + OData__ModerationStatus: number; +} + +export class ModeratedUpdateListItem implements IModeratedUpdateListItem { + public readonly Title: string; + public OData__ModerationStatus: number; + + constructor(moderationStatus: ModerationStatus) { + this.OData__ModerationStatus = moderationStatus && moderationStatus.value; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/UpdateHyperlink.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/UpdateHyperlink.ts new file mode 100644 index 000000000..ede5496d9 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/UpdateHyperlink.ts @@ -0,0 +1,9 @@ +export class UpdateHyperlink { + public Description: string; + public Url: string; + + constructor(url: string, description?: string) { + this.Url = url; + this.Description = description || url; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/UpdateMultiChoice.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/UpdateMultiChoice.ts new file mode 100644 index 000000000..21eb061d1 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/UpdateMultiChoice.ts @@ -0,0 +1,8 @@ +export class UpdateMultiChoice { + public __metadata = { "type": "Collection(Edm.String)" }; + + constructor( + public readonly results: string[] + ) { + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/UpdateMultiLookup.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/UpdateMultiLookup.ts new file mode 100644 index 000000000..531fb35e9 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/UpdateMultiLookup.ts @@ -0,0 +1,6 @@ +export class UpdateMultiLookup { + constructor( + public readonly results: number[] + ) { + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/UpdateTaxonomy.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/UpdateTaxonomy.ts new file mode 100644 index 000000000..2f18ec3d6 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/UpdateTaxonomy.ts @@ -0,0 +1,10 @@ +export class UpdateTaxonomy { + public readonly __metadata = { "type": "SP.Taxonomy.TaxonomyFieldValue" }; + public readonly WssId = -1; + + constructor( + public readonly Label: string, + public readonly TermGuid: string + ) { + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/index.ts b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/index.ts new file mode 100644 index 000000000..56302c465 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/common/sharepoint/update/index.ts @@ -0,0 +1,6 @@ +export { IUpdateListItem } from './IUpdateListItem'; +export { IModeratedUpdateListItem, ModeratedUpdateListItem } from './ModeratedUpdateListItem'; +export { UpdateHyperlink } from './UpdateHyperlink'; +export { UpdateMultiChoice } from './UpdateMultiChoice'; +export { UpdateMultiLookup } from './UpdateMultiLookup'; +export { UpdateTaxonomy } from './UpdateTaxonomy'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/Root.tsx b/samples/react-rhythm-of-business-calendar/src/components/Root.tsx new file mode 100644 index 000000000..a1054519a --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/Root.tsx @@ -0,0 +1,21 @@ +import { DefaultViewKey } from 'model'; +import React, { FC } from 'react'; +import { Navigate, Route, Routes } from 'react-router'; +import { useConfigurationService } from 'services'; +import { ViewRoute } from './views'; + +const Root: FC = () => { + const { active: config } = useConfigurationService(); + const defaultView = config?.defaultView || DefaultViewKey; + + return ( + + + } /> + } /> + + + ); +}; + +export default Root; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/_common.module.scss b/samples/react-rhythm-of-business-calendar/src/components/_common.module.scss new file mode 100644 index 000000000..0344f18a4 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/_common.module.scss @@ -0,0 +1 @@ +@import '../common/components/styles/common.module'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/_panels.module.scss b/samples/react-rhythm-of-business-calendar/src/components/_panels.module.scss new file mode 100644 index 000000000..f5c073b93 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/_panels.module.scss @@ -0,0 +1,14 @@ +@import 'common.module'; + +.content { + @include ms-fontSize-16; + + & > :global(.ms-Grid-row) > :global(.ms-Grid-col) { + margin-top: 16px; + + :global(.ms-Label) { + @include ms-fontSize-12; + @include ms-fontWeight-bold; + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/approvals/ApprovalDialog.tsx b/samples/react-rhythm-of-business-calendar/src/components/approvals/ApprovalDialog.tsx new file mode 100644 index 000000000..e1cfd3620 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/approvals/ApprovalDialog.tsx @@ -0,0 +1,100 @@ +import React from 'react'; +import { DefaultButton, DialogFooter, format, IChoiceGroupOption, PrimaryButton, Stack } from '@fluentui/react'; +import { ErrorHandler, now } from 'common'; +import { EntityDialogBase, IEntityDialogProps, IDataDialogBaseState, IDataDialogBase, LiveChoiceGroup, LiveTextField } from "common/components"; +import { Event, EventModerationStatus } from "model"; +import { withServices, ServicesProp, EventsServiceProp, EventsService, DirectoryServiceProp, DirectoryService } from 'services'; + +import { PersistConcurrencyFailureMessage, ApprovalDialog as strings } from "ComponentStrings"; + +const moderationOptions: IChoiceGroupOption[] = [ + { key: EventModerationStatus.Approved.name, text: strings.ModerationStatus.Approve }, + { key: EventModerationStatus.Rejected.name, text: strings.ModerationStatus.Reject } +]; + +export interface IApprovalDialog extends IDataDialogBase { +} + +type IProps = IEntityDialogProps & ServicesProp; +type IState = IDataDialogBaseState; + +class ApprovalDialog extends EntityDialogBase implements IApprovalDialog { + protected get title() { + return this.entity ? format(strings.Title, this.entity.displayName) : ''; + } + + protected async persistChangesCore() { + const { + [DirectoryService]: { currentUser }, + [EventsService]: events + } = this.props.services; + + try { + this.entity.moderator = currentUser; + this.entity.moderationTimestamp = now(); + + await events.persist(); + } catch (e) { + if (ErrorHandler.is_412_PRECONDITION_FAILED(e)) { + const message = await ErrorHandler.message(e); + console.warn(message, e); + return Promise.reject(PersistConcurrencyFailureMessage); + } else { + throw e; + } + } + } + + protected renderEditContent(): JSX.Element { + const { showValidationFeedback } = this.state; + const event = this.entity; + const liveProps = { + entity: event, + showValidationFeedback, + updateField: this.updateField + }; + + return ( + + val.name} + getValueFromKey={val => EventModerationStatus.fromName(val)} + getTextFromValue={val => { + switch (val) { + case EventModerationStatus.Approved: return strings.ModerationStatus.Approved; + case EventModerationStatus.Rejected: return strings.ModerationStatus.Rejected; + default: return strings.ModerationStatus.Pending; + } + }} + /> + + + ); + } + + protected renderEditFooter(): JSX.Element { + const { submitting } = this.state; + const onSubmit = () => this.submit(() => this.dismiss()); + const onCancel = () => this.discard(); + + return ( + + {strings.Command_Submit.Text} + {strings.Command_Cancel.Text} + + ); + } +} + +export default withServices(ApprovalDialog); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/approvals/ApproversPanel.module.scss b/samples/react-rhythm-of-business-calendar/src/components/approvals/ApproversPanel.module.scss new file mode 100644 index 000000000..68c7f7ffb --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/approvals/ApproversPanel.module.scss @@ -0,0 +1 @@ +@import '../panels.module'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/approvals/ApproversPanel.tsx b/samples/react-rhythm-of-business-calendar/src/components/approvals/ApproversPanel.tsx new file mode 100644 index 000000000..44729d41b --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/approvals/ApproversPanel.tsx @@ -0,0 +1,295 @@ +import React from 'react'; +import { FocusZone, format, ICommandBarItemProps, IDropdownOption, Text } from "@fluentui/react"; +import { Entity, ErrorHandler, humanizeFixedList, multifilter } from 'common'; +import { EntityPanelBase, IEntityPanelProps, IDataPanelBaseState, ResponsiveGrid, GridRow, GridCol, IDataPanelBase, LiveTextField, LiveText, LiveUserPicker, ITransformer, LiveMultiselectDropdown } from "common/components"; +import { Approvers, Refiner, RefinerValue } from "model"; +import { withServices, ServicesProp, EventsServiceProp, EventsService } from 'services'; +import { ListItemTechnicals } from '../shared'; + +import { PersistConcurrencyFailureMessage, ApproversPanel as strings } from "ComponentStrings"; + +import styles from './ApproversPanel.module.scss'; + +export interface IApproversPanel extends IDataPanelBase { +} + +interface IOwnProps { +} +type IProps = IOwnProps & IEntityPanelProps & ServicesProp; + +interface IOwnState { + refinerValueOptionsByRefiner: Map; + refiners: readonly Refiner[]; +} +type IState = IOwnState & IDataPanelBaseState; + +class ApproversPanel extends EntityPanelBase implements IApproversPanel { + protected get title() { + return ''; + } + + protected resetState(): IState { + this._buildRefinerValueOptions(); + + return { + ...super.resetState(), + refinerValueOptionsByRefiner: new Map(), + refiners: [] + }; + } + + public componentShouldRender() { + super.componentShouldRender(); + this._buildRefinerValueOptions(); + } + + private async _buildRefinerValueOptions() { + const { [EventsService]: { refinersAsync } } = this.props.services; + + await refinersAsync.promise; + + const refiners = [...refinersAsync.data]; + refiners.sort(Refiner.OrderAscComparer); + + const refinerValueOptionsByRefiner = new Map(); + for (const refiner of refiners) { + const options: IDropdownOption[] = refiner.values.filter(Entity.NotDeletedFilter).map((value: RefinerValue) => { + const { key, displayName: text } = value; + return { key, text, data: value } as IDropdownOption; + }); + + refinerValueOptionsByRefiner.set(refiner, options); + } + + this.setState({ refinerValueOptionsByRefiner, refiners }); + } + + protected async persistChangesCore() { + const { [EventsService]: events } = this.props.services; + + try { + events.track(this.entity); + await events.persist(); + } catch (e) { + if (ErrorHandler.is_412_PRECONDITION_FAILED(e)) { + const message = await ErrorHandler.message(e); + console.warn(message, e); + return Promise.reject(PersistConcurrencyFailureMessage); + } else { + throw e; + } + } + } + + private approvalsDescription(): JSX.Element { + const { refiners } = this.state; + const { refinerValues } = this.entity; + + return <> + {strings.ApprovalExplanation} + +

    + {refiners.map(refiner => { + const { displayName, key } = refiner; + const selectedValues = multifilter(refinerValues.get(), Entity.NotDeletedFilter, v => v.refiner.get() === refiner); + const allValues = refiner.values.filter(Entity.NotDeletedFilter); + const humanizedString = humanizeFixedList(selectedValues, allValues, v => v.displayName, false, strings.AnyValue, undefined, strings.ValueListConjunction); + return ( +
  • + {selectedValues.length > 0 + ? format(strings.ValueForRefiner, humanizedString, displayName) + : format(strings.AnyRefinerValue, displayName) + } +
  • + ); + })} +
+
+ ; + } + + protected renderDisplayContent(): JSX.Element { + const { refiners } = this.state; + const entity = this.entity; + const liveProps = { + entity + }; + + return ( + + + + + + + + + {refiners.map(refiner => { + const transformer = { + transform: (values: RefinerValue[]) => values.filter(v => v.refiner.get() === refiner), + reverse: (values: RefinerValue[]) => values + }; + + return ( + + + {vals => {vals.map(v => v.displayName).join(', ') || strings.AnyValue}} + + + ); + })} + + + + + {val => {val.map(({ title }) => title).join(', ') || "-"}} + + + + {refiners.length > 0 && + + + {this.approvalsDescription()} + + + } + + + + + + + + ); + } + + protected renderEditContent(): JSX.Element { + const { showValidationFeedback, refiners, refinerValueOptionsByRefiner } = this.state; + const entity = this.entity; + const { refinerValues } = entity; + const liveProps = { + entity, + showValidationFeedback, + updateField: this.updateField + }; + + return ( + + + + + + + + {refiners.filter(Entity.NotDeletedFilter).map(refiner => { + const { displayName } = refiner; + const anyValueString = format(strings.AnyRefinerValue, displayName); + + const transformer: ITransformer = { + transform: (values: RefinerValue[]) => { + return values.filter(v => v.refiner.get() === refiner); + }, + reverse: (values: RefinerValue | RefinerValue[]) => { + return [ + ...this.entity.refinerValues.filter(v => v.refiner.get() !== refiner), + ...(values instanceof Array ? values : [values]).filter(v => v !== refiner.blankValue) + ].filter(Boolean); + } + }; + + const allValues = refiner.values.filter(Entity.NotDeletedFilter); + const selectedValues = multifilter(refinerValues.get(), Entity.NotDeletedFilter, v => v.refiner.get() === refiner); + const humanizedString = (values: readonly RefinerValue[]) => humanizeFixedList(values, allValues, v => v.displayName, false, anyValueString, undefined, strings.ValueListConjunction); + + return ( + + val.key} + placeholder={anyValueString} + onRenderTitle={() => <>{humanizedString(selectedValues)}} + renderValue={vals => humanizedString(vals)} + /> + + ); + })} + + + + + + + {refiners.length > 0 && + + + {this.approvalsDescription()} + + + } + + + + + + + ); + } + + protected buildDisplayHeaderCommands(): ICommandBarItemProps[] { + const onEdit = () => { this.edit(); }; + + return [{ + key: 'edit', + text: strings.Command_Edit.Text, + iconProps: { iconName: 'Edit' }, + onClick: onEdit + }]; + } + + protected buildEditHeaderCommands(): ICommandBarItemProps[] { + const { submitting } = this.state; + const { isDeleted } = this.entity; + const onSubmit = () => this.submit(() => this.dismiss()); + const onConfirmDiscard = () => this.confirmDiscard(); + const onDelete = () => this.confirmDelete(); + + return [{ + key: 'save', + text: strings.Command_Save.Text, + iconProps: { iconName: 'Save' }, + disabled: submitting, + onClick: onSubmit + }, { + key: 'discard', + text: strings.Command_Discard.Text, + iconProps: { iconName: 'Cancel' }, + onClick: onConfirmDiscard + }, { + key: 'delete', + text: strings.Command_Delete.Text, + iconProps: { iconName: 'Delete' }, + disabled: isDeleted, + onClick: onDelete + }]; + } +} + +export default withServices(ApproversPanel); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/approvals/ConfigureApproversPanel.tsx b/samples/react-rhythm-of-business-calendar/src/components/approvals/ConfigureApproversPanel.tsx new file mode 100644 index 000000000..eebcbfec7 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/approvals/ConfigureApproversPanel.tsx @@ -0,0 +1,210 @@ +import { isEqual } from "lodash"; +import React, { Component, createRef, MutableRefObject, ReactNode, RefObject } from "react"; +import { CheckboxVisibility, CommandBar, ConstrainMode, DetailsList, DetailsListLayoutMode, IColumn, IContextualMenuItem, MessageBar, MessageBarType, Panel, PanelType, Selection, SelectionMode, Text } from "@fluentui/react"; +import { Entity, humanizeFixedList, IAsyncData, multifilter } from "common"; +import { AsyncDataComponent } from "common/components"; +import { Approvers, Refiner } from "model"; +import { EventsService, EventsServiceProp, ServicesProp, TeamsJs, withServices } from "services"; +import ApproversPanel, { IApproversPanel } from "./ApproversPanel"; + +import { ConfigureApproversPanel as strings } from "ComponentStrings"; + +export interface IConfigureApproversPanel { + open: () => void; + close: () => void; +} + +interface IOwnProps { + componentRef?: RefObject; +} +type IProps = IOwnProps & ServicesProp; + +interface IState { + hidden: boolean; + approversAsync: IAsyncData; + refinersAsync: IAsyncData; +} + +class ConfigureApproversPanel extends Component implements IConfigureApproversPanel { + private readonly _approversPanel = createRef(); + private readonly _selection: Selection; + + constructor(props: IProps) { + super(props); + + const { + [EventsService]: { approversAsync, refinersAsync } + } = this.props.services; + + this.state = { + hidden: true, + approversAsync, + refinersAsync + }; + + this._selection = new Selection({ + onSelectionChanged: () => this.setState({}), + items: [] + }); + } + + public componentDidMount() { + (this.props.componentRef as MutableRefObject).current = this; + } + + public componentWillUnmount(): void { + (this.props.componentRef as MutableRefObject).current = null; + } + + public readonly open = () => + this.setState({ hidden: false }) + + public readonly close = () => + this.setState({ hidden: true }) + + private readonly _viewApprovers = async () => { + try { + const approvers = this._selection.getSelection()[0]; + await this._approversPanel.current.display(approvers); + } finally { this.forceUpdate(); } + } + + private readonly _newApprovers = async () => { + try { + await this._approversPanel.current.edit(new Approvers()); + } finally { this.forceUpdate(); } + } + + private readonly _editApprovers = async () => { + try { + const approvers = this._selection.getSelection()[0]; + await this._approversPanel.current.edit(approvers); + } finally { this.forceUpdate(); } + } + + private readonly _getApproversKey = ({ key }: Approvers) => key; + + private readonly _generateCommands = (selectedCount: number) => { + const addContact: IContextualMenuItem = { + key: "add", + name: "New", + iconProps: { iconName: "Add" }, + onClick: () => { this._newApprovers(); } + }; + + const viewContact: IContextualMenuItem = { + key: "view", + name: "View", + iconProps: { iconName: "View" }, + disabled: selectedCount === 0, + onClick: () => { this._viewApprovers(); } + }; + + const editContact: IContextualMenuItem = { + key: "edit", + name: "Edit", + iconProps: { iconName: "Edit" }, + disabled: selectedCount === 0, + onClick: () => { this._editApprovers(); } + }; + + return { + near: [addContact, viewContact, editContact] + }; + } + + private *_generateColumns(refiners: readonly Refiner[]): Generator { + yield { + key: 'title', + name: strings.Column_Title, + isRowHeader: true, + isResizable: true, + isMultiline: true, + fieldName: 'displayName' + } as IColumn; + + for (const refiner of refiners) { + yield { + key: `refiner-${refiner.key}`, + name: refiner.displayName, + isResizable: true, + isMultiline: true, + onRender: ({ refinerValues }: Approvers) => { + const selectedValues = multifilter(refinerValues.get(), Entity.NotDeletedFilter, v => v.refiner.get() === refiner); + const allValues = refiner.values.filter(Entity.NotDeletedFilter); + const humanizedString = humanizeFixedList(selectedValues, allValues, v => v.displayName, false, strings.AnyValue, undefined, strings.ValueListConjunction); + return selectedValues.length > 0 ? humanizedString : strings.AnyValue; + } + } as IColumn; + } + + yield { + key: 'users', + name: strings.Column_Users, + isResizable: true, + isMultiline: true, + onRender: ({ users }: Approvers) => users.map(({ title }) => title).join(', ') + } as IColumn; + } + + private _filteredAndSortdApprovers: Approvers[] = []; + private _getFilteredAndSortedApprovers(approvers: readonly Approvers[]): Approvers[] { + const filteredAndSortdApprovers = approvers.filter(Entity.NotDeletedFilter).sort(Entity.DisplayNameAscComparer); + if (!isEqual(this._filteredAndSortdApprovers, filteredAndSortdApprovers)) { + this._filteredAndSortdApprovers = filteredAndSortdApprovers; + this._selection.setItems(filteredAndSortdApprovers); + } + + return this._filteredAndSortdApprovers; + } + + + public render(): ReactNode { + const { [TeamsJs]: teams } = this.props.services; + const { hidden, approversAsync, refinersAsync } = this.state; + + const commands = this._generateCommands(this._selection.getSelectedCount()); + + return ( + {approvers => + {refiners => <> + + + + {this._filteredAndSortdApprovers.length === 0 && + {strings.NoApproversDefined} + } + + {teams ? strings.AdminApproversMessage_Teams : strings.AdminApproversMessage_SharePoint} + + + + } + } + ); + } +} + +export default withServices(ConfigureApproversPanel); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/approvals/EventCard.tsx b/samples/react-rhythm-of-business-calendar/src/components/approvals/EventCard.tsx new file mode 100644 index 000000000..9e76e5f65 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/approvals/EventCard.tsx @@ -0,0 +1,35 @@ +import React, { FC, useCallback } from "react"; +import { useConst } from "@fluentui/react-hooks"; +import { ActionButton, Separator, Stack } from "@fluentui/react"; +import { Event } from "model"; +import { EventOverview, IEventCommands } from "../events"; + +import styles from './MyApprovalsPanel.module.scss'; + +import { MyApprovalsPanel as strings } from 'ComponentStrings'; + +interface IProps { + event: Event; + commands: IEventCommands; +} + +export const EventCard: FC = ({ + event, + commands: { view, approve, reject } +}) => { + const onClickView = useCallback(() => { view(event); }, [event, view]); + const onClickApprove = useCallback(() => { approve(event); }, [event, approve]); + const onClickReject = useCallback(() => { reject(event); }, [event, reject]); + + return ( +
+ + + + {strings.Command_View.Text} + {strings.Command_Approve.Text} + {strings.Command_Reject.Text} + +
+ ); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/approvals/MyApprovalsFilter.tsx b/samples/react-rhythm-of-business-calendar/src/components/approvals/MyApprovalsFilter.tsx new file mode 100644 index 000000000..2c438ee74 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/approvals/MyApprovalsFilter.tsx @@ -0,0 +1,24 @@ +import { FC, ReactElement } from "react"; +import { Entity } from "common"; +import { Approvers, Event } from "model"; +import { useDirectoryService } from "services"; + +interface IProps { + events: readonly Event[]; + approvers: readonly Approvers[]; + children: (events: readonly Event[]) => ReactElement; +} + +export const MyApprovalsFilter: FC = ({ events, approvers, children }) => { + const { currentUser, currentUserIsSiteAdmin } = useDirectoryService(); + const currentUserApprovers = approvers.filter(a => a.userIsAnApprover(currentUser)); + + const filteredEvents = events + .filter(({ isRecurring, isSeriesMaster }) => !isRecurring || isSeriesMaster) + .filter(Entity.NotDeletedFilter) + .filter(Event.PendingFilter) + .sort(Event.StartAscComparer) + .filter(event => currentUserIsSiteAdmin || Approvers.appliesToAny(currentUserApprovers, event.valuesByRefiner())); + + return children(filteredEvents); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/approvals/MyApprovalsPanel.module.scss b/samples/react-rhythm-of-business-calendar/src/components/approvals/MyApprovalsPanel.module.scss new file mode 100644 index 000000000..2085e10e8 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/approvals/MyApprovalsPanel.module.scss @@ -0,0 +1,8 @@ +@import '../panels.module'; + +.event { + @include ms-depth-4; + margin: 10px; + padding: 15px 30px 0 30px; + border-radius: 6px; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/approvals/MyApprovalsPanel.tsx b/samples/react-rhythm-of-business-calendar/src/components/approvals/MyApprovalsPanel.tsx new file mode 100644 index 000000000..4c00016c5 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/approvals/MyApprovalsPanel.tsx @@ -0,0 +1,90 @@ +import React, { Component, MutableRefObject, ReactNode, RefObject } from "react"; +import { FocusZone, Panel, PanelType, Text } from "@fluentui/react"; +import { IAsyncData } from "common"; +import { AsyncDataComponent } from "common/components"; +import { Approvers, Event } from "model"; +import { EventsService, EventsServiceProp, ServicesProp, withServices } from "services"; +import { IEventCommands } from "../events/IEventCommands"; +import { EventCard } from "./EventCard"; +import { MyApprovalsFilter } from "./MyApprovalsFilter"; + +import { MyApprovalsPanel as strings } from "ComponentStrings"; + +export interface IMyApprovalsPanel { + open: () => void; + close: () => void; +} + +interface IOwnProps { + componentRef?: RefObject; + commands: IEventCommands; +} +type IProps = IOwnProps & ServicesProp; + +interface IState { + hidden: boolean; + eventsAsync: IAsyncData; + approversAsync: IAsyncData; +} + +class MyApprovalsPanel extends Component implements IMyApprovalsPanel { + constructor(props: IProps) { + super(props); + + const { + [EventsService]: { eventsAsync, approversAsync } + } = this.props.services; + + this.state = { + hidden: true, + eventsAsync, + approversAsync + }; + } + + public componentDidMount() { + (this.props.componentRef as MutableRefObject).current = this; + } + + public componentWillUnmount(): void { + (this.props.componentRef as MutableRefObject).current = null; + } + + public readonly open = () => + this.setState({ hidden: false }) + + public readonly close = () => + this.setState({ hidden: true }) + + public render(): ReactNode { + const { commands } = this.props; + const { hidden, eventsAsync, approversAsync } = this.state; + + return ( + + {approvers => + {events => + {events => <> + {events.map(event => + + )} + {events.length === 0 && + {strings.NoEventsToApprove} + } + } + } + } + + ); + } +} + +export default withServices(MyApprovalsPanel); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/approvals/index.ts b/samples/react-rhythm-of-business-calendar/src/components/approvals/index.ts new file mode 100644 index 000000000..fee93d0ed --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/approvals/index.ts @@ -0,0 +1,5 @@ +export { default as ApprovalDialog, IApprovalDialog } from './ApprovalDialog'; +export { default as ApproversPanel, IApproversPanel } from './ApproversPanel'; +export { default as ConfigureApproversPanel, IConfigureApproversPanel } from './ConfigureApproversPanel'; +export { default as MyApprovalsPanel, IMyApprovalsPanel } from './MyApprovalsPanel'; +export { MyApprovalsFilter } from './MyApprovalsFilter'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/events/EventBar.module.scss b/samples/react-rhythm-of-business-calendar/src/components/events/EventBar.module.scss new file mode 100644 index 000000000..655d08c29 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/events/EventBar.module.scss @@ -0,0 +1,51 @@ +@import '../common.module'; + +$eventBorderRadius: 6px; + +@mixin event-font() { + color: white; + @include ms-fontSize-12; + line-height: 16px; + overflow: hidden; + white-space: nowrap; +} + +.event { + @include event-font(); + margin-top: 1px; + cursor: pointer; + + padding: 3px 6px; + + &.compact { + padding: 1px 6px 2px 6px; + } + + &.unapproved { + font-style: italic; + } + + &.rejected { + text-decoration: line-through; + } + + &.startsIn { + border-top-left-radius: $eventBorderRadius; + border-bottom-left-radius: $eventBorderRadius; + } + + &.endsIn { + border-top-right-radius: $eventBorderRadius; + border-bottom-right-radius: $eventBorderRadius; + margin-right: 1px; + } + + .text { + @include event-font(); + text-overflow: ellipsis; + } + + .recur { + text-align: end; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/events/EventBar.tsx b/samples/react-rhythm-of-business-calendar/src/components/events/EventBar.tsx new file mode 100644 index 000000000..c1670c503 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/events/EventBar.tsx @@ -0,0 +1,79 @@ +import React, { CSSProperties, FC, useMemo } from 'react'; +import { css, Stack, StackItem, useTheme } from '@fluentui/react'; +import { useConst } from '@fluentui/react-hooks'; +import { LockIcon, POIIcon, RecentIcon, RepeatAllIcon } from '@fluentui/react-icons-mdl2'; +import { IEvent } from 'model'; +import { useConfigurationService } from 'services'; + +import { Humanize as strings } from 'ComponentStrings'; + +import styles from './EventBar.module.scss'; + +export enum EventBarSize { + Compact, + Large +} + +interface IProps { + event: IEvent; + startsIn: boolean; + endsIn: boolean; + timeStringOverride?: string; + size?: EventBarSize; +} + +export const EventBar: FC = ({ event, startsIn, endsIn, timeStringOverride, size = EventBarSize.Compact }) => { + const { palette: { themePrimary } } = useTheme(); + const { active: { useApprovals } } = useConfigurationService(); + + const { isPendingApproval, isRejected, title, start, end, isAllDay, location, tag, color, isConfidential, isRecurring } = event; + + const eventClassName = css( + styles.event, + { + [styles.unapproved]: useApprovals && isPendingApproval, + [styles.rejected]: isRejected, + [styles.startsIn]: startsIn, + [styles.endsIn]: endsIn, + [styles.compact]: size === EventBarSize.Compact + } + ); + + const style: CSSProperties = useMemo(() => { + return { + backgroundColor: color?.toCssString() || themePrimary + }; + }, [color, themePrimary]); + + const startTimeString = timeStringOverride || + (size === EventBarSize.Compact + ? (!isAllDay && start?.format('LT')) + : isAllDay ? strings.AllDay : `${start?.format('LT')} - ${end?.format('LT')}` + ); + + return ( + + + {tag && [{tag}]} + + {size === EventBarSize.Compact && startTimeString && `${startTimeString}, `} + {title} + + {isConfidential && } + + {isRecurring && } + + + {size === EventBarSize.Large && <> + + + {startTimeString} + + + + {location || '-'} + + } + + ); +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/events/EventDetailsCallout.tsx b/samples/react-rhythm-of-business-calendar/src/components/events/EventDetailsCallout.tsx new file mode 100644 index 000000000..f69856d58 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/events/EventDetailsCallout.tsx @@ -0,0 +1,74 @@ +import React, { FC, MutableRefObject, RefObject, useCallback, useEffect, useState } from 'react'; +import { useBoolean, useConst } from "@fluentui/react-hooks"; +import { FocusTrapCallout, FocusZone, ICalloutContentStyles, IFocusTrapZoneProps, IStackTokens, Separator, Stack } from '@fluentui/react'; +import { IEvent } from 'model'; +import { useEventCommandActionButtons } from '../hooks'; +import { EventOverview } from './EventOverview'; +import { IEventCommands } from './IEventCommands'; + +export interface IEventDetailsCallout { + open(event: IEvent, target: HTMLElement): void; +} + +interface IProps { + componentRef: RefObject; + commands: IEventCommands; +} + +export const EventDetailsCallout: FC = ({ componentRef, commands }) => { + const [isOpen, { setTrue: show, setFalse: hide }] = useBoolean(false); + const [event, setEvent] = useState(); + const [target, setTarget] = useState(); + + const open = useCallback((eventToOpen: IEvent, openTarget: HTMLElement) => { + if (eventToOpen !== event || !isOpen) { + setEvent(eventToOpen); + setTarget(openTarget); + show(); + } else { + hide(); + } + }, [event, isOpen, setEvent, setTarget, show, hide]); + + useEffect(() => { + (componentRef as MutableRefObject).current = { open }; + return () => { (componentRef as MutableRefObject).current = undefined; }; + }, [componentRef, open]); + + const stackTokens = useConst({ childrenGap: 10 }); + + const calloutStyles = useConst>({ + calloutMain: { padding: '10px 25px', maxWidth: 625 } + }); + + const focusTrapProps = useConst({ + isClickableOutsideFocusTrap: true, + forceFocusInsideTrap: false, + }); + + const [ + viewCommand, + addToOutlookCommand, + getLinkCommand + ] = useEventCommandActionButtons(commands, event); + + return (isOpen && + + + + + + {viewCommand} + {addToOutlookCommand} + {getLinkCommand} + + + + ); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/events/EventFilter.tsx b/samples/react-rhythm-of-business-calendar/src/components/events/EventFilter.tsx new file mode 100644 index 000000000..a652f198d --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/events/EventFilter.tsx @@ -0,0 +1,56 @@ +import { FC, ReactElement } from "react"; +import { Entity, MomentRange, User } from "common"; +import { Approvers, Event, EventOccurrence, Refiner, RefinerValue } from "model"; +import { useConfigurationService, useDirectoryService } from "services"; + +interface IProps { + events: readonly Event[]; + dateRange: MomentRange; + refiners: readonly Refiner[]; + selectedRefinerValues: Set; + approvers: readonly Approvers[]; + children: (cccurrences: readonly EventOccurrence[]) => ReactElement; +} + +export const EventFilter: FC = ({ events, dateRange, refiners, selectedRefinerValues, approvers, children }) => { + const { currentUser, currentUserIsSiteAdmin } = useDirectoryService(); + const { active: { useApprovals, useRefiners } } = useConfigurationService(); + const currentUserApprovers = approvers.filter(a => a.userIsAnApprover(currentUser)); + + const filteredEventOccurrences = events + .filter(event => !event.isSeriesException) + .filter(Entity.NotDeletedFilter) + .filter(event => { + if (event.isApproved) { + return true; + } else if (event.isRejected && User.equal(event.creator, currentUser)) { + return true; + } else if (event.isPendingApproval) { + if (!useApprovals) + return true; + else if (currentUserIsSiteAdmin) + return true; + else if (User.equal(event.creator, currentUser)) + return true; + else if (Approvers.appliesToAny(currentUserApprovers, event.valuesByRefiner())) + return true; + else + return false; + } + }) + .flatMap(event => event.expandOccurrences(dateRange)) + .filter(occurrence => { + const valuesByRefiner = occurrence.event.valuesByRefiner(); + return !useRefiners || refiners.every(refiner => { + const values = valuesByRefiner.get(refiner); + if (values) + return values.some(v => selectedRefinerValues.has(v)); + else if (!refiner.required) + return selectedRefinerValues.has(refiner.blankValue); + else + return true; + }); + }); + + return children(filteredEventOccurrences); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/events/EventOverview.module.scss b/samples/react-rhythm-of-business-calendar/src/components/events/EventOverview.module.scss new file mode 100644 index 000000000..5a422f799 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/events/EventOverview.module.scss @@ -0,0 +1,26 @@ +@import '../common.module'; + +.root { + position: relative; + + .title { + @include ms-fontWeight-semibold; + padding-bottom: 2px; + + @include lg-up { + @include ms-fontSize-18; + } + + @include md-down { + @include ms-fontSize-16; + } + + &.unapproved { + font-style: italic; + } + + &.rejected { + text-decoration: line-through; + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/events/EventOverview.tsx b/samples/react-rhythm-of-business-calendar/src/components/events/EventOverview.tsx new file mode 100644 index 000000000..46b2020b3 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/events/EventOverview.tsx @@ -0,0 +1,86 @@ +import React, { FC } from 'react'; +import { css, IStackStyles, IStackTokens, Stack, StackItem, Text } from '@fluentui/react'; +import { useConst } from '@fluentui/react-hooks'; +import { LockIcon, POIIcon, RecentIcon, RepeatAllIcon } from '@fluentui/react-icons-mdl2'; +import { Entity } from 'common'; +import { LiveUpdate } from 'common/components'; +import { IEvent, humanizeDateRange, humanizeRecurrencePattern } from 'model'; +import { useConfigurationService } from 'services'; +import { RefinerValuePill } from '../refiners'; + +import { EventOverview as strings } from 'ComponentStrings'; + +import styles from './EventOverview.module.scss'; + +interface IProps { + event: IEvent; + className?: string; +} + +export const EventOverview: FC = ({ event, className }) => { + const { active: { useApprovals } } = useConfigurationService(); + const { title, start, end, isAllDay, location, isSeriesMaster, isPendingApproval, isRejected, isRecurring, isConfidential, recurrence } = event; + + const titleClassName = css( + styles.title, + { + [styles.unapproved]: useApprovals && isPendingApproval, + [styles.rejected]: isRejected + } + ); + + const rootStackTokens: IStackTokens = useConst({ childrenGap: 10 }); + const titleStackStyles: IStackStyles = useConst({ root: { width: '100%' } }); + const detailsStackTokens: IStackTokens = useConst({ childrenGap: 24 }); + const refinerValuesStackTokens: IStackTokens = useConst({ childrenGap: 6 }); + const confidentialStackTokens: IStackTokens = useConst({ childrenGap: 4 }); + const iconTextStackTokens: IStackTokens = useConst({ childrenGap: 10 }); + + const refinerValues = event.refinerValues.get().filter(Entity.NotDeletedFilter); + + return ( + {renderLiveUpdateMark => <> + + + + {title} + + {renderLiveUpdateMark()} + + + {refinerValues.length > 0 && + + {refinerValues.map(refinerValue => + + )} + + } + {isConfidential && + + + {strings.Confidential} + + } + + {!isSeriesMaster && + + + {humanizeDateRange(start, end, isAllDay)} + + } + {isRecurring && + + + {event.getSeriesMaster().start.format('LT')} - {event.getSeriesMaster().end.format('LT')}, {humanizeRecurrencePattern(start, recurrence)} + + } + {location && + + + {location} + + } + + } + ); +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/events/EventPanel.module.scss b/samples/react-rhythm-of-business-calendar/src/components/events/EventPanel.module.scss new file mode 100644 index 000000000..65349d1a2 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/events/EventPanel.module.scss @@ -0,0 +1,7 @@ +@import '../panels.module'; + +.header { + padding: 12px 30px; + border-bottom: 1px solid; + border-bottom-color: $color-neutralQuaternary; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/events/EventPanel.tsx b/samples/react-rhythm-of-business-calendar/src/components/events/EventPanel.tsx new file mode 100644 index 000000000..d9b35d304 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/events/EventPanel.tsx @@ -0,0 +1,969 @@ +import { PrincipalType } from '@pnp/sp'; +import { Guid } from '@microsoft/sp-core-library'; +import React from 'react'; +import { FocusZone, format, ICommandBarItemProps, IDropdownOption, Label, Link, MessageBar, MessageBarType, Stack, Text } from "@fluentui/react"; +import { Entity, ErrorHandler, humanizeDuration, mapToArray, now, User, ValidationRule } from 'common'; +import { EntityPanelBase, IEntityPanelProps, IDataPanelBaseState, ResponsiveGrid, GridRow, GridCol, LiveText, LiveUpdate, IDataPanelBase, LiveToggle, LiveUserPicker, LiveTextField, LiveTimePicker, LiveDatePicker, Validation, ITransformer, LiveMultiselectDropdown, LiveDropdown } from "common/components"; +import { Event, Refiner, RefinerValue, RecurPattern, EventModerationStatus, Approvers, humanizeRecurrencePattern } from "model"; +import { withServices, ServicesProp, EventsServiceProp, EventsService, ConfigurationServiceProp, ConfigurationService, DirectoryServiceProp, DirectoryService } from 'services'; +import { EventOverview } from '../events'; +import { RefinerValuePill } from '../refiners'; +import { ListItemTechnicals } from '../shared'; +import { PatternChoiceGroup, DailyEditor, WeeklyEditor, MonthlyEditor, YearlyEditor, UntilEditor } from '../recurrence'; +import { IEventCommands } from './IEventCommands'; + +import { PersistConcurrencyFailureMessage, Validation as validationStrings, EventPanel as strings } from "ComponentStrings"; + +import styles from './EventPanel.module.scss'; + +export class RefinerValueValidationRule extends ValidationRule { + constructor( + private _refiner: Refiner + ) { + super((e: Event) => this._isValid(e), validationStrings.Refiners.Required); + } + + private _isValid({ refinerValues }: Event): boolean { + return !this._refiner.required || refinerValues.get().some(v => v.refiner.get() === this._refiner); + } +} + +export interface IEventPanel extends IDataPanelBase { +} + +interface IOwnProps { + commands: IEventCommands; +} +type IProps = IOwnProps & IEntityPanelProps & ServicesProp; + +interface IOwnState { + refinerValueOptionsByRefiner: Map; + refiners: readonly Refiner[]; +} +type IState = IOwnState & IDataPanelBaseState; + +class EventPanel extends EntityPanelBase implements IEventPanel { + private readonly _refinerValueValidationRulesByRefiner = new Map(); + + protected get title() { + return this.entity?.displayName || (this.isNew ? strings.NewEvent : ''); + } + + protected resetState(): IState { + this._buildRefinerValueOptions(); + this._buildRefinerValueValidationRules(); + + return { + ...super.resetState(), + refinerValueOptionsByRefiner: new Map(), + refiners: [] + }; + } + + protected validate(): boolean { + const rules = mapToArray(this._refinerValueValidationRulesByRefiner); + return super.validate() && rules.every(rule => rule.validate(this.entity)); + } + + public componentShouldRender() { + super.componentShouldRender(); + this._buildRefinerValueOptions(); + this._buildRefinerValueValidationRules(); + } + + private async _buildRefinerValueOptions() { + const { [EventsService]: { refinersAsync } } = this.props.services; + + await refinersAsync.promise; + + const refiners = [...refinersAsync.data]; + refiners.sort(Refiner.OrderAscComparer); + + const refinerValueToDropdownOption = (value: RefinerValue) => { + const { key, displayName: text } = value; + return { key, text, data: value } as IDropdownOption; + }; + + const refinerValueOptionsByRefiner = new Map(); + for (const refiner of refiners) { + const { required, allowMultiselect, blankValue } = refiner; + const options: IDropdownOption[] = []; + + if (!required && !allowMultiselect) { + options.push(refinerValueToDropdownOption(blankValue)); + } + + options.push(...refiner.values.filter(Entity.NotDeletedFilter).map(refinerValueToDropdownOption)); + + refinerValueOptionsByRefiner.set(refiner, options); + } + + this.setState({ refinerValueOptionsByRefiner, refiners }); + } + + private async _buildRefinerValueValidationRules() { + const { [EventsService]: { refinersAsync } } = this.props.services; + + await refinersAsync.promise; + + const { data: refiners } = refinersAsync; + + this._refinerValueValidationRulesByRefiner.clear(); + + for (const refiner of refiners.filter(Entity.NotDeletedFilter)) { + const rule = new RefinerValueValidationRule(refiner); + this._refinerValueValidationRulesByRefiner.set(refiner, rule); + } + } + + protected async persistChangesCore() { + const { + [DirectoryService]: { currentUserIsSiteAdmin, currentUser }, + [ConfigurationService]: { active: { useApprovals } }, + [EventsService]: events + } = this.props.services; + const { isApproved, isRejected, isDeleted, isConfidential } = this.entity; + + const userCanApprove = currentUserIsSiteAdmin || this._currentUserIsAnApprover(); + + try { + if (isRejected && !userCanApprove) { + this.entity.moderationStatus = EventModerationStatus.Pending; + } + else if (!isApproved && (!useApprovals || userCanApprove)) { + this.entity.moderationStatus = EventModerationStatus.Approved; + this.entity.moderator = currentUser; + this.entity.moderationTimestamp = now(); + } + + if (this.entity.hasRecurrenceChanges() && !isDeleted) { + this.entity.exceptions.forEach(e => e.delete()); + this.entity.recurrenceUID = Guid.newGuid(); + } + + if (!isConfidential) { + this.entity.restrictedToAccounts = []; + } + + events.track(this.entity); + await events.persist(); + } catch (e) { + if (ErrorHandler.is_412_PRECONDITION_FAILED(e)) { + const message = await ErrorHandler.message(e); + console.warn(message, e); + return Promise.reject(PersistConcurrencyFailureMessage); + } else { + throw e; + } + } + } + + private _renderModerationStatus() { + const { + [DirectoryService]: { currentUserIsSiteAdmin, currentUser }, + [ConfigurationService]: { active: { useApprovals } } + } = this.props.services; + const { creator, isApproved, isPendingApproval, isRejected, moderator, moderationMessage, moderationTimestamp } = this.entity + + if (!useApprovals) return <>; + + const userCanApprove = currentUserIsSiteAdmin || this._currentUserIsAnApprover(); + const userIsCreator = this.isNew || User.equal(creator, currentUser); + + return <> + {this.inDisplayMode && isPendingApproval && <> + + {strings.Moderation.EventIsPendingApproval} + + } + {this.inEditMode && isPendingApproval && !userCanApprove && <> + + {strings.Moderation.EventWillNeedApproval} + + } + {this.inEditMode && isPendingApproval && userCanApprove && <> + + {strings.Moderation.EventWillBeAutoApproved} + + } + {isApproved && (userIsCreator || userCanApprove) && <> + + {format(strings.Moderation.EventIsApproved, moderator.title, moderationTimestamp.format('LLL'))} + {moderationMessage && <> + + {moderationMessage} + } + + } + {isRejected && (userIsCreator || userCanApprove) && <> + + {format(strings.Moderation.EventIsRejected, moderator.title, moderationTimestamp.format('LLL'))} + {moderationMessage && <> + + {moderationMessage} + } + + } + ; + } + + protected renderDisplayContent(): JSX.Element { + const { [ConfigurationService]: { active: config } } = this.props.services; + const { refiners } = this.state; + const event = this.entity; + const liveProps = { + entity: event + }; + const { isAllDay, start, isConfidential, isRecurring, isSeriesMaster, isSeriesException, seriesMaster } = event; + const isConfidentialPrevious = event.hasPrevious && event.previousValue('isConfidential'); + const isConfidentialSnapshot = event.hasSnapshot && event.snapshotValue('isConfidential'); + const confidentialFieldEnabled = (isConfidential || isConfidentialSnapshot || isConfidentialPrevious || config.allowConfidentialEvents); + + return ( + + + + + + {val => {val || "-"}} + + + + + {!isSeriesMaster && + + + {start => {start.format('dddd, MMMM DD, YYYY')}} + + + } + + + {(start, state) => { + let isAllDay = false; + switch (state) { + case 'current': isAllDay = this.entity.currentValue('isAllDay'); break; + case 'snapshot': isAllDay = this.entity.snapshotValue('isAllDay'); break; + case 'previous': isAllDay = this.entity.previousValue('isAllDay'); break; + } + return {isAllDay ? strings.AllDay : start.format('LT')}; + }} + + + {!isSeriesMaster && + + + {end => {end.format('dddd, MMMM DD, YYYY')}} + + + } + + {!isAllDay && + + {(end, state) => { + let isAllDay = false; + switch (state) { + case 'current': isAllDay = this.entity.currentValue('isAllDay'); break; + case 'snapshot': isAllDay = this.entity.snapshotValue('isAllDay'); break; + case 'previous': isAllDay = this.entity.previousValue('isAllDay'); break; + } + return {isAllDay ? strings.AllDay : end.format('LT')}; + }} + + } + + + {isRecurring && + + + + {recurrence => {humanizeRecurrencePattern(start, recurrence)}} + + + + } + + + + {val => {val || "-"}} + + + + + + + {val => {val || "-"}} + + + + + + + {val => {val.map(({ title }) => title).join(', ') || "-"}} + + + + + {refiners.map(refiner => { + const transformer = { + transform: (values: RefinerValue[]) => values.filter(v => v.refiner.get() === refiner), + reverse: (values: RefinerValue[]) => values + }; + + return ( + + + {val => + + {val.map(refinerValue => + + )} + + } + + + ); + })} + + + + {this._renderModerationStatus()} + + + {confidentialFieldEnabled && + + + + {val => {val ? strings.Field_Confidential.OnText : strings.Field_Confidential.OffText}} + + + + {isConfidential && + + {val => {val.map(({ title }) => title).join(', ') || "-"}} + + } + + + } + + + + + + + + ); + } + + protected renderEditContent(): JSX.Element { + const { [ConfigurationService]: { active: config } } = this.props.services; + const { refiners, refinerValueOptionsByRefiner, showValidationFeedback } = this.state; + const event = this.entity; + const { isAllDay, start, isConfidential, isRecurring, isSeriesException, recurrence, recurrenceExceptionInstanceDate } = event; + const isConfidentialPrevious = event.hasPrevious && event.previousValue('isConfidential'); + const isConfidentialSnapshot = event.hasSnapshot && event.snapshotValue('isConfidential'); + const confidentialFieldEnabled = (isConfidential || isConfidentialSnapshot || isConfidentialPrevious || config.allowConfidentialEvents); + const liveProps = { + entity: event, + showValidationFeedback, + updateField: this.updateField + }; + + return ( + + + + + + + + + + + {(!isRecurring || isSeriesException) && + + + + } + + + + + + + + + {(!isRecurring || isSeriesException) && + + + + } + + + + + {!isAllDay && <> + + {humanizeDuration(this.entity.duration)} + } + + + + + + {isSeriesException && + + + + {format(strings.ThisInstanceOccursOn, recurrenceExceptionInstanceDate.format('LL'))} +
+ {humanizeRecurrencePattern(start, recurrence)} +
+
+ } + {!isSeriesException && + + + + + + {isRecurring && + humanizeRecurrencePattern(start, recur)} updateValue={recurrence => this.updateField(e => e.recurrence = recurrence)}>{renderLiveUpdateMark => { + const { pattern } = recurrence; + return ( + + {renderLiveUpdateMark()} + this.updateField(e => e.recurrence.pattern = parseInt(opt.key))} + /> + {pattern === RecurPattern.daily && + + } + {pattern === RecurPattern.weekly && + + } + {pattern === RecurPattern.monthly && + + } + {pattern === RecurPattern.yearly && + + } + + + + ); + }} + + } + + + {this.entity.hasRecurrenceChanges() && + {strings.Recurrence.UpdateWarning} + } + + + } + + + + + + + + + + + + + + + + + {refiners.filter(Entity.NotDeletedFilter).map(refiner => { + const { displayName, required, allowMultiselect } = refiner; + const rules = [this._refinerValueValidationRulesByRefiner.get(refiner)]; + + const transformer: ITransformer = { + transform: (values: RefinerValue[]) => { + return values.filter(v => v.refiner.get() === refiner); + }, + reverse: (values: RefinerValue | RefinerValue[]) => { + return [ + ...event.refinerValues.filter(v => v.refiner.get() !== refiner), + ...(values instanceof Array ? values : [values]).filter(v => v !== refiner.blankValue) + ].filter(Boolean); + } + }; + + const livePropsForRefinerDropdowns = { + entity: event, + showValidationFeedback, + updateField: (update: (event: Event) => void) => { + this.updateField(event => { + update(event); + event.moderationStatus = EventModerationStatus.Pending; + }); + } + } + + return ( + + + {allowMultiselect + ? val.key} + renderValue={vals => + + {vals.map(v => )} + + } + /> + : val?.key || 0} + renderValue={val => val && val.length > 0 && } + /> + } + + + ); + })} + + + + {this._renderModerationStatus()} + + + {confidentialFieldEnabled && + (isSeriesException + ? + + + {val => val ? strings.Field_Confidential.OnText : strings.Field_Confidential.OffText} + + + + {isConfidential && + + {val => val.map(({ title }) => title).join(', ') || "-"} + + } + + + : + + + + + {isConfidential && + + } + + + )} + + + + + +
+ ); + } + + protected renderDisplayHeader(): JSX.Element { + return ; + } + + protected renderEditHeader(): JSX.Element { + const event = this.entity; + const { isSeriesException, recurrenceExceptionInstanceDate, seriesMaster } = event; + const onEditSeries = () => { this.edit(seriesMaster.get()); }; + + return <> + + {isSeriesException && + + {format(strings.Recurrence.EditingInstanceWarning, recurrenceExceptionInstanceDate.format('LL'))}. +   + {strings.Recurrence.Command_EditSeries.Text} {strings.Recurrence.EditSeriesButtonExplanation} + + } + ; + } + + protected markEntityDeleted(): void { + this.entity.snapshot(); + + if (this.entity.isSeriesException) + this.entity.recurrenceInstanceCancelled = true; + else + this.entity.delete(); + } + + private _currentUserIsAnApprover(): boolean { + const { + [DirectoryService]: { currentUser }, + [EventsService]: { approversAsync }, + } = this.props.services; + + const currentUserApprovers = approversAsync.data?.filter(a => a.userIsAnApprover(currentUser)) || []; + + return Approvers.appliesToAny(currentUserApprovers, this.entity.valuesByRefiner()); + } + + protected buildDisplayHeaderCommands(): ICommandBarItemProps[] { + const { + commands: { approve, reject, addToOutlook, addSeriesToOutlook, getLink }, + services: { [DirectoryService]: { currentUserIsSiteAdmin, currentUser } } + } = this.props; + const { isRecurring, isSeriesException, isSeriesMaster, seriesMaster, isDeleted, isNew, isApproved, creator } = this.entity; + const onEdit = () => { this.edit(); }; + const onEditSeries = () => { this.edit(seriesMaster.get(), false); }; + const onDelete = () => { this.confirmDelete(); }; + const onDeleteSeries = () => { + this.edit(seriesMaster.get(), false); + this.confirmDelete(); + }; + const onApprove = () => { approve(this.entity); }; + const onReject = () => { reject(this.entity); }; + const onAddToOutlook = () => { addToOutlook(this.entity); }; + const onAddSeriesToOutlook = () => { addSeriesToOutlook(this.entity); }; + const onGetLink = () => { getLink(this.entity); }; + + const editSingleCommand: ICommandBarItemProps = { + key: 'edit', + text: strings.Command_Edit.Text, + iconProps: { iconName: 'Edit' }, + disabled: isDeleted, + onClick: onEdit + }; + + const editSeriesCommand: ICommandBarItemProps = { + key: 'edit', + text: "Edit series", + iconProps: { iconName: 'Edit' }, + disabled: isDeleted, + onClick: onEdit + }; + + const editRecurringCommand: ICommandBarItemProps = { + key: 'edit', + text: strings.Command_Edit.Text, + iconProps: { iconName: 'Edit' }, + disabled: isDeleted, + subMenuProps: { + items: [{ + key: 'edit-series', + text: strings.Command_Edit_Recurring_Series.Text, + onClick: onEditSeries + }, { + key: 'edit-occurrence', + text: strings.Command_Edit_Recurring_Instance.Text, + onClick: onEdit + }] + } + }; + + const moderationCommand: ICommandBarItemProps = { + key: 'moderation', + text: strings.Command_Approval.Text, + iconProps: { iconName: 'EventAccepted' }, + disabled: isDeleted, + subMenuProps: { + items: [{ + key: 'approve', + iconProps: { iconName: 'Accept' }, + text: strings.Command_Approval_Approve.Text, + onClick: onApprove + }, { + key: 'decline', + iconProps: { iconName: 'Clear' }, + text: strings.Command_Approval_Reject.Text, + onClick: onReject + }] + } + }; + + const deleteSingleCommand: ICommandBarItemProps = { + key: 'delete', + text: strings.Command_Delete.Text, + iconProps: { iconName: 'Delete' }, + disabled: isDeleted, + onClick: onDelete + }; + + const deleteSeriesMasterCommand: ICommandBarItemProps = { + key: 'delete', + text: strings.Command_Delete_Series.Text, + iconProps: { iconName: 'Delete' }, + disabled: isDeleted, + onClick: onDelete + }; + + const deleteRecurringCommand: ICommandBarItemProps = { + key: 'delete', + text: strings.Command_Delete.Text, + iconProps: { iconName: 'Delete' }, + disabled: isDeleted, + subMenuProps: { + items: [{ + key: 'delete-series', + text: strings.Command_Delete_Recurring_Series.Text, + onClick: onDeleteSeries + }, { + key: 'delete-occurrence', + text: strings.Command_Delete_Recurring_Instance.Text, + onClick: onDelete + }] + } + }; + + const addToOutlookSingleCommand: ICommandBarItemProps = { + key: 'add-to-outlook', + text: strings.Command_AddToOutlook.Text, + iconProps: { iconName: 'AddEvent' }, + disabled: isDeleted, + onClick: onAddToOutlook + }; + + const addToOutlookSeriesCommand: ICommandBarItemProps = { + key: 'add-to-outlook', + text: strings.Command_AddToOutlook.Text, + iconProps: { iconName: 'AddEvent' }, + disabled: isDeleted, + onClick: onAddSeriesToOutlook + }; + + const addToOutlookRecurringCommand: ICommandBarItemProps = { + key: 'add-to-outlook', + text: strings.Command_AddToOutlook.Text, + iconProps: { iconName: 'AddEvent' }, + disabled: isDeleted, + subMenuProps: { + items: [{ + key: 'add-to-outlook-series', + text: strings.Command_AddToOutlook_Recurring_Series.Text, + onClick: onAddSeriesToOutlook + }, { + key: 'add-to-outlook-occurrence', + text: strings.Command_AddToOutlook_Recurring_Instance.Text, + onClick: onAddToOutlook + }] + } + }; + + const getLinkCommand: ICommandBarItemProps = { + key: 'get-link', + text: strings.Command_GetLink.Text, + iconProps: { iconName: 'Link' }, + disabled: isDeleted, + onClick: onGetLink + }; + + const userCanApprove = currentUserIsSiteAdmin || this._currentUserIsAnApprover(); + const userIsCreator = User.equal(creator, currentUser); + const canEdit = userIsCreator || userCanApprove; + const canModerate = !isApproved && userCanApprove; + const canDelete = (!isNew || isSeriesException) && canEdit; + const canAddToOutlook = (!isNew || isSeriesException) && isApproved; + + return [ + canEdit && ( + isRecurring + ? (isSeriesMaster + ? editSeriesCommand + : editRecurringCommand + ) + : editSingleCommand + ), + canModerate && moderationCommand, + canDelete && ( + isRecurring + ? (isSeriesMaster + ? deleteSeriesMasterCommand + : deleteRecurringCommand + ) + : deleteSingleCommand + ), + canAddToOutlook && ( + isRecurring + ? (isSeriesMaster + ? addToOutlookSeriesCommand + : addToOutlookRecurringCommand + ) + : addToOutlookSingleCommand + ), + getLinkCommand + ].filter(Boolean); + } + + protected buildEditHeaderCommands(): ICommandBarItemProps[] { + const { [DirectoryService]: { currentUserIsSiteAdmin, currentUser } } = this.props.services; + const { submitting } = this.state; + const { isRecurring, isSeriesException, isSeriesMaster, seriesMaster, isDeleted, isNew, creator } = this.entity; + const onSubmit = () => this.submit(() => { this.display(); }); + const onConfirmDiscard = () => this.confirmDiscard(); + const onDelete = () => { this.confirmDelete(); }; + const onDeleteSeries = () => { + this.entity.revert(); + this.edit(seriesMaster.get(), false); + this.confirmDelete(); + }; + + const deleteSingleCommand: ICommandBarItemProps = { + key: 'delete', + text: strings.Command_Delete.Text, + iconProps: { iconName: 'Delete' }, + disabled: isDeleted, + onClick: onDelete + }; + + const deleteSeriesMasterCommand: ICommandBarItemProps = { + key: 'delete', + text: strings.Command_Delete_Series.Text, + iconProps: { iconName: 'Delete' }, + disabled: isDeleted, + onClick: onDelete + }; + + const deleteRecurringCommand: ICommandBarItemProps = { + key: 'delete', + text: strings.Command_Delete.Text, + iconProps: { iconName: 'Delete' }, + disabled: isDeleted, + subMenuProps: { + items: [{ + key: 'delete-series', + text: strings.Command_Delete_Recurring_Series.Text, + onClick: onDeleteSeries + }, { + key: 'delete-occurrence', + text: strings.Command_Delete_Recurring_Instance.Text, + onClick: onDelete + }] + } + }; + + const userCanApprove = currentUserIsSiteAdmin || this._currentUserIsAnApprover(); + const userIsCreator = User.equal(creator, currentUser); + const canEdit = userIsCreator || userCanApprove; + const canDelete = (!isNew || isSeriesException) && canEdit; + + return [{ + key: 'save', + text: strings.Command_Save.Text, + iconProps: { iconName: 'Save' }, + disabled: submitting || isDeleted, + onClick: onSubmit + }, { + key: 'discard', + text: strings.Command_Discard.Text, + iconProps: { iconName: 'Cancel' }, + disabled: isDeleted, + onClick: onConfirmDiscard + }, + canDelete && ( + isRecurring + ? (isSeriesMaster + ? deleteSeriesMasterCommand + : deleteRecurringCommand + ) + : deleteSingleCommand + ) + ].filter(Boolean); + } +} + +export default withServices(EventPanel); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/events/IEventCommands.ts b/samples/react-rhythm-of-business-calendar/src/components/events/IEventCommands.ts new file mode 100644 index 000000000..eae9806d5 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/events/IEventCommands.ts @@ -0,0 +1,12 @@ +import { IEvent } from "model"; + +export type EventCommand = (event: IEvent) => void; + +export interface IEventCommands { + view: EventCommand; + approve: EventCommand; + reject: EventCommand; + addToOutlook: EventCommand; + addSeriesToOutlook: EventCommand; + getLink: EventCommand; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/events/index.ts b/samples/react-rhythm-of-business-calendar/src/components/events/index.ts new file mode 100644 index 000000000..d7efdfff6 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/events/index.ts @@ -0,0 +1,6 @@ +export { EventBar, EventBarSize } from './EventBar'; +export { EventFilter } from './EventFilter'; +export { EventOverview } from './EventOverview'; +export { EventDetailsCallout, IEventDetailsCallout } from './EventDetailsCallout'; +export { default as EventPanel, IEventPanel } from './EventPanel'; +export { type IEventCommands } from './IEventCommands'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/hooks/index.ts b/samples/react-rhythm-of-business-calendar/src/components/hooks/index.ts new file mode 100644 index 000000000..fb57ec501 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/hooks/index.ts @@ -0,0 +1,9 @@ +export { useApprovals } from './useApprovals'; +export { useCopyLinkDialog } from './useCopyLinkDialog'; +export { useEventCommandActionButtons } from './useEventCommandActionButtons'; +export { useEventPanel } from './useEventPanel'; +export { useExecuteEventDeepLink } from './useExecuteEventDeepLink'; +export { useRefinerPanel } from './useRefinerPanel'; +export { useRefinerValues } from './useRefinerValues'; +export { useSettings } from './useSettings'; +export { useWindowSize } from './useWindowSize'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/hooks/useApprovals.ts b/samples/react-rhythm-of-business-calendar/src/components/hooks/useApprovals.ts new file mode 100644 index 000000000..d3ad2b975 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/hooks/useApprovals.ts @@ -0,0 +1,74 @@ +import { useCallback, useEffect, useRef, useState } from "react"; +import { useForceUpdate } from "@fluentui/react-hooks"; +import { Entity, IComponent } from "common"; +import { Event, EventModerationStatus } from "model"; +import { useConfigurationService, useDirectoryService, useEventsService } from "services"; +import { IApprovalDialog, IMyApprovalsPanel } from "../approvals"; + +export const useApprovals = () => { + const forceUpdate = useForceUpdate(); + + const myApprovalspanel = useRef(); + + const openMyApprovalspanel = useCallback(() => { + myApprovalspanel.current.open(); + }, [myApprovalspanel]); + + const closeMyApprovalspanel = useCallback(() => { + myApprovalspanel.current.open(); + }, [myApprovalspanel]); + + + const approvalDialog = useRef(); + + const moderateEvent = useCallback(async (event: Event) => { + try { + await approvalDialog.current.edit(event); + } finally { forceUpdate(); } + }, [approvalDialog, forceUpdate]); + + const approve = useCallback((event: Event) => { + event.snapshot(); + event.moderationStatus = EventModerationStatus.Approved; + moderateEvent(event); + }, [moderateEvent]); + + const reject = useCallback((event: Event) => { + event.snapshot(); + event.moderationStatus = EventModerationStatus.Rejected; + moderateEvent(event); + }, [moderateEvent]); + + + const { approversAsync } = useEventsService(); + const { currentUser } = useDirectoryService(); + const [userIsAnApprover, setUserIsAnApprover] = useState(false); + + useEffect(() => { + const update = () => { + const approvers = approversAsync.data?.filter(Entity.NotDeletedFilter); + const isApprover = approvers.some(a => a.userIsAnApprover(currentUser)); + setUserIsAnApprover(isApprover); + } + + approversAsync.promise.then(update); + + const component: IComponent = { componentShouldRender: update }; + approversAsync.registerComponentForUpdates(component); + return () => approversAsync.unregisterComponentForUpdates(component); + }, [approversAsync, currentUser, setUserIsAnApprover]); + + const { currentUserIsSiteAdmin } = useDirectoryService(); + const { active: { useApprovals } } = useConfigurationService(); + const isApprover = useApprovals && (currentUserIsSiteAdmin || userIsAnApprover); + + return [ + isApprover, + myApprovalspanel, + approvalDialog, + openMyApprovalspanel, + closeMyApprovalspanel, + approve, + reject + ] as const; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/hooks/useCopyLinkDialog.ts b/samples/react-rhythm-of-business-calendar/src/components/hooks/useCopyLinkDialog.ts new file mode 100644 index 000000000..a7171bdba --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/hooks/useCopyLinkDialog.ts @@ -0,0 +1,19 @@ +import { useCallback, useRef } from "react"; +import { IEvent } from "model"; +import { useEventsService } from "services"; +import { ICopyLinkDialog } from "../shared"; + +export const useCopyLinkDialog = () => { + const events = useEventsService(); + const copyLinkDialog = useRef(); + + const getLink = useCallback((event: IEvent) => { + const path = events.createEventDeepLink(event.getExceptionOrEvent()); + copyLinkDialog.current.open(path, event.displayName); + }, [copyLinkDialog, events]); + + return [ + copyLinkDialog, + getLink + ] as const; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/hooks/useEventCommandActionButtons.tsx b/samples/react-rhythm-of-business-calendar/src/components/hooks/useEventCommandActionButtons.tsx new file mode 100644 index 000000000..86d25e853 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/hooks/useEventCommandActionButtons.tsx @@ -0,0 +1,78 @@ +import React, { useMemo } from "react"; +import { ActionButton } from "@fluentui/react"; +import { IEvent } from "model"; +import { IEventCommands } from "../events/IEventCommands"; + +import { EventCommands as strings } from 'ComponentStrings'; + +export const useEventCommandActionButtons = (commands: IEventCommands, event: IEvent | undefined) => { + const { view, addToOutlook, addSeriesToOutlook, getLink } = commands; + const { isApproved, isSeriesMaster, isRecurring } = event || {}; + const canAddToOutlook = isApproved; + + const viewCommand = useMemo(() => + view(event)}> + {strings.Command_View.Text} + , + [event, view] + ); + + const addToOutlookSingleCommand = useMemo(() => + addToOutlook(event)}> + {strings.Command_AddToOutlook.Text} + , + [event, addToOutlook] + ); + + const addToOutlookSeriesCommand = useMemo(() => + addSeriesToOutlook(event)}> + {strings.Command_AddToOutlook.Text} + , + [event, addSeriesToOutlook] + ); + + const addToOutlookRecurringCommand = useMemo(() => + addSeriesToOutlook(event) + }, { + key: 'add-to-outlook-occurrence', + text: strings.Command_AddToOutlook_Recurring_Instance.Text, + onClick: () => addToOutlook(event) + }] + }} + > + {strings.Command_AddToOutlook.Text} + , + [event, addSeriesToOutlook, addToOutlook] + ); + + const addToOutlookCommand = useMemo(() => + canAddToOutlook && ( + isRecurring + ? (isSeriesMaster + ? addToOutlookSeriesCommand + : addToOutlookRecurringCommand + ) + : addToOutlookSingleCommand + ), + [canAddToOutlook, isRecurring, isSeriesMaster, addToOutlookRecurringCommand, addToOutlookSingleCommand] + ); + + const getLinkCommand = useMemo(() => + getLink(event)}> + {strings.Command_GetLink.Text} + , + [event, getLink] + ); + + return [ + viewCommand, + addToOutlookCommand, + getLinkCommand + ] as const; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/hooks/useEventPanel.ts b/samples/react-rhythm-of-business-calendar/src/components/hooks/useEventPanel.ts new file mode 100644 index 000000000..cefb72f61 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/hooks/useEventPanel.ts @@ -0,0 +1,31 @@ +import { Moment } from "moment-timezone"; +import { useCallback, useRef } from "react"; +import { useForceUpdate } from "@fluentui/react-hooks"; +import { Event, IEvent } from "model"; +import { IEventPanel } from "../events"; + +export const useEventPanel = (anchorDate: Moment) => { + const forceUpdate = useForceUpdate(); + + const eventPanel = useRef(); + + const newEvent = useCallback(async (date?: Moment) => { + try { + const event = new Event(); + event.startDate = date || anchorDate; + await eventPanel.current.edit(event); + } finally { forceUpdate(); } + }, [anchorDate, eventPanel, forceUpdate]); + + const displayEvent = useCallback(async (event: IEvent) => { + try { + await eventPanel.current.display(event.getExceptionOrEvent()); + } finally { forceUpdate(); } + }, [eventPanel, forceUpdate]); + + return [ + eventPanel, + newEvent, + displayEvent + ] as const; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/hooks/useExecuteEventDeepLink.ts b/samples/react-rhythm-of-business-calendar/src/components/hooks/useExecuteEventDeepLink.ts new file mode 100644 index 000000000..40cf3a9c5 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/hooks/useExecuteEventDeepLink.ts @@ -0,0 +1,71 @@ +import moment, { Moment } from "moment-timezone"; +import { useCallback, useEffect, useState } from "react"; +import { IComponent, parseIntOrDefault } from "common"; +import { Event } from "model"; +import { useEventsService, useTeamsJS } from "services"; + +const eventIdParam = 'eventid'; +const recurrenceDateParam = 'recurrencedate'; + +export const useExecuteEventDeepLink = (displayEvent: (event: Event) => Promise) => { + const teams = useTeamsJS(); + const events = useEventsService(); + const { eventsAsync } = events; + + const [eventId, setEventId] = useState(); + const [recurrenceDate, setRecurrenceDate] = useState(); + const [event, setEvent] = useState(); + + useEffect(() => { + const { search } = location; + const searchParams = new URLSearchParams(search); + + if (teams) { + const { eventId, recurrenceDate } = JSON.parse(teams.context.subEntityId || '{}') as { eventId: string, recurrenceDate: string }; + setEventId(parseIntOrDefault(eventId, undefined)); + setRecurrenceDate(recurrenceDate ? moment(recurrenceDate) : undefined); + } else if (searchParams.has(eventIdParam)) { + setEventId(parseIntOrDefault(searchParams.get(eventIdParam), undefined)); + const recurrenceDateString = searchParams.get(recurrenceDateParam); + setRecurrenceDate(recurrenceDateString ? moment(recurrenceDateString) : undefined); + } + }, [teams, setEventId, setRecurrenceDate]); + + + useEffect(() => { + const update = async () => { + const event = (await events.eventsById()).get(eventId); + setEvent(event); + } + + eventsAsync.promise.then(update); + + const component: IComponent = { componentShouldRender: update }; + eventsAsync.registerComponentForUpdates(component); + return () => eventsAsync.unregisterComponentForUpdates(component); + }, [eventId, events, eventsAsync]); + + const eraseEventFromQueryString = useCallback(() => { + const { origin, pathname, search } = location; + const searchParams = new URLSearchParams(search); + + if (searchParams.has(eventIdParam)) { + searchParams.delete(eventIdParam); + searchParams.delete(recurrenceDateParam); + + const newSearchParams = searchParams.toString(); + const path = origin + pathname + (newSearchParams ? '?' + newSearchParams : ''); + + setTimeout(() => history.replaceState({ path }, '', path), 1); + } + }, []); + + useEffect(() => { + if (event) { + console.debug('deep linking to event with ID:', eventId, 'and recurrence date', recurrenceDate?.format()); + + const eventToDisplay = (recurrenceDate && event.findOrCreateExceptionForDate(recurrenceDate)) || event; + displayEvent(eventToDisplay).finally(eraseEventFromQueryString); + } + }, [event, eventId, recurrenceDate]); +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/hooks/useRefinerPanel.ts b/samples/react-rhythm-of-business-calendar/src/components/hooks/useRefinerPanel.ts new file mode 100644 index 000000000..eaa0cfbd6 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/hooks/useRefinerPanel.ts @@ -0,0 +1,35 @@ +import { max } from "lodash"; +import { useCallback, useRef } from "react"; +import { useForceUpdate } from "@fluentui/react-hooks"; +import { Refiner } from "model"; +import { useEventsService } from "services"; +import { IRefinerPanel } from "../refiners"; + +export const useRefinerPanel = () => { + const forceUpdate = useForceUpdate(); + + const { refinersAsync } = useEventsService(); + + const refinerPanel = useRef(); + + const newRefiner = useCallback(async () => { + try { + const refiner = new Refiner(); + const maxOrder = max(refinersAsync.data?.map(v => v.order)); + refiner.order = isFinite(maxOrder) ? maxOrder + 1 : 0; + await refinerPanel.current.edit(refiner); + } finally { forceUpdate(); } + }, [refinersAsync, refinerPanel, forceUpdate]); + + const editRefiner = useCallback(async (refiner: Refiner) => { + try { + await refinerPanel.current.edit(refiner); + } finally { forceUpdate(); } + }, [refinerPanel, forceUpdate]); + + return [ + refinerPanel, + newRefiner, + editRefiner + ] as const; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/hooks/useRefinerValues.ts b/samples/react-rhythm-of-business-calendar/src/components/hooks/useRefinerValues.ts new file mode 100644 index 000000000..b9f59cc5e --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/hooks/useRefinerValues.ts @@ -0,0 +1,74 @@ +import { useCallback, useEffect, useState } from "react"; +import { useForceUpdate } from "@fluentui/react-hooks"; +import { Entity, IComponent } from "common"; +import { RefinerValue } from "model"; +import { useEventsService } from "services"; +import { OnRefinerSelectionChanged } from "../refiners"; + +export const useRefinerValues = () => { + const forceUpdate = useForceUpdate(); + const { refinersAsync, refinerValuesAsync } = useEventsService(); + + const [selectedRefinerValues] = useState(new Set()); + const [knownRefinerValues] = useState(new Set()); + const [hasRefiners, setHasRefiners] = useState(false); + + useEffect(() => { + const update = () => { + const refiners = refinersAsync.data?.filter(Entity.NotDeletedFilter); + + refiners?.forEach(({ required, blankValue }) => { + if (!required && !knownRefinerValues.has(blankValue)) { + selectedRefinerValues.add(blankValue); + knownRefinerValues.add(blankValue); + } + }); + + setHasRefiners(refiners?.length > 0); + forceUpdate(); + } + + refinersAsync.promise.then(update); + + const component: IComponent = { componentShouldRender: update }; + refinersAsync.registerComponentForUpdates(component); + return () => refinersAsync.unregisterComponentForUpdates(component); + }, [refinersAsync, selectedRefinerValues, knownRefinerValues, setHasRefiners, forceUpdate]); + + useEffect(() => { + const update = () => { + const refinerValues = refinerValuesAsync.data?.filter(Entity.NotDeletedFilter); + refinerValues?.forEach(value => { + if (value.isActive) { + if (!knownRefinerValues.has(value)) { + knownRefinerValues.add(value); + selectedRefinerValues.add(value); + } + } else { + knownRefinerValues.delete(value); + selectedRefinerValues.delete(value); + } + }); + + forceUpdate(); + } + + refinerValuesAsync.promise.then(update); + + const component: IComponent = { componentShouldRender: update }; + refinerValuesAsync.registerComponentForUpdates(component); + return () => refinerValuesAsync.unregisterComponentForUpdates(component); + }, [refinersAsync, refinerValuesAsync, selectedRefinerValues, knownRefinerValues, forceUpdate]); + + const onSelectedRefinerValuesChanged: OnRefinerSelectionChanged = useCallback(({ added, removed }) => { + added.forEach(v => selectedRefinerValues.add(v)); + removed.forEach(v => selectedRefinerValues.delete(v)); + forceUpdate(); + }, [selectedRefinerValues, forceUpdate]); + + return [ + hasRefiners, + selectedRefinerValues, + onSelectedRefinerValuesChanged + ] as const; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/hooks/useSettings.ts b/samples/react-rhythm-of-business-calendar/src/components/hooks/useSettings.ts new file mode 100644 index 000000000..0185877ed --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/hooks/useSettings.ts @@ -0,0 +1,30 @@ +import { useCallback, useRef } from "react"; +import { useForceUpdate } from "@fluentui/react-hooks"; +import { useConfigurationService, useDirectoryService } from "services"; +import { IConfigureApproversPanel } from "../approvals"; +import { ISettingsPanel } from "../settings"; + +export const useSettings = () => { + const forceUpdate = useForceUpdate(); + const { active: config } = useConfigurationService(); + const { currentUserIsSiteAdmin } = useDirectoryService(); + + const userCanManageSettings = currentUserIsSiteAdmin; + + const settingsPanel = useRef(); + + const editSettings = useCallback(async () => { + try { + await settingsPanel.current.edit(config); + } finally { forceUpdate(); } + }, [config, settingsPanel, forceUpdate]); + + const configureApproversPanel = useRef(); + + return [ + userCanManageSettings, + settingsPanel, + configureApproversPanel, + editSettings + ] as const; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/hooks/useWindowSize.ts b/samples/react-rhythm-of-business-calendar/src/components/hooks/useWindowSize.ts new file mode 100644 index 000000000..087753ec6 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/hooks/useWindowSize.ts @@ -0,0 +1,21 @@ +import { useCallback, useEffect, useState } from "react" + +export const useWindowSize = () => { + const [width, setWidth] = useState(innerWidth); + const [height, setHeight] = useState(innerHeight); + + const handleWindowResize = useCallback(() => { + setWidth(innerWidth); + setHeight(innerHeight); + }, [setWidth, setHeight]); + + useEffect(() => { + addEventListener('resize', handleWindowResize); + return () => removeEventListener('resize', handleWindowResize); + }, [handleWindowResize]); + + return { + width, + height + } as const; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/index.ts b/samples/react-rhythm-of-business-calendar/src/components/index.ts new file mode 100644 index 000000000..fd101e52e --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/index.ts @@ -0,0 +1,3 @@ +export { default as Root } from './Root'; +export { default as ConfigurationWizard } from './setup/ConfigurationWizard'; +export { default as Upgrade } from './setup/Upgrade'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/loc/componentstrings.d.ts b/samples/react-rhythm-of-business-calendar/src/components/loc/componentstrings.d.ts new file mode 100644 index 000000000..b0c02119d --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/loc/componentstrings.d.ts @@ -0,0 +1,370 @@ +declare module 'ComponentStrings' { + import { IButtonStrings, IFieldStrings, ITextFieldStrings, IToggleFieldStrings } from "common"; + + interface IConfigurationWizardStrings { + Heading: string; + SetRefinersHeading: string; + SetRefinersDescription: string; + AddEventsHeading: string; + AddEventsDescription: string; + SetApproversHeading: string; + SetApproversDescription: string; + StartButton: IButtonStrings; + SetupComplete: string; + MustBeTeamOwner: string; + MustBeSiteAdmin: string; + } + + interface IUpgradeStrings { + Heading: string; + InProgressHeading: string; + CompletedHeading: string; + Description: string; + CannotUpgrade: string; + UpgradeButton: IButtonStrings; + } + + interface IViewNames { + Day: string; + Week: string; + Month: string; + Quarter: string; + } + + interface IViewRouteStrings { + Command_NewEvent: IButtonStrings; + Command_Settings: IButtonStrings; + Command_Approvals: IButtonStrings; + RefinerRailLabel: string; + Command_CollapseRefinerRail: IButtonStrings; + Command_AddRefiner: IButtonStrings; + } + + interface IDayViewStrings { + NoEventsMessage: string; + } + + interface IWeekViewStrings { + Command_NewEvent: IButtonStrings; + } + + interface IMonthViewStrings { + Command_NewEvent: IButtonStrings; + } + + interface IQuarterViewStrings { + NoEventsMessage: string; + MultipleOccurrences: string; + } + + interface IRefinerStrings { + SelectAll: string; + Blank: string; + Command_Edit: IButtonStrings; + } + + interface IListItemTechnicalsStrings { + Field_Created: IFieldStrings; + Field_Modified: IFieldStrings; + } + + interface IHumanizeStrings { + AllDay: string; + Day: string; + Weekday: string; + Weekend: string; + First: string; + Second: string; + Third: string; + Fourth: string; + Last: string; + HumanizePattern: string; + Pattern_Until: { Forever: string; Date: string; Count: string; }; + Pattern_Daily_EachWeekday: string; + Pattern_Daily_EveryNDays: { Singular: string; Plural: string; }; + Pattern_Weekly: { Singular: string; Plural: string; AllDays: string; }; + Pattern_Monthly_ByDate: { Singular: string; Plural: string; }; + Pattern_Monthly_ByDay: { Singular: string; Plural: string; }; + Pattern_Yearly_ByDate: { Singular: string; Plural: string; }; + Pattern_Yearly_ByDay: { Singular: string; Plural: string; }; + } + + interface IRecurrencePatternsStrings { + Pattern: string; + Daily_EveryNDays: string; + Daily_Weekdays: string; + Weekly: string; + Monthly_ByDate: string; + Monthly_ByDay: string; + Yearly_ByDate: string; + Yearly_ByDay: string; + Until: string; + Until_Forever: string; + Until_Date: string; + Until_Count: string; + Field_EveryNDays: IFieldStrings; + Field_EveryNWeeks: IFieldStrings; + Field_EveryNMonths: IFieldStrings; + Field_WeekOf: IFieldStrings; + Field_Day: IFieldStrings; + Field_Month: IFieldStrings; + Field_Date: IFieldStrings; + Field_UntilCount: IFieldStrings; + Field_UntilDate: IFieldStrings; + Command_Increment: IButtonStrings; + Command_Decrement: IButtonStrings; + } + + interface IEventOverviewStrings { + Confidential: string; + } + + interface IEventCommandsStrings { + Command_View: IButtonStrings; + Command_AddToOutlook: IButtonStrings; + Command_AddToOutlook_Recurring_Series: IButtonStrings; + Command_AddToOutlook_Recurring_Instance: IButtonStrings; + Command_GetLink: IButtonStrings; + } + + interface IEventPanelStrings { + NewEvent: string; + AllDay: string; + SpecificStartAndEndTime: string; + Field_Title: ITextFieldStrings; + Field_StartDate: IFieldStrings; + Field_StartTime: IFieldStrings; + Field_EndDate: IFieldStrings; + Field_EndTime: IFieldStrings; + Field_AllDayEvent: IToggleFieldStrings; + Field_Recurring: IToggleFieldStrings; + Field_Location: ITextFieldStrings; + Field_Description: ITextFieldStrings; + Field_Contacts: IFieldStrings; + Field_Confidential: IToggleFieldStrings; + Field_RestrictedToAccounts_Display: IFieldStrings; + Field_RestrictedToAccounts_Edit: IFieldStrings; + Recurrence: { + Daily: string; + Weekly: string; + Monthly: string; + Yearly: string; + UpdateWarning: string; + EditingInstanceWarning: string; + Command_EditSeries: IButtonStrings; + EditSeriesButtonExplanation: string; + }; + ThisInstanceOccursOn: string; + Moderation: { + EventIsPendingApproval: string; + EventWillNeedApproval: string; + EventWillBeAutoApproved: string; + EventIsApproved: string; + EventIsRejected: string; + ModeratorMessage: string; + }; + Command_Edit: IButtonStrings; + Command_Edit_Recurring_Series: IButtonStrings; + Command_Edit_Recurring_Instance: IButtonStrings; + Command_Save: IButtonStrings; + Command_Discard: IButtonStrings; + Command_AddToOutlook: IButtonStrings; + Command_AddToOutlook_Recurring_Series: IButtonStrings; + Command_AddToOutlook_Recurring_Instance: IButtonStrings; + Command_GetLink: IButtonStrings; + Command_Approval: IButtonStrings; + Command_Approval_Approve: IButtonStrings; + Command_Approval_Reject: IButtonStrings; + Command_Delete: IButtonStrings; + Command_Delete_Series: IButtonStrings; + Command_Delete_Recurring_Series: IButtonStrings; + Command_Delete_Recurring_Instance: IButtonStrings; + } + + interface IApprovalEmailsStrings { + RequestEmail: { + Subject: string; + Intro: string; + EventLinkText: string; + EventDetailsHeading: string; + }, + RejectedEmail: { + Subject: string; + Intro: string; + EventLinkText: string; + NoReasonGiven: string; + EventDetailsHeading: string; + }, + EventDetails: { + EventName: string; + Location: string; + DateAndTime: string; + Description: string; + ConfidentialEvent: string; + }, + RefinerNoValueSelected: string; + } + + interface IApprovalDialogStrings { + Title: string; + Field_ModerationStatus: IFieldStrings; + ModerationStatus: { + Pending: string; + Approve: string; + Approved: string; + Reject: string; + Rejected: string; + }; + Field_ModerationComments: ITextFieldStrings; + Command_Submit: IButtonStrings; + Command_Cancel: IButtonStrings; + } + + interface IApproversPanelStrings { + Field_Title_DisplayMode: ITextFieldStrings; + Field_Title_EditMode: ITextFieldStrings; + Field_Users: IFieldStrings; + ApprovalExplanation: string; + AnyValue: string; + AnyRefinerValue: string; + ValueForRefiner: string; + ValueListConjunction: string; + Command_Edit: IButtonStrings; + Command_Save: IButtonStrings; + Command_Discard: IButtonStrings; + Command_Delete: IButtonStrings; + } + + interface IConfigureApproversPanelStrings { + HeaderText: string; + Column_Title: string; + Column_Users: string; + AnyValue: string; + ValueListConjunction: string; + AdminApproversMessage_Teams: string; + AdminApproversMessage_SharePoint: string; + NoApproversDefined: string; + Command_Close: IButtonStrings; + Command_Add: IButtonStrings; + Command_Edit: IButtonStrings; + Command_View: IButtonStrings; + } + + interface IMyApprovalsPanelStrings { + HeaderText: string; + NoEventsToApprove: string; + Command_Close: IButtonStrings; + Command_View: IButtonStrings; + Command_Approve: IButtonStrings; + Command_Reject: IButtonStrings; + } + + interface IRefinerPanelStrings { + RefinerHeadingPrefix: string; + NewRefinerDefaultHeading: string; + Field_Name: ITextFieldStrings; + Field_Required: IToggleFieldStrings; + Field_AllowMultiselect: IToggleFieldStrings; + Field_InitialDisplay: IToggleFieldStrings; + Field_UseColors: IToggleFieldStrings; + Field_UseTags: IToggleFieldStrings; + Field_CustomSort: IToggleFieldStrings; + Field_RefinerValues: IFieldStrings; + Field_RefinerValue_Name: ITextFieldStrings; + Field_RefinerValue_Tag: ITextFieldStrings; + Field_RefinerValue_Archive: IToggleFieldStrings; + Command_AddRefinerValue: IButtonStrings; + Command_DeleteRefinerValue: IButtonStrings; + Command_ReorderRefinerValue: IButtonStrings; + Command_Edit: IButtonStrings; + Command_Save: IButtonStrings; + Command_Discard: IButtonStrings; + Command_Delete: IButtonStrings; + } + + interface ISettingsPanelStrings { + Heading: string; + Field_FiscalYear: IFieldStrings; + Field_DefaultView: ITextFieldStrings; + Field_UseRefiners: IToggleFieldStrings; + Field_RefinerRailInitialDisplay: IToggleFieldStrings; + Field_QuarterViewGroupByRefiner: IFieldStrings; + Field_UseApprovals: IToggleFieldStrings; + Field_AllowConfidentialEvents: IToggleFieldStrings; + Field_Refiners: IFieldStrings; + Command_ConfigureApprovers: IButtonStrings; + Command_AddRefiner: IButtonStrings; + Command_EditRefiner: IButtonStrings; + Command_ReorderRefiner: IButtonStrings; + Command_Edit: IButtonStrings; + Command_Save: IButtonStrings; + Command_Back: IButtonStrings; + } + + interface ICopyLinkDialogStrings { + Title: string; + SubText: string; + Field_Url: IFieldStrings; + } + + interface IValidationStrings { + Daily: { + EveryNRequired: string; + }; + Weekly: { + EveryNRequired: string; + DaysRequired: string; + }; + MonthlyByDate: { + DateRequired: string; + EveryNRequired: string; + }; + MonthlyByDay: { + EveryNRequired: string; + }; + YearlyByDate: { + DateRequired: string; + }; + Until: { + EndDateRequired: string; + EndDateAfterStart: string; + CountRequired: string; + }; + Refiners: { + NotValid: string; + Required: string; + } + } + + interface IComponentStrings { + AppName: string; + PersistConcurrencyFailureMessage: string; + ConfigurationWizard: IConfigurationWizardStrings; + UpgradeStrings: IUpgradeStrings; + ViewNames: IViewNames; + ViewRoute: IViewRouteStrings; + DayView: IDayViewStrings; + WeekView: IWeekViewStrings; + MonthView: IMonthViewStrings; + QuarterView: IQuarterViewStrings; + Refiner: IRefinerStrings; + ListItemTechnicals: IListItemTechnicalsStrings; + Humanize: IHumanizeStrings; + RecurrencePatterns: IRecurrencePatternsStrings; + EventOverview: IEventOverviewStrings; + EventCommands: IEventCommandsStrings; + EventPanel: IEventPanelStrings; + ApprovalEmails: IApprovalEmailsStrings; + ApprovalDialog: IApprovalDialogStrings; + ApproversPanel: IApproversPanelStrings; + ConfigureApproversPanel: IConfigureApproversPanelStrings; + MyApprovalsPanel: IMyApprovalsPanelStrings; + RefinerPanel: IRefinerPanelStrings; + SettingsPanel: ISettingsPanelStrings; + CopyLinkDialog: ICopyLinkDialogStrings; + Validation: IValidationStrings; + } + + const strings: IComponentStrings; + export = strings; +} diff --git a/samples/react-rhythm-of-business-calendar/src/components/loc/en-us.js b/samples/react-rhythm-of-business-calendar/src/components/loc/en-us.js new file mode 100644 index 000000000..9913c378f --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/loc/en-us.js @@ -0,0 +1,340 @@ +define([], function () { + return { + AppName: "Rhythm of Business Calendar", + PersistConcurrencyFailureMessage: "Another user has saved changes. Please wait for the updates to be received and then try saving again.", + ConfigurationWizard: { + Heading: "Welcome to {0}!", + SetRefinersHeading: "Configure refiners", + SetRefinersDescription: "Define custom attributes that you would like to associate with events, then use them to slice and dice the calendar data.", + AddEventsHeading: "Add events", + AddEventsDescription: "Create a single or recurring event, mark it confidential, and color-code it using refiners you define.", + SetApproversHeading: "Set approvers", + SetApproversDescription: "Create you own approval workflow for events based on the refiners you define.", + StartButton: { Text: "Let's go!" }, + SetupComplete: "Setup is complete.", + MustBeTeamOwner: "An owner of this Team needs to configure the app.", + MustBeSiteAdmin: "An admin for this site needs to configure the app." + }, + UpgradeStrings: { + Heading: "Upgrade required", + InProgressHeading: "Upgrading...", + CompletedHeading: "Upgrade complete", + Description: "This app needs to upgrade the data schema.", + CannotUpgrade: "We're sorry, this app cannot be upgraded from", + UpgradeButton: { Text: "Upgrade" } + }, + ViewNames: { + Day: "Day", + Week: "Week", + Month: "Month", + Quarter: "Quarter" + }, + ViewRoute: { + Command_NewEvent: { Text: "New event" }, + Command_Settings: { Text: "Settings" }, + Command_Approvals: { Text: "Approvals" }, + RefinerRailLabel: "Refiners", + Command_CollapseRefinerRail: { Tooltip: "collapse refiner rail", AriaLabel: "collapse refiner rail" }, + Command_AddRefiner: { Text: "Add refiner" } + }, + DayView: { + NoEventsMessage: "There are no events on this day" + }, + WeekView: { + Command_NewEvent: { Text: "New" }, + }, + MonthView: { + Command_NewEvent: { Text: "New" }, + }, + QuarterView: { + NoEventsMessage: "No events", + MultipleOccurrences: "Multiple" + }, + Refiner: { + SelectAll: "Select all", + Blank: "(blank)", + Command_Edit: { Tooltip: "Edit refiner", AriaLabel: "edit refiner" } + }, + ListItemTechnicals: { + Field_Created: { Label: "Created on" }, + Field_Modified: { Label: "Last modified" } + }, + Humanize: { + AllDay: "All day event", + Day: "day", + Weekday: "weekday", + Weekend: "weekend day", + First: "first", + Second: "second", + Third: "third", + Fourth: "fourth", + Last: "last", + HumanizePattern: "{0}, starting {1} {2}", + Pattern_Until: { + Forever: "", + Date: "through {0}", + Count: "for {0} occurrences" + }, + Pattern_Daily_EachWeekday: "Each weekday", + Pattern_Daily_EveryNDays: { + Singular: "Each day", + Plural: "Every {0} days" + }, + Pattern_Weekly: { + Singular: "On {0} each week", + Plural: "On {0} every {1} weeks", + AllDays: "all days" + }, + Pattern_Monthly_ByDate: { + Singular: "On the {0} of each month", + Plural: "On the {0} of every {1} months" + }, + Pattern_Monthly_ByDay: { + Singular: "On the {0} {1} of each month", + Plural: "On the {0} {1} of every {2} months" + }, + Pattern_Yearly_ByDate: { + Singular: "On {0} {1} each year", + Plural: "On {0} {1} of every {2} years" + }, + Pattern_Yearly_ByDay: { + Singular: "On the {0} {1} of each year", + Plural: "On the {0} {1} of every {2} years" + } + }, + RecurrencePatterns: { + Pattern: "Pattern", + Daily_EveryNDays: "Every {every} day(s)", + Daily_Weekdays: "Every weekday", + Weekly: "Every {every} week(s) on:", + Monthly_ByDate: "Day {date} of every {every} month(s)", + Monthly_ByDay: "The {weekof} {day} of every {every} month(s)", + Yearly_ByDate: "Every {month} {date}", + Yearly_ByDay: "The {weekof} {day} of {month}", + Until: "Until", + Until_Forever: "No end date", + Until_Date: "End by {date}", + Until_Count: "End after {count} occurence(s)", + Field_EveryNDays: { AriaLabel: "every N days" }, + Field_EveryNWeeks: { AriaLabel: "every N weeks" }, + Field_EveryNMonths: { AriaLabel: "every N months" }, + Field_WeekOf: { AriaLabel: "week of" }, + Field_Day: { AriaLabel: "day" }, + Field_Month: { AriaLabel: "month" }, + Field_Date: { AriaLabel: "date" }, + Field_UntilCount: { AriaLabel: "end after N occurrences" }, + Field_UntilDate: { AriaLabel: "end by date" }, + Command_Increment: { Tooltip: "Increment", AriaLabel: "increment" }, + Command_Decrement: { Tooltip: "Decrement", AriaLabel: "decrement" }, + }, + EventOverview: { + Confidential: "Confidential" + }, + EventCommands: { + Command_View: { Text: "View" }, + Command_AddToOutlook: { Text: "Add to Outlook" }, + Command_AddToOutlook_Recurring_Series: { Text: "Entire series" }, + Command_AddToOutlook_Recurring_Instance: { Text: "Just this occurence" }, + Command_GetLink: { Text: "Get link" }, + }, + EventPanel: { + NewEvent: "New event", + AllDay: "All day event", + SpecificStartAndEndTime: "Specific start and end time", + Field_Title: { Label: "Title" }, + Field_StartDate: { Label: "Start date" }, + Field_StartTime: { Label: "Start time" }, + Field_EndDate: { Label: "End date" }, + Field_EndTime: { Label: "End time" }, + Field_AllDayEvent: { Label: "All day event", OnText: "Yes", OffText: "No" }, + Field_Recurring: { Label: "Recurring event", OnText: "Yes", OffText: "No" }, + Field_Location: { Label: "Location" }, + Field_Description: { Label: "Description" }, + Field_Contacts: { Label: "Event contacts", Tooltip: "People who are the point of contact for this event" }, + Field_Confidential: { Label: "Confidential", OnText: "Yes", OffText: "No", Tooltip: "Make this a confidential event that only you, the team owners, the designated approver(s), and the specified groups will be able to see on the calendar" }, + Field_RestrictedToAccounts_Display: { Label: "Group(s) that can see this event" }, + Field_RestrictedToAccounts_Edit: { Label: "Only you, the team owners, the designated approver(s), and members of the below group(s) will be able to see this event" }, + Recurrence: { + Daily: "Daily", + Weekly: "Weekly", + Monthly: "Monthly", + Yearly: "Yearly", + UpdateWarning: "Updating recurrence options will cause any exceptions to the original pattern to be lost", + EditingInstanceWarning: "You are editing an instance of the series that occurs on {0}", + Command_EditSeries: { Text: "Edit the series" }, + EditSeriesButtonExplanation: "if you need to change the recurrence pattern." + }, + ThisInstanceOccursOn: "This instance occurs on {0}", + Moderation: { + EventIsPendingApproval: "This event needs approval to appear on the calendar", + EventWillNeedApproval: "This event will need approval before it will appear on the calendar", + EventWillBeAutoApproved: "This event will be automatically approved", + EventIsApproved: "This event was approved by {0} on {1}", + EventIsRejected: "This event was declined by {0} on {1}", + ModeratorMessage: "Message from moderator:" + }, + Command_Edit: { Text: "Edit" }, + Command_Edit_Recurring_Series: { Text: "Series" }, + Command_Edit_Recurring_Instance: { Text: "This occurence" }, + Command_Save: { Text: "Save" }, + Command_Discard: { Text: "Discard changes" }, + Command_AddToOutlook: { Text: "Add to Outlook" }, + Command_AddToOutlook_Recurring_Series: { Text: "Entire series" }, + Command_AddToOutlook_Recurring_Instance: { Text: "Just this occurence" }, + Command_GetLink: { Text: "Get link" }, + Command_Approval: { Text: "Approval" }, + Command_Approval_Approve: { Text: "Approve" }, + Command_Approval_Reject: { Text: "Decline" }, + Command_Delete: { Text: "Delete" }, + Command_Delete_Series: { Text: "Delete series" }, + Command_Delete_Recurring_Series: { Text: "Entire series" }, + Command_Delete_Recurring_Instance: { Text: "Just this occurence" } + }, + ApprovalEmails: { + RequestEmail: { + Subject: "Your approval is requested", + Intro: "An event requiring your approval has been submitted to the {0} by {1}.", + EventLinkText: "Please approve or decline this event.", + EventDetailsHeading: "Event details:" + }, + RejectedEmail: { + Subject: "Your event was declined", + Intro: "An event you submitted to the {0} has been declined by {1}", + EventLinkText: "View event in the calendar", + NoReasonGiven: "(none given)", + EventDetailsHeading: "Event details:" + }, + EventDetails: { + EventName: "Event", + Location: "Location", + DateAndTime: "Date and time", + Description: "Description", + ConfidentialEvent: "This is a confidential event." + }, + RefinerNoValueSelected: "(no value selected)" + }, + ApprovalDialog: { + Title: "Approve event \"{0}\"?", + Field_ModerationStatus: { Label: "Do you approve this event?" }, + ModerationStatus: { + Pending: "Pending", + Approve: "Approve", + Approved: "Approved", + Reject: "Decline", + Rejected: "Declined" + }, + Field_ModerationComments: { Label: "Comments (optional)" }, + Command_Submit: { Text: "Submit" }, + Command_Cancel: { Text: "Cancel" } + }, + ApproversPanel: { + Field_Title_DisplayMode: { Label: "Name" }, + Field_Title_EditMode: { Label: "Give this group of approvers a descriptive name" }, + Field_Users: { Label: "Users" }, + ApprovalExplanation: "These users can approve events with:", + AnyValue: "Any value", + AnyRefinerValue: "Any {0}", + ValueForRefiner: "{0} for {1}", + ValueListConjunction: "or", + Command_Edit: { Text: "Edit" }, + Command_Save: { Text: "Save" }, + Command_Discard: { Text: "Discard changes" }, + Command_Delete: { Text: "Delete" } + }, + ConfigureApproversPanel: { + HeaderText: "Configure Approvers", + Column_Title: "Name", + Column_Users: "Users", + AnyValue: "Any value", + ValueListConjunction: "or", + AdminApproversMessage_Teams: "Team owners will always be able to approve events.", + AdminApproversMessage_SharePoint: "Site Administrators will always be able to approve events.", + NoApproversDefined: "You have not defined any approvers.", + Command_Close: { Text: "Close", Tooltip: "Close", AriaLabel: "close" }, + Command_Add: { Text: "New" }, + Command_Edit: { Text: "Edit" }, + Command_View: { Text: "View" }, + }, + MyApprovalsPanel: { + HeaderText: "Events needing your approval", + NoEventsToApprove: "You're all caught up. There are no events pending approval.", + Command_Close: { Text: "Close", Tooltip: "Close", AriaLabel: "close" }, + Command_View: { Text: "View details" }, + Command_Approve: { Text: "Approve" }, + Command_Reject: { Text: "Decline" } + }, + RefinerPanel: { + RefinerHeadingPrefix: "Refiner", + NewRefinerDefaultHeading: "New refiner", + Field_Name: { Label: "Name" }, + Field_Required: { Label: "Required", OnText: "Yes", OffText: "No", Tooltip: "If required, users must choose one of this refiner's values when submitting an event, otherwise users may leave that field blank on the event form" }, + Field_AllowMultiselect: { Label: "Selection", OnText: "Multiselect", OffText: "Single select", Tooltip: "Multiselect allows users to associate more than one of this refiner's values with an event" }, + Field_InitialDisplay: { Label: "Initial display", OnText: "Expanded", OffText: "Collapsed", Tooltip: "Whether this refiner will initially display expanded or collapsed when the app starts" }, + Field_UseColors: { Label: "Use colors", OnText: "Yes", OffText: "No", Tooltip: "Turn on or off custom colors for this refiner's values. Only one of your refiners may use colors." }, + Field_UseTags: { Label: "Use tags", OnText: "Yes", OffText: "No", Tooltip: "Turn on or off custom tags for this refiner's values. Tags are short names (up to 3 characters) for each refiner value. Only one of your refiners may use tags." }, + Field_CustomSort: { Label: "Sorting", OnText: "Custom", OffText: "Alphabetical", Tooltip: "Whether to automatically sort the refiner values alphabetically or to enable specifying a custom ordering" }, + Field_RefinerValues: { Label: "Refiner values" }, + Field_RefinerValue_Name: { Label: "Name", Placeholder: "Value" }, + Field_RefinerValue_Tag: { Label: "Tag", Placeholder: "Tag" }, + Field_RefinerValue_Archive: { AriaLabel: "Active", OnText: "Active", OffText: "Inactive", Tooltip: "This refiner value is currently being referenced by one or more events. By marking it inactive, those events will be hidden from the calendar." }, + Command_DeleteRefinerValue: { Text: "Delete", Tooltip: "Delete refiner value", AriaLabel: "delete refiner value" }, + Command_AddRefinerValue: { Text: "Add" }, + Command_ReorderRefinerValue: { AriaLabel: "reorder this refiner value" }, + Command_Edit: { Text: "Edit" }, + Command_Save: { Text: "Save" }, + Command_Discard: { Text: "Discard changes" }, + Command_Delete: { Text: "Delete" } + }, + SettingsPanel: { + Heading: "Settings", + Field_FiscalYear: { Label: "First month of your fiscal year", Tooltip: "Determines the fiscal quarter for the calendar view" }, + Field_DefaultView: { Label: "Initial view", Tooltip: "Default view that should appear to all users when the app starts" }, + Field_UseRefiners: { Label: "Use refiners", OnText: "Yes", OffText: "No", Tooltip: "Turn refiners on or off" }, + Field_RefinerRailInitialDisplay: { Label: "Refiners rail initial display", OnText: "Expanded", OffText: "Collapsed", Tooltip: "Whether the refiner rail will initially display expanded or collapsed when the app starts" }, + Field_QuarterViewGroupByRefiner: { Label: "Quarter view - group by", Tooltip: "Determines how events are grouped in the quarter view" }, + Field_UseApprovals: { Label: "Use approvals", OnText: "Yes", OffText: "No", Tooltip: "Turn on or off approval workflow for events" }, + Field_AllowConfidentialEvents: { Label: "Allow confidential events", OnText: "Yes", OffText: "No", Tooltip: "Turn on or off the ability for users to create events that are only visible to specific people or groups" }, + Field_Refiners: { Label: "Refiners" }, + Command_ConfigureApprovers: { Text: "Configure Approvers", Tooltip: "Create an approval matrix to define who will approve which events" }, + Command_AddRefiner: { Text: "Add refiner" }, + Command_EditRefiner: { Text: "Edit refiner", Tooltip: "Edit refiner", AriaLabel: "edit refiner" }, + Command_ReorderRefiner: { AriaLabel: "reorder this refiner" }, + Command_Edit: { Text: "Edit" }, + Command_Save: { Text: "Save" }, + Command_Back: { Text: "Back" } + }, + CopyLinkDialog: { + Title: "Copy a link to \"{0}\"", + SubText: "Press Ctrl + C to get a link to this event that you can share with your teammates.", + Field_Url: { AriaLabel: "URL" } + }, + Validation: { + Daily: { + EveryNRequired: "Must specify a number" + }, + Weekly: { + EveryNRequired: "Must specify a number", + DaysRequired: "Must select at least one day" + }, + MonthlyByDate: { + DateRequired: "Must specify a number", + EveryNRequired: "Must specify a number" + }, + MonthlyByDay: { + EveryNRequired: "Must specify a number" + }, + YearlyByDate: { + DateRequired: "Must specify a number" + }, + Until: { + EndDateRequired: "Must specify a date", + EndDateAfterStart: "Must be after start date", + CountRequired: "Must specify a number" + }, + Refiners: { + NotValid: "Refiner selections are not valid", + Required: "This is required" + } + } + }; +}); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/recurrence/ChoiceGroupOptionStack.tsx b/samples/react-rhythm-of-business-calendar/src/components/recurrence/ChoiceGroupOptionStack.tsx new file mode 100644 index 000000000..e7894e70b --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/recurrence/ChoiceGroupOptionStack.tsx @@ -0,0 +1,9 @@ +import React, { FC } from "react"; +import { IStackTokens, Stack } from "@fluentui/react"; + +const tokens: IStackTokens = { childrenGap: 10 }; + +export const ChoiceGroupOptionStack: FC = ({ children }) => + + {children} + \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/recurrence/DailyEditor.tsx b/samples/react-rhythm-of-business-calendar/src/components/recurrence/DailyEditor.tsx new file mode 100644 index 000000000..d576cb17b --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/recurrence/DailyEditor.tsx @@ -0,0 +1,107 @@ +import React, { FC, FormEvent, useCallback } from "react"; +import { ChoiceGroup, IChoiceGroupOption, IChoiceGroupOptionProps, IChoiceGroupOptionStyles, ITextFieldStyles } from "@fluentui/react"; +import { firstTextPart, Localize, Validation } from "common/components"; +import { Event } from "model"; +import { ChoiceGroupOptionStack } from "./ChoiceGroupOptionStack"; +import { NumberTextField } from "./NumberTextField"; + +import { RecurrencePatterns as strings } from "ComponentStrings"; + +const dailyChoiceStyles: IChoiceGroupOptionStyles = { + root: { minHeight: 32 }, + field: { margin: 5 } +}; + +const weekdayChoiceStyles: IChoiceGroupOptionStyles = { + root: { minHeight: 32, marginTop: 16 }, + field: { margin: 5 } +}; + +const everyTextFieldStyles: Partial = { + root: { width: 100 } +}; + +interface IProps { + entity: Event; + showValidationFeedback: boolean; + updateField: (update: (entity: Event) => void, callback?: () => any) => void; +} + +export const DailyEditor: FC = ({ + entity, + showValidationFeedback, + updateField +}) => { + const { recurrence: { daily } } = entity; + const { weekdaysOnly, every } = daily; + + const onChangedChoice = useCallback( + (ev: FormEvent, opt: IChoiceGroupOption) => updateField(() => daily.weekdaysOnly = (opt.key === 'weekday')), + [updateField] + ); + + const onChangedEvery = useCallback( + (val: number) => updateField(() => daily.every = val), + [updateField] + ); + + const onDecrementEvery = useCallback( + () => updateField(() => daily.every--), + [updateField] + ); + + const onIncrementEvery = useCallback( + () => updateField(() => daily.every++), + [updateField] + ); + + const onRenderFieldDailyChoiceGroupOption = useCallback((props: IChoiceGroupOptionProps, render: FC) => + + + {render(props)} + + }} /> + + , + [showValidationFeedback, entity, every, onChangedEvery, onDecrementEvery, onIncrementEvery] + ); + + const onRenderFieldWeekdayChoiceGroupOption = useCallback((props: IChoiceGroupOptionProps, render: FC) => + + {render(props)} + , + [] + ); + + const choiceGroupOptions = useCallback(() => + [ + { + key: 'daily', + text: firstTextPart(strings.Daily_EveryNDays), + styles: dailyChoiceStyles, + onRenderField: onRenderFieldDailyChoiceGroupOption + }, { + key: 'weekday', + text: firstTextPart(strings.Daily_Weekdays), + styles: weekdayChoiceStyles, + onRenderField: onRenderFieldWeekdayChoiceGroupOption + } + ], + [onRenderFieldDailyChoiceGroupOption, onRenderFieldWeekdayChoiceGroupOption] + ); + + return ; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/recurrence/MonthlyEditor.tsx b/samples/react-rhythm-of-business-calendar/src/components/recurrence/MonthlyEditor.tsx new file mode 100644 index 000000000..50b2c187b --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/recurrence/MonthlyEditor.tsx @@ -0,0 +1,167 @@ +import React, { FC, FormEvent, useCallback } from "react"; +import { ChoiceGroup, Dropdown, IChoiceGroupOption, IChoiceGroupOptionProps, IChoiceGroupOptionStyles, IDropdownOption, ITextFieldStyles, TextField } from "@fluentui/react"; +import { firstTextPart, Localize, Validation } from "common/components"; +import { Event, RecurPatternOption } from "model"; +import { recurDayDropdownOptions, recurWeekOfDropdownOptions } from "./SharedDropdownOptions"; +import { ChoiceGroupOptionStack } from "./ChoiceGroupOptionStack"; +import { NumberTextField } from "./NumberTextField"; + +import { RecurrencePatterns as strings } from "ComponentStrings"; + +const byDateChoiceStyles: IChoiceGroupOptionStyles = { + root: { minHeight: 32 }, + field: { margin: 5 } +}; + +const byDayChoiceStyles: IChoiceGroupOptionStyles = { + root: { minHeight: 32, marginTop: 16 }, + field: { margin: 5 } +}; + +const dateTextFieldStyles: Partial = { + root: { width: 60 } +}; + +const weekOfTextFieldStyles: Partial = { + root: { width: 85 } +}; + +const dayTextFieldStyles: Partial = { + root: { width: 125 } +}; + +const everyTextFieldStyles: Partial = { + root: { width: 100 } +}; + +interface IProps { + entity: Event; + showValidationFeedback: boolean; + updateField: (update: (entity: Event) => void, callback?: () => any) => void; +} + +export const MonthlyEditor: FC = ({ + entity, + showValidationFeedback, + updateField +}) => { + const { recurrence: { monthly } } = entity; + const { option, byDate, byDay, every } = monthly; + + const onChangedChoice = useCallback( + (ev: FormEvent, opt: IChoiceGroupOption) => updateField(() => monthly.option = parseInt(opt.key)), + [updateField] + ); + + const onChangedDate = useCallback( + (ev: FormEvent, val: string) => updateField(() => monthly.byDate.date = parseInt(val)), + [updateField] + ); + + const onChangedWeekOf = useCallback( + (ev: FormEvent, opt: IDropdownOption) => updateField(() => monthly.byDay.weekOf = opt.key as number), + [updateField] + ); + + const onChangedDay = useCallback( + (ev: FormEvent, opt: IDropdownOption) => updateField(() => monthly.byDay.day = opt.key as number), + [updateField] + ); + + const onChangedEvery = useCallback( + (val: number) => updateField(() => monthly.every = val), + [updateField] + ); + + const onDecrementEvery = useCallback( + () => updateField(() => monthly.every--), + [updateField] + ); + + const onIncrementEvery = useCallback( + () => updateField(() => monthly.every++), + [updateField] + ); + + const onRenderFieldByDateChoiceGroupOption = useCallback((props: IChoiceGroupOptionProps, render: FC) => + + + {render(props)} + , + every: + }} /> + + , + [showValidationFeedback, entity, byDate, every, onChangedDate, onChangedEvery, onDecrementEvery, onIncrementEvery] + ); + + const onRenderFieldByDayChoiceGroupOption = useCallback((props: IChoiceGroupOptionProps, render: FC) => + + + {render(props)} + , + day: , + every: + }} /> + + , + [showValidationFeedback, entity, byDay, every, onChangedWeekOf, onChangedDay, onChangedEvery, onDecrementEvery, onIncrementEvery] + ); + + const choiceGroupOptions = useCallback(() => + [ + { + key: RecurPatternOption.byDate.toString(), + text: firstTextPart(strings.Monthly_ByDate), + styles: byDateChoiceStyles, + onRenderField: onRenderFieldByDateChoiceGroupOption + }, { + key: RecurPatternOption.byDay.toString(), + text: firstTextPart(strings.Monthly_ByDay), + styles: byDayChoiceStyles, + onRenderField: onRenderFieldByDayChoiceGroupOption + } + ], + [onRenderFieldByDateChoiceGroupOption, onRenderFieldByDayChoiceGroupOption] + ); + + return ; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/recurrence/NumberTextField.tsx b/samples/react-rhythm-of-business-calendar/src/components/recurrence/NumberTextField.tsx new file mode 100644 index 000000000..f6a8c3033 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/recurrence/NumberTextField.tsx @@ -0,0 +1,51 @@ +import React, { FC, FormEvent, useCallback } from "react"; +import { IconButton, IIconProps, ITextFieldProps, ITextFieldStyles, TextField, mergeStyleSets, TooltipHost } from "@fluentui/react"; + +import { RecurrencePatterns as strings } from "ComponentStrings"; + +const decrementIconProps: IIconProps = { iconName: 'ChevronLeftSmall' }; +const incrementIconProps: IIconProps = { iconName: 'ChevronRightSmall' }; + +const defaultStyles: Partial = { + prefix: { padding: 0 }, + suffix: { padding: 0 } +}; + +interface IProps extends ITextFieldProps { + number: number; + styles?: Partial; + onIncrement: () => void; + onDecrement: () => void; + onNumberChanged: (val: number) => void; +} + +export const NumberTextField: FC = (props) => { + const { number, styles, onIncrement, onDecrement, onNumberChanged } = props; + + const onChange = useCallback((ev: FormEvent, val: string) => + onNumberChanged(parseInt(val)), + [onNumberChanged] + ); + + const onRenderPrefix = useCallback(() => + + + , + [onDecrement] + ); + const onRenderSuffix = useCallback(() => + + + , + [onIncrement] + ); + + return ; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/recurrence/PatternChoiceGroup.tsx b/samples/react-rhythm-of-business-calendar/src/components/recurrence/PatternChoiceGroup.tsx new file mode 100644 index 000000000..a5dc2e191 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/recurrence/PatternChoiceGroup.tsx @@ -0,0 +1,35 @@ +import React, { FC, useMemo } from "react"; +import { ChoiceGroup, IChoiceGroupOption, IChoiceGroupProps, useTheme } from "@fluentui/react"; +import { RecurPattern } from "model"; +import { EventPanel as strings } from "ComponentStrings"; + +export const PatternChoiceGroup: FC = (props) => { + const { palette: { neutralLighterAlt } } = useTheme(); + + const recurrenceIntervalOptions: IChoiceGroupOption[] = useMemo(() => + [{ + key: RecurPattern.daily.toString(), + text: strings.Recurrence.Daily, + iconProps: { iconName: 'Calendar' }, + styles: { root: { backgroundColor: neutralLighterAlt } } + }, { + key: RecurPattern.weekly.toString(), + text: strings.Recurrence.Weekly, + iconProps: { iconName: 'CalendarAgenda' }, + styles: { root: { backgroundColor: neutralLighterAlt } } + }, { + key: RecurPattern.monthly.toString(), + text: strings.Recurrence.Monthly, + iconProps: { iconName: 'CalendarWeek' }, + styles: { root: { backgroundColor: neutralLighterAlt } } + }, { + key: RecurPattern.yearly.toString(), + text: strings.Recurrence.Yearly, + iconProps: { iconName: 'CalendarWorkWeek' }, + styles: { root: { backgroundColor: neutralLighterAlt } } + }], + [neutralLighterAlt] + ); + + return ; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/recurrence/Recurrence.module.scss b/samples/react-rhythm-of-business-calendar/src/components/recurrence/Recurrence.module.scss new file mode 100644 index 000000000..ca3516c7e --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/recurrence/Recurrence.module.scss @@ -0,0 +1,5 @@ +@import '../common.module'; + +.recurrenceWeekdays > :global(.ms-Grid-row) > :global(.ms-Grid-col) { + margin-top: 16px; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/recurrence/SharedDropdownOptions.ts b/samples/react-rhythm-of-business-calendar/src/components/recurrence/SharedDropdownOptions.ts new file mode 100644 index 000000000..97f741c73 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/recurrence/SharedDropdownOptions.ts @@ -0,0 +1,64 @@ +import { IDropdownOption } from "@fluentui/react"; +import { RecurDay, RecurWeekOfMonth } from "model"; +import { months, weekdays } from "moment-timezone"; + +import { Humanize as strings } from "ComponentStrings"; + +const monthStrings = months(); +const weekdayStrings = weekdays(); + +export const recurWeekOfDropdownOptions: IDropdownOption[] = [{ + key: RecurWeekOfMonth.first, + text: strings.First +}, { + key: RecurWeekOfMonth.second, + text: strings.Second +}, { + key: RecurWeekOfMonth.third, + text: strings.Third +}, { + key: RecurWeekOfMonth.fourth, + text: strings.Fourth +}, { + key: RecurWeekOfMonth.last, + text: strings.Last +}]; + +export const recurDayDropdownOptions: IDropdownOption[] = [{ + key: RecurDay.day, + text: strings.Day +}, { + key: RecurDay.weekday, + text: strings.Weekday +}, { + key: RecurDay.weekend, + text: strings.Weekend +}, { + key: RecurDay.sunday, + text: weekdayStrings[0] +}, { + key: RecurDay.monday, + text: weekdayStrings[1] +}, { + key: RecurDay.tuesday, + text: weekdayStrings[2] +}, { + key: RecurDay.wednesday, + text: weekdayStrings[3] +}, { + key: RecurDay.thursday, + text: weekdayStrings[4] +}, { + key: RecurDay.friday, + text: weekdayStrings[5] +}, { + key: RecurDay.saturday, + text: weekdayStrings[6] +}]; + +export const monthDropdownOptions: IDropdownOption[] = monthStrings.map((name, idx) => { + return { + key: idx, + text: name + } +}); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/recurrence/UntilEditor.tsx b/samples/react-rhythm-of-business-calendar/src/components/recurrence/UntilEditor.tsx new file mode 100644 index 000000000..b1410314c --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/recurrence/UntilEditor.tsx @@ -0,0 +1,136 @@ +import moment from "moment"; +import React, { FC, FormEvent, useCallback } from "react"; +import { ChoiceGroup, DatePicker, IChoiceGroupOption, IChoiceGroupOptionProps, IChoiceGroupOptionStyles, ITextFieldStyles } from "@fluentui/react"; +import { firstTextPart, Localize, Validation } from "common/components"; +import { Event, RecurUntilType } from "model"; +import { ChoiceGroupOptionStack } from "./ChoiceGroupOptionStack"; +import { NumberTextField } from "./NumberTextField"; + +import { RecurrencePatterns as strings } from "ComponentStrings"; + +const choiceStyles: IChoiceGroupOptionStyles = { + root: { minHeight: 32 }, + field: { margin: 5 } +}; + +const countTextFieldStyles: Partial = { + root: { width: 125 } +}; + +const formatDatePickerDate = (date: Date) => { const m = moment(date); return m.isValid() ? m.format('l') : ''; }; + +interface IProps { + entity: Event; + showValidationFeedback: boolean; + updateField: (update: (entity: Event) => void, callback?: () => any) => void; +} + +export const UntilEditor: FC = ({ + entity, + showValidationFeedback, + updateField +}) => { + const { recurrence: { until } } = entity; + const { type, count, date } = until; + + const onChangedChoice = useCallback( + (ev: FormEvent, opt: IChoiceGroupOption) => updateField(() => until.type = parseInt(opt.key)), + [updateField] + ); + + const onChangedCount = useCallback( + (val: number) => updateField(() => until.count = val), + [updateField] + ); + + const onDecrementCount = useCallback( + () => updateField(() => until.count--), + [updateField] + ); + + const onIncrementCount = useCallback( + () => updateField(() => until.count++), + [updateField] + ); + + const onChangedDate = useCallback( + (val: Date) => { + const m = moment(val); + updateField(() => until.date = m.isValid() ? m : undefined); + }, + [updateField] + ); + + const onRenderFieldForeverChoiceGroupOption = useCallback((props: IChoiceGroupOptionProps, render: FC) => + + {render(props)} + , + [] + ); + + const onRenderFieldCountChoiceGroupOption = useCallback((props: IChoiceGroupOptionProps, render: FC) => + + + {render(props)} + + }} /> + + , + [entity, showValidationFeedback, count, onChangedCount, onDecrementCount, onIncrementCount] + ); + + const onRenderFieldDateChoiceGroupOption = useCallback((props: IChoiceGroupOptionProps, render: FC) => + + + {render(props)} + + }} /> + + , + [entity, showValidationFeedback, date, onChangedDate] + ); + + const choiceGroupOptions = useCallback(() => + [ + { + key: RecurUntilType.forever.toString(), + text: firstTextPart(strings.Until_Forever), + styles: choiceStyles, + onRenderField: onRenderFieldForeverChoiceGroupOption + }, { + key: RecurUntilType.count.toString(), + text: firstTextPart(strings.Until_Count), + styles: choiceStyles, + onRenderField: onRenderFieldCountChoiceGroupOption + }, { + key: RecurUntilType.date.toString(), + text: firstTextPart(strings.Until_Date), + styles: choiceStyles, + onRenderField: onRenderFieldDateChoiceGroupOption + } + ], + [onRenderFieldForeverChoiceGroupOption, onRenderFieldCountChoiceGroupOption, onRenderFieldDateChoiceGroupOption] + ); + + return ; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/recurrence/WeekdayCheckbox.tsx b/samples/react-rhythm-of-business-calendar/src/components/recurrence/WeekdayCheckbox.tsx new file mode 100644 index 000000000..ee921b742 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/recurrence/WeekdayCheckbox.tsx @@ -0,0 +1,24 @@ +import { weekdays } from "moment-timezone"; +import React, { FC, FormEvent, useCallback } from "react"; +import { Checkbox } from "@fluentui/react"; + +const weekdayStrings = weekdays(); + +interface IProps { + day: number; + included: boolean; + onIncludedChanged: (day: number, included: boolean) => void; +} + +export const WeekdayCheckbox: FC = ({ day, included, onIncludedChanged }) => { + const onChange = useCallback((ev: FormEvent, val: boolean) => + onIncludedChanged(day, val), + [day, onIncludedChanged] + ); + + return ; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/recurrence/WeeklyEditor.tsx b/samples/react-rhythm-of-business-calendar/src/components/recurrence/WeeklyEditor.tsx new file mode 100644 index 000000000..d3f5b77f3 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/recurrence/WeeklyEditor.tsx @@ -0,0 +1,83 @@ +import React, { FC, useCallback } from "react"; +import { ITextFieldStyles, Label } from "@fluentui/react"; +import { GridCol, GridRow, Localize, ResponsiveGrid, Validation } from "common/components"; +import { Event } from "model"; +import { ChoiceGroupOptionStack } from "./ChoiceGroupOptionStack"; +import { NumberTextField } from "./NumberTextField"; +import { WeekdayCheckbox } from "./WeekdayCheckbox"; + +import { RecurrencePatterns as strings } from "ComponentStrings"; + +import styles from './Recurrence.module.scss'; + +const everyTextFieldStyles: Partial = { + root: { width: 100 } +}; + +interface IProps { + entity: Event; + showValidationFeedback: boolean; + updateField: (update: (entity: Event) => void, callback?: () => any) => void; +} + +export const WeeklyEditor: FC = ({ + entity, + showValidationFeedback, + updateField +}) => { + const { recurrence: { weekly } } = entity; + const { days, every } = weekly; + + const onChangedEvery = useCallback( + (val: number) => updateField(() => weekly.every = val), + [updateField] + ); + + const onDecrementEvery = useCallback( + () => updateField(() => weekly.every--), + [updateField] + ); + + const onIncrementEvery = useCallback( + () => updateField(() => weekly.every++), + [updateField] + ); + + const onWeekdayIncludedChanged = useCallback( + (day: number, included: boolean) => updateField(() => weekly.days[day] = included), + [updateField] + ); + + return <> + + + + + }} /> + + + + + + {days.map((included, idx) => + + + + )} + + + + ; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/recurrence/YearlyEditor.tsx b/samples/react-rhythm-of-business-calendar/src/components/recurrence/YearlyEditor.tsx new file mode 100644 index 000000000..5b8412c56 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/recurrence/YearlyEditor.tsx @@ -0,0 +1,152 @@ +import React, { FC, FormEvent, useCallback } from "react"; +import { ChoiceGroup, Dropdown, IChoiceGroupOption, IChoiceGroupOptionProps, IChoiceGroupOptionStyles, IDropdownOption, ITextFieldStyles, TextField } from "@fluentui/react"; +import { firstTextPart, Localize, Validation } from "common/components"; +import { Event, RecurPatternOption } from "model"; +import { monthDropdownOptions, recurDayDropdownOptions, recurWeekOfDropdownOptions } from "./SharedDropdownOptions"; +import { ChoiceGroupOptionStack } from "./ChoiceGroupOptionStack"; + +import { RecurrencePatterns as strings } from "ComponentStrings"; + +const byDateChoiceStyles: IChoiceGroupOptionStyles = { + root: { minHeight: 32 }, + field: { margin: 5 } +}; + +const byDayChoiceStyles: IChoiceGroupOptionStyles = { + root: { minHeight: 32, marginTop: 16 }, + field: { margin: 5 } +}; + +const dateTextFieldStyles: Partial = { + root: { width: 60 } +}; + +const weekOfTextFieldStyles: Partial = { + root: { width: 85 } +}; + +const dayTextFieldStyles: Partial = { + root: { width: 125 } +}; + +const monthTextFieldStyles: Partial = { + root: { width: 110 } +}; + +interface IProps { + entity: Event; + showValidationFeedback: boolean; + updateField: (update: (entity: Event) => void, callback?: () => any) => void; +} + +export const YearlyEditor: FC = ({ + entity, + showValidationFeedback, + updateField +}) => { + const { recurrence: { yearly } } = entity; + const { option, byDate, byDay, month } = yearly; + + const onChangedChoice = useCallback( + (ev: FormEvent, opt: IChoiceGroupOption) => updateField(() => yearly.option = parseInt(opt.key)), + [updateField] + ); + + const onChangedDate = useCallback( + (ev: FormEvent, val: string) => updateField(() => yearly.byDate.date = parseInt(val)), + [updateField] + ); + + const onChangedWeekOf = useCallback( + (ev: FormEvent, opt: IDropdownOption) => updateField(() => yearly.byDay.weekOf = opt.key as number), + [updateField] + ); + + const onChangedDay = useCallback( + (ev: FormEvent, opt: IDropdownOption) => updateField(() => yearly.byDay.day = opt.key as number), + [updateField] + ); + + const onChangedMonth = useCallback( + (ev: FormEvent, opt: IDropdownOption) => updateField(() => yearly.month = opt.key as number), + [updateField] + ); + + const onRenderFieldByDateChoiceGroupOption = useCallback((props: IChoiceGroupOptionProps, render: FC) => + + + {render(props)} + , + date: + }} /> + + , + [entity, showValidationFeedback, month, byDate, onChangedMonth, onChangedDate] + ); + + const onRenderFieldByDayChoiceGroupOption = useCallback((props: IChoiceGroupOptionProps, render: FC) => + + {render(props)} + , + day: , + month: + }} /> + , + [byDay, month, onChangedWeekOf, onChangedDay, onChangedMonth] + ); + + const choiceGroupOptions = useCallback(() => + [ + { + key: RecurPatternOption.byDate.toString(), + text: firstTextPart(strings.Yearly_ByDate), + styles: byDateChoiceStyles, + onRenderField: onRenderFieldByDateChoiceGroupOption + }, { + key: RecurPatternOption.byDay.toString(), + text: firstTextPart(strings.Yearly_ByDay), + styles: byDayChoiceStyles, + onRenderField: onRenderFieldByDayChoiceGroupOption + } + ], + [onRenderFieldByDateChoiceGroupOption, onRenderFieldByDayChoiceGroupOption] + ); + + return ; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/recurrence/index.ts b/samples/react-rhythm-of-business-calendar/src/components/recurrence/index.ts new file mode 100644 index 000000000..65a9c43fa --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/recurrence/index.ts @@ -0,0 +1,6 @@ +export { DailyEditor } from './DailyEditor'; +export { WeeklyEditor } from './WeeklyEditor'; +export { MonthlyEditor } from './MonthlyEditor'; +export { PatternChoiceGroup } from './PatternChoiceGroup'; +export { YearlyEditor } from './YearlyEditor'; +export { UntilEditor } from './UntilEditor'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/refiners/OnRefinerSelectionChanged.ts b/samples/react-rhythm-of-business-calendar/src/components/refiners/OnRefinerSelectionChanged.ts new file mode 100644 index 000000000..41e296adf --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/refiners/OnRefinerSelectionChanged.ts @@ -0,0 +1,8 @@ +import { RefinerValue } from "model"; + +interface IChanges { + added: readonly RefinerValue[]; + removed: readonly RefinerValue[]; +} + +export type OnRefinerSelectionChanged = (changes: IChanges) => void; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerCheckbox.tsx b/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerCheckbox.tsx new file mode 100644 index 000000000..f7424d4b6 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerCheckbox.tsx @@ -0,0 +1,39 @@ +import React, { FC, FormEvent, useCallback, useMemo } from "react"; +import { Checkbox, ICheckboxProps, mergeThemes, useTheme } from "@fluentui/react"; +import { RefinerValue } from "model"; +import { Color } from "common"; + +interface IProps extends ICheckboxProps { + label?: string; + value: RefinerValue; + checked: boolean; + enableColors: boolean; + overrideColor?: Color; + onCheckChanged: (value: RefinerValue, checked: boolean) => void; +} + +export const RefinerCheckbox: FC = (props) => { + const { label, value, checked, enableColors, overrideColor, onCheckChanged } = props; + const color = overrideColor || value.color; + const currentTheme = useTheme(); + const hoverColor = useMemo(() => currentTheme.isInverted ? color.lighten(0.25) : color.darken(0.25), [currentTheme, color]); + const theme = mergeThemes(currentTheme, enableColors && { + semanticColors: { + inputBackgroundChecked: color.toCssString(), + inputBackgroundCheckedHovered: hoverColor.toCssString() + } + }); + + const onChange = useCallback( + (ev: FormEvent, checked: boolean) => onCheckChanged(value, checked), + [value, onCheckChanged] + ); + + return ; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerPanel.module.scss b/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerPanel.module.scss new file mode 100644 index 000000000..7a1d89758 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerPanel.module.scss @@ -0,0 +1,78 @@ +@import '../panels.module'; + +.header { + position: relative; + + .text { + @include md-down { + @include ms-fontSize-16; + } + + @include lg-up { + @include ms-fontSize-18; + } + + @include ms-fontWeight-semibold; + padding: 24px 24px 12px 24px; + } + + .liveUpdateMark { + position: absolute; + top: 6px; + right: 8px; + } +} + +.content { + .refinerValue { + position: relative; + padding: 12px 0; + + .tag { + padding-right: 24px; + } + + @include md-down { + + .tag, + .color, + .commands { + padding-top: 12px; + } + } + + .liveUpdateMark { + position: absolute; + left: -32px; + top: 16px; + } + + .titleLiveUpdateMark { + position: absolute; + right: 10px; + top: 5px; + } + + .colorLiveUpdateMark { + top: 5px; + } + + .tagLiveUpdateMark { + position: absolute; + right: 0; + top: 5px; + } + + .archiveToggle { + margin: 6px 0; + } + } +} + +.colorPreview { + height: 30px; + width: 30px; + border: 1px solid; + border-color: $color-neutralSecondary; + border-radius: 15px; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerPanel.tsx b/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerPanel.tsx new file mode 100644 index 000000000..0855ddd0a --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerPanel.tsx @@ -0,0 +1,544 @@ +import { max } from 'lodash'; +import React, { CSSProperties } from 'react'; +import { DragDropContext, Draggable, Droppable, DropResult } from 'react-beautiful-dnd'; +import { ActionButton, FocusZone, ICommandBarItemProps, IconButton, ITextFieldStyles, Label, Stack, StackItem, Text, TooltipHost } from "@fluentui/react"; +import { GripperDotsVerticalIcon } from '@fluentui/react-icons-mdl2'; +import { Entity, ErrorHandler, IAsyncData, inverseFilter, multifilter, ValidationRule } from 'common'; +import { EntityPanelBase, IEntityPanelProps, IDataPanelBaseState, ResponsiveGrid, GridRow, GridCol, LiveText, LiveUpdate, LiveTextField, IDataPanelBase, LiveRelationship, CalloutColorPicker, LiveToggle } from "common/components"; +import { Refiner, RefinerValue } from "model"; +import { withServices, ServicesProp, EventsServiceProp, EventsService, DirectoryService, DirectoryServiceProp } from 'services'; +import { ListItemTechnicals } from '../shared'; + +import { PersistConcurrencyFailureMessage, RefinerPanel as strings } from "ComponentStrings"; + +import styles from './RefinerPanel.module.scss'; + +export class OnlyOneRefinerUsesColorsValidationRule extends ValidationRule { + constructor(existingRefiners: IAsyncData) { + super( + refiner => OnlyOneRefinerUsesColorsValidationRule.isValid(refiner, existingRefiners.data), + "Only one refiner may use colors" + ); + } + + public static isValid(refiner: Refiner, existingRefiners: readonly Refiner[]): boolean { + return !refiner.enableColors || existingRefiners?.every(r => r === refiner || !r.enableColors); + } +} + +export class OnlyOneRefinerUsesTagsValidationRule extends ValidationRule { + constructor(existingRefiners: IAsyncData) { + super( + refiner => OnlyOneRefinerUsesTagsValidationRule.isValid(refiner, existingRefiners.data), + "Only one refiner may use tags" + ); + } + + public static isValid(refiner: Refiner, existingRefiners: readonly Refiner[]): boolean { + return !refiner.enableTags || existingRefiners?.every(r => r === refiner || !r.enableTags); + } +} + + +export interface IRefinerPanel extends IDataPanelBase { +} + +interface IOwnProps { + refinersAsync: IAsyncData; +} +type IProps = IOwnProps & IEntityPanelProps & ServicesProp; + +interface IOwnState { +} +type IState = IOwnState & IDataPanelBaseState; + +class RefinerPanel extends EntityPanelBase implements IRefinerPanel { + private _enableColorsValidation: OnlyOneRefinerUsesColorsValidationRule; + private _enableTagsValidation: OnlyOneRefinerUsesTagsValidationRule; + + public componentDidMount(): void { + super.componentDidMount(); + + const { refinersAsync } = this.props; + this._enableColorsValidation = new OnlyOneRefinerUsesColorsValidationRule(refinersAsync); + this._enableTagsValidation = new OnlyOneRefinerUsesTagsValidationRule(refinersAsync); + } + + protected get title() { + if (this.entity) { + const { displayName } = this.entity; + if (this.isNew && !displayName) + return strings.NewRefinerDefaultHeading; + else + return `${strings.RefinerHeadingPrefix}: ${displayName}`; + } else { + return ''; + } + } + + protected hasChanges(): boolean { + return super.hasChanges() || this.entity?.values.hasChanges(); + } + + protected validate(): boolean { + return super.validate() && + this.entity?.values.filter(Entity.NotDeletedFilter).every(v => v.valid()) && + this._enableColorsValidation.validate(this.entity) && + this._enableTagsValidation.validate(this.entity); + } + + protected markEntityDeleted(): void { + super.markEntityDeleted(); + + this.entity.values.forEach(value => { + value.events.snapshot(); + value.events.removeAll(); + }); + } + + protected async persistChangesCore() { + const { [EventsService]: events } = this.props.services; + + try { + const values = this.entity.values.filter(Entity.NotDeletedFilter).sort(this.entity.values.sorting.comparer); + values.forEach((value, idx) => value.order = idx); + + events.track(this.entity); + await events.persist(); + + if (this.entity.isDeleted) { + this.entity.values.forEach(value => value.events.immortalize()); + } + } catch (e) { + if (ErrorHandler.is_412_PRECONDITION_FAILED(e)) { + const message = await ErrorHandler.message(e); + console.warn(message, e); + return Promise.reject(PersistConcurrencyFailureMessage); + } else { + throw e; + } + } + } + + private readonly _onRefinerValueDragEnd = async (result: DropResult) => { + if (!result.destination) return; + + const sourceIndex = result.source.index; + const destinationIndex = result.destination.index; + + if (destinationIndex !== sourceIndex) { + const values = this.entity.values.filter(Entity.NotDeletedFilter).sort(this.entity.values.sorting.comparer); + values.forEach((value, idx) => value.order = idx); + + const sourceValue = values[sourceIndex]; + const destinationValue = values[destinationIndex]; + + sourceValue.order = destinationValue.order; + + // if moving down in order, shift the intervening items up one space + for (let i = sourceIndex + 1; i <= destinationIndex; i++) { + values[i].order--; + } + + // if moving up in order, shift the intervening items down one space + for (let i = sourceIndex - 1; i >= destinationIndex; i--) { + values[i].order++; + } + } + } + + protected renderDisplayContent(): JSX.Element { + const liveProps = { + entity: this.entity + }; + + return ( + + + + + + + + + + + {val => {val ? strings.Field_Required.OnText : strings.Field_Required.OffText}} + + + + + {val => {val ? strings.Field_AllowMultiselect.OnText : strings.Field_AllowMultiselect.OffText}} + + + + + {val => {val ? strings.Field_InitialDisplay.OnText : strings.Field_InitialDisplay.OffText}} + + + + + + + {val => {val ? strings.Field_UseColors.OnText : strings.Field_UseColors.OffText}} + + + + + {val => {val ? strings.Field_UseTags.OnText : strings.Field_UseTags.OffText}} + + + + + {val => {val ? strings.Field_CustomSort.OnText : strings.Field_CustomSort.OffText}} + + + + + + + + {({ entity: value, isDeleted }) => { + const deletedStyle: CSSProperties = { + textDecoration: 'line-through', + fontWeight: 'lighter' + }; + return ( + {(renderLiveUpdateMark) => <> + {renderLiveUpdateMark()} +
+ {value.displayName} +
+ }
+ ); + }} +
+
+
+ + + + + +
+
+ ); + } + + protected renderEditContent(): JSX.Element { + const { showValidationFeedback } = this.state; + const entity = this.entity; + const { enableColors, enableTags, values, customSort } = entity; + const liveProps = { + entity, + showValidationFeedback, + updateField: this.updateField + }; + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + { + this.updateField(entity => { + update(entity); + const values = entity.values.filter(Entity.NotDeletedFilter).sort(entity.values.sorting.comparer); + values.forEach((value, idx) => value.order = idx); + }, callback); + }} + label={strings.Field_CustomSort.Label} + onText={strings.Field_CustomSort.OnText} + offText={strings.Field_CustomSort.OffText} + tooltip={strings.Field_CustomSort.Tooltip} + propertyName='customSort' + /> + + + + + + + + {({ innerRef, droppableProps, placeholder }, snapshot) => ( +
+ {({ entity, isDeleted, index }) => { + const liveProps = { + entity, + showValidationFeedback, + updateField: (update: (data: RefinerValue) => void, callback?: () => any) => this.updateField(refiner => update(entity), callback) + }; + const titleFieldstyles: Partial = { + field: { paddingRight: 24 } + }; + const tagFieldstyles: Partial = { + field: { textAlign: 'center' }, + prefix: { padding: '0 6px' }, + suffix: { padding: '0 6px' } + }; + + return ( + + {({ innerRef, draggableProps, dragHandleProps }, { isDragging }) => ( +
+ this.forceUpdate()} + > + {renderLiveUpdateMark => renderLiveUpdateMark({ className: styles.liveUpdateMark })} + + + {customSort && + + + + } + + + + + + + {enableColors && + + +
+ } updateValue={color => this.updateField(r => entity.color = color)}> + {renderLiveUpdateMark => + + + this.updateField(r => entity.color = color)} + /> + + + {renderLiveUpdateMark({ className: styles.colorLiveUpdateMark })} + + + } + + + } + {enableTags && + + + + } + {!isDragging && + + {multifilter(entity.events.get(), Entity.NotDeletedFilter, inverseFilter(Entity.NewAndGhostableFilter)).length > 0 + ? + : (!isDeleted && + + { this.updateField(e => entity.delete()); }} + /> + + ) + } + + } + + + + +
+ )} + + ); + }} + {placeholder} +
+ )} + + + { + const value = new RefinerValue(); + const maxOrder = max(values.map(v => v.order)); + value.order = isFinite(maxOrder) ? maxOrder + 1 : 0; + this.updateField(refiner => refiner.values.add(value)); + }}>{strings.Command_AddRefinerValue.Text} + + + + + + + + + + ); + } + + protected renderDisplayHeader(): JSX.Element { + return ( +
+ {this.title} + {renderLiveUpdateMark => renderLiveUpdateMark({ className: styles.liveUpdateMark })} +
+ ); + } + + protected buildDisplayHeaderCommands(): ICommandBarItemProps[] { + const { [DirectoryService]: { currentUserIsSiteAdmin } } = this.props.services; + const onEdit = () => { this.edit(); }; + + const canEdit = currentUserIsSiteAdmin; + + const editCommand: ICommandBarItemProps = { + key: 'edit', + text: strings.Command_Edit.Text, + iconProps: { iconName: 'Edit' }, + onClick: onEdit + }; + + return [ + canEdit && editCommand + ].filter(Boolean); + } + + protected buildEditHeaderCommands(): ICommandBarItemProps[] { + const { [DirectoryService]: { currentUserIsSiteAdmin } } = this.props.services; + const { submitting } = this.state; + const { isDeleted, isNew } = this.entity; + const onSubmit = () => this.submit(() => this.dismiss()); + const onConfirmDiscard = () => this.confirmDiscard(); + const onDelete = () => this.confirmDelete(); + + const saveCommand: ICommandBarItemProps = { + key: 'save', + text: strings.Command_Save.Text, + iconProps: { iconName: 'Save' }, + disabled: submitting, + onClick: onSubmit + }; + + const discardCommand: ICommandBarItemProps = { + key: 'discard', + text: strings.Command_Discard.Text, + iconProps: { iconName: 'Cancel' }, + onClick: onConfirmDiscard + }; + + const deleteCommand: ICommandBarItemProps = { + key: 'delete', + text: strings.Command_Delete.Text, + iconProps: { iconName: 'Delete' }, + disabled: isDeleted, + onClick: onDelete + }; + + const canDelete = !isNew && currentUserIsSiteAdmin; + + return [ + saveCommand, + discardCommand, + canDelete && deleteCommand + ].filter(Boolean); + } +} + +export default withServices(RefinerPanel); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerValuePill.module.scss b/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerValuePill.module.scss new file mode 100644 index 000000000..4568baaad --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerValuePill.module.scss @@ -0,0 +1,11 @@ +@import '../common.module'; + +.pill { + @include ms-fontSize-12; + line-height: 16px; + overflow: hidden; + white-space: nowrap; + padding: 1px 6px 2px 6px; + border-radius: 6px; + border: 1px solid transparent; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerValuePill.tsx b/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerValuePill.tsx new file mode 100644 index 000000000..f5f873018 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerValuePill.tsx @@ -0,0 +1,30 @@ +import React, { CSSProperties, FC, useMemo } from 'react'; +import { useTheme } from '@fluentui/react'; +import { RefinerValue } from 'model'; + +import styles from './RefinerValuePill.module.scss'; + +interface IProps { + refinerValue: RefinerValue; +} + +export const RefinerValuePill: FC = ({ refinerValue }) => { + const { palette: { white, neutralPrimary } } = useTheme(); + + const { title, color, tag } = refinerValue; + const { enableTags, enableColors } = refinerValue.refiner.get(); + + const refinerValueStyle: CSSProperties = useMemo(() => { + return { + color: enableColors ? white : neutralPrimary, + backgroundColor: (enableColors && color?.toCssString()) || white, + borderColor: ((enableColors && color?.toCssString()) || neutralPrimary) + }; + }, [enableColors, enableTags, color, tag]); + + return ( + + {enableTags && tag && `[${tag}]`} {title} + + ); +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerValues.module.scss b/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerValues.module.scss new file mode 100644 index 000000000..55237747b --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerValues.module.scss @@ -0,0 +1,19 @@ +@import '../common.module'; + +.heading { + .editContainer { + min-width: 32px; + min-height: 32px; + } + + .edit { + display: none; + } + + &:hover, + &:focus-within { + .edit { + display: block; + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerValues.tsx b/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerValues.tsx new file mode 100644 index 000000000..7e088be37 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/refiners/RefinerValues.tsx @@ -0,0 +1,131 @@ +import React, { FC, FormEvent, useCallback, useMemo } from "react"; +import { ActionButton, Checkbox, FocusZone, FontSizes, FontWeights, IButtonStyles, ICheckboxStyles, IconButton, IIconProps, IStackTokens, Stack, StackItem, TooltipHost, useTheme } from "@fluentui/react"; +import { useBoolean } from "@fluentui/react-hooks"; +import { Refiner, RefinerValue } from "model"; +import { Color, Entity, multifilter } from "common"; +import { OnRefinerSelectionChanged } from "./OnRefinerSelectionChanged"; +import { RefinerCheckbox } from "./RefinerCheckbox"; + +import { Refiner as strings } from "ComponentStrings"; + +import styles from "./RefinerValues.module.scss"; + +const expandedIcon: IIconProps = { iconName: 'ChevronDown' }; +const collapsedIcon: IIconProps = { iconName: 'ChevronRight' }; +const editIcon: IIconProps = { iconName: 'Edit' }; + +const headingStackTokens: IStackTokens = { childrenGap: 8 }; +const refinerValuesStackTokens: IStackTokens = { childrenGap: 6, maxWidth: 250 }; + +const headingStyles: IButtonStyles = { + root: { padding: 0 }, + textContainer: { fontWeight: 500 }, + icon: { margin: 2 } +}; +const selectAllValuesStyles: ICheckboxStyles = { + root: { marginRight: 32 }, + text: { fontSize: FontSizes.size12, fontWeight: FontWeights.semibold } +}; +const refinerValueStyles: ICheckboxStyles = { + root: { marginRight: 32 }, + text: { fontSize: FontSizes.size12 } +}; + +interface IProps { + editingEnabled: boolean; + refiner: Refiner; + selectedValues: Set; + onSelectionChanged: OnRefinerSelectionChanged; + onEdit: (refiner: Refiner) => void; +} + +export const RefinerValues: FC = ({ + editingEnabled, + refiner, + selectedValues, + onSelectionChanged, + onEdit +}) => { + const { displayName, required, initiallyExpanded, enableColors, blankValue } = refiner; + + const showBlankValue = !required; + + const { palette: { themePrimary } } = useTheme(); + const blankValueColor = useMemo(() => Color.parse(themePrimary), [themePrimary]); + + const values = multifilter(refiner.values.get(), Entity.NotDeletedFilter, RefinerValue.ActiveFilter); + const allAreSelected = values.every(v => selectedValues.has(v)) && (!showBlankValue || selectedValues.has(blankValue)); + + const toggleSelectAll = useCallback((ev: FormEvent, checked: boolean) => { + onSelectionChanged({ + added: checked ? [blankValue, ...values] : [], + removed: !checked ? [blankValue, ...values] : [] + }); + }, [blankValue, values, onSelectionChanged]); + + const valueChanged = useCallback((value: RefinerValue, checked: boolean) => { + onSelectionChanged({ + added: checked ? [value] : [], + removed: !checked ? [value] : [] + }); + }, [onSelectionChanged]); + + const onClickEdit = useCallback( + () => editingEnabled && onEdit(refiner), + [refiner, editingEnabled, onEdit] + ); + + const [expanded, { toggle: toggleExpanded }] = useBoolean(initiallyExpanded); + + return ( + + + + + + {displayName} + + + {editingEnabled && + + + + + + } + + + {expanded && + + + {showBlankValue && + + } + {values.map((value, idx) => + + )} + + } + + ); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/refiners/Refiners.tsx b/samples/react-rhythm-of-business-calendar/src/components/refiners/Refiners.tsx new file mode 100644 index 000000000..ccffb0733 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/refiners/Refiners.tsx @@ -0,0 +1,29 @@ +import React, { FC } from "react"; +import { Separator, Stack } from "@fluentui/react"; +import { Refiner, RefinerValue } from "model"; +import { type OnRefinerSelectionChanged } from "./OnRefinerSelectionChanged"; +import { RefinerValues } from "./RefinerValues"; +import { Entity } from "common"; + +interface IProps { + editingEnabled: boolean; + refiners: readonly Refiner[]; + selectedValues: Set; + onSelectionChanged: OnRefinerSelectionChanged; + onEditRefiner: (refiner: Refiner) => void; +} + +export const Refiners: FC = ({ editingEnabled, refiners, selectedValues, onSelectionChanged, onEditRefiner }) => + + {refiners.filter(Entity.NotDeletedFilter).sort(Refiner.OrderAscComparer).map((refiner, idx) => <> + {idx > 0 && } + + )} + \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/refiners/index.ts b/samples/react-rhythm-of-business-calendar/src/components/refiners/index.ts new file mode 100644 index 000000000..0e69b4ba3 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/refiners/index.ts @@ -0,0 +1,4 @@ +export { default as RefinerPanel, IRefinerPanel } from './RefinerPanel'; +export { Refiners } from './Refiners'; +export { RefinerValuePill } from './RefinerValuePill'; +export { type OnRefinerSelectionChanged } from './OnRefinerSelectionChanged'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/settings/RefinerEditor.tsx b/samples/react-rhythm-of-business-calendar/src/components/settings/RefinerEditor.tsx new file mode 100644 index 000000000..1827ea583 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/settings/RefinerEditor.tsx @@ -0,0 +1,116 @@ +import React, { CSSProperties, FC, useCallback } from 'react'; +import { DragDropContext, Draggable, Droppable, DropResult } from 'react-beautiful-dnd'; +import { useConst, useForceUpdate } from '@fluentui/react-hooks'; +import { ActionButton, IconButton, IIconProps, IStackTokens, Stack, Text, TooltipHost } from '@fluentui/react'; +import { GripperDotsVerticalIcon } from '@fluentui/react-icons-mdl2'; +import { Refiner } from 'model'; +import { useEventsService } from 'services'; + +import { SettingsPanel as strings } from "ComponentStrings"; + +import styles from './SettingsPanel.module.scss'; + +interface IProps { + refiners: Refiner[]; + onNewRefiner: () => void; + onEditRefiner: (refiner: Refiner) => void; +} + +interface IRefinerItemProps { + index: number; + refiner: Refiner; + onEditRefiner: (refiner: Refiner) => void; +} + +export const RefinerItem: FC = ({ index, refiner, onEditRefiner }) => { + const { key, displayName } = refiner; + const onclickEdit = useCallback( + () => onEditRefiner(refiner), + [refiner, onEditRefiner] + ); + + const stackTokens: IStackTokens = useConst({ childrenGap: 12 }); + const gripperIconStyle: CSSProperties = useConst({ position: 'relative', top: -2 }); + const editIconProps: IIconProps = useConst({ iconName: 'Edit' }); + + return ( + + {({ innerRef, draggableProps, dragHandleProps }, { isDragging, draggingOver }) => ( +
+ + + + + + {displayName} + + {!isDragging && !draggingOver && + + + + } + +
+ )} +
+ ); +} + +export const RefinerEditor: FC = ({ refiners, onNewRefiner, onEditRefiner }) => { + const forceUpdate = useForceUpdate(); + const events = useEventsService(); + + const onRefinerDragStart = useCallback(() => { + refiners.forEach((refiner, idx) => { + refiner.snapshot(); + refiner.order = idx; + }); + }, [refiners]); + + const onRefinerDragEnd = useCallback(async (result: DropResult) => { + if (!result.destination) return; + + const sourceIndex = result.source.index; + const destinationIndex = result.destination.index; + + if (destinationIndex !== sourceIndex) { + refiners.splice(destinationIndex, 0, ...refiners.splice(sourceIndex, 1)); + + refiners.forEach((refiner, idx) => { + refiner.order = idx; + }); + + try { + await events.persist(); + refiners.forEach(refiner => refiner.immortalize()); + } catch (ex) { + refiners.forEach(refiner => refiner.revert()); + } + + forceUpdate(); + } + }, [refiners, events, forceUpdate]); + + return <> + + + {({ innerRef, droppableProps, placeholder }, snapshot) => ( +
+ {refiners.map((refiner, idx) => + + )} + {placeholder} +
+ )} +
+
+ + {strings.Command_AddRefiner.Text} + + ; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/settings/SettingsPanel.module.scss b/samples/react-rhythm-of-business-calendar/src/components/settings/SettingsPanel.module.scss new file mode 100644 index 000000000..c82f2b637 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/settings/SettingsPanel.module.scss @@ -0,0 +1,23 @@ +@import '../panels.module'; + +.refiners { + .refiner { + height: 32px; + + .name { + @include ms-fontSize-14; + @include ms-fontWeight-semibold; + } + + .edit { + display: none; + } + + &:hover, + &:focus-within { + .edit { + display: block; + } + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/settings/SettingsPanel.tsx b/samples/react-rhythm-of-business-calendar/src/components/settings/SettingsPanel.tsx new file mode 100644 index 000000000..412a129de --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/settings/SettingsPanel.tsx @@ -0,0 +1,258 @@ +import { months } from 'moment-timezone'; +import React, { RefObject } from 'react'; +import { DefaultButton, ICommandBarItemProps, IDropdownOption, Label, TooltipHost } from "@fluentui/react"; +import { arrayToMap, Entity, ErrorHandler } from 'common'; +import { EntityPanelBase, IEntityPanelProps, IDataPanelBaseState, ResponsiveGrid, GridRow, GridCol, IDataPanelBase, LiveToggle, LiveDropdown } from "common/components"; +import { ReadonlyRefinerMap, Refiner } from 'model'; +import { withServices, ServicesProp, ConfigurationServiceProp, ConfigurationService, EventsServiceProp, EventsService } from 'services'; +import { Configuration } from 'schema'; +import { IConfigureApproversPanel } from '../approvals'; +import { ViewDescriptors, ViewDescriptorsById } from '../views'; +import { RefinerEditor } from './RefinerEditor'; + +import { PersistConcurrencyFailureMessage, SettingsPanel as strings } from "ComponentStrings"; + +import styles from './SettingsPanel.module.scss'; + +const refinerToDropdownOption = (refiner: Refiner) => { + const { id: key, displayName: text } = refiner; + return { key, text } as IDropdownOption; +}; + +const viewDropdownOptions: IDropdownOption[] = ViewDescriptors.map(v => { + return { + key: v.id, + text: v.title + }; +}); + +const monthNames = months(); +const fiscalYearDropdownOptions: IDropdownOption[] = monthNames.map((name, idx) => { + return { + key: idx, + text: name + }; +}); + +export interface ISettingsPanel extends IDataPanelBase { +} + +interface IOwnProps { + onSettingsUpdated: () => void; + onNewRefiner: () => void; + onEditRefiner: (refiner: Refiner) => void; + configureApproversPanel: RefObject; +} +type IProps = IOwnProps & IEntityPanelProps & ServicesProp; + +interface IOwnState { + groupByRefinerOptions: IDropdownOption[]; + refiners: Refiner[]; + refinersById: ReadonlyRefinerMap; +} +type IState = IOwnState & IDataPanelBaseState; + +class SettingsPanel extends EntityPanelBase implements ISettingsPanel { + protected get title() { + return strings.Heading; + } + + protected resetState(): IState { + this._buildGroupByRefinerOptions(); + + return { + ...super.resetState(), + groupByRefinerOptions: [], + refiners: [], + refinersById: new Map() + }; + } + + public componentShouldRender() { + super.componentShouldRender(); + this._buildGroupByRefinerOptions(); + } + + private async _buildGroupByRefinerOptions() { + const { [EventsService]: { refinersAsync } } = this.props.services; + + await refinersAsync.promise; + + const refiners = [...refinersAsync.data]; + refiners.sort(Refiner.OrderAscComparer); + + const groupByRefinerOptions: IDropdownOption[] = [ + { key: 0, text: '' }, + ...refiners.filter(Entity.NotDeletedFilter).map(refinerToDropdownOption) + ]; + + const refinersById = arrayToMap(refiners, r => r.id); + + this.setState({ groupByRefinerOptions, refiners, refinersById }); + } + + protected async persistChangesCore() { + const { [ConfigurationService]: configurations } = this.props.services; + + try { + await configurations.persist(); + } catch (e) { + if (ErrorHandler.is_412_PRECONDITION_FAILED(e)) { + const message = await ErrorHandler.message(e); + console.warn(message, e); + return Promise.reject(PersistConcurrencyFailureMessage); + } else { + throw e; + } + } + } + + protected readonly updateFieldAndSubmit = (update: (data: Configuration) => void, callback?: () => any) => + this.updateField(update, () => { + if (callback) callback(); + this.submit(() => { + this.edit(); + this.props.onSettingsUpdated(); + }); + }) + + private _openConfigureApprovers = () => + this.props.configureApproversPanel.current?.open(); + + + protected renderEditContent(): JSX.Element { + const { onNewRefiner, onEditRefiner } = this.props; + const { showValidationFeedback, groupByRefinerOptions, refiners, refinersById } = this.state; + const entity = this.entity; + const { useRefiners, useApprovals } = entity; + const liveProps = { + entity, + showValidationFeedback, + updateField: this.updateFieldAndSubmit + }; + + return ( + + + + v} + renderValue={v => ViewDescriptorsById.get(v).title} + /> + + + v} + renderValue={v => monthNames[v]} + /> + + + + + + + + + + + v} + renderValue={v => { + const refiner = refinersById.get(v); + return !refiner.isDeleted ? refiner.displayName : ''; + }} + disabled={!useRefiners || !refiners.some(Entity.NotDeletedFilter)} + /> + + + + + + + +
+ + + {strings.Command_ConfigureApprovers.Text} + + +
+
+ + + + + + {useRefiners && + + + + + + + } +
+ ); + } + + protected buildEditHeaderCommands(): ICommandBarItemProps[] { + const onConfirmDiscard = () => this.confirmDiscard(); + + return [{ + key: 'back', + text: strings.Command_Back.Text, + iconProps: { iconName: 'Back' }, + onClick: onConfirmDiscard + }]; + } +} + +export default withServices(SettingsPanel); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/settings/index.ts b/samples/react-rhythm-of-business-calendar/src/components/settings/index.ts new file mode 100644 index 000000000..ba18c6f05 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/settings/index.ts @@ -0,0 +1 @@ +export { default as SettingsPanel, ISettingsPanel } from "./SettingsPanel"; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/setup/ConfigurationWizard.tsx b/samples/react-rhythm-of-business-calendar/src/components/setup/ConfigurationWizard.tsx new file mode 100644 index 000000000..e15986c57 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/setup/ConfigurationWizard.tsx @@ -0,0 +1,123 @@ +import React, { FC, useState } from "react"; +import { IComponentStyles } from "@uifabric/foundation"; +import { FocusZone, format, Image, IStackTokens, ITextStyles, Stack, Text } from "@fluentui/react"; +import { useConst } from "@fluentui/react-hooks"; +import { Wizard, IWizardPageProps } from "common/components"; +import { ElementProvisioner } from "common/sharepoint"; +import { Configuration } from "schema"; +import { useConfigurationService, useEventsService, useSharePointService, ISharePointService, IConfigurationService, IEventsService, useTeamsJS, useDirectoryService, ILiveUpdateService, useLiveUpdateService } from "services"; + +import { AppName, ConfigurationWizard as strings } from 'ComponentStrings'; + +const setRefinersIllustration = require('assets/onboarding/setRefinersIllustration.png'); +const addEventsIllustration = require('assets/onboarding/addEventsIllustration.png'); +const setApproversIllustration = require('assets/onboarding/setApproversIllustration.png'); + +interface IProps { + onSetupComplete: () => void; +} + +type IWizardData = { + configuration: Configuration; + services: { + spo: ISharePointService; + configurations: IConfigurationService; + events: IEventsService; + liveUpdate: ILiveUpdateService + }; +}; +type IConfigurationWizardPageProps = IWizardPageProps; + +const Heading: FC = () => + + {format(strings.Heading, AppName)} + + +const Page_Start = (props: IConfigurationWizardPageProps) => { + const itemWidth = 250; + const tokens = useConst({ childrenGap: 6, maxWidth: itemWidth }); + const descriptionTextStyles: IComponentStyles = { root: { textAlign: 'center' } }; + + return ( + + + + + {strings.SetRefinersHeading} + {strings.SetRefinersDescription} + + + + {strings.AddEventsHeading} + {strings.AddEventsDescription} + + + + {strings.SetApproversHeading} + {strings.SetApproversDescription} + + + + ); +} + +const Page_Success = (props: IConfigurationWizardPageProps) => + + {strings.SetupComplete} + + +const finalizeSetup = async ({ configuration, services }: IWizardData) => { + const { spo, configurations, events, liveUpdate } = services; + + configurations.track(configuration); + + const provisioner = new ElementProvisioner(); + await provisioner.ensureElements(configuration.schema); + + await spo.preflightSchema(); + await configurations.persist(); + + configurations.active = configuration; + + await events.initialize(); + await spo.preflightSchema(); + + liveUpdate.begin(); +} + +const ConfigurationWizard: FC = ({ onSetupComplete }) => { + const { currentUserIsSiteAdmin } = useDirectoryService(); + const teams = useTeamsJS(); + const spo = useSharePointService(); + const configurations = useConfigurationService(); + const events = useEventsService(); + const liveUpdate = useLiveUpdateService(); + + const [data] = useState({ + configuration: new Configuration(), + services: { spo, configurations, events, liveUpdate } + }); + + if (currentUserIsSiteAdmin) { + return ( + } + startPage={Page_Start} + stepPages={[]} + execute={finalizeSetup} + successPage={Page_Success} + strings={{ StartButton: strings.StartButton }} + onWizardComplete={onSetupComplete} + /> + ); + } else { + return ( + + {teams ? strings.MustBeTeamOwner : strings.MustBeSiteAdmin} + + ); + } +} + +export default ConfigurationWizard; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/setup/Upgrade.module.scss b/samples/react-rhythm-of-business-calendar/src/components/setup/Upgrade.module.scss new file mode 100644 index 000000000..644b0c1e0 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/setup/Upgrade.module.scss @@ -0,0 +1,8 @@ +@import '../../common/components/styles/common.module'; + +.upgrade { + padding-bottom: 40px; + margin: 0 auto; + max-width: 800px; + text-align: center; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/setup/Upgrade.tsx b/samples/react-rhythm-of-business-calendar/src/components/setup/Upgrade.tsx new file mode 100644 index 000000000..dcd0b03e8 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/setup/Upgrade.tsx @@ -0,0 +1,201 @@ +import { first, isEmpty, min } from "lodash"; +import React, { Component, ReactElement, ReactNode } from "react"; +import { PrimaryButton, ProgressIndicator, MessageBar, MessageBarType } from "@fluentui/react"; +import { CompletedIcon } from "@fluentui/react-icons-mdl2"; +import { IUpgrade, IUpgradeAction } from 'common/sharepoint'; +import { Configuration } from 'schema'; +import { withServices, ServicesProp, ConfigurationServiceProp, ConfigurationService } from 'services'; + +import * as sstrings from 'ComponentStrings'; +import * as cstrings from 'CommonStrings'; +import styles from "./Upgrade.module.scss"; + +const UpgradeCompletedSplashscreenTimeout = 2500; + +interface IOwnProps { + onUpgradeComplete: () => void; +} +type IProps = IOwnProps & ServicesProp; + +interface IState { + cannotUpgrade: boolean; + inProgress: boolean; + complete: boolean; + currentAction: IUpgradeAction; + percentComplete: number; + error: any; +} + +class Upgrade extends Component { + constructor(props: IProps) { + super(props); + + this.state = { + cannotUpgrade: false, + inProgress: false, + complete: false, + currentAction: null, + percentComplete: 0.0, + error: null + }; + } + + private readonly _onClick = () => { + this._upgrade(); + } + + private readonly _upgrade = async () => { + const { [ConfigurationService]: config } = this.props.services; + + try { + let upgradableConfigs = this._nextConfigurationsToUpgrade(); + let nextUpgradeGroups = this._nextUpgradeGroups(upgradableConfigs); + + if (isEmpty(nextUpgradeGroups)) { + this.setState({ cannotUpgrade: true }); + } + else { + while (!isEmpty(nextUpgradeGroups)) { + const sampleGroup = first(nextUpgradeGroups); + let i = min(upgradableConfigs.map(c => c.currentUpgradeAction)); + + while (i < sampleGroup.upgrade.actions.length) { + this.setState({ + inProgress: true, + percentComplete: i / sampleGroup.upgrade.actions.length, + error: null + }); + + const sampleAction = sampleGroup.upgrade.actions[i]; + + if (sampleAction.shared) { // if is shared, do once, persist all + const sharedAction = sampleAction; + this.setState({ currentAction: sharedAction }); + console.log("Running shared upgrade action: " + sharedAction.description); + + await sharedAction.execute(this.props); + + upgradableConfigs.forEach(c => { + c.snapshot(); + c.currentUpgradeAction = i + 1; + }); + + await config.persist(); + + upgradableConfigs.forEach(c => c.immortalize()); + } else { // if not shared, execute per config, persist per config + for (const { upgrade, configuration } of nextUpgradeGroups) { + const action = upgrade.actions[i]; + + this.setState({ currentAction: action }); + console.log("Running upgrade action: " + action.description); + + await action.execute(this.props); + + configuration.snapshot(); + configuration.currentUpgradeAction = i + 1; + + await config.persist(); + configuration.immortalize(); + } + } + + i++; + } + + for (const configuration of upgradableConfigs) { + configuration.snapshot(); + configuration.currentUpgradeAction = 0; + configuration.schemaVersion = first(nextUpgradeGroups).upgrade.toVersion; + } + + await config.persist(); + + upgradableConfigs.forEach(c => c.immortalize()); + + upgradableConfigs = this._nextConfigurationsToUpgrade(); + nextUpgradeGroups = this._nextUpgradeGroups(upgradableConfigs); + } + + this.setState({ complete: true, inProgress: false }); + setTimeout(this.props.onUpgradeComplete, UpgradeCompletedSplashscreenTimeout); + } + } catch (e) { + console.error(e); + this.setState({ error: e, inProgress: false }); + } + } + + private readonly _nextConfigurationsToUpgrade = (): Configuration[] => { + const { [ConfigurationService]: configurations } = this.props.services; + const minSchemaVer = min(configurations.all.map(c => c.schemaVersion)); + return configurations.all.filter(c => c.schemaVersion === minSchemaVer); + } + + private readonly _nextUpgradeGroups = (configurations: Configuration[]): { upgrade: IUpgrade, configuration: Configuration }[] => { + return configurations + .map(config => { + const upgrade = first(config.schema.upgrades.filter(u => u.fromVersion === config.schemaVersion)); + return { upgrade: upgrade, configuration: config }; + }) + .filter(group => !!group.upgrade); + } + + private readonly _renderCannotUpgrade = (): React.ReactNode => { + const { [ConfigurationService]: { active } } = this.props.services; + return

{sstrings.UpgradeStrings.CannotUpgrade} v{active.schemaVersion.toFixed(1)}.

; + } + + private readonly _renderReadyToUpgrade = (): React.ReactNode => { + const { inProgress } = this.state; + return ( +
+

{sstrings.UpgradeStrings.Heading}

+

{sstrings.UpgradeStrings.Description}

+ +
+ ); + } + + private readonly _renderInProgress = (): React.ReactNode => { + const { currentAction, percentComplete } = this.state; + return ( +
+

{sstrings.UpgradeStrings.InProgressHeading}

+ +
+ ); + } + + private readonly _renderComplete = (): ReactNode => { + return ( +
+

{sstrings.UpgradeStrings.CompletedHeading}

+

+
+ ); + } + + public render(): ReactElement { + const { cannotUpgrade, complete, inProgress, error } = this.state; + return ( +
+

{sstrings.AppName}

+ + {error && {cstrings.GenericError}} + + { + (cannotUpgrade && this._renderCannotUpgrade()) + || + (complete && this._renderComplete()) + || + (inProgress && this._renderInProgress()) + || + this._renderReadyToUpgrade() + } +
+ ); + } +} + +export default withServices(Upgrade); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/shared/CopyLinkDialog.tsx b/samples/react-rhythm-of-business-calendar/src/components/shared/CopyLinkDialog.tsx new file mode 100644 index 000000000..7eb33e701 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/shared/CopyLinkDialog.tsx @@ -0,0 +1,65 @@ +import React, { FC, FocusEvent, useState, RefObject, useEffect, MutableRefObject, useCallback, useMemo } from "react"; +import { Dialog, format, IDialogContentProps, TextField } from "@fluentui/react"; +import { useConst, useBoolean } from "@fluentui/react-hooks"; + +import { CopyLinkDialog as strings } from "ComponentStrings"; + +export interface ICopyLinkDialog { + open(link: string, itemTitle: string): void; +} + +interface IProps { + componentRef: RefObject; +} + +export const CopyLinkDialog: FC = ({ componentRef }) => { + const [isOpen, { setTrue: show, setFalse: hide }] = useBoolean(false); + const [itemTitle, setItemTitle] = useState(""); + const [link, setLink] = useState(""); + + const open = useCallback((link: string, itemTitle: string) => { + setItemTitle(itemTitle); + setLink(link); + show(); + }, [setItemTitle, setLink]); + + useEffect(() => { + (componentRef as MutableRefObject).current = { open }; + return () => { (componentRef as MutableRefObject).current = undefined; }; + }, [componentRef, open]); + + const onLinkTextFieldFocus = useCallback((event: FocusEvent) => { + // event properties must be copied to use async + const target = event.target; + setTimeout(() => target.select(), 0); + }, []); + + const onLinkTextFieldCopy = useCallback(() => setTimeout(hide, 0), []); + + const dialogContentProps = useMemo(() => { + return { + title: format(strings.Title, itemTitle), + subText: strings.SubText + } as IDialogContentProps; + }, [itemTitle]) + + return ( + + ); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/shared/ListItemTechnicals.tsx b/samples/react-rhythm-of-business-calendar/src/components/shared/ListItemTechnicals.tsx new file mode 100644 index 000000000..657ddbe62 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/shared/ListItemTechnicals.tsx @@ -0,0 +1,30 @@ +import { duration } from "moment-timezone"; +import React, { FC } from "react"; +import { Label, Text } from "@fluentui/react"; +import { useId } from "@fluentui/react-hooks"; +import { now } from "common"; +import { ListItemEntity } from "common/sharepoint"; + +import { ListItemTechnicals as strings } from "ComponentStrings"; + +interface IProps { + entity: ListItemEntity; +} + +export const ListItemTechnicals: FC = ({ entity: { isNew, modified, created } }) => { + const createdLabelId = useId(); + const modifiedLabelId = useId(); + + return !isNew && <> + {!modified.isSame(created) && <> + + + {modified.format('ddd MMM Do, YYYY [at] h:mm A')} ({duration(modified.diff(now())).humanize(true)}) + + } + + + {created.format('ddd MMM Do, YYYY [at] h:mm A')} + + ; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/shared/Rail.tsx b/samples/react-rhythm-of-business-calendar/src/components/shared/Rail.tsx new file mode 100644 index 000000000..0a2653a61 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/shared/Rail.tsx @@ -0,0 +1,53 @@ +import React, { CSSProperties, FC, ReactElement } from "react" +import { ActionButton, IIconProps, useTheme } from "@fluentui/react" +import { useBoolean } from "@fluentui/react-hooks"; + +interface IProps { + name: string; + initiallyExpanded?: boolean; + expandIconProps?: IIconProps; + children: (collapseRail: () => void) => ReactElement; +} + +export const Rail: FC = ({ + name, + initiallyExpanded = true, + expandIconProps = { iconName: 'ChevronDown' }, + children +}) => { + const [expanded, { + setTrue: expandRail, + setFalse: collapseRail + }] = useBoolean(window.innerWidth > 1024 && initiallyExpanded); + + const { palette: { neutralLight, neutralLighterAlt } } = useTheme(); + + if (expanded) { + return ( +
+ {children(collapseRail)} +
+ ); + } else { + const railStyle: CSSProperties = { + height: '100%', + width: 40, + backgroundColor: neutralLighterAlt, + borderRight: '1px solid ' + neutralLight + }; + + const expandButtonStyle: CSSProperties = { + transform: 'rotate(-90deg)', + transformOrigin: 'top left', + marginTop: Math.round(16 /*icon width*/ + 16 /*button padding*/ + ((name?.length || 0) * 6.25) /*text size*/ + 20 /*top margin*/) + }; + + return ( +
+ + {name} + +
+ ) + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/shared/SwipedEvents.tsx b/samples/react-rhythm-of-business-calendar/src/components/shared/SwipedEvents.tsx new file mode 100644 index 000000000..dcbab989e --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/shared/SwipedEvents.tsx @@ -0,0 +1,47 @@ +import 'swiped-events'; +import React, { forwardRef, ReactNode, useEffect, useRef } from "react"; +import { useMergedRefs } from '@fluentui/react-hooks'; + +export interface SwipeEventDetails { + dir: 'up' | 'down' | 'left' | 'right', // swipe direction (up,down,left,right) + touchType: 'direct' | 'stylus', // touch type (stylus,direct) - stylus=apple pencil and direct=finger + xStart: number, // x coords of swipe start + xEnd: number, // x coords of swipe end + yStart: number, // y coords of swipe start + yEnd: number // y coords of swipe end +} + +export type SwipeEventListener = (evt: Event & { + detail: SwipeEventDetails; +}) => void; + +interface IProps { + threshold?: number; + timeout?: number; + handler: SwipeEventListener; + children: ReactNode; +} + +const SwipedEvents = forwardRef(({ threshold = 20, timeout = 500, handler, children }: IProps, forwardRef) => { + const longPressRef = useRef(); + const ref = useMergedRefs(longPressRef, forwardRef); + + useEffect( + () => { + const element = longPressRef.current; + element?.addEventListener("swiped", handler); + return () => { + element?.removeEventListener("swiped", handler); + }; + }, + [handler] + ); + + return ( +
+ {children} +
+ ); +}); + +export default SwipedEvents; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/shared/index.ts b/samples/react-rhythm-of-business-calendar/src/components/shared/index.ts new file mode 100644 index 000000000..c6f908921 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/shared/index.ts @@ -0,0 +1,4 @@ +export { CopyLinkDialog, ICopyLinkDialog } from './CopyLinkDialog'; +export { ListItemTechnicals } from './ListItemTechnicals'; +export { Rail } from './Rail'; +export { default as SwipedEvents, SwipeEventListener } from './SwipedEvents'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/shared/swiped-events.d.ts b/samples/react-rhythm-of-business-calendar/src/components/shared/swiped-events.d.ts new file mode 100644 index 000000000..a0340354b --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/shared/swiped-events.d.ts @@ -0,0 +1 @@ +declare module 'swiped-events'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/DateRotatorController.ts b/samples/react-rhythm-of-business-calendar/src/components/views/DateRotatorController.ts new file mode 100644 index 000000000..9884a8e3c --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/DateRotatorController.ts @@ -0,0 +1,38 @@ +import { now } from "common"; +import { Moment } from "moment-timezone"; +import { IIconProps } from "@fluentui/react"; +import { useCallback, useState } from "react"; +import { Configuration } from "schema"; +import { useConfigurationService } from "services"; + +export interface IDateRotatorController { + previousIconProps: IIconProps; + nextIconProps: IIconProps; + previousDate(date: Moment, config: Configuration): Moment; + nextDate(date: Moment, config: Configuration): Moment; + dateString(date: Moment, config: Configuration): string; +} + +export const useDataRotatorController = (controller: IDateRotatorController) => { + const [anchorDate, setAnchorDate] = useState(now()); + + const { active: config } = useConfigurationService(); + + const onRotatePreviousDate = useCallback(() => { + setAnchorDate(controller.previousDate(anchorDate, config)); + }, [setAnchorDate, anchorDate, config, controller]); + + const onRotateNextDate = useCallback(() => { + setAnchorDate(controller.nextDate(anchorDate, config)); + }, [setAnchorDate, anchorDate, config, controller]); + + const dateString = controller.dateString(anchorDate, config); + + return [ + anchorDate, + setAnchorDate, + dateString, + onRotatePreviousDate, + onRotateNextDate + ] as const; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/IViewCommands.ts b/samples/react-rhythm-of-business-calendar/src/components/views/IViewCommands.ts new file mode 100644 index 000000000..fe03d70b0 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/IViewCommands.ts @@ -0,0 +1,8 @@ +import { Moment } from "moment-timezone"; +import { IEvent } from "model"; + +export interface IViewCommands { + setAnchorDate: (date: Moment) => void; + newEvent: (date: Moment) => void; + activateEvent: (event: IEvent) => void; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/IViewDescriptor.ts b/samples/react-rhythm-of-business-calendar/src/components/views/IViewDescriptor.ts new file mode 100644 index 000000000..77224fd80 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/IViewDescriptor.ts @@ -0,0 +1,14 @@ +import { Moment } from "moment-timezone"; +import { MomentRange } from "common"; +import { IViewProps } from "./IViewProps"; +import { IDateRotatorController } from "./DateRotatorController"; +import { ViewKeys } from "model"; +import { Configuration } from "schema"; + +export interface IViewDescriptor { + id: ViewKeys; + title: string; + dateRotatorController: IDateRotatorController; + dateRange: (anchorDate: Moment, config: Configuration) => MomentRange; + renderer: (props: IViewProps) => JSX.Element; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/IViewProps.ts b/samples/react-rhythm-of-business-calendar/src/components/views/IViewProps.ts new file mode 100644 index 000000000..9df06a8f0 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/IViewProps.ts @@ -0,0 +1,13 @@ +import { EventOccurrence, Refiner, RefinerValue } from "model"; +import { Moment } from "moment-timezone"; +import { IEventCommands } from "../events/IEventCommands"; +import { IViewCommands } from "./IViewCommands"; + +export interface IViewProps { + anchorDate: Moment; + cccurrences: readonly EventOccurrence[]; + refiners: readonly Refiner[]; + selectedRefinerValues: Set; + eventCommands: IEventCommands; + viewCommands: IViewCommands; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/ViewNav.module.scss b/samples/react-rhythm-of-business-calendar/src/components/views/ViewNav.module.scss new file mode 100644 index 000000000..eea0713de --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/ViewNav.module.scss @@ -0,0 +1,7 @@ +@import '../common.module'; + +.viewNavContainer { + overflow-x: scroll; + @include hide-scrollbar; + padding: 1px; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/ViewNav.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/ViewNav.tsx new file mode 100644 index 000000000..00fe9888c --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/ViewNav.tsx @@ -0,0 +1,32 @@ +import React, { useCallback } from "react"; +import { Pivot, PivotItem } from "@fluentui/react"; +import { useNavigate } from "react-router"; +import { IViewDescriptor } from "./IViewDescriptor"; +import { ViewDescriptors } from "./Views"; +import { useView } from "./useView"; + +import styles from './ViewNav.module.scss'; + +type OnLinkClickType = (item?: PivotItem, ev?: React.MouseEvent) => void; + +const renderViewNavPivotItem = ({ id, title }: IViewDescriptor) => + + +export const ViewNav = () => { + const view = useView(); + const navigate = useNavigate(); + const onViewPivotItemClicked: OnLinkClickType = useCallback( + ({ props: { itemKey } }, ev) => navigate(`/${itemKey}`), + [navigate] + ); + + return ( +
+ + {ViewDescriptors.map(renderViewNavPivotItem)} + +
+ ); +}; + +export default ViewNav; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/ViewRoute.module.scss b/samples/react-rhythm-of-business-calendar/src/components/views/ViewRoute.module.scss new file mode 100644 index 000000000..e70ec5cb8 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/ViewRoute.module.scss @@ -0,0 +1,11 @@ +@import '../common.module'; + +.root { + @include md-down { + padding-right: 10px; + } + + @include lg-up { + padding-right: 20px; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/ViewRoute.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/ViewRoute.tsx new file mode 100644 index 000000000..b23375a4d --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/ViewRoute.tsx @@ -0,0 +1,323 @@ +import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; +import { IComponentStyles } from '@uifabric/foundation'; +import { useBoolean, useForceUpdate } from '@fluentui/react-hooks'; +import { ActionButton, CommandBar, ICommandBarItemProps, IconButton, IIconProps, IStackItemSlots, IStackTokens, Panel, PanelType, Stack, StackItem, Text, TooltipHost } from '@fluentui/react'; +import { BackEventListener } from 'common'; +import { AsyncDataComponent, DateRotator } from 'common/components'; +import { IEvent } from 'model'; +import { useConfigurationService, useDirectoryService, useEventsService } from 'services'; +import { ApprovalDialog, ConfigureApproversPanel, MyApprovalsFilter, MyApprovalsPanel } from '../approvals'; +import { useApprovals, useCopyLinkDialog, useExecuteEventDeepLink, useEventPanel, useRefinerPanel, useSettings, useRefinerValues, useWindowSize } from '../hooks'; +import { Refiners, RefinerPanel } from '../refiners'; +import { SettingsPanel } from '../settings'; +import { EventFilter, EventPanel, IEventCommands } from '../events'; +import { CopyLinkDialog, Rail, SwipedEvents, SwipeEventListener } from '../shared'; +import { IViewCommands, useDataRotatorController, useView, ViewNav } from '.'; + +import { ViewRoute as strings } from "ComponentStrings"; + +import styles from './ViewRoute.module.scss'; + +const RefinerRailPanelDisplayBreakpoint = 1024; + +const rootStackTokens: IStackTokens = { childrenGap: 16 }; +const refinerRailStackTokens: IStackTokens = { childrenGap: 16, padding: '10px 0 0 20px' }; +const viewStackTokens: IStackTokens = { childrenGap: 8, padding: '10px 0' }; + +const calendarViewStackItemStyles: IComponentStyles = { + root: { minWidth: 0 } +}; + +const addRefinerIconProps: IIconProps = { iconName: 'Add' }; +const collapseRefinerRailIconProps: IIconProps = { iconName: 'ClosePaneMirrored' }; +const expandRefinerRailIconProps: IIconProps = { iconName: 'ClosePane' }; + +const ViewRoute: FC = () => { + const { active: config } = useConfigurationService(); + const { currentUserIsSiteAdmin } = useDirectoryService(); + + const view = useView(); + const View = view.renderer; + + const [ + anchorDate, + setAnchorDate, + dateString, + onRotatePreviousDate, + onRotateNextDate + ] = useDataRotatorController(view.dateRotatorController); + + const dateRange = useMemo( + () => view.dateRange(anchorDate, config), + [view, anchorDate] + ); + + const { eventsAsync, refinersAsync, refinerValuesAsync, approversAsync } = useEventsService(); + const [asyncWatchers] = useState([eventsAsync, refinersAsync, refinerValuesAsync, approversAsync]); + + const [ + hasRefiners, + selectedRefinerValues, + onSelectedRefinerValuesChanged + ] = useRefinerValues(); + + const [ + userIsAnApprover, + myApprovalsPanel, + approvalDialog, + openMyApprovalsPanel, + , + approveEvent, + rejectEvent + ] = useApprovals(); + + const [ + eventPanel, + newEvent, + displayEvent + ] = useEventPanel(anchorDate); + + const [ + refinerPanel, + newRefiner, + editRefiner + ] = useRefinerPanel(); + + const [ + userCanManageSettings, + settingsPanel, + configureApproversPanel, + editSettings + ] = useSettings(); + + const [ + copyLinkDialog, + getLink + ] = useCopyLinkDialog(); + + const { width } = useWindowSize(); + + const useSwipeInRefiners = width <= RefinerRailPanelDisplayBreakpoint; + const useRefinersRail = !useSwipeInRefiners; + + const [isRefinerRailExpanded, { setTrue: expandRail, setFalse: collapseRail }] = useBoolean(false); + const backEventListener = useMemo(() => new BackEventListener(collapseRail), [collapseRail]); + useEffect(() => { + return () => backEventListener.cleanup(); + }, [backEventListener]); + + const openRefinerRailPanel = useCallback(() => { + backEventListener.listenForBack(); + expandRail(); + }, [backEventListener, expandRail]); + + const dismissRefinerRailPanel = useCallback(() => { + backEventListener.cancelListeningForBack(); + collapseRail(); + }, [backEventListener, collapseRail]); + + const swipeHandler: SwipeEventListener = useCallback(({ detail }) => { + if (detail.dir === 'right') { + openRefinerRailPanel(); + } + }, [openRefinerRailPanel]); + + useExecuteEventDeepLink(displayEvent); + + const useRefiners = (currentUserIsSiteAdmin || hasRefiners) && config.useRefiners; + + const commandBarItems = useCallback((numberOfEventsNeedingApproval: number) => { + return ([ + { + key: 'new-event', + text: strings.Command_NewEvent.Text, + iconProps: { iconName: 'Add' }, + onClick: () => newEvent() + }, + userCanManageSettings && { + key: 'settings', + text: strings.Command_Settings.Text, + iconProps: { iconName: 'Settings' }, + onClick: () => editSettings() + }, + userIsAnApprover && { + key: 'approvals', + text: numberOfEventsNeedingApproval ? `${strings.Command_Approvals.Text} (${numberOfEventsNeedingApproval})` : strings.Command_Approvals.Text, + iconProps: { iconName: 'InboxCheck' }, + onClick: () => openMyApprovalsPanel() + } + ] as ICommandBarItemProps[]).filter(Boolean); + }, [userCanManageSettings, userIsAnApprover, newEvent, editSettings, openMyApprovalsPanel]); + + const events = useEventsService(); + const addEventToOutlook = (event: IEvent) => { events.addToOutlook(event.getExceptionOrEvent()); }; + const addEventSeriesToOutlook = (event: IEvent) => { events.addToOutlook(event.getSeriesMaster()); }; + + const eventCommands = useMemo(() => { + return { + view: displayEvent, + approve: approveEvent, + reject: rejectEvent, + addToOutlook: addEventToOutlook, + addSeriesToOutlook: addEventSeriesToOutlook, + getLink + } as IEventCommands; + }, [displayEvent, approveEvent, rejectEvent]); + + const viewCommands = useMemo(() => { + return { + setAnchorDate, + newEvent, + activateEvent: displayEvent + } as IViewCommands; + }, [setAnchorDate, newEvent]); + + + return <> + + {refiners => + {() => + + + {currentUserIsSiteAdmin && + + {strings.Command_AddRefiner.Text} + + } + + } + } + + + + {useRefiners && useRefinersRail && + + {collapseRail => + {refiners => + {() => + + + {strings.RefinerRailLabel} + + + + + + {currentUserIsSiteAdmin && + + {strings.Command_AddRefiner.Text} + + } + + } + }} + + + } + + {approvers => + {refiners => + {events => + + {events => + + {useRefiners && useSwipeInRefiners && + + } + + + } + + + + + + {cccurrences => + + } + + + } + } + } + + + + + + + + + + + ; +}; + +export default ViewRoute; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/Views.ts b/samples/react-rhythm-of-business-calendar/src/components/views/Views.ts new file mode 100644 index 000000000..107122db2 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/Views.ts @@ -0,0 +1,15 @@ +import { arrayToMap } from "common"; +import { IViewDescriptor } from "./IViewDescriptor"; +import { DayViewDescriptor } from "./day/DayView"; +import { WeekViewDescriptor } from "./week/WeekView"; +import { MonthViewDescriptor } from "./month/MonthView"; +import { QuarterViewDescriptor } from "./quarter/QuarterView"; + +export const ViewDescriptors: IViewDescriptor[] = [ + DayViewDescriptor, + WeekViewDescriptor, + MonthViewDescriptor, + QuarterViewDescriptor +]; + +export const ViewDescriptorsById = arrayToMap(ViewDescriptors, v => v.id); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/day/DayView.module.scss b/samples/react-rhythm-of-business-calendar/src/components/views/day/DayView.module.scss new file mode 100644 index 000000000..9472cc06d --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/day/DayView.module.scss @@ -0,0 +1,8 @@ +@import '../../common.module'; + +.event { + @include ms-depth-4; + margin: 10px; + padding: 15px 10px 15px 30px; + border-radius: 6px; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/day/DayView.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/day/DayView.tsx new file mode 100644 index 000000000..4607f31fb --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/day/DayView.tsx @@ -0,0 +1,95 @@ +import React, { FC } from 'react'; +import { FocusZone, IStackItemStyles, Separator, Stack, StackItem, Text } from '@fluentui/react'; +import { EventOccurrence, ViewKeys } from 'model'; +import { useEventCommandActionButtons, useWindowSize } from '../../hooks'; +import { EventOverview, IEventCommands } from '../../events'; +import { IViewDescriptor } from '../IViewDescriptor'; +import { IViewProps } from '../IViewProps'; + +import * as strings from 'ComponentStrings'; + +import styles from './DayView.module.scss'; + +const CommandOrientationBreakpoint = 1024; + +const eventOverviewStackItemStyles: IStackItemStyles = { + root: { minWidth: 0 } +}; + +const eventCommandsStackItemStyles: IStackItemStyles = { + root: { minWidth: 160 } +}; + +interface IEventCardProps { + occurrence: EventOccurrence; + commands: IEventCommands, +} + +const EventCard: FC = ({ occurrence, commands }) => { + const [ + viewCommand, + addToOutlookCommand, + getLinkCommand + ] = useEventCommandActionButtons(commands, occurrence); + + const { width } = useWindowSize(); + const layoutCommandsHorizontally = width <= CommandOrientationBreakpoint; + + return ( + + + + + + + + {viewCommand} + {addToOutlookCommand} + {getLinkCommand} + + + + ); +}; + +const DayView: FC = ({ + cccurrences, + eventCommands, +}) => { + if (cccurrences.length === 0) { + return {strings.DayView.NoEventsMessage} + } else { + const sortedEventOccurrences = [...cccurrences].sort(EventOccurrence.StartAscComparer); + + return ( + + {sortedEventOccurrences.map(occurrence => + + )} + + ); + } +}; + +export const DayViewDescriptor: IViewDescriptor = { + id: ViewKeys.daily, + title: strings.ViewNames.Day, + renderer: DayView, + dateRotatorController: { + previousIconProps: { iconName: 'ChevronLeft' }, + nextIconProps: { iconName: 'ChevronRight' }, + previousDate: date => date.clone().subtract(1, 'day'), + nextDate: date => date.clone().add(1, 'day'), + dateString: date => date.format('dddd, MMMM DD, YYYY') + }, + dateRange: (date) => { + return { + start: date.clone().startOf('day'), + end: date.clone().endOf('day') + }; + } +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/index.ts b/samples/react-rhythm-of-business-calendar/src/components/views/index.ts new file mode 100644 index 000000000..f952015ad --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/index.ts @@ -0,0 +1,6 @@ +export * from './Views'; +export { IDateRotatorController, useDataRotatorController } from './DateRotatorController'; +export { type IViewCommands } from './IViewCommands'; +export { default as ViewNav } from "./ViewNav"; +export { default as ViewRoute } from './ViewRoute'; +export { useView } from './useView'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/month/Builder.ts b/samples/react-rhythm-of-business-calendar/src/components/views/month/Builder.ts new file mode 100644 index 000000000..152d6bb28 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/month/Builder.ts @@ -0,0 +1,134 @@ +import { sumBy } from "lodash"; +import { Moment } from "moment-timezone"; +import { MomentRange } from "common"; +import { EventOccurrence } from 'model'; + +export class ItemInfo { + constructor( + public readonly duration: number, + ) { + } +} + +export class ShimItemInfo extends ItemInfo { +} + +export class EventItemInfo extends ItemInfo { + constructor( + duration: number, + public readonly startsInWeek: boolean, + public readonly endsInWeek: boolean, + public readonly cccurrence: EventOccurrence + ) { + super(duration); + } + + public get title() { return this.cccurrence.title; } + public get start() { return this.cccurrence.start; } + public get isAllDay() { return this.cccurrence.isAllDay; } + public get isPendingApproval() { return this.cccurrence.isPendingApproval; } + public get isRejected() { return this.cccurrence.isRejected; } + public get tag() { return this.cccurrence.tag; } + public get color() { return this.cccurrence.color; } + public get isRecurring() { return this.cccurrence.isRecurring; } + public get isConfidential() { return this.cccurrence.isConfidential; } +} + +export class ContentRowInfo { + public readonly items: ItemInfo[]; + + constructor( + private readonly _startDate: Moment, + private readonly _endDate: Moment + ) { + + this.items = []; + } + + public canInclude(cccurrence: EventOccurrence): boolean { + const startsInWeek = cccurrence.start.isSameOrAfter(this._startDate); + const startPosition = startsInWeek ? cccurrence.start.day() : 0; + return this.lastUsedPosition() <= startPosition; + } + + public include(cccurrence: EventOccurrence) { + const { start, end } = cccurrence; + const startsInWeek = start.isSameOrAfter(this._startDate); + const endsInWeek = end.isSameOrBefore(this._endDate); + const startPosition = startsInWeek ? start.day() : 0; + const endPosition = endsInWeek ? end.day() + 1 : 7; + const duration = endPosition - startPosition; + + const shimDuration = startPosition - this.lastUsedPosition(); + if (shimDuration > 0) { + this.items.push(new ShimItemInfo(shimDuration)); + } + + const item = new EventItemInfo(duration, startsInWeek, endsInWeek, cccurrence); + this.items.push(item); + } + + private lastUsedPosition(): number { + return sumBy(this.items, item => item.duration); + } +} + +export class WeekInfo { + public readonly contentRows: ContentRowInfo[] = []; + + constructor( + public readonly start: Moment, + public readonly end: Moment + ) { + } + + public include(cccurrence: EventOccurrence) { + if (MomentRange.overlaps(cccurrence, this)) { + let availableRow = this.contentRows.find(row => row.canInclude(cccurrence)); + + if (!availableRow) { + availableRow = new ContentRowInfo(this.start, this.end); + this.contentRows.push(availableRow); + } + + availableRow.include(cccurrence); + } + } +} + +export class Builder { + public static dateRange(anchorDate: Moment): MomentRange { + const start = anchorDate.clone().startOf('month').startOf('week'); + const end = anchorDate.clone().endOf('month').endOf('week'); + return { start, end }; + } + + public static build(cccurrences: readonly EventOccurrence[], anchorDate: Moment): WeekInfo[] { + const weeks = this._createWeeks(anchorDate); + this._fillWeeksWithEvents(weeks, cccurrences); + return weeks; + } + + private static _createWeeks(anchorDate: Moment): WeekInfo[] { + const weeks: WeekInfo[] = []; + + const { start, end } = Builder.dateRange(anchorDate); + const date = start; + + do { + const weekStart = date.clone(); + const weekEnd = date.clone().endOf('week'); + weeks.push(new WeekInfo(weekStart, weekEnd)); + date.add(1, 'week'); + } while (date.isBefore(end)); + + return weeks; + } + + private static _fillWeeksWithEvents(weeks: WeekInfo[], cccurrences: readonly EventOccurrence[]) { + const sortedEventOccurrences = [...cccurrences].sort(EventOccurrence.StartAscComparer); + for (const week of weeks) { + sortedEventOccurrences.forEach(occurrence => week.include(occurrence)); + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/month/ContentRow.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/month/ContentRow.tsx new file mode 100644 index 000000000..dcfe386a8 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/month/ContentRow.tsx @@ -0,0 +1,26 @@ +import React, { FC } from "react"; +import { Stack, StackItem } from "@fluentui/react"; +import { EventOccurrence } from "model"; +import { ContentRowInfo, EventItemInfo } from "./Builder"; +import { EventItem } from "./EventItem"; +import { ShimItem } from "./ShimItem"; +import { blockStyles } from './blockStyles'; + +import styles from './MonthView.module.scss'; + +interface IProps { + row: ContentRowInfo; + onActivate: (cccurrence: EventOccurrence, target: HTMLElement) => void; +} + +export const ContentRow: FC = ({ row: { items }, onActivate }) => + + {items.map((item, idx) => + + {item instanceof EventItemInfo + ? + : + } + + )} + \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/month/EventItem.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/month/EventItem.tsx new file mode 100644 index 000000000..ce52fa963 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/month/EventItem.tsx @@ -0,0 +1,30 @@ +import React, { FC, useCallback, useRef } from "react"; +import { EventOccurrence } from "model"; +import { EventBar, EventBarSize } from "../../events"; +import { EventItemInfo } from "./Builder"; + +interface IProps { + eventInfo: EventItemInfo; + onActivate: (cccurrence: EventOccurrence, target: HTMLElement) => void; +} + +export const EventItem: FC = ({ eventInfo, onActivate }) => { + const { cccurrence, startsInWeek, endsInWeek } = eventInfo; + + const root = useRef(); + + const onClick = useCallback(() => { + onActivate(cccurrence, root.current); + }, [cccurrence, root, onActivate]); + + return ( +
+ +
+ ); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/month/Header.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/month/Header.tsx new file mode 100644 index 000000000..f8ff324ce --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/month/Header.tsx @@ -0,0 +1,42 @@ +import { weekdays, weekdaysMin, weekdaysShort } from 'moment-timezone'; +import React, { FC } from "react"; +import { css, IStackItemStyles, IStackStyles, mergeStyleSets, Stack, StackItem, useTheme } from "@fluentui/react"; +import { blockStyles } from './blockStyles'; +import styles from './MonthView.module.scss'; + +export const Header: FC = () => { + const { palette: { neutralTertiary, neutralLight } } = useTheme(); + + const stackStyles: IStackStyles = { + root: { + borderBottom: '1px solid ' + neutralTertiary + } + }; + + const stackItemStylesFirstItem = mergeStyleSets( + blockStyles(1), { + root: { + } + } as IStackItemStyles + ); + + const stackItemStyles = mergeStyleSets( + blockStyles(1), { + root: { + borderLeft: '1px solid ' + neutralLight + } + } as IStackItemStyles + ); + + return <> + + {weekdays().map((name, idx) => 0 ? stackItemStyles : stackItemStylesFirstItem}>{name})} + + + {weekdaysShort().map((name, idx) => 0 ? stackItemStyles : stackItemStylesFirstItem}>{name})} + + + {weekdaysMin().map((name, idx) => 0 ? stackItemStyles : stackItemStylesFirstItem}>{name})} + + ; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/month/MonthView.module.scss b/samples/react-rhythm-of-business-calendar/src/components/views/month/MonthView.module.scss new file mode 100644 index 000000000..25aba6c8a --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/month/MonthView.module.scss @@ -0,0 +1,48 @@ +@import '../../common.module'; + +.header { + &.full { + @include hidden-md-down; + } + + &.short { + @include hidden-sm; + @include hidden-lg-up; + } + + &.min { + @include hidden-md-up; + } + + & > * { + @include ms-fontSize-12; + @include ms-fontWeight-semibold; + line-height: 30px; + text-align: center; + } +} + +.week { + position: relative; + padding-top: 22px; + padding-bottom: 2px; + min-height: 60px; + + .background { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + + .date { + &:not(:hover) .newEventButton { + display: none; + } + } + } + + .content { + position: relative; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/month/MonthView.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/month/MonthView.tsx new file mode 100644 index 000000000..7db0160e4 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/month/MonthView.tsx @@ -0,0 +1,53 @@ +import React, { FC, useCallback, useRef } from 'react'; +import { EventOccurrence, ViewKeys } from 'model'; +import { EventDetailsCallout, IEventDetailsCallout } from '../../events'; +import { IViewDescriptor } from '../IViewDescriptor'; +import { IViewProps } from '../IViewProps'; +import { Builder } from './Builder'; +import { Header } from './Header'; +import { Week } from './Week'; + +import { ViewNames as strings } from 'ComponentStrings'; +import { FocusZone } from '@fluentui/react'; + +const MonthView: FC = ({ anchorDate, eventCommands, viewCommands, cccurrences }) => { + const weeks = Builder.build(cccurrences, anchorDate); + const detailsCallout = useRef(); + + const onActivate = useCallback((cccurrence: EventOccurrence, target: HTMLElement) => { + detailsCallout.current?.open(cccurrence, target); + }, []); + + return ( + +
+ {weeks.map(week => + + )} + + + ); +}; + +export const MonthViewDescriptor: IViewDescriptor = { + id: ViewKeys.monthly, + title: strings.Month, + renderer: MonthView, + dateRotatorController: { + previousIconProps: { iconName: 'ChevronUp' }, + nextIconProps: { iconName: 'ChevronDown' }, + previousDate: date => date.clone().subtract(1, 'month'), + nextDate: date => date.clone().add(1, 'month'), + dateString: date => date.format('MMMM YYYY') + }, + dateRange: Builder.dateRange +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/month/ShimItem.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/month/ShimItem.tsx new file mode 100644 index 000000000..9df91cdf0 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/month/ShimItem.tsx @@ -0,0 +1,10 @@ +import React, { FC } from "react"; +import { StackItem } from "@fluentui/react"; +import { blockStyles } from './blockStyles'; + +interface IProps { + duration: number; +} + +export const ShimItem: FC = ({ duration }) => + diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/month/Week.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/month/Week.tsx new file mode 100644 index 000000000..533725e55 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/month/Week.tsx @@ -0,0 +1,34 @@ +import { Moment } from 'moment-timezone'; +import React, { CSSProperties, FC } from 'react'; +import { useTheme } from '@fluentui/react'; +import { EventOccurrence } from 'model'; +import { IViewCommands } from '../IViewCommands'; +import { WeekInfo } from './Builder'; +import { ContentRow } from './ContentRow'; +import { WeekBackground } from './WeekBackground'; + +import styles from './MonthView.module.scss'; + +interface IProps { + anchorDate: Moment; + week: WeekInfo; + onActivate: (cccurrence: EventOccurrence, target: HTMLElement) => void; + viewCommands: IViewCommands; +} + +export const Week: FC = ({ anchorDate, week, onActivate, viewCommands }) => { + const { palette: { neutralTertiary } } = useTheme(); + + const style: CSSProperties = { + borderBottom: '1px solid ' + neutralTertiary + }; + + return ( +
+ + {week.contentRows.map((row, idx) => + + )} +
+ ); +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/month/WeekBackground.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/month/WeekBackground.tsx new file mode 100644 index 000000000..81e89cf81 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/month/WeekBackground.tsx @@ -0,0 +1,120 @@ +import { Moment } from 'moment-timezone'; +import React, { FC, useMemo } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { ActionButton, css, FontSizes, FontWeights, IButtonProps, IButtonStyles, IconButton, IStackItemStyles, mergeStyleSets, Stack, StackItem, useTheme } from '@fluentui/react'; +import { MomentRange, now } from 'common'; +import { ViewKeys } from 'model'; +import { useWindowSize } from '../../hooks'; +import { IViewCommands } from '../IViewCommands'; +import { blockStyles } from './blockStyles'; + +import { MonthView as strings } from 'ComponentStrings'; + +import styles from './MonthView.module.scss'; + +const newEventButtonStyles: IButtonStyles = { + root: { + fontSize: 12, + height: 'unset' + }, + icon: { + fontSize: 12, + margin: '0 2px' + }, + label: { + margin: 0 + } +}; + +const enumerateDates = (startDate: Moment, endDate: Moment): Moment[] => { + const dates: Moment[] = []; + let date = startDate.clone(); + do { + dates.push(date); + date = date.clone().add(1, 'days'); + } while (date < endDate); + + return dates; +} + +interface IProps { + anchorDate: Moment; + range: MomentRange; + commands: IViewCommands; +} + +export const WeekBackground: FC = ({ anchorDate, commands: { newEvent, setAnchorDate }, range: { start, end } }) => { + const { palette: { themePrimary, themeDarkAlt, neutralLight, neutralLighterAlt }, semanticColors: { bodyBackground } } = useTheme(); + + const navigate = useNavigate(); + + return ( + + {enumerateDates(start, end).map((date, idx) => { + const dateIsInThisMonth = date.isSame(anchorDate, 'month'); + const includeMonthName = date.date() === 1 || (idx === 0 && !dateIsInThisMonth); + const isToday = date.isSame(now(), 'day'); + + const dateButtonStyles: IButtonStyles = { + root: { + color: dateIsInThisMonth ? themePrimary : themeDarkAlt, + fontSize: FontSizes.size10, + fontWeight: isToday ? FontWeights.bold : (dateIsInThisMonth ? FontWeights.semibold : FontWeights.regular), + height: 'unset', + padding: 0 + } + } + + const stackItemStyles = mergeStyleSets( + blockStyles(1), { + root: { + color: themePrimary, + backgroundColor: dateIsInThisMonth ? bodyBackground : neutralLighterAlt, + borderLeft: idx > 0 ? '1px solid ' + neutralLight : undefined, + borderTop: '3px solid ' + (isToday ? themePrimary : 'transparent'), + padding: '1px 8px 4px 8px' + } + } as IStackItemStyles + ); + + const onClickDate = () => { + setAnchorDate(date); + navigate(`/${ViewKeys.daily}`); + }; + + const onClickNewEvent = () => { + setAnchorDate(date); + newEvent(date); + }; + + const { width } = useWindowSize(); + + const newEventButtonProps: IButtonProps = useMemo(() => { + return { + className: css(styles.newEventButton, 'ms-motion-fadeIn'), + iconProps: { iconName: 'Add' }, + styles: newEventButtonStyles, + onClick: onClickNewEvent + }; + }, [onClickNewEvent]); + + return ( + + + + + {includeMonthName && <>{date.format("MMM")} } + {date.date()} + + + {width >= 640 + ? {strings.Command_NewEvent.Text} + : + } + + + ); + })} + + ); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/month/blockStyles.ts b/samples/react-rhythm-of-business-calendar/src/components/views/month/blockStyles.ts new file mode 100644 index 000000000..b1e532b0f --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/month/blockStyles.ts @@ -0,0 +1,6 @@ +import { memoize } from "lodash"; +import { IStackItemStyles } from "@fluentui/react"; + +export const blockStyles: (count: number) => IStackItemStyles = memoize(count => { + return { root: { width: (count / 7 * 100).toFixed(2) + '%' } }; +}); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/quarter/Builder.ts b/samples/react-rhythm-of-business-calendar/src/components/views/quarter/Builder.ts new file mode 100644 index 000000000..4674e982b --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/quarter/Builder.ts @@ -0,0 +1,124 @@ +import { Moment } from "moment-timezone"; +import { Entity, mapGetOrAdd, MomentRange, multifilter } from "common"; +import { Event, EventOccurrence, IEvent, Refiner, RefinerValue } from "model"; +import { Configuration } from "schema"; +import { getFiscalQuarter } from "./Utils"; + +import { Refiner as strings } from "ComponentStrings"; + +export class EventItemInfo { + constructor( + public readonly startsInMonth: boolean, + public readonly endsInMonth: boolean, + public readonly event: IEvent + ) { + } + + public get title() { return this.event.title; } + public get isPendingApproval() { return this.event.isPendingApproval; } + public get isRejected() { return this.event.isRejected; } + public get tag() { return this.event.tag; } + public get color() { return this.event.color; } + public get isRecurring() { return this.event.isRecurring; } + public get isConfidential() { return this.event.isConfidential; } +} + +export class RefinerValueInfo { + public readonly itemsByEvent = new Map(); + + constructor( + public readonly title: string, + private readonly _startDate: Moment, + private readonly _endDate: Moment + ) { + } + + public get eventCount() { + return this.itemsByEvent.size; + } + + public include(event: IEvent) { + const { start, end } = event; + const startsInMonth = start.isSameOrAfter(this._startDate); + const endsInMonth = end.isSameOrBefore(this._endDate); + + const item = new EventItemInfo(startsInMonth, endsInMonth, event); + const items = mapGetOrAdd(this.itemsByEvent, event.getWrappedEvent(), () => []); + items.push(item); + } +} + +export class MonthInfo { + public readonly blankValue: RefinerValueInfo; + public readonly refinerValues: Map; + + constructor( + public readonly start: Moment, + public readonly end: Moment, + public readonly refiner: Refiner | undefined + ) { + this.blankValue = new RefinerValueInfo(strings.Blank, start, end); + this.refinerValues = new Map(); + + if (refiner) { + refiner.values.filter(Entity.NotDeletedFilter).forEach(value => this.refinerValues.set(value, new RefinerValueInfo(value.displayName, start, end))); + } + } + + public include(event: IEvent) { + if (MomentRange.overlaps(event, this)) { + const refinerValues = multifilter(event.refinerValues.get(), Entity.NotDeletedFilter, rv => rv.refiner.get() === this.refiner); + if (refinerValues.length === 0) { + this.blankValue.include(event); + } else { + for (const value of refinerValues) { + const info = this.refinerValues.get(value); + info.include(event); + } + } + } + } +} + +export class Builder { + public static dateRange(anchorDate: Moment, { fiscalYearSartMonth }: Configuration): MomentRange { + const qtr = getFiscalQuarter(anchorDate, fiscalYearSartMonth); + const testPreviousMonths = [0, 1, 2].map(n => anchorDate.clone().subtract(n, 'months')).map(d => getFiscalQuarter(d, fiscalYearSartMonth)); + const testUpcomingMonths = [0, 1, 2].map(n => anchorDate.clone().add(n, 'months')).map(d => getFiscalQuarter(d, fiscalYearSartMonth)); + const startMonthOffset = testPreviousMonths.lastIndexOf(qtr); + const endMonthOffset = testUpcomingMonths.lastIndexOf(qtr); + + return { + start: anchorDate.clone().subtract(startMonthOffset, 'months').startOf('month'), + end: anchorDate.clone().add(endMonthOffset, 'months').endOf('month') + }; + } + + public static build(cccurrences: readonly EventOccurrence[], anchorDate: Moment, groupByRefiner: Refiner | undefined, config: Configuration): MonthInfo[] { + const range = Builder.dateRange(anchorDate, config); + const weeks = this._createMonths(range, groupByRefiner); + this._fillMonthsWithEvents(weeks, cccurrences); + return weeks; + } + + private static _createMonths({ start, end }: MomentRange, groupByRefiner: Refiner | undefined): MonthInfo[] { + const months: MonthInfo[] = []; + const date = start; + + do { + const monthStart = date.clone(); + const monthEnd = date.clone().endOf('month'); + months.push(new MonthInfo(monthStart, monthEnd, groupByRefiner)); + date.add(1, 'month'); + } while (date.isBefore(end)); + + return months; + } + + private static _fillMonthsWithEvents(months: MonthInfo[], cccurrences: readonly EventOccurrence[]) { + const sortedEventOccurrences = [...cccurrences].sort(EventOccurrence.StartAscComparer); + for (const month of months) { + sortedEventOccurrences.forEach(cccurrence => month.include(cccurrence)); + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/quarter/EventItem.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/quarter/EventItem.tsx new file mode 100644 index 000000000..ae1f1fbc6 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/quarter/EventItem.tsx @@ -0,0 +1,41 @@ +import { first, last } from "lodash"; +import React, { FC, useCallback, useRef } from "react"; +import { IEvent } from "model"; +import { EventBar, EventBarSize } from "../../events"; +import { EventItemInfo } from "./Builder"; + +import { QuarterView as strings } from "ComponentStrings"; + +interface IProps { + eventInfos: EventItemInfo[]; + onActivate: (event: IEvent, target: HTMLElement) => void; +} + +export const EventItem: FC = ({ eventInfos, onActivate }) => { + const { event, startsInMonth, isRecurring } = first(eventInfos); + const { endsInMonth } = last(eventInfos); + const { start, isAllDay } = event; + + const startTimeString = eventInfos.length > 1 + ? strings.MultipleOccurrences + : start.format(isAllDay ? 'ddd D' : 'ddd D LT'); + + const root = useRef(); + + const onClick = useCallback(() => { + const eventToActivate = eventInfos.length > 1 ? event.getSeriesMaster() : event; + onActivate(eventToActivate, root.current); + }, [isRecurring, eventInfos, event, root, onActivate]); + + return ( +
+ +
+ ); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/quarter/Month.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/quarter/Month.tsx new file mode 100644 index 000000000..7eeace60b --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/quarter/Month.tsx @@ -0,0 +1,68 @@ +import { Moment } from 'moment-timezone'; +import React, { FC } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { ActionButton, FocusZone, FontSizes, FontWeights, IStackItemStyles, Stack, StackItem, useTheme } from '@fluentui/react'; +import { useConst } from '@fluentui/react-hooks'; +import { Entity } from 'common'; +import { EventOccurrence, RefinerValue, ViewKeys } from 'model'; +import { IViewCommands } from '../IViewCommands'; +import { MonthInfo } from './Builder'; +import { RefinerValueEvents } from './RefinerValueEvents'; + +interface IProps { + anchorDate: Moment; + month: MonthInfo; + columnWidth: number; + selectedRefinerValues: Set; + onActivate: (cccurrence: EventOccurrence, target: HTMLElement) => void; + viewCommands: IViewCommands; +} + +export const Month: FC = ({ + month: { refiner, refinerValues, start, blankValue }, + columnWidth, + selectedRefinerValues, + onActivate, + viewCommands: { setAnchorDate } +}) => { + const navigate = useNavigate(); + const { palette: { themeDarkAlt, neutralLighter, neutralPrimary } } = useTheme(); + + const onClickMonth = () => { + setAnchorDate(start); + navigate(`/${ViewKeys.monthly}`); + }; + + const styles: IStackItemStyles = { root: { width: `${columnWidth}%`, paddingBottom: 10 } }; + + return ( + +
+ + {start.format("MMMM")} + +
+ + {(!refiner || selectedRefinerValues.has(refiner.blankValue) || (refiner.required && blankValue.eventCount > 0)) && + + + + } + {refiner && refiner.values.filter(Entity.NotDeletedFilter).filter(value => selectedRefinerValues.has(value)).map(value => refinerValues.get(value)).map((value, idx) => + + + + )} + +
+ ); +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/quarter/QuarterView.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/quarter/QuarterView.tsx new file mode 100644 index 000000000..b8f6f027b --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/quarter/QuarterView.tsx @@ -0,0 +1,79 @@ +import { clamp } from 'lodash'; +import React, { FC, useCallback, useRef } from 'react'; +import { IStackItemStyles, Stack, StackItem } from '@fluentui/react'; +import { Entity, multifilter } from 'common'; +import { EventOccurrence, ViewKeys } from 'model'; +import { useConfigurationService } from 'services'; +import { useWindowSize } from '../../hooks'; +import { EventDetailsCallout, IEventDetailsCallout } from '../../events'; +import { IViewDescriptor } from '../IViewDescriptor'; +import { IViewProps } from '../IViewProps'; +import { Builder } from './Builder'; +import { Month } from './Month'; +import { getFiscalQuarter, getFiscalYear } from './Utils'; + +import { ViewNames as strings } from 'ComponentStrings'; + +const QuarterView: FC = ({ anchorDate, cccurrences, refiners, selectedRefinerValues, viewCommands, eventCommands }) => { + const { active: config } = useConfigurationService(); + + const groupByRefiner = config.useRefiners ? refiners.find(r => r.id === config.quarterViewGroupByRefinerId) : undefined; + const months = Builder.build(cccurrences, anchorDate, groupByRefiner, config); + + const detailsCallout = useRef(); + + const onActivate = useCallback((cccurrence: EventOccurrence, target: HTMLElement) => { + detailsCallout.current?.open(cccurrence, target); + }, []); + + const { width } = useWindowSize(); + const columns = width < 640 ? 1 : (width < 1024 ? 2 : (width < 1366 ? 4 : 6)); + const refinerCount = groupByRefiner + ? (multifilter([groupByRefiner.blankValue, ...groupByRefiner.values.get()], Entity.NotDeletedFilter, v => selectedRefinerValues.has(v))).length + : 1; + const monthWidth = 100 / clamp(Math.floor(columns / refinerCount), 1, 3); + const columnWidth = 100 * Math.max(1 / refinerCount, 1 / columns); + + const styles: IStackItemStyles = { root: { width: `${monthWidth}%`, paddingBottom: 25 } }; + + return ( +
+ + {months.map(month => + + + + )} + + +
+ ); +}; + +export const QuarterViewDescriptor: IViewDescriptor = { + id: ViewKeys.quarter, + title: strings.Quarter, + renderer: QuarterView, + dateRotatorController: { + previousIconProps: { iconName: 'ChevronUp' }, + nextIconProps: { iconName: 'ChevronDown' }, + previousDate: date => date.clone().subtract(3, 'months'), + nextDate: date => date.clone().add(3, 'months'), + dateString: (date, { fiscalYearSartMonth }) => { + const fy = getFiscalYear(date, fiscalYearSartMonth); + const qtr = getFiscalQuarter(date, fiscalYearSartMonth); + return `FY${fy} Q${qtr}`; + } + }, + dateRange: Builder.dateRange +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/quarter/RefinerValueEvents.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/quarter/RefinerValueEvents.tsx new file mode 100644 index 000000000..bc89c3c66 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/quarter/RefinerValueEvents.tsx @@ -0,0 +1,33 @@ +import React, { FC } from "react"; +import { FontWeights, IStackItemStyles, ITextStyles, Stack, StackItem, Text } from "@fluentui/react"; +import { useConst } from "@fluentui/react-hooks"; +import { EventOccurrence } from "model"; +import { RefinerValueInfo } from "./Builder"; +import { EventItem } from "./EventItem"; + +import { QuarterView as strings } from "ComponentStrings"; + +interface IProps { + showTitle?: boolean; + refinerValue: RefinerValueInfo; + onActivate: (cccurrence: EventOccurrence, target: HTMLElement) => void; +} + +export const RefinerValueEvents: FC = ({ showTitle = false, refinerValue: { title, itemsByEvent }, onActivate }) => { + const titleStyles: ITextStyles = useConst({ root: { margin: '5px 0', fontWeight: FontWeights.semibold } }); + const eventItemStyles: IStackItemStyles = useConst({ root: { marginRight: 10 } }); + + return <> + {showTitle && {title}} + + {itemsByEvent.size === 0 && + {strings.NoEventsMessage} + } + {[...itemsByEvent.values()].map((items, idx) => + + + + )} + + ; +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/quarter/Utils.ts b/samples/react-rhythm-of-business-calendar/src/components/views/quarter/Utils.ts new file mode 100644 index 000000000..393389610 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/quarter/Utils.ts @@ -0,0 +1,7 @@ +import { Moment } from "moment-timezone" + +export const getFiscalYear = (date: Moment, fiscalYearSartMonth: number): string => + (date.month() >= fiscalYearSartMonth ? date.clone().add(1, 'year') : date).format('YY') + +export const getFiscalQuarter = (date: Moment, fiscalYearSartMonth: number) => + Math.floor((date.month() + 12 - fiscalYearSartMonth) % 12 / 3) + 1 diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/useView.ts b/samples/react-rhythm-of-business-calendar/src/components/views/useView.ts new file mode 100644 index 000000000..9454ba33c --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/useView.ts @@ -0,0 +1,8 @@ +import { DefaultViewKey, ViewKeys } from "model"; +import { useParams } from "react-router"; +import { ViewDescriptorsById } from "./Views"; + +export const useView = () => { + const { view } = useParams(); + return ViewDescriptorsById.get(view as ViewKeys) || ViewDescriptorsById.get(DefaultViewKey); +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/week/Background.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/week/Background.tsx new file mode 100644 index 000000000..a67b8b8ff --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/week/Background.tsx @@ -0,0 +1,120 @@ +import { Moment } from 'moment-timezone'; +import React, { FC, useMemo } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { ActionButton, css, FontSizes, FontWeights, IButtonProps, IButtonStyles, IconButton, IStackItemStyles, mergeStyleSets, Stack, StackItem, useTheme } from '@fluentui/react'; +import { MomentRange, now } from 'common'; +import { ViewKeys } from 'model'; +import { useWindowSize } from '../../hooks'; +import { IViewCommands } from '../IViewCommands'; +import { blockStyles } from './blockStyles'; + +import { WeekView as strings } from 'ComponentStrings'; + +import styles from './WeekView.module.scss'; + +const newEventButtonStyles: IButtonStyles = { + root: { + fontSize: 12, + height: 'unset' + }, + icon: { + fontSize: 12, + margin: '0 2px' + }, + label: { + margin: 0 + } +}; + +const enumerateDates = (startDate: Moment, endDate: Moment): Moment[] => { + const dates: Moment[] = []; + let date = startDate.clone(); + do { + dates.push(date); + date = date.clone().add(1, 'days'); + } while (date < endDate); + + return dates; +} + +interface IProps { + anchorDate: Moment; + range: MomentRange; + commands: IViewCommands; +} + +export const Background: FC = ({ anchorDate, commands: { newEvent, setAnchorDate }, range: { start, end } }) => { + const { palette: { themePrimary, neutralLight, neutralLighterAlt }, semanticColors: { bodyBackground } } = useTheme(); + + const navigate = useNavigate(); + + return ( + + {enumerateDates(start, end).map((date, idx) => { + const dateIsInThisMonth = date.isSame(anchorDate, 'month'); + const includeMonthName = date.date() === 1 || idx === 0; + const isToday = date.isSame(now(), 'day'); + + const dateButtonStyles: IButtonStyles = { + root: { + color: themePrimary, + fontSize: FontSizes.size10, + fontWeight: isToday ? FontWeights.bold : (dateIsInThisMonth ? FontWeights.semibold : FontWeights.regular), + height: 'unset', + padding: 0 + } + } + + const stackItemStyles = mergeStyleSets( + blockStyles(1), { + root: { + color: themePrimary, + backgroundColor: dateIsInThisMonth ? bodyBackground : neutralLighterAlt, + borderLeft: idx > 0 ? '1px solid ' + neutralLight : undefined, + borderTop: '3px solid ' + (isToday ? themePrimary : 'transparent'), + padding: '1px 8px 4px 8px' + } + } as IStackItemStyles + ); + + const onClickDate = () => { + setAnchorDate(date); + navigate(`/${ViewKeys.daily}`); + }; + + const onClickNewEvent = () => { + setAnchorDate(date); + newEvent(date); + }; + + const { width } = useWindowSize(); + + const newEventButtonProps: IButtonProps = useMemo(() => { + return { + className: css(styles.newEventButton, 'ms-motion-fadeIn'), + iconProps: { iconName: 'Add' }, + styles: newEventButtonStyles, + onClick: onClickNewEvent + }; + }, [onClickNewEvent]); + + return ( + + + + + {includeMonthName && <>{date.format("MMM")} } + {date.date()} + + + {width >= 640 + ? {strings.Command_NewEvent.Text} + : + } + + + ); + })} + + ); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/week/Builder.ts b/samples/react-rhythm-of-business-calendar/src/components/views/week/Builder.ts new file mode 100644 index 000000000..4eaa94709 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/week/Builder.ts @@ -0,0 +1,101 @@ +import { sumBy } from "lodash"; +import { Moment } from "moment-timezone"; +import { MomentRange } from "common"; +import { EventOccurrence } from 'model'; + +export class ItemInfo { + constructor( + public readonly duration: number, + ) { + } +} + +export class ShimItemInfo extends ItemInfo { +} + +export class EventItemInfo extends ItemInfo { + constructor( + duration: number, + public readonly startsInWeek: boolean, + public readonly endsInWeek: boolean, + public readonly cccurrence: EventOccurrence + ) { + super(duration); + } + + public get title() { return this.cccurrence.title; } + public get isPendingApproval() { return this.cccurrence.isPendingApproval; } + public get isRejected() { return this.cccurrence.isRejected; } + public get tag() { return this.cccurrence.tag; } + public get color() { return this.cccurrence.color; } + public get isRecurring() { return this.cccurrence.isRecurring; } + public get isConfidential() { return this.cccurrence.isConfidential; } +} + +export class ContentRowInfo { + public readonly items: ItemInfo[]; + + constructor( + private readonly _startDate: Moment, + private readonly _endDate: Moment + ) { + + this.items = []; + } + + public canInclude(cccurrence: EventOccurrence): boolean { + const startsInWeek = cccurrence.start.isSameOrAfter(this._startDate); + const startPosition = startsInWeek ? cccurrence.start.day() : 0; + return this.lastUsedPosition() <= startPosition; + } + + public include(cccurrence: EventOccurrence) { + const { start, end } = cccurrence; + const startsInWeek = start.isSameOrAfter(this._startDate); + const endsInWeek = end.isSameOrBefore(this._endDate); + const startPosition = startsInWeek ? start.day() : 0; + const endPosition = endsInWeek ? end.day() + 1 : 7; + const duration = endPosition - startPosition; + + const shimDuration = startPosition - this.lastUsedPosition(); + if (shimDuration > 0) { + this.items.push(new ShimItemInfo(shimDuration)); + } + + const item = new EventItemInfo(duration, startsInWeek, endsInWeek, cccurrence); + this.items.push(item); + } + + private lastUsedPosition(): number { + return sumBy(this.items, item => item.duration); + } +} + +export class Builder { + public static dateRange(anchorDate: Moment): MomentRange { + const start = anchorDate.clone().startOf('week'); + const end = anchorDate.clone().endOf('week'); + return { start, end }; + } + + public static build(cccurrences: readonly EventOccurrence[], anchorDate: Moment): ContentRowInfo[] { + const contentRows: ContentRowInfo[] = []; + + const { start, end } = Builder.dateRange(anchorDate); + + const sortedEventOccurrences = [...cccurrences].sort(EventOccurrence.StartAscComparer); + + for (const cccurrence of sortedEventOccurrences) { + let availableRow = contentRows.find(row => row.canInclude(cccurrence)); + + if (!availableRow) { + availableRow = new ContentRowInfo(start, end); + contentRows.push(availableRow); + } + + availableRow.include(cccurrence); + } + + return contentRows; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/week/ContentRow.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/week/ContentRow.tsx new file mode 100644 index 000000000..fcbf9df0a --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/week/ContentRow.tsx @@ -0,0 +1,26 @@ +import React, { FC } from "react"; +import { Stack, StackItem } from "@fluentui/react"; +import { IViewCommands } from "../IViewCommands"; +import { ContentRowInfo, EventItemInfo } from "./Builder"; +import { EventItem } from "./EventItem"; +import { ShimItem } from "./ShimItem"; +import { blockStyles } from './blockStyles'; + +import styles from './WeekView.module.scss'; + +interface IProps { + row: ContentRowInfo; + commands: IViewCommands; +} + +export const ContentRow: FC = ({ row: { items }, commands }) => + + {items.map((item, idx) => + + {item instanceof EventItemInfo + ? + : + } + + )} + \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/week/EventItem.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/week/EventItem.tsx new file mode 100644 index 000000000..f3b4a5e86 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/week/EventItem.tsx @@ -0,0 +1,28 @@ +import React, { FC, useCallback } from "react"; +import { EventBar, EventBarSize } from "../../events"; +import { IViewCommands } from "../IViewCommands"; +import { EventItemInfo } from "./Builder"; + +interface IProps { + eventInfo: EventItemInfo; + commands: IViewCommands; +} + +export const EventItem: FC = ({ eventInfo, commands: { activateEvent } }) => { + const { cccurrence, startsInWeek, endsInWeek } = eventInfo; + + const onClick = useCallback(() => { + activateEvent(cccurrence); + }, [cccurrence, activateEvent]); + + return ( +
+ +
+ ); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/week/Header.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/week/Header.tsx new file mode 100644 index 000000000..5db3c5bf4 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/week/Header.tsx @@ -0,0 +1,42 @@ +import { weekdays, weekdaysMin, weekdaysShort } from 'moment-timezone'; +import React, { FC } from "react"; +import { css, IStackItemStyles, IStackStyles, mergeStyleSets, Stack, StackItem, useTheme } from "@fluentui/react"; +import { blockStyles } from './blockStyles'; +import styles from './WeekView.module.scss'; + +export const Header: FC = () => { + const { palette: { neutralTertiary, neutralLight } } = useTheme(); + + const stackStyles: IStackStyles = { + root: { + borderBottom: '1px solid ' + neutralTertiary + } + }; + + const stackItemStylesFirstItem = mergeStyleSets( + blockStyles(1), { + root: { + } + } as IStackItemStyles + ); + + const stackItemStyles = mergeStyleSets( + blockStyles(1), { + root: { + borderLeft: '1px solid ' + neutralLight + } + } as IStackItemStyles + ); + + return <> + + {weekdays().map((name, idx) => 0 ? stackItemStyles : stackItemStylesFirstItem}>{name})} + + + {weekdaysShort().map((name, idx) => 0 ? stackItemStyles : stackItemStylesFirstItem}>{name})} + + + {weekdaysMin().map((name, idx) => 0 ? stackItemStyles : stackItemStylesFirstItem}>{name})} + + ; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/week/ShimItem.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/week/ShimItem.tsx new file mode 100644 index 000000000..9df91cdf0 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/week/ShimItem.tsx @@ -0,0 +1,10 @@ +import React, { FC } from "react"; +import { StackItem } from "@fluentui/react"; +import { blockStyles } from './blockStyles'; + +interface IProps { + duration: number; +} + +export const ShimItem: FC = ({ duration }) => + diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/week/WeekView.module.scss b/samples/react-rhythm-of-business-calendar/src/components/views/week/WeekView.module.scss new file mode 100644 index 000000000..3b70fbbd2 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/week/WeekView.module.scss @@ -0,0 +1,90 @@ +@import '../../common.module'; + +$eventBorderRadius: 6px; + +@mixin event-font() { + color: white; + @include ms-fontSize-12; + line-height: 16px; + overflow: hidden; + white-space: nowrap; +} + +.header { + &.full { + @include hidden-md-down; + } + + &.short { + @include hidden-sm; + @include hidden-lg-up; + } + + &.min { + @include hidden-md-up; + } + + & > * { + @include ms-fontSize-12; + @include ms-fontWeight-semibold; + line-height: 30px; + text-align: center; + } +} + +.week { + position: relative; + padding-top: 22px; + padding-bottom: 2px; + min-height: 60px; + + .background { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + + .date { + &:not(:hover) .newEventButton { + display: none; + } + } + } + + .content { + position: relative; + } +} + +.event { + @include event-font(); + margin-top: 1px; + padding: 1px 6px 2px 6px; + cursor: pointer; + + &.unapproved { + font-style: italic; + } + + &.rejected { + text-decoration: line-through; + } + + &.startsInWeek { + border-top-left-radius: $eventBorderRadius; + border-bottom-left-radius: $eventBorderRadius; + } + + &.endsInWeek { + border-top-right-radius: $eventBorderRadius; + border-bottom-right-radius: $eventBorderRadius; + margin-right: 1px; + } + + .title { + @include event-font(); + text-overflow: ellipsis; + margin-right: 6px; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/week/WeekView.tsx b/samples/react-rhythm-of-business-calendar/src/components/views/week/WeekView.tsx new file mode 100644 index 000000000..48aa6ee66 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/week/WeekView.tsx @@ -0,0 +1,62 @@ +import React, { CSSProperties, FC } from 'react'; +import { FocusZone, useTheme } from '@fluentui/react'; +import { ViewKeys } from 'model'; +import { IViewDescriptor } from '../IViewDescriptor'; +import { IViewProps } from '../IViewProps'; +import { Builder } from './Builder'; +import { Background } from './Background'; +import { ContentRow } from './ContentRow'; +import { Header } from './Header'; + +import { ViewNames as strings } from 'ComponentStrings'; + +import styles from './WeekView.module.scss'; + +const WeekView: FC = ({ anchorDate, viewCommands, cccurrences }) => { + const range = Builder.dateRange(anchorDate); + const contentRows = Builder.build(cccurrences, anchorDate); + + const { palette: { neutralTertiary } } = useTheme(); + + const style: CSSProperties = { + borderBottom: '1px solid ' + neutralTertiary + }; + + return ( + +
+
+ + {contentRows.map((row, idx) => + + )} +
+ + ); +}; + +export const WeekViewDescriptor: IViewDescriptor = { + id: ViewKeys.weekly, + title: strings.Week, + renderer: WeekView, + dateRotatorController: { + previousIconProps: { iconName: 'ChevronLeft' }, + nextIconProps: { iconName: 'ChevronRight' }, + previousDate: date => date.clone().subtract(1, 'week'), + nextDate: date => date.clone().add(1, 'week'), + dateString: date => { + const startOfWeek = date.clone().startOf('week'); + const endOfWeek = date.clone().endOf('week'); + if (startOfWeek.isSame(endOfWeek, 'year')) { + if (startOfWeek.isSame(endOfWeek, 'month')) { + return `${startOfWeek.format('MMM DD')} - ${endOfWeek.format('DD, YYYY')}`; + } else { + return `${startOfWeek.format('MMM DD')} - ${endOfWeek.format('MMM DD, YYYY')}`; + } + } else { + return `${startOfWeek.format('MMM DD, YYYY')} - ${endOfWeek.format('MMM DD, YYYY')}`; + } + } + }, + dateRange: Builder.dateRange +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/components/views/week/blockStyles.ts b/samples/react-rhythm-of-business-calendar/src/components/views/week/blockStyles.ts new file mode 100644 index 000000000..b1e532b0f --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/components/views/week/blockStyles.ts @@ -0,0 +1,6 @@ +import { memoize } from "lodash"; +import { IStackItemStyles } from "@fluentui/react"; + +export const blockStyles: (count: number) => IStackItemStyles = memoize(count => { + return { root: { width: (count / 7 * 100).toFixed(2) + '%' } }; +}); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/index.ts b/samples/react-rhythm-of-business-calendar/src/index.ts new file mode 100644 index 000000000..be63fad80 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/index.ts @@ -0,0 +1 @@ +export * from './webparts/rhythmOfBusinessCalendar/RhythmOfBusinessCalendarWebPart'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/model/Approvers.ts b/samples/react-rhythm-of-business-calendar/src/model/Approvers.ts new file mode 100644 index 000000000..f99f8fe83 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/model/Approvers.ts @@ -0,0 +1,91 @@ +import { intersection } from 'lodash'; +import { Moment } from 'moment-timezone'; +import { Guid } from '@microsoft/sp-core-library'; +import { groupBy, IManyToManyRelationship, ManyToManyRelationship, MaxLengthValidationRule, RequiredValidationRule, User, ValidationRule } from 'common'; +import { ListItemEntity } from "common/sharepoint"; +import { RefinerValue } from './RefinerValue'; +import { Refiner } from './Refiner'; + +interface IState { + users: User[]; + includeInApprovalEmail: boolean; +} + +export class Approvers extends ListItemEntity { + public static readonly TitleValidations = [ + new RequiredValidationRule(e => e.title), + new MaxLengthValidationRule(e => e.title, 255) + ]; + public static readonly UsersValidations = [ + new RequiredValidationRule(e => e.users) + ]; + + public static appliesTo(approvers: Approvers, eventValuesByRefiner: Map): boolean { + const { refinerValuesByRefiner: approverValuesByRefiner } = approvers; + return [...approverValuesByRefiner.keys()].every(refiner => { + const approverValues = approverValuesByRefiner.get(refiner); + const eventValues = eventValuesByRefiner.get(refiner); + return intersection(approverValues, eventValues).length > 0; + }); + } + + public static appliesToAny(approvers: Approvers[], eventValuesByRefiner: Map): boolean { + return approvers.some(a => Approvers.appliesTo(a, eventValuesByRefiner)); + } + + constructor(author?: User, editor?: User, created?: Moment, modified?: Moment, id?: number, uniqueId?: Guid, etag?: number) { + super(author, editor, created, modified, id, uniqueId, etag); + + this.users = []; + this.includeInApprovalEmail = true; + + this.refinerValues = ManyToManyRelationship.create(this, 'approvers'); + this.includeInBoundedContext(this.refinerValues); + } + + public readonly refinerValues: IManyToManyRelationship; + + private _refinerValuesByRefiner: Map = undefined; + public get refinerValuesByRefiner() { + return (this._refinerValuesByRefiner = this._refinerValuesByRefiner || + groupBy(this.refinerValues.get(), value => value.refiner.get()) + ); + } + + public hasChanges(specificProperty?: string | number | symbol): boolean { + if (specificProperty) + return super.hasChanges(specificProperty); + else + return super.hasChanges() || this.refinerValues.hasChanges(); + } + + public immortalize() { + this._refinerValuesByRefiner = undefined; + super.immortalize(); + } + + public endLiveUpdate() { + this._refinerValuesByRefiner = undefined; + super.endLiveUpdate(); + } + + public get users(): User[] { return this.state.users; } + public set users(val: User[]) { this.state.users = val; } + + public get includeInApprovalEmail(): boolean { return this.state.includeInApprovalEmail; } + public set includeInApprovalEmail(val: boolean) { this.state.includeInApprovalEmail = val; } + + public userIsAnApprover(user: User): boolean { + return this.users.some(u => User.equal(u, user)); + } + + protected validationRules(): ValidationRule[] { + return [ + ...Approvers.TitleValidations, + ...Approvers.UsersValidations + ]; + } +} + +export type ApproversMap = Map; +export type ReadonlyApproversMap = ReadonlyMap; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/model/Cadence.ts b/samples/react-rhythm-of-business-calendar/src/model/Cadence.ts new file mode 100644 index 000000000..893c46d14 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/model/Cadence.ts @@ -0,0 +1,291 @@ +import { min, Moment } from "moment-timezone"; +import { MomentRange } from "common"; +import { DailyRecurrence, MonthlyRecurrence, RecurDay, RecurPattern, RecurPatternOption, Recurrence, RecurUntilType, RecurWeekOfMonth, WeeklyRecurrence, YearlyRecurrence } from "./Recurrence"; + +const isWeekend = (date: Moment): boolean => + date.day() === 0 || date.day() === 6 + +const thisOrPreviousWeekday = (date: Moment): void => { + while (isWeekend(date)) + date.subtract(1, 'day'); +} + +const thisOrNextWeekday = (date: Moment): void => { + while (isWeekend(date)) + date.add(1, 'day'); +} + +const thisOrPreviousWeekendDay = (date: Moment): void => { + while (!isWeekend(date)) + date.subtract(1, 'day'); +} + +const thisOrNextWeekendDay = (date: Moment): void => { + while (!isWeekend(date)) + date.add(1, 'day'); +} + +const gotoDateByRecurDay = (current: Moment, weekOf: RecurWeekOfMonth, recurDay: RecurDay) => { + switch (recurDay) { + case RecurDay.day: { + if (weekOf === RecurWeekOfMonth.last) + current.endOf('month'); + else + current.date(weekOf + 1); + + break; + } + case RecurDay.weekday: { + if (weekOf === RecurWeekOfMonth.last) { + current.endOf('month'); + thisOrPreviousWeekday(current); + } else { + current.startOf('month'); + thisOrNextWeekday(current); + + for (let i = 0; i < weekOf; i++) { + current.add(1, 'day'); + thisOrNextWeekday(current); + } + } + + break; + } + case RecurDay.weekend: { + if (weekOf === RecurWeekOfMonth.last) { + current.endOf('month'); + thisOrPreviousWeekendDay(current); + } else { + current.startOf('month'); + thisOrNextWeekendDay(current); + + for (let i = 0; i < weekOf; i++) { + current.add(1, 'day'); + thisOrNextWeekendDay(current); + } + } + + break; + } + default: { + if (weekOf === RecurWeekOfMonth.last) current.add(1, 'month'); + const month = current.month(); + current.startOf('month'); + current.day(recurDay); // sets the date to be the specified day of the week within the current Sunday-Saturday week + if (current.month() < month) current.add(1, 'week'); // if that moved the date backwards to the previous month, add a week to move forward to the current month + current.add(weekOf === RecurWeekOfMonth.last ? -1 : weekOf, 'weeks'); + } + } +} + +interface ICadenceGenerator { + generate(start: Moment): Generator; +} + +class DailyCadenceGenerator implements ICadenceGenerator { + constructor( + private readonly _daily: DailyRecurrence, + ) { } + + public *generate(start: Moment): Generator { + const { every, weekdaysOnly } = this._daily; + const current = start.clone(); + + while (true) { + if (weekdaysOnly) { + if (current.day() === 0) + current.add(1, 'day'); // Sunday, add 1 day + + if (current.day() === 6) + current.add(2, 'days'); // Saturday, add 2 days + } + + yield current.clone(); + + current.add(weekdaysOnly ? 1 : every, 'days'); + } + } +} + +class WeeklyCadenceGenerator implements ICadenceGenerator { + constructor( + private readonly _weekly: WeeklyRecurrence, + ) { } + + public *generate(start: Moment): Generator { + const { days, every } = this._weekly; + const current = start.clone(); + + let d = current.weekday(); + + while (true) { + do { + if (days[d]) { + yield current.clone(); + } + + current.add(1, 'day'); + d++; + } while (d < days.length); + + d = 0; + current.add(every - 1, 'weeks'); + } + } +} + +class MonthlyByDateCadenceGenerator implements ICadenceGenerator { + constructor( + private readonly _monthly: MonthlyRecurrence, + ) { } + + public *generate(start: Moment): Generator { + const { byDate: { date }, every } = this._monthly; + const current = start.clone(); + + if (date < current.date()) + current.add(every, 'months'); + + while (true) { + const monthTemp = current.month(); + + current.date(date); + + if (current.month() > monthTemp) { + current.startOf('month').subtract(1, 'day'); + } + + yield current.clone(); + + current.add(every, 'months'); + } + } +} + +class MonthlyByDayCadenceGenerator implements ICadenceGenerator { + constructor( + private readonly _monthly: MonthlyRecurrence, + ) { } + + public *generate(start: Moment): Generator { + const { byDay: { day, weekOf }, every } = this._monthly; + const current = start.clone(); + + while (true) { + gotoDateByRecurDay(current, weekOf, day); + + if (current.isSameOrAfter(start)) + yield current.clone(); + + current.add(every, 'months'); + } + } +} + +class YearlyByDateCadenceGenerator implements ICadenceGenerator { + constructor( + private readonly _yearly: YearlyRecurrence, + ) { } + + public *generate(start: Moment): Generator { + const { byDate: { date }, month, every } = this._yearly; + const current = start.clone(); + + if (month < current.month() || (month === current.month() && date < current.date())) + current.add(every, 'years'); + + while (true) { + current.month(month); + current.date(date); + + if (current.month() > month) { + current.startOf('month').subtract(1, 'day'); + } + + yield current.clone(); + + current.add(every, 'years'); + } + } +} + +class YearlyByDayCadenceGenerator implements ICadenceGenerator { + constructor( + private readonly _yearly: YearlyRecurrence, + ) { } + + public *generate(start: Moment): Generator { + const { byDay: { day, weekOf }, month, every } = this._yearly; + const current = start.clone(); + + while (true) { + current.month(month); + + gotoDateByRecurDay(current, weekOf, day); + + if (current.isSameOrAfter(start)) + yield current.clone(); + + current.add(every, 'years'); + } + } +} + +export class Cadence { + constructor( + private readonly _start: Moment, + private readonly _recurrence: Recurrence + ) { } + + public *generate(range?: MomentRange): Generator { + range ||= { start: this._start?.clone(), end: this._start?.clone().add(3, 'years') }; + + if (!range.start?.isValid() || !range.end?.isValid()) + return; + + const { until } = this._recurrence; + + const generator = this._createGenerator(); + const dates = generator.generate(this._start); + let count = 0; + + const end = (until.type === RecurUntilType.date && until.date?.isValid()) + ? min(range.end, until.date) + : range.end; + + do { + const { done, value: date } = dates.next(); + + if (done || !date.isValid() || date.isAfter(end, 'day')) + break; + + if (date.isSameOrAfter(range.start, 'day')) + yield date; + + count++; + } while (until.type !== RecurUntilType.count || count < until.count); + } + + private _createGenerator(): ICadenceGenerator { + const { pattern, daily, weekly, monthly, yearly } = this._recurrence; + + switch (pattern) { + case RecurPattern.daily: + return new DailyCadenceGenerator(daily); + case RecurPattern.weekly: + return new WeeklyCadenceGenerator(weekly); + case RecurPattern.monthly: + if (monthly.option === RecurPatternOption.byDate) + return new MonthlyByDateCadenceGenerator(monthly); + else if (monthly.option === RecurPatternOption.byDay) + return new MonthlyByDayCadenceGenerator(monthly); + break; + case RecurPattern.yearly: + if (yearly.option === RecurPatternOption.byDate) + return new YearlyByDateCadenceGenerator(yearly); + else if (yearly.option === RecurPatternOption.byDay) + return new YearlyByDayCadenceGenerator(yearly); + break; + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/model/Event.ts b/samples/react-rhythm-of-business-calendar/src/model/Event.ts new file mode 100644 index 000000000..7f4cbbb8e --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/model/Event.ts @@ -0,0 +1,415 @@ +import { first, isEqualWith, remove } from 'lodash'; +import { duration, Duration, Moment } from 'moment-timezone'; +import { Guid } from '@microsoft/sp-core-library'; +import { now, IManyToManyRelationship, ManyToManyRelationship, User, RequiredValidationRule, MaxLengthValidationRule, Comparer, momentAscComparer, IOneToManyRelationship, OneToManyRelationship, ManyToOneRelationship, IManyToOneRelationship, MomentRange, Color, aggregateComparer, IUserListChanges, ValidationRule, groupBy, multifilter, Entity, inverseFilter } from 'common'; +import { ListItemEntity } from "common/sharepoint"; +import { Cadence } from './Cadence'; +import { IEvent } from './IEvent'; +import { EventOccurrence } from './EventOccurrence'; +import { Recurrence } from './Recurrence'; +import { Refiner } from './Refiner'; +import { RefinerValue } from './RefinerValue'; +import { EventModerationStatus } from "./EventModerationStatus"; +import { Count_Until_Recurrence_Required_ValidationRule, Date_MonthlyByDate_Recurrence_Required_ValidationRule, Date_YearlyByDate_Recurrence_Required_ValidationRule, Days_Weekly_Recurrence_Required_ValidationRule, EndDate_Until_Recurrence_AfterStartDate_ValidationRule, EndDate_Until_Recurrence_Required_ValidationRule, EveryN_Daily_Recurrence_Required_ValidationRule, EveryN_MonthlyByDate_Recurrence_Required_ValidationRule, EveryN_MonthlyByDay_Recurrence_Required_ValidationRule, EveryN_Weekly_Recurrence_Required_ValidationRule } from './Validations'; + +interface IState { + description: string; + location: string; + contacts: User[]; + start: Moment; + end: Moment; + isAllDay: boolean; + isRecurring: boolean; + recurrence: Recurrence; + recurrenceUID: Guid; + recurrenceExceptionInstanceDate: Moment; + recurrenceInstanceCancelled: boolean; + seriesMaster: Event; + isConfidential: boolean; + restrictedToAccounts: User[]; + moderationStatus: EventModerationStatus; + moderator: User | undefined; + moderationTimestamp: Moment | undefined; + moderationMessage: string; +} + +export class Event extends ListItemEntity implements IEvent { + public static readonly TitleValidations = [ + new RequiredValidationRule(e => e.title), + new MaxLengthValidationRule(e => e.title, 255) + ]; + public static readonly LocationValidations = [ + new MaxLengthValidationRule(e => e.location, 255) + ]; + public static readonly StartDateValidations = [ + new RequiredValidationRule(e => e.startDate) + ]; + public static readonly EndDateValidations = [ + new RequiredValidationRule(e => e.endDate) + ]; + public static readonly EveryN_Daily_Recurrence_Validations = [ + new EveryN_Daily_Recurrence_Required_ValidationRule() + ]; + public static readonly EveryN_Weekly_Recurrence_Validations = [ + new EveryN_Weekly_Recurrence_Required_ValidationRule() + ]; + public static readonly Days_Weekly_Recurrence_Validations = [ + new Days_Weekly_Recurrence_Required_ValidationRule() + ]; + public static readonly Date_MonthlyByDate_Recurrence_Validations = [ + new Date_MonthlyByDate_Recurrence_Required_ValidationRule() + ]; + public static readonly EveryN_MonthlyByDate_Recurrence_Validations = [ + new EveryN_MonthlyByDate_Recurrence_Required_ValidationRule() + ]; + public static readonly EveryN_MonthlyByDay_Recurrence_Validations = [ + new EveryN_MonthlyByDay_Recurrence_Required_ValidationRule() + ]; + public static readonly Date_YearlyByDate_Recurrence_Validations = [ + new Date_YearlyByDate_Recurrence_Required_ValidationRule() + ]; + public static readonly EndDate_Until_Recurrence_Validations = [ + new EndDate_Until_Recurrence_Required_ValidationRule(), + new EndDate_Until_Recurrence_AfterStartDate_ValidationRule() + ]; + public static readonly Count_Until_Recurrence_Validations = [ + new Count_Until_Recurrence_Required_ValidationRule() + ]; + + public static ApprovedFilter = ({ isApproved }: Event): boolean => isApproved; + public static PendingFilter = ({ isPendingApproval }: Event): boolean => isPendingApproval; + public static RejectedFilter = ({ isRejected }: Event): boolean => isRejected; + + public static readonly StartAscComparer: Comparer = (a, b) => momentAscComparer(a.start, b.start); + public static readonly RefinerValueOrderAscComparer = aggregateComparer(RefinerValue.RefinerOrderAscComparer, RefinerValue.OrderAscComparer); + + constructor(author?: User, editor?: User, created?: Moment, modified?: Moment, id?: number, uniqueId?: Guid, etag?: number) { + super(author, editor, created, modified, id, uniqueId, etag); + + this.state.description = ""; + this.state.location = ""; + this.state.contacts = []; + this.state.start = now().startOf('hour').add(1, 'hour'); + this.state.end = this.state.start.clone().add(1, 'hour'); + this.state.isAllDay = false; + this.state.isRecurring = false; + this.state.recurrence = undefined; + this.state.recurrenceUID = undefined; + this.state.recurrenceExceptionInstanceDate = undefined; + this.state.recurrenceInstanceCancelled = false; + this.state.seriesMaster = undefined; + this.state.isConfidential = false; + this.state.restrictedToAccounts = []; + this.state.moderationStatus = EventModerationStatus.Pending; + this.state.moderator = undefined; + this.state.moderationTimestamp = undefined; + this.state.moderationMessage = ""; + + this.refinerValues = ManyToManyRelationship.create(this, 'events', { comparer: Event.RefinerValueOrderAscComparer }); + this.includeInBoundedContext(this.refinerValues); + + this.exceptions = OneToManyRelationship.create(this, 'seriesMaster'); + this.includeInBoundedContext(this.exceptions); + + this.seriesMaster = ManyToOneRelationship.create(this, 'exceptions', 'seriesMaster'); + this.includeInBoundedContext(this.seriesMaster); + } + + public readonly seriesMaster: IManyToOneRelationship; + public readonly exceptions: IOneToManyRelationship; + + public readonly refinerValues: IManyToManyRelationship; + + public valuesByRefiner(): Map { + return groupBy(this.refinerValues.get(), value => value.refiner.get()); + } + + public get tag(): string | undefined { + return this.refinerValues.find(v => v.refiner.get()?.enableTags)?.tag; + } + + public get color(): Color | undefined { + return this.refinerValues.find(v => v.refiner.get()?.enableColors)?.color; + } + + public hasChanges(specificProperty?: string | number | symbol): boolean { + if (specificProperty) + return super.hasChanges(specificProperty); + else + return super.hasChanges() || this.refinerValues.hasChanges(); + } + + public delete() { + super.delete() + this.exceptions.forEach(e => e.delete()); + } + + public hasRecurrenceChanges(): boolean { + if (!this.isNew && this.hasSnapshot) { + const current = { + isRecurring: this.isRecurring, + recurrence: this.recurrence, + start: this.start, + end: this.end, + isAllDay: this.isAllDay + }; + + this.peekSnapshot(); + const snapshot = { + isRecurring: this.isRecurring, + recurrence: this.recurrence, + start: this.start, + end: this.end, + isAllDay: this.isAllDay + }; + this.endPeek(); + + return snapshot.isRecurring && !isEqualWith(current, snapshot, this.stateIsEqualCustomizer); + } else { + return false; + } + } + + public immortalize() { + if (this.hasSnapshot && this.isAllDay) { + this.start.startOf('day'); + this.end.endOf('day').startOf('minute'); + } + + super.immortalize(); + } + + public get isSeriesMaster(): boolean { return this.state.isRecurring && !this.seriesMaster.get(); } + + public get isSeriesException(): boolean { return !!this.seriesMaster.get(); } + + public get allowGhosting(): boolean { + // exceptions are ghostable to enable editing of a new occurrence and to discard it if there are no changes + return this.isSeriesException; + } + + public get description(): string { return this.state.description; } + public set description(val: string) { this.state.description = val; } + + public get location(): string { return this.state.location; } + public set location(val: string) { this.state.location = val; } + + public get contacts(): User[] { return this.state.contacts; } + public set contacts(val: User[]) { this.state.contacts = val; } + + public get start(): Moment { return this.state.start; } + public set start(val: Moment) { this.state.start = val; } + + public get end(): Moment { return this.state.end; } + public set end(val: Moment) { this.state.end = val; } + + public get startDate(): Moment { return this.start?.clone().startOf('day'); } + public set startDate(date: Moment) { + const { startTime, duration } = this; + + const newStart = date?.clone().startOf('day').add(startTime); + const newEnd = newStart?.clone().add(duration); + + this.start = newStart; + this.end = newEnd; + } + + public get endDate(): Moment { return this.end?.clone().startOf('day'); } + public set endDate(date: Moment) { + const { start, endTime } = this; + + const newEnd = date?.clone().startOf('day').add(endTime); + const newStart = newEnd?.isSameOrBefore(start, 'minutes') + ? newEnd?.clone().subtract(1, 'hour') + : start; + + this.start = newStart; + this.end = newEnd; + } + + public get startTime(): Duration { return duration(this.start?.diff(this.startDate)); } + public set startTime(time: Duration) { + const { start, duration } = this; + + const newStart = start?.clone().startOf('day').add(time); + const newEnd = newStart?.clone().add(duration); + + this.start = newStart; + this.end = newEnd; + } + + public get endTime(): Duration { return duration(this.end?.diff(this.endDate)); } + public set endTime(time: Duration) { + const { start, end, isRecurring } = this; + + const newEnd = end?.clone().startOf('day').add(time); + + if (newEnd?.isSameOrBefore(start, 'minute')) + newEnd.add(1, 'day'); + + if (isRecurring && newEnd && !newEnd.isSame(start, 'day')) { + const startTime = start?.diff(start?.clone().startOf('day')); + const endTime = newEnd.diff(newEnd.clone().startOf('day')); + if (endTime > startTime) { + newEnd.subtract(1, 'day'); + } + } + + this.end = newEnd; + } + + public get duration(): Duration { return duration(this.end?.diff(this.start)); } + + public get isAllDay(): boolean { return this.state.isAllDay; } + public set isAllDay(val: boolean) { this.state.isAllDay = val; } + + public get isRecurring(): boolean { return this._seriesMasterOrThisState.isRecurring; } + public set isRecurring(val: boolean) { + if (val && this.hasSnapshot && this.snapshotValue('isRecurring') === false) + this.endDate = this.startDate; + + if (!this.isSeriesException) this.state.isRecurring = val; + + this.recurrence ||= new Recurrence(); + + if (val && (!this.recurrenceUID || Guid.empty.equals(this.recurrenceUID))) + this.recurrenceUID = Guid.newGuid(); + } + + public get recurrence(): Recurrence { return this._seriesMasterOrThisState.recurrence; } + public set recurrence(val: Recurrence) { if (!this.isSeriesException) this.state.recurrence = val; } + + public get recurrenceUID(): Guid { return this._seriesMasterOrThisState.recurrenceUID; } + public set recurrenceUID(val: Guid) { if (!this.isSeriesException) this.state.recurrenceUID = val; } + + public get recurrenceExceptionInstanceDate(): Moment { return this.state.recurrenceExceptionInstanceDate; } + public set recurrenceExceptionInstanceDate(val: Moment) { this.state.recurrenceExceptionInstanceDate = val; } + + public get recurrenceInstanceCancelled(): boolean { return this.state.recurrenceInstanceCancelled; } + public set recurrenceInstanceCancelled(val: boolean) { this.state.recurrenceInstanceCancelled = val; } + + public get isConfidential(): boolean { return this._seriesMasterOrThisState.isConfidential; } + public set isConfidential(val: boolean) { if (!this.isSeriesException) this.state.isConfidential = val; } + + public get restrictedToAccounts(): User[] { return this._seriesMasterOrThisState.restrictedToAccounts; } + public set restrictedToAccounts(val: User[]) { if (!this.isSeriesException) this.state.restrictedToAccounts = val; } + + public get moderationStatus(): EventModerationStatus { return this._seriesMasterOrThisState.moderationStatus; } + public set moderationStatus(val: EventModerationStatus) { if (!this.isSeriesException) this.state.moderationStatus = val; } + + public get isPendingApproval(): boolean { return this.moderationStatus === EventModerationStatus.Pending; } + public get isApproved(): boolean { return this.moderationStatus === EventModerationStatus.Approved; } + public get isRejected(): boolean { return this.moderationStatus === EventModerationStatus.Rejected; } + + public get moderator(): User | undefined { return this._seriesMasterOrThisState.moderator; } + public set moderator(val: User | undefined) { if (!this.isSeriesException) this.state.moderator = val; } + + public get moderationTimestamp(): Moment | undefined { return this._seriesMasterOrThisState.moderationTimestamp; } + public set moderationTimestamp(val: Moment | undefined) { if (!this.isSeriesException) this.state.moderationTimestamp = val; } + + public get moderationMessage(): string { return this._seriesMasterOrThisState.moderationMessage; } + public set moderationMessage(val: string) { if (!this.isSeriesException) this.state.moderationMessage = val; } + + public get creator(): User { return (this.isSeriesException ? this.seriesMaster.get() : this).author; } + + private get _seriesMasterOrThisState(): IState { + return (this.isSeriesException ? this.seriesMaster.get() : this).state; + } + + public getWrappedEvent(): Event { + return this; + } + + public getSeriesMaster(): Event { + return this.isSeriesException ? this.seriesMaster.get() : this; + } + + public getExceptionOrEvent(): Event { + return this; + } + + public restrictedToAccountsUserChanges(): IUserListChanges { + return this.usersDifference('restrictedToAccounts'); + } + + public expandOccurrences(range?: MomentRange): EventOccurrence[] { + if (this.isSeriesMaster) { + const cadence = new Cadence(this.start, this.recurrence); + const dates = Array.from(cadence.generate(range)); + const exceptionsInRange = multifilter(this.exceptions.get(), inverseFilter(Entity.NewAndGhostableFilter), e => MomentRange.overlaps(range, e)); + + return dates + .map(date => { + const exception = this.exceptions.find(e => e.recurrenceExceptionInstanceDate.isSame(date, 'minute')); + + if (exception) { + remove(exceptionsInRange, e => e === exception); + } + + if (exception && !exception.isDeleted) { + if (exception.recurrenceInstanceCancelled) { + return undefined; + } else if (!MomentRange.overlaps(range, exception)) { + return undefined; + } else { + return new EventOccurrence(exception); + } + } else { + date.startOf('day'); + const start = date.clone().add(this.startTime); + const end = start.clone().add(this.duration); + return new EventOccurrence(this, start, end); + } + }) + .filter(Boolean) + .concat(exceptionsInRange.map(e => new EventOccurrence(e))); + } else { + return (!range || MomentRange.overlaps(this, range)) ? [new EventOccurrence(this)] : []; + } + } + + public findOrCreateExceptionForDate(date: Moment): Event { + const occurrence = first(this.expandOccurrences({ start: date, end: date })); + return occurrence ? this.createSeriesException(occurrence.start, occurrence.end) : undefined; + } + + public createSeriesException(start: Moment, end: Moment): Event { + if (this.isSeriesMaster) { + const event = new Event(); + event.title = this.title; + event.start = start; + event.end = end; + event.location = this.location; + event.description = this.description; + event.contacts = [...this.contacts]; + event.isAllDay = this.isAllDay; + event.refinerValues.set([...this.refinerValues.get()]); + event.seriesMaster.set(this); + event.recurrenceExceptionInstanceDate = start.clone(); + return event; + } else { + throw new Error('Cannot create a series exception because this event is not the series master'); + } + } + + protected validationRules(): ValidationRule[] { + return [ + ...Event.TitleValidations, + ...Event.LocationValidations, + ...Event.StartDateValidations, + ...Event.EndDateValidations, + ...Event.EveryN_Daily_Recurrence_Validations, + ...Event.EveryN_Weekly_Recurrence_Validations, + ...Event.Days_Weekly_Recurrence_Validations, + ...Event.Date_MonthlyByDate_Recurrence_Validations, + ...Event.EveryN_MonthlyByDate_Recurrence_Validations, + ...Event.EveryN_MonthlyByDay_Recurrence_Validations, + ...Event.Date_YearlyByDate_Recurrence_Validations, + ...Event.EndDate_Until_Recurrence_Validations, + ...Event.Count_Until_Recurrence_Validations + ]; + } +} + +export type EventMap = Map; +export type ReadonlyEventMap = ReadonlyMap; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/model/EventModerationStatus.ts b/samples/react-rhythm-of-business-calendar/src/model/EventModerationStatus.ts new file mode 100644 index 000000000..467d94b55 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/model/EventModerationStatus.ts @@ -0,0 +1,26 @@ +export class EventModerationStatus { + public static readonly Pending = new EventModerationStatus("Pending"); + public static readonly Approved = new EventModerationStatus("Approved"); + public static readonly Rejected = new EventModerationStatus("Rejected"); + + public static readonly all = [ + EventModerationStatus.Pending, + EventModerationStatus.Approved, + EventModerationStatus.Rejected + ] as const; + + private static readonly _statusesByName = new Map(EventModerationStatus.all.map(s => [s.name, s] as const)); + + public static fromName(name: string) { + return EventModerationStatus._statusesByName.get(name) || EventModerationStatus.Pending; + } + + private constructor( + public readonly name: string + ) { + } + + public clone(): EventModerationStatus { + return this; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/model/EventOccurrence.ts b/samples/react-rhythm-of-business-calendar/src/model/EventOccurrence.ts new file mode 100644 index 000000000..763437dc2 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/model/EventOccurrence.ts @@ -0,0 +1,47 @@ +import { Comparer, momentAscComparer } from "common"; +import { Moment } from "moment-timezone"; +import { IEvent } from "./IEvent"; +import { Event } from "./Event"; + +export class EventOccurrence implements IEvent { + public static readonly StartAscComparer: Comparer = (a, b) => momentAscComparer(a.start, b.start); + + constructor( + public readonly event: Event, + public readonly start: Moment = event.start.clone(), + public readonly end: Moment = event.end.clone() + ) { + } + + public get displayName() { return this.event.displayName; } + public get title() { return this.event.title; } + public get isAllDay() { return this.event.isAllDay; } + public get location() { return this.event.location; } + public get color() { return this.event.color; } + public get tag() { return this.event.tag; } + public get recurrence() { return this.event.recurrence; } + public get isPendingApproval() { return this.event.isPendingApproval; } + public get isApproved() { return this.event.isApproved; } + public get isRejected() { return this.event.isRejected; } + public get isRecurring() { return this.event.isRecurring; } + public get isSeriesMaster() { return false; } // an event occurrence is never the series master + public get isSeriesException() { return this.event.isRecurring; } // an event occurrence is always an exception if the event is recurring + public get isConfidential() { return this.event.isConfidential; } + public get refinerValues() { return this.event.refinerValues; } + + public getWrappedEvent(): Event { + return this.event; + } + + public getSeriesMaster(): Event { + return this.event.getSeriesMaster(); + } + + public getExceptionOrEvent(): Event { + if (this.event.isSeriesMaster) { + return this.event.createSeriesException(this.start, this.end); + } else { + return this.event; + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/model/IEvent.ts b/samples/react-rhythm-of-business-calendar/src/model/IEvent.ts new file mode 100644 index 000000000..929bc4968 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/model/IEvent.ts @@ -0,0 +1,26 @@ +import { Moment } from "moment-timezone"; +import { Color, IManyToManyRelationship } from "common"; +import { Event, Recurrence, RefinerValue } from "model"; + +export interface IEvent { + readonly displayName: string; + readonly title: string; + readonly start: Moment; + readonly end: Moment; + readonly isAllDay: boolean; + readonly location: string; + readonly color: Color; + readonly tag: string; + readonly recurrence: Recurrence; + readonly isPendingApproval: boolean; + readonly isApproved: boolean; + readonly isRejected: boolean; + readonly isRecurring: boolean; + readonly isSeriesMaster: boolean; + readonly isSeriesException: boolean; + readonly isConfidential: boolean; + readonly refinerValues: IManyToManyRelationship; + getWrappedEvent(): Event; + getSeriesMaster(): Event; + getExceptionOrEvent(): Event; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/model/Recurrence.ts b/samples/react-rhythm-of-business-calendar/src/model/Recurrence.ts new file mode 100644 index 000000000..d9d884790 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/model/Recurrence.ts @@ -0,0 +1,149 @@ +import { clamp } from "lodash"; +import { Moment } from "moment-timezone"; + +export enum RecurDay { + sunday = 0, + monday = 1, + tuesday = 2, + wednesday = 3, + thursday = 4, + friday = 5, + saturday = 6, + day = 7, + weekday = 8, + weekend = 9 +} + +export enum RecurWeekOfMonth { + first = 0, + second = 1, + third = 2, + fourth = 3, + last = 4 +} + +export enum RecurPattern { + daily = 0, + weekly = 1, + monthly = 2, + yearly = 3 +} + +export enum RecurPatternOption { + byDate = 0, // specific date of the month (ex Aug 15) + byDay = 1 // a particular day of the week (ex third Wednesday) +} + +export enum RecurUntilType { + forever = 0, + date = 1, + count = 2 +} + +const between = (val: number, min: number, max: number) => + isFinite(val) ? clamp(val, min, max) : val; + +export class DailyRecurrence { + private _every: number = 1; + public get every(): number { return this._every; } + public set every(val: number) { this._every = between(val, 1, 99) } + + public weekdaysOnly: boolean; +} + +export class WeeklyRecurrence { + private _every: number = 1; + public get every(): number { return this._every; } + public set every(val: number) { this._every = between(val, 1, 52) } + + public readonly days: boolean[] = [false, false, false, false, false, false, false]; + + public setDefaultsForDate(date: Moment) { + this.days[date.day()] = true; + } +} + +export class MonthlyByDateRecurrence { + private _date: number = 1; + public get date(): number { return this._date; } + public set date(val: number) { this._date = between(val, 1, 31) } +} + +export class MonthlyByDayRecurrence { + public weekOf: RecurWeekOfMonth = RecurWeekOfMonth.first; + public day: RecurDay = RecurDay.monday; + + public setDefaultsForDate(date: Moment) { + this.day = date.day() as RecurDay; + } +} + +export class MonthlyRecurrence { + public option: RecurPatternOption = RecurPatternOption.byDate; + public byDate: MonthlyByDateRecurrence = new MonthlyByDateRecurrence(); + public byDay: MonthlyByDayRecurrence = new MonthlyByDayRecurrence(); + + private _every: number = 1; + public get every(): number { return this._every; } + public set every(val: number) { this._every = between(val, 1, 24) } + + public setDefaultsForDate(date: Moment) { + this.byDay.setDefaultsForDate(date); + } +} + +export class YearlyByDateRecurrence { + private _date: number = 1; + public get date(): number { return this._date; } + public set date(val: number) { this._date = between(val, 1, 31) } +} + +export class YearlyByDayRecurrence { + public weekOf: RecurWeekOfMonth = RecurWeekOfMonth.first; + public day: RecurDay = RecurDay.monday; + + public setDefaultsForDate(date: Moment) { + this.day = date.day() as RecurDay; + } +} + +export class YearlyRecurrence { + public option: RecurPatternOption = RecurPatternOption.byDate; + public byDate: YearlyByDateRecurrence = new YearlyByDateRecurrence(); + public byDay: YearlyByDayRecurrence = new YearlyByDayRecurrence(); + + private _month: number = 0; + public get month(): number { return this._month; } + public set month(val: number) { this._month = between(val, 0, 11) } + + private _every: number = 1; + public get every(): number { return this._every; } + public set every(val: number) { this._every = between(val, 1, 9) } + + public setDefaultsForDate(date: Moment) { + this.byDay.setDefaultsForDate(date); + this.month = date.month(); + } +} + +export class RecurUntil { + public type: RecurUntilType = RecurUntilType.forever; + public count: number | undefined = 10; + public date: Moment | undefined; +} + +export class Recurrence { + public firstDayOfWeek: string = 'su'; + + public pattern: RecurPattern = RecurPattern.daily; + public readonly until: RecurUntil = new RecurUntil(); + public readonly daily: DailyRecurrence = new DailyRecurrence(); + public readonly weekly: WeeklyRecurrence = new WeeklyRecurrence(); + public readonly monthly: MonthlyRecurrence = new MonthlyRecurrence(); + public readonly yearly: YearlyRecurrence = new YearlyRecurrence(); + + public setDefaultsForDate(date: Moment) { + this.weekly.setDefaultsForDate(date); + this.yearly.setDefaultsForDate(date); + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/model/Refiner.ts b/samples/react-rhythm-of-business-calendar/src/model/Refiner.ts new file mode 100644 index 000000000..e8aee49e3 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/model/Refiner.ts @@ -0,0 +1,90 @@ +import { Moment } from 'moment-timezone'; +import { Guid } from '@microsoft/sp-core-library'; +import { IOneToManyRelationship, IRelationshipSortingParameters, MaxLengthValidationRule, OneToManyRelationship, RequiredValidationRule, User, ValidationRule } from 'common'; +import { ListItemEntity } from "common/sharepoint"; +import { RefinerValue } from './RefinerValue'; + +interface IState { + order: number; + allowMultiselect: boolean; + required: boolean; + initiallyExpanded: boolean; + enableColors: boolean; + enableTags: boolean; + customSort: boolean; +} + +export class Refiner extends ListItemEntity { + public static readonly TitleValidations = [ + new RequiredValidationRule(e => e.title), + new MaxLengthValidationRule(e => e.title, 50) + ]; + + public static readonly OrderAscComparer = (a: Refiner, b: Refiner) => a.order - b.order; + + private readonly _refinerValuesSorting: IRelationshipSortingParameters; + + constructor(author?: User, editor?: User, created?: Moment, modified?: Moment, id?: number, uniqueId?: Guid, etag?: number) { + super(author, editor, created, modified, id, uniqueId, etag); + + this.state.order = 0; + this.state.allowMultiselect = false; + this.state.required = false; + this.state.initiallyExpanded = true; + this.state.enableColors = false; + this.state.enableTags = false; + this.state.customSort = false; + + this._refinerValuesSorting = { comparer: RefinerValue.TitleAscComparer }; + this.values = OneToManyRelationship.create(this, 'refiner', this._refinerValuesSorting); + this.includeInBoundedContext(this.values); + + this.blankValue = new RefinerValue(); + } + + public readonly values: IOneToManyRelationship; + + public readonly blankValue: RefinerValue; + + public get order(): number { return this.state.order; } + public set order(val: number) { this.state.order = val; } + + public get allowMultiselect(): boolean { return this.state.allowMultiselect; } + public set allowMultiselect(val: boolean) { this.state.allowMultiselect = val; } + + public get required(): boolean { return this.state.required; } + public set required(val: boolean) { this.state.required = val; } + + public get initiallyExpanded(): boolean { return this.state.initiallyExpanded; } + public set initiallyExpanded(val: boolean) { this.state.initiallyExpanded = val; } + + public get enableColors(): boolean { return this.state.enableColors; } + public set enableColors(val: boolean) { this.state.enableColors = val; } + + public get enableTags(): boolean { return this.state.enableTags; } + public set enableTags(val: boolean) { this.state.enableTags = val; } + + public get customSort(): boolean { return this.state.customSort; } + public set customSort(val: boolean) { + this.state.customSort = val; + + if (val) + this._refinerValuesSorting.comparer = RefinerValue.OrderAscComparer; + else + this._refinerValuesSorting.comparer = RefinerValue.TitleAscComparer; + } + + public delete() { + super.delete(); + this.values.forEach(value => value.delete()); + } + + protected validationRules(): ValidationRule[] { + return [ + ...Refiner.TitleValidations + ]; + } +} + +export type RefinerMap = Map; +export type ReadonlyRefinerMap = ReadonlyMap; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/model/RefinerValue.ts b/samples/react-rhythm-of-business-calendar/src/model/RefinerValue.ts new file mode 100644 index 000000000..b42b8c53f --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/model/RefinerValue.ts @@ -0,0 +1,85 @@ +import { Moment } from 'moment-timezone'; +import { Guid } from '@microsoft/sp-core-library'; +import { Color, IManyToManyRelationship, IManyToOneRelationship, ManyToManyRelationship, ManyToOneRelationship, MaxLengthValidationRule, RequiredValidationRule, User, ValidationRule } from 'common'; +import { ListItemEntity } from "common/sharepoint"; +import { Approvers } from './Approvers'; +import { Event } from './Event'; +import { Refiner } from './Refiner'; + +import * as cstrings from "CommonStrings"; + +class TagRequiredValidationRule extends ValidationRule { + constructor() { + super(TagRequiredValidationRule._isValid, cstrings.Validation.Required); + } + + private static _isValid({ refiner, tag }: RefinerValue): boolean { + return refiner.get()?.enableTags ? RequiredValidationRule.hasValue(tag) : true; + } +} + +interface IState { + refiner: Refiner; + order: number; + tag: string; + color: Color; + isActive: boolean; +} + +export class RefinerValue extends ListItemEntity { + public static readonly TitleValidations = [ + new RequiredValidationRule(e => e.title), + new MaxLengthValidationRule(e => e.title, 50) + ]; + public static readonly TagValidations = [ + new TagRequiredValidationRule(), + new MaxLengthValidationRule(e => e.tag, 3) + ]; + + public static readonly OrderAscComparer = (a: RefinerValue, b: RefinerValue) => a.order - b.order; + public static readonly RefinerOrderAscComparer = (a: RefinerValue, b: RefinerValue) => a.refiner.get()?.order - b.refiner.get()?.order; + + public static readonly ActiveFilter = ({ isActive }: RefinerValue): boolean => isActive; + + constructor(author?: User, editor?: User, created?: Moment, modified?: Moment, id?: number, uniqueId?: Guid, etag?: number) { + super(author, editor, created, modified, id, uniqueId, etag); + + this.state.refiner = null; + this.state.order = 0; + this.state.tag = ""; + this.state.color = new Color(255, 255, 255); + this.state.isActive = true; + + this.refiner = ManyToOneRelationship.create(this, 'values', 'refiner'); + this.includeInBoundedContext(this.refiner); + + this.events = ManyToManyRelationship.create(this, 'refinerValues'); + this.approvers = ManyToManyRelationship.create(this, 'refinerValues'); + } + + public readonly refiner: IManyToOneRelationship; + public readonly events: IManyToManyRelationship; + public readonly approvers: IManyToManyRelationship; + + public get order(): number { return this.state.order; } + public set order(val: number) { this.state.order = val; } + + public get tag(): string { return this.state.tag; } + public set tag(val: string) { this.state.tag = val; } + + public get color(): Color { return this.state.color; } + public set color(val: Color) { this.state.color = val; } + + public get isActive(): boolean { return this.state.isActive; } + public set isActive(val: boolean) { this.state.isActive = val; } + + protected validationRules(): ValidationRule[] { + return [ + ...RefinerValue.TitleValidations, + ...RefinerValue.TagValidations + ]; + } +} + +export type RefinerValueMap = Map; +export type ReadonlyRefinerValueMap = ReadonlyMap; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/model/Validations.ts b/samples/react-rhythm-of-business-calendar/src/model/Validations.ts new file mode 100644 index 000000000..0ea684932 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/model/Validations.ts @@ -0,0 +1,155 @@ +import { ValidationRule } from 'common'; +import { Event } from './Event'; +import { RecurPattern, RecurPatternOption, RecurUntilType } from './Recurrence'; + +import { Validation as strings } from 'ComponentStrings'; + +export class EveryN_Daily_Recurrence_Required_ValidationRule extends ValidationRule { + constructor() { + super(EveryN_Daily_Recurrence_Required_ValidationRule._isValid, strings.Daily.EveryNRequired); + } + + private static _isValid({ isRecurring, recurrence }: Event): boolean { + if (!isRecurring) { + return true; + } else { + const { pattern, daily: { every, weekdaysOnly } } = recurrence; + return (pattern === RecurPattern.daily && !weekdaysOnly) ? isFinite(every) : true; + } + } +} + +export class EveryN_Weekly_Recurrence_Required_ValidationRule extends ValidationRule { + constructor() { + super(EveryN_Weekly_Recurrence_Required_ValidationRule._isValid, strings.Weekly.EveryNRequired); + } + + private static _isValid({ isRecurring, recurrence }: Event): boolean { + if (!isRecurring) { + return true; + } else { + const { pattern, weekly: { every } } = recurrence; + return pattern === RecurPattern.weekly ? isFinite(every) : true; + } + } +} + +export class Days_Weekly_Recurrence_Required_ValidationRule extends ValidationRule { + constructor() { + super(Days_Weekly_Recurrence_Required_ValidationRule._isValid, strings.Weekly.DaysRequired); + } + + private static _isValid({ isRecurring, recurrence }: Event): boolean { + if (!isRecurring) { + return true; + } else { + const { pattern, weekly: { days } } = recurrence; + return pattern === RecurPattern.weekly ? days.some(Boolean) : true; + } + } +} + +export class Date_MonthlyByDate_Recurrence_Required_ValidationRule extends ValidationRule { + constructor() { + super(Date_MonthlyByDate_Recurrence_Required_ValidationRule._isValid, strings.MonthlyByDate.DateRequired); + } + + private static _isValid({ isRecurring, recurrence }: Event): boolean { + if (!isRecurring) { + return true; + } else { + const { pattern, monthly: { byDate: { date }, option } } = recurrence; + return (pattern === RecurPattern.monthly && option === RecurPatternOption.byDate) ? isFinite(date) : true; + } + } +} + +export class EveryN_MonthlyByDate_Recurrence_Required_ValidationRule extends ValidationRule { + constructor() { + super(EveryN_MonthlyByDate_Recurrence_Required_ValidationRule._isValid, strings.MonthlyByDate.EveryNRequired); + } + + private static _isValid({ isRecurring, recurrence }: Event): boolean { + if (!isRecurring) { + return true; + } else { + const { pattern, monthly: { every, option } } = recurrence; + return (pattern === RecurPattern.monthly && option === RecurPatternOption.byDate) ? isFinite(every) : true; + } + } +} + +export class EveryN_MonthlyByDay_Recurrence_Required_ValidationRule extends ValidationRule { + constructor() { + super(EveryN_MonthlyByDay_Recurrence_Required_ValidationRule._isValid, strings.MonthlyByDay.EveryNRequired); + } + + private static _isValid({ isRecurring, recurrence }: Event): boolean { + if (!isRecurring) { + return true; + } else { + const { pattern, monthly: { every, option } } = recurrence; + return (pattern === RecurPattern.monthly && option === RecurPatternOption.byDay) ? isFinite(every) : true; + } + } +} + +export class Date_YearlyByDate_Recurrence_Required_ValidationRule extends ValidationRule { + constructor() { + super(Date_YearlyByDate_Recurrence_Required_ValidationRule._isValid, strings.YearlyByDate.DateRequired); + } + + private static _isValid({ isRecurring, recurrence }: Event): boolean { + if (!isRecurring) { + return true; + } else { + const { pattern, yearly: { byDate: { date }, option } } = recurrence; + return (pattern === RecurPattern.yearly && option === RecurPatternOption.byDate) ? isFinite(date) : true; + } + } +} + +export class EndDate_Until_Recurrence_Required_ValidationRule extends ValidationRule { + constructor() { + super(EndDate_Until_Recurrence_Required_ValidationRule._isValid, strings.Until.EndDateRequired); + } + + private static _isValid({ isRecurring, recurrence }: Event): boolean { + if (!isRecurring) { + return true; + } else { + const { until: { type, date } } = recurrence; + return type === RecurUntilType.date ? date?.isValid() : true; + } + } +} + +export class EndDate_Until_Recurrence_AfterStartDate_ValidationRule extends ValidationRule { + constructor() { + super(EndDate_Until_Recurrence_AfterStartDate_ValidationRule._isValid, strings.Until.EndDateAfterStart); + } + + private static _isValid({ isRecurring, startDate, recurrence }: Event): boolean { + if (!isRecurring) { + return true; + } else { + const { until: { type, date } } = recurrence; + return (type === RecurUntilType.date && startDate?.isValid() && date?.isValid()) ? date.isSameOrAfter(startDate, 'day') : true; + } + } +} + +export class Count_Until_Recurrence_Required_ValidationRule extends ValidationRule { + constructor() { + super(Count_Until_Recurrence_Required_ValidationRule._isValid, strings.Until.CountRequired); + } + + private static _isValid({ isRecurring, recurrence }: Event): boolean { + if (!isRecurring) { + return true; + } else { + const { until: { type, count } } = recurrence; + return type === RecurUntilType.count ? isFinite(count) : true; + } + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/model/ViewKeys.ts b/samples/react-rhythm-of-business-calendar/src/model/ViewKeys.ts new file mode 100644 index 000000000..748a779f1 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/model/ViewKeys.ts @@ -0,0 +1,12 @@ +import { stringToEnum } from "common"; + +export const ViewKeys = stringToEnum([ + "daily", + "weekly", + "monthly", + "quarter" +]); + +export type ViewKeys = keyof (typeof ViewKeys); + +export const DefaultViewKey = ViewKeys.monthly; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/model/humanize.ts b/samples/react-rhythm-of-business-calendar/src/model/humanize.ts new file mode 100644 index 000000000..591604c14 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/model/humanize.ts @@ -0,0 +1,118 @@ +import { Moment, localeData, months, weekdays, weekdaysShort } from "moment-timezone"; +import { format } from "@fluentui/react"; +import { humanizeFixedList } from "common"; +import { DailyRecurrence, MonthlyRecurrence, RecurPattern, RecurPatternOption, Recurrence, RecurUntil, RecurUntilType, WeeklyRecurrence, YearlyRecurrence } from "./Recurrence"; + +import { Humanize as strings } from "ComponentStrings"; + +const monthStrings = months(); +const dayNames = weekdaysShort(); +const dayStrings = [...weekdays(), strings.Day, strings.Weekday, strings.Weekend]; +const weekOfStrings = [strings.First, strings.Second, strings.Third, strings.Fourth, strings.Last]; + +export const humanizeDateRange = (start: Moment, end: Moment, isAllDay: boolean): string => { + if (start.isSame(end, 'year')) { + if (start.isSame(end, 'month')) { + if (start.isSame(end, 'day')) { + return isAllDay + ? `${start.format('dddd, MMMM D, YYYY')}, ${strings.AllDay}` + : `${start.format('dddd, MMMM D, YYYY, LT')} - ${end.format('LT')}`; + } else { + return isAllDay + ? `${start.format('MMMM D')}-${end.format('D, YYYY')}, ${strings.AllDay}` + : `${start.format('MMMM D')}-${end.format('D')}, ${start.format('YYYY, LT')} - ${end.format('LT')}`; + } + } else { + return isAllDay + ? `${start.format('MMMM DD')} - ${end.format('MMMM DD, YYYY')}, ${strings.AllDay}` + : `${start.format('MMM D')} - ${end.format('MMM D')}, ${start.format('YYYY, LT')} - ${end.format('LT')}`; + } + } else { + return isAllDay + ? `${start.format('MMMM D, YYYY')} - ${end.format('MMMM D, YYYY')}, ${strings.AllDay}` + : `${start.format('MMMM DD, YYYY, LT')} - ${end.format('MMMM DD, YYYY, LT')}`; + } +} + +const humanizeDailyPattern = ({ weekdaysOnly, every }: DailyRecurrence) => { + if (weekdaysOnly) + return strings.Pattern_Daily_EachWeekday; // "Each weekday" + else + return format( // "Every {0} days" + every > 1 ? strings.Pattern_Daily_EveryNDays.Plural : strings.Pattern_Daily_EveryNDays.Singular, + every + ); +} + +const humanizeWeeklyPattern = ({ days, every }: WeeklyRecurrence) => { + const includedDays = days.map((included, idx) => included && dayNames[idx]).filter(Boolean); + const daysString = humanizeFixedList(includedDays, dayNames, name => name, false, strings.Pattern_Weekly.AllDays); + return format(// "On {0} every {1} weeks" + every > 1 ? strings.Pattern_Weekly.Plural : strings.Pattern_Weekly.Singular, + daysString, every + ); +} + +const humanizeMonthlyPattern = ({ option, byDay: { day, weekOf }, byDate: { date }, every }: MonthlyRecurrence) => { + if (option === RecurPatternOption.byDate) { + return format( // "On the {0} of every {1} months" + every > 1 ? strings.Pattern_Monthly_ByDate.Plural : strings.Pattern_Monthly_ByDate.Singular, + localeData().ordinal(date), every + ); + } else { + return format( // "On the {0} {1} of every {2} months" + every > 1 ? strings.Pattern_Monthly_ByDay.Plural : strings.Pattern_Monthly_ByDay.Singular, + weekOfStrings[weekOf], dayStrings[day], every + ); + } +} + +const humanizeYearlyPattern = ({ option, byDay: { day, weekOf }, byDate: { date }, month, every }: YearlyRecurrence) => { + if (option === RecurPatternOption.byDate) { + return format( // "On {0} {1} of every {2} years" + every > 1 ? strings.Pattern_Yearly_ByDate.Plural : strings.Pattern_Yearly_ByDate.Singular, + monthStrings[month], localeData().ordinal(date), every + ); + } else { + return format( // "On the {0} {1} of every {2} years" + every > 1 ? strings.Pattern_Yearly_ByDay.Plural : strings.Pattern_Yearly_ByDay.Singular, + weekOfStrings[weekOf], dayStrings[day], monthStrings[month], every + ); + } +} + +const humanizeUntilPattern = ({ type, count, date }: RecurUntil) => { + if (type === RecurUntilType.count && count > 0) { + return format( // "for {0} occurrences" + strings.Pattern_Until.Count, + count + ); + } else if (type === RecurUntilType.date && date) { + return format( // "through {0}" + strings.Pattern_Until.Date, + date.format('l') + ); + } else { // if (type === RecurUntilType.forever) + return ""; + } +} + +export const humanizeRecurrencePattern = (startDate: Moment, recurrence: Recurrence) => { + if (!recurrence) return ""; + + const { pattern, daily, weekly, monthly, yearly, until } = recurrence; + + const untilPatternString = humanizeUntilPattern(until); + const startDateString = startDate.format('l'); + let recurrencePatternString = ""; + + switch (pattern) { + case RecurPattern.daily: recurrencePatternString = humanizeDailyPattern(daily); break; + case RecurPattern.weekly: recurrencePatternString = humanizeWeeklyPattern(weekly); break; + case RecurPattern.monthly: recurrencePatternString = humanizeMonthlyPattern(monthly); break; + case RecurPattern.yearly: recurrencePatternString = humanizeYearlyPattern(yearly); break; + } + + // "{0}, starting {1} {2}" + return format(strings.HumanizePattern, recurrencePatternString, startDateString, untilPatternString); +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/model/index.ts b/samples/react-rhythm-of-business-calendar/src/model/index.ts new file mode 100644 index 000000000..cc0732939 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/model/index.ts @@ -0,0 +1,10 @@ +export { Approvers, type ApproversMap, type ReadonlyApproversMap } from "./Approvers"; +export { type IEvent } from "./IEvent"; +export { Event, type EventMap, type ReadonlyEventMap } from "./Event"; +export { EventOccurrence } from "./EventOccurrence"; +export { EventModerationStatus } from "./EventModerationStatus"; +export * from './humanize'; +export { Recurrence, RecurDay, RecurPattern, RecurPatternOption, RecurWeekOfMonth, RecurUntilType, DailyRecurrence, WeeklyRecurrence, MonthlyRecurrence, YearlyRecurrence, RecurUntil } from "./Recurrence"; +export { Refiner, type RefinerMap, type ReadonlyRefinerMap } from "./Refiner"; +export { RefinerValue, type RefinerValueMap, type ReadonlyRefinerValueMap } from "./RefinerValue"; +export { ViewKeys, DefaultViewKey } from './ViewKeys'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/schema/Configuration.ts b/samples/react-rhythm-of-business-calendar/src/schema/Configuration.ts new file mode 100644 index 000000000..9783bf0d0 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/schema/Configuration.ts @@ -0,0 +1,72 @@ +import { Guid } from "@microsoft/sp-core-library"; +import { User } from "common"; +import { ListItemEntity } from "common/sharepoint"; +import { ViewKeys } from "model"; +import { Moment } from "moment-timezone"; +import { CurrentSchemaVersion, IRhythmOfBusinessCalendarSchema, RhythmOfBusinessCalendarSchema } from "./RhythmOfBusinessCalendarSchema"; + +interface IState { + schemaVersion: number; + currentUpgradeAction: number; + fiscalYearSartMonth: number; + defaultView: ViewKeys; + useRefiners: boolean; + refinerRailInitiallyExpanded: boolean; + quarterViewGroupByRefinerId: number; + useApprovals: boolean; + allowConfidentialEvents: boolean; +} + +export class Configuration extends ListItemEntity { + private _schema: IRhythmOfBusinessCalendarSchema; + + constructor(author?: User, editor?: User, created?: Moment, modified?: Moment, id?: number, uniqueId?: Guid, etag?: number) { + super(author, editor, created, modified, id, uniqueId, etag); + + this.state.schemaVersion = CurrentSchemaVersion; + this.state.currentUpgradeAction = 0; + this.state.fiscalYearSartMonth = 1; + this.state.defaultView = ViewKeys.monthly; + this.state.useRefiners = true; + this.state.refinerRailInitiallyExpanded = true; + this.state.quarterViewGroupByRefinerId = undefined; + this.state.useApprovals = false; + this.state.allowConfidentialEvents = false; + + this._schema = RhythmOfBusinessCalendarSchema; + } + + public get schema(): IRhythmOfBusinessCalendarSchema { return this._schema; } + + public get schemaVersion(): number { return this.state.schemaVersion; } + public set schemaVersion(val: number) { this.state.schemaVersion = val; } + + public get currentUpgradeAction(): number { return this.state.currentUpgradeAction; } + public set currentUpgradeAction(val: number) { this.state.currentUpgradeAction = val; } + + public get schemaRequiresUpgrade(): boolean { return this._schema.version > this.schemaVersion; } + + public get fiscalYearSartMonth(): number { return this.state.fiscalYearSartMonth; } + public set fiscalYearSartMonth(val: number) { this.state.fiscalYearSartMonth = val; } + + public get defaultView(): ViewKeys { return this.state.defaultView; } + public set defaultView(val: ViewKeys) { this.state.defaultView = val; } + + public get useRefiners(): boolean { return this.state.useRefiners; } + public set useRefiners(val: boolean) { this.state.useRefiners = val; } + + public get refinerRailInitiallyExpanded(): boolean { return this.state.refinerRailInitiallyExpanded; } + public set refinerRailInitiallyExpanded(val: boolean) { this.state.refinerRailInitiallyExpanded = val; } + + public get quarterViewGroupByRefinerId(): number { return this.state.quarterViewGroupByRefinerId; } + public set quarterViewGroupByRefinerId(val: number) { this.state.quarterViewGroupByRefinerId = val; } + + public get useApprovals(): boolean { return this.state.useApprovals; } + public set useApprovals(val: boolean) { this.state.useApprovals = val; } + + public get allowConfidentialEvents(): boolean { return this.state.allowConfidentialEvents; } + public set allowConfidentialEvents(val: boolean) { this.state.allowConfidentialEvents = val; } +} + +export type ConfigurationMap = Map; +export type ReadonlyConfigurationMap = ReadonlyMap; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/schema/Defaults.ts b/samples/react-rhythm-of-business-calendar/src/schema/Defaults.ts new file mode 100644 index 000000000..09505c31c --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/schema/Defaults.ts @@ -0,0 +1,23 @@ +const Environments = { + LOCAL: { Prefix: 'LCL' }, + DEV: { Prefix: 'DEV' }, + TEST: { Prefix: 'TST' }, + STAGE: { Prefix: 'STG' }, + PROD: { Prefix: '' } +}; + +const Environment = Environments.LOCAL; +const AppPrefix = "RoB Calendar"; + +const combine = (...segments: string[]) => segments.join(' ').trim(); +const title = (baseTitle: string) => combine(Environment.Prefix, AppPrefix, baseTitle); + +export const Defaults = { + ListTitles: { + Configuration: title("Configuration"), + Events: title('Events'), + Refiners: title('Refiners'), + RefinerValues: title('Refiner Values'), + Approvers: title('Approvers') + } +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/schema/RhythmOfBusinessCalendarSchema.ts b/samples/react-rhythm-of-business-calendar/src/schema/RhythmOfBusinessCalendarSchema.ts new file mode 100644 index 000000000..855cb3440 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/schema/RhythmOfBusinessCalendarSchema.ts @@ -0,0 +1,30 @@ +import { IElementDefinitions, IListDefinition, buildLiveSchema } from "common/sharepoint"; +import { ConfigurationList, IEventsListDefinition, EventsList, RefinersList, RefinerValuesList, ApproversList, IRefinersListDefinition, IRefinerValuesListDefinition, IApproversListDefinition } from "./lists"; + +export const CurrentSchemaVersion: number = 1.0; + +export interface IRhythmOfBusinessCalendarSchema extends IElementDefinitions { + configurationList: IListDefinition; + eventsList: IEventsListDefinition; + refinersList: IRefinersListDefinition; + refinerValuesList: IRefinerValuesListDefinition; + approversList: IApproversListDefinition; +} + +export const RhythmOfBusinessCalendarSchema = buildLiveSchema({ + version: CurrentSchemaVersion, + lists: [ + ConfigurationList, + EventsList, + RefinersList, + RefinerValuesList, + ApproversList + ], + upgrades: [ + ], + configurationList: ConfigurationList, + eventsList: EventsList, + refinersList: RefinersList, + refinerValuesList: RefinerValuesList, + approversList: ApproversList +}); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/schema/index.ts b/samples/react-rhythm-of-business-calendar/src/schema/index.ts new file mode 100644 index 000000000..b8fbd740f --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/schema/index.ts @@ -0,0 +1,3 @@ +export { Configuration, ConfigurationMap, ReadonlyConfigurationMap } from './Configuration'; +export { ConfigurationList } from './lists'; +export { IRhythmOfBusinessCalendarSchema } from './RhythmOfBusinessCalendarSchema'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/schema/lists/ApproversList.ts b/samples/react-rhythm-of-business-calendar/src/schema/lists/ApproversList.ts new file mode 100644 index 000000000..301cfd222 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/schema/lists/ApproversList.ts @@ -0,0 +1,68 @@ +import { IListDefinition, FieldType, IViewDefinition, includeStandardViewFields, IBooleanFieldDefinition, IUserFieldDefinition, ILookupFieldDefinition, ListTemplateType, RoleOperation, RoleType } from "common/sharepoint"; +import { Defaults } from "../Defaults"; +import { RefinerValuesList } from "./RefinerValuesList"; + +const Field_RefinerValues: ILookupFieldDefinition = { + type: FieldType.Lookup, + name: 'RefinerValues', + displayName: 'Refiner Values', + required: false, + multi: true, + lookupListTitle: RefinerValuesList.title, + showField: RefinerValuesList.field_Value.name +}; + +const Field_IncludeInApprovalEmail: IBooleanFieldDefinition = { + type: FieldType.Boolean, + name: 'IncludeInApprovalEmail', + displayName: 'Include In Approval Email', + default: 'Yes' +}; + +const Field_Users: IUserFieldDefinition = { + type: FieldType.User, + name: 'Users', + userSelectionMode: "PeopleOnly", + required: true, + multi: true +}; + +const View_AllApprovers: IViewDefinition = { + title: "All Approvers", + rowLimit: 250, + paged: true, + default: true, + fields: includeStandardViewFields( + Field_RefinerValues, + Field_IncludeInApprovalEmail, + Field_Users + ) +}; + +export interface IApproversListDefinition extends IListDefinition { + view_AllApprovers: IViewDefinition; +} + +export const ApproversList: IApproversListDefinition = { + title: Defaults.ListTitles.Approvers, + description: '', + template: ListTemplateType.GenericList, + dependencies: [RefinerValuesList], + permissions: { + copyRoleAssignments: false, + userRoles: [ + { operation: RoleOperation.Add, roleType: RoleType.Administrator, userType: 'ownerGroup' }, + { operation: RoleOperation.Add, roleType: RoleType.Reader, userType: 'memberGroup' }, + { operation: RoleOperation.Add, roleType: RoleType.Reader, userType: 'visitorGroup' } + ] + }, + fields: [ + Field_RefinerValues, + Field_IncludeInApprovalEmail, + Field_Users + ], + views: [ + View_AllApprovers + ], + view_AllApprovers: View_AllApprovers +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/schema/lists/ConfigurationList.ts b/samples/react-rhythm-of-business-calendar/src/schema/lists/ConfigurationList.ts new file mode 100644 index 000000000..3242d00c0 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/schema/lists/ConfigurationList.ts @@ -0,0 +1,119 @@ +import { IListDefinition, FieldType, IViewDefinition, includeStandardViewFields, INumberFieldDefinition, ListTemplateType, IChoiceFieldDefinition, IBooleanFieldDefinition, RoleOperation, RoleType } from "common/sharepoint"; +import { ViewKeys } from "model"; +import { Defaults } from "../Defaults"; + +const Field_SchemaVersion: INumberFieldDefinition = { + type: FieldType.Number, + name: 'SchemaVersion', + displayName: "Schema Version", + required: true +}; + +const Field_CurrentUpgradeAction: INumberFieldDefinition = { + type: FieldType.Number, + name: 'CurrentUpgradeAction', + displayName: "Current Upgrade Action" +}; + +const Field_FiscalYearSartMonth: INumberFieldDefinition = { + type: FieldType.Number, + name: 'FiscalYearSartMonth', + displayName: "Fiscal Year Sart Month", + min: 1, + max: 12, + required: true, + default: "1" +}; + +const Field_DefaultView: IChoiceFieldDefinition = { + type: FieldType.Choice, + name: 'DefaultView', + displayName: "Default View", + choices: Object.keys(ViewKeys), + default: ViewKeys.monthly +}; + +const Field_UseRefiners: IBooleanFieldDefinition = { + type: FieldType.Boolean, + name: 'UseRefiners', + displayName: "Use Refiners", + default: "Yes" +}; + +const Field_RefinerRailInitiallyExpanded: IBooleanFieldDefinition = { + type: FieldType.Boolean, + name: 'RefinerRailInitiallyExpanded', + displayName: "Refiner Rail Initially Expanded", + default: "Yes" +}; + +const Field_QuarterViewGroupByRefinerId: INumberFieldDefinition = { + type: FieldType.Number, + name: 'QuarterViewGroupByRefinerId', + displayName: 'Quarter View Group By Refiner Id' +}; + +const Field_UseApprovals: IBooleanFieldDefinition = { + type: FieldType.Boolean, + name: 'UseApprovals', + displayName: "Use Approvals", + default: "No" +}; + +const Field_AllowConfidentialEvents: IBooleanFieldDefinition = { + type: FieldType.Boolean, + name: 'AllowConfidentialEvents', + displayName: "Allow Confidential Events", + default: "No" +}; + +const View_AllItems: IViewDefinition = { + title: "All Configurations", + rowLimit: 1, + paged: false, + default: true, + query: '', + fields: includeStandardViewFields( + Field_SchemaVersion, + Field_CurrentUpgradeAction, + Field_FiscalYearSartMonth, + Field_DefaultView, + Field_UseRefiners, + Field_RefinerRailInitiallyExpanded, + Field_QuarterViewGroupByRefinerId, + Field_UseApprovals, + Field_AllowConfidentialEvents + ) +}; + +export interface IConfigurationListDefinition extends IListDefinition { + view_AllItems: IViewDefinition; +} + +export const ConfigurationList: IConfigurationListDefinition = { + title: Defaults.ListTitles.Configuration, + description: '', + template: ListTemplateType.GenericList, + permissions: { + copyRoleAssignments: false, + userRoles: [ + { operation: RoleOperation.Add, roleType: RoleType.Administrator, userType: 'ownerGroup' }, + { operation: RoleOperation.Add, roleType: RoleType.Reader, userType: 'memberGroup' }, + { operation: RoleOperation.Add, roleType: RoleType.Reader, userType: 'visitorGroup' } + ] + }, + siteFields: [], + fields: [ + Field_SchemaVersion, + Field_CurrentUpgradeAction, + Field_FiscalYearSartMonth, + Field_DefaultView, + Field_UseRefiners, + Field_RefinerRailInitiallyExpanded, + Field_QuarterViewGroupByRefinerId, + Field_UseApprovals, + Field_AllowConfidentialEvents + ], + views: [View_AllItems], + view_AllItems: View_AllItems +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/schema/lists/EventsList.ts b/samples/react-rhythm-of-business-calendar/src/schema/lists/EventsList.ts new file mode 100644 index 000000000..dd1cbf58c --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/schema/lists/EventsList.ts @@ -0,0 +1,229 @@ +import { DateTimeFieldFormatType } from "@pnp/sp/fields"; +import { IListDefinition, FieldType, IViewDefinition, includeStandardViewFields, ITextFieldDefinition, IBooleanFieldDefinition, IUserFieldDefinition, ILookupFieldDefinition, IDateTimeFieldDefinition, ListTemplateType, ITitleFieldDefinition, IRecurrenceFieldDefinition, IIntegerFieldDefinition, IGuidFieldDefinition, RoleOperation, RoleType, IChoiceFieldDefinition } from "common/sharepoint"; +import { EventModerationStatus } from "model"; +import { Defaults } from "../Defaults"; +import { RefinerValuesList } from "./RefinerValuesList"; + +const Field_Title: ITitleFieldDefinition = { + type: FieldType.Text, + name: 'Title', + required: true +}; + +const Field_Description: ITextFieldDefinition = { + type: FieldType.Text, + name: 'Description', + multi: true +}; + +const Field_Location: ITextFieldDefinition = { + type: FieldType.Text, + name: 'Location' +}; + +const Field_EventDate: IDateTimeFieldDefinition = { + type: FieldType.DateTime, + name: 'EventDate', + displayName: 'Start Time', + required: true, + dateTimeFormat: DateTimeFieldFormatType.DateTime +}; + +const Field_EndDate: IDateTimeFieldDefinition = { + type: FieldType.DateTime, + name: 'EndDate', + displayName: 'End Time', + required: true, + dateTimeFormat: DateTimeFieldFormatType.DateTime +}; + +const Field_fAllDayEvent: IBooleanFieldDefinition = { + type: FieldType.Boolean, + name: 'fAllDayEvent', + displayName: 'All Day Event', + default: 'No' +}; + +const Field_fRecurrence: IRecurrenceFieldDefinition = { + type: FieldType.Recurrence, + name: 'fRecurrence', + displayName: 'Recurrence' +}; + +const Field_EventType: IIntegerFieldDefinition = { + type: FieldType.Integer, + name: 'EventType', + displayName: 'Event Type' +}; + +const Field_UID: IGuidFieldDefinition = { + type: FieldType.Guid, + name: 'UID' +}; + +const Field_RecurrenceID: IDateTimeFieldDefinition = { + type: FieldType.DateTime, + name: 'RecurrenceID', + displayName: 'Recurrence ID', + dateTimeFormat: DateTimeFieldFormatType.DateTime +}; + +const Field_MasterSeriesItemID: IIntegerFieldDefinition = { + type: FieldType.Integer, + name: 'MasterSeriesItemID' +}; + +const Field_RecurrenceData: ITextFieldDefinition = { + type: FieldType.Text, + name: 'RecurrenceData', + multi: true +}; + +const Field_Duration: IIntegerFieldDefinition = { + type: FieldType.Integer, + name: 'Duration' +}; + +const Field_RefinerValues: ILookupFieldDefinition = { + type: FieldType.Lookup, + name: 'RefinerValues', + displayName: 'Refiner Values', + required: false, + multi: true, + lookupListTitle: RefinerValuesList.title, + showField: RefinerValuesList.field_Value.name +}; + +const Field_Contacts: IUserFieldDefinition = { + type: FieldType.User, + name: 'Contacts', + userSelectionMode: "PeopleOnly", + multi: true +}; + +const Field_Confidential: IBooleanFieldDefinition = { + type: FieldType.Boolean, + name: 'IsConfidential', + displayName: 'Is Confidential', + default: 'No' +}; + +const Field_RestrictedToAccounts: IUserFieldDefinition = { + type: FieldType.User, + name: 'RestrictedToAccounts', + displayName: 'Restricted To Accounts', + userSelectionMode: "PeopleAndGroups", + multi: true +}; + +const Field_ModerationStatus: IChoiceFieldDefinition = { + type: FieldType.Choice, + name: 'ModerationStatus', + displayName: 'Moderation Status', + choices: EventModerationStatus.all.map(s => s.name), + default: EventModerationStatus.Pending.name +}; + +const Field_Moderator: IUserFieldDefinition = { + type: FieldType.User, + name: 'Moderator', + userSelectionMode: "PeopleOnly", + required: false +}; + +const Field_ModerationTimestamp: IDateTimeFieldDefinition = { + type: FieldType.DateTime, + name: 'ModerationTimestamp', + displayName: 'Moderation Timestamp', + required: false, + dateTimeFormat: DateTimeFieldFormatType.DateTime +}; + +const Field_ModerationMessage: ITextFieldDefinition = { + type: FieldType.Text, + name: 'ModerationMessage', + displayName: 'Moderation Message', + multi: true, + required: false +}; + +const View_AllEvents: IViewDefinition = { + title: "All RoB Events", + rowLimit: 600, + paged: true, + default: false, + fields: includeStandardViewFields( + Field_Description, + Field_Location, + Field_EventDate, + Field_EndDate, + Field_fAllDayEvent, + Field_fRecurrence, + Field_EventType, + Field_UID, + Field_RecurrenceID, + Field_MasterSeriesItemID, + Field_RecurrenceData, + Field_Duration, + Field_RefinerValues, + Field_Contacts, + Field_Confidential, + Field_RestrictedToAccounts, + Field_ModerationStatus, + Field_Moderator, + Field_ModerationTimestamp, + Field_ModerationMessage + ), + // need to sort by ID ascending in order to ensure the series master is loaded before any exceptions to the series + query: ` + + + + ` +}; + +export interface IEventsListDefinition extends IListDefinition { + view_AllEvents: IViewDefinition; +} + +export const EventsList: IEventsListDefinition = { + title: Defaults.ListTitles.Events, + description: '', + template: ListTemplateType.EventsList, + dependencies: [RefinerValuesList], + permissions: { + copyRoleAssignments: false, + userRoles: [ + { operation: RoleOperation.Add, roleType: RoleType.Administrator, userType: 'ownerGroup' }, + { operation: RoleOperation.Add, roleType: RoleType.Administrator, userType: 'memberGroup' }, + { operation: RoleOperation.Add, roleType: RoleType.Reader, userType: 'visitorGroup' } + ] + }, + fields: [ + Field_Title, + Field_Description, + Field_Location, + Field_EventDate, + Field_EndDate, + Field_fAllDayEvent, + Field_fRecurrence, + Field_EventType, + Field_UID, + Field_RecurrenceID, + Field_MasterSeriesItemID, + Field_RecurrenceData, + Field_Duration, + Field_RefinerValues, + Field_Contacts, + Field_Confidential, + Field_RestrictedToAccounts, + Field_ModerationStatus, + Field_Moderator, + Field_ModerationTimestamp, + Field_ModerationMessage + ], + views: [ + View_AllEvents + ], + view_AllEvents: View_AllEvents +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/schema/lists/RefinerValuesList.ts b/samples/react-rhythm-of-business-calendar/src/schema/lists/RefinerValuesList.ts new file mode 100644 index 000000000..7fb712f61 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/schema/lists/RefinerValuesList.ts @@ -0,0 +1,116 @@ +import { IListDefinition, FieldType, IViewDefinition, includeStandardViewFields, ITitleFieldDefinition, INumberFieldDefinition, ITextFieldDefinition, IBooleanFieldDefinition, viewFields, ILookupFieldDefinition, IFieldDefinition, ListTemplateType, RoleOperation, RoleType } from "common/sharepoint"; +import { Defaults } from "../Defaults"; +import { RefinersList } from "./RefinersList"; + +const Field_Value: ITitleFieldDefinition = { + type: FieldType.Text, + name: 'Title', + displayName: 'Value', + required: true, + maxLength: 50 +}; + +const Field_Refiner: ILookupFieldDefinition = { + type: FieldType.Lookup, + name: 'Refiner', + required: true, + lookupListTitle: RefinersList.title, + showField: RefinersList.field_Name.name +}; + +const Field_Order: INumberFieldDefinition = { + type: FieldType.Number, + name: 'Order', + min: 0 +}; + +const Field_Tag: ITextFieldDefinition = { + type: FieldType.Text, + name: 'Tag', + maxLength: 3 +}; + +const Field_Color: ITextFieldDefinition = { + type: FieldType.Text, + name: 'Color' +}; + +const Field_Archived: IBooleanFieldDefinition = { + type: FieldType.Boolean, + name: "Archived", + default: 'No' +}; + +const View_AllRefinerValues: IViewDefinition = { + title: "All Refiner Values", + rowLimit: 1000, + paged: true, + default: false, + fields: includeStandardViewFields( + Field_Order, + Field_Refiner, + Field_Tag, + Field_Color, + Field_Archived + ) +}; + +const View_ActiveRefinerValues: IViewDefinition = { + title: "Active Refiner Values", + rowLimit: 500, + paged: true, + default: true, + fields: viewFields( + Field_Value, + Field_Refiner + ), + query: ` + + + + + + + + + + + 1 + + + ` +}; + +export interface IRefinerValuesListDefinition extends IListDefinition { + field_Value: IFieldDefinition; + view_AllRefinerValues: IViewDefinition; +} + +export const RefinerValuesList: IRefinerValuesListDefinition = { + title: Defaults.ListTitles.RefinerValues, + description: '', + template: ListTemplateType.GenericList, + dependencies: [RefinersList], + permissions: { + copyRoleAssignments: false, + userRoles: [ + { operation: RoleOperation.Add, roleType: RoleType.Administrator, userType: 'ownerGroup' }, + { operation: RoleOperation.Add, roleType: RoleType.Reader, userType: 'memberGroup' }, + { operation: RoleOperation.Add, roleType: RoleType.Reader, userType: 'visitorGroup' } + ] + }, + fields: [ + Field_Value, + Field_Order, + Field_Refiner, + Field_Tag, + Field_Color, + Field_Archived + ], + views: [ + View_AllRefinerValues, + View_ActiveRefinerValues + ], + field_Value: Field_Value, + view_AllRefinerValues: View_AllRefinerValues +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/schema/lists/RefinersList.ts b/samples/react-rhythm-of-business-calendar/src/schema/lists/RefinersList.ts new file mode 100644 index 000000000..bce602850 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/schema/lists/RefinersList.ts @@ -0,0 +1,114 @@ +import { IListDefinition, FieldType, IViewDefinition, includeStandardViewFields, ITitleFieldDefinition, INumberFieldDefinition, IBooleanFieldDefinition, IFieldDefinition, ListTemplateType, RoleOperation, RoleType } from "common/sharepoint"; +import { Defaults } from "../Defaults"; + +const Field_Name: ITitleFieldDefinition = { + type: FieldType.Text, + name: 'Title', + displayName: 'Name', + required: true, + maxLength: 50 +}; + +const Field_Order: INumberFieldDefinition = { + type: FieldType.Number, + name: 'Order', + min: 0 +}; + +const Field_AllowMultiselect: IBooleanFieldDefinition = { + type: FieldType.Boolean, + name: 'AllowMultiselect', + displayName: 'Allow Multiselect', + default: 'No' +}; + +const Field_Required: IBooleanFieldDefinition = { + type: FieldType.Boolean, + name: 'Required', + default: 'No' +}; + +const Field_InitiallyExpanded: IBooleanFieldDefinition = { + type: FieldType.Boolean, + name: 'InitiallyExpanded', + displayName: 'Initially Expanded', + default: 'Yes' +}; + +const Field_EnableColors: IBooleanFieldDefinition = { + type: FieldType.Boolean, + name: 'EnableColors', + displayName: 'Enable Colors', + default: 'No' +}; + +const Field_EnableTags: IBooleanFieldDefinition = { + type: FieldType.Boolean, + name: 'EnableTags', + displayName: 'Enable Tags', + default: 'No' +}; + +const Field_CustomSort: IBooleanFieldDefinition = { + type: FieldType.Boolean, + name: 'CustomSort', + displayName: 'Custom Sort', + default: 'No' +}; + +const View_AllRefiners: IViewDefinition = { + title: "All Refiners", + rowLimit: 100, + paged: true, + default: true, + fields: includeStandardViewFields( + Field_Order, + Field_AllowMultiselect, + Field_Required, + Field_InitiallyExpanded, + Field_EnableColors, + Field_EnableTags, + Field_CustomSort + ), + query: ` + + + + + ` +}; + +export interface IRefinersListDefinition extends IListDefinition { + field_Name: IFieldDefinition; + view_AllRefiners: IViewDefinition; +} + +export const RefinersList: IRefinersListDefinition = { + title: Defaults.ListTitles.Refiners, + description: '', + template: ListTemplateType.GenericList, + dependencies: [], + permissions: { + copyRoleAssignments: false, + userRoles: [ + { operation: RoleOperation.Add, roleType: RoleType.Administrator, userType: 'ownerGroup' }, + { operation: RoleOperation.Add, roleType: RoleType.Reader, userType: 'memberGroup' }, + { operation: RoleOperation.Add, roleType: RoleType.Reader, userType: 'visitorGroup' } + ] + }, + fields: [ + Field_Name, + Field_Order, + Field_AllowMultiselect, + Field_Required, + Field_InitiallyExpanded, + Field_EnableColors, + Field_EnableTags, + Field_CustomSort + ], + views: [ + View_AllRefiners + ], + field_Name: Field_Name, + view_AllRefiners: View_AllRefiners +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/schema/lists/index.ts b/samples/react-rhythm-of-business-calendar/src/schema/lists/index.ts new file mode 100644 index 000000000..33821604b --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/schema/lists/index.ts @@ -0,0 +1,5 @@ +export { ApproversList, IApproversListDefinition } from './ApproversList'; +export { ConfigurationList } from './ConfigurationList'; +export { EventsList, IEventsListDefinition } from './EventsList'; +export { RefinersList, IRefinersListDefinition } from './RefinersList'; +export { RefinerValuesList, IRefinerValuesListDefinition } from './RefinerValuesList'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/services/configuration/ConfigurationLoader.ts b/samples/react-rhythm-of-business-calendar/src/services/configuration/ConfigurationLoader.ts new file mode 100644 index 000000000..f25701209 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/services/configuration/ConfigurationLoader.ts @@ -0,0 +1,74 @@ +import { ErrorHandler } from "common"; +import { PagedViewLoader, IListItemResult, SPField, buildLiveList, IUpdateListItem, ErrorDiagnosis } from "common/sharepoint"; +import { ILiveUpdateService, ISharePointService, ITimeZoneService } from "common/services"; +import { ViewKeys } from "model"; +import { Configuration, ConfigurationList } from 'schema'; + +interface IConfigurationListItemResult extends IListItemResult { + readonly SchemaVersion: SPField.Query_Number; + readonly CurrentUpgradeAction: SPField.Query_Number; + readonly FiscalYearSartMonth: SPField.Query_Number; + readonly DefaultView: SPField.Query_Choice; + readonly UseRefiners: SPField.Query_Boolean; + readonly RefinerRailInitiallyExpanded: SPField.Query_Boolean; + readonly QuarterViewGroupByRefinerId: SPField.Query_Number; + readonly UseApprovals: SPField.Query_Boolean; + readonly AllowConfidentialEvents: SPField.Query_Boolean; +} + +interface IConfigurationUpdateListItem extends IUpdateListItem { + // 1.0 fields + readonly SchemaVersion: SPField.Update_Number; + readonly CurrentUpgradeAction: SPField.Update_Number; + readonly FiscalYearSartMonth: SPField.Update_Number; + readonly DefaultView: SPField.Update_Choice; + readonly UseRefiners: SPField.Update_Boolean; + readonly RefinerRailInitiallyExpanded: SPField.Update_Boolean; + readonly QuarterViewGroupByRefinerId: SPField.Update_Number; + readonly UseApprovals: SPField.Update_Boolean; + readonly AllowConfidentialEvents: SPField.Update_Boolean; +} + +const toConfiguration = async (row: IConfigurationListItemResult, config: Configuration): Promise => { + config.title = row.Title; + config.schemaVersion = SPField.fromFloat(row, 'SchemaVersion'); + config.currentUpgradeAction = SPField.fromInt(row, 'CurrentUpgradeAction', 0); + config.fiscalYearSartMonth = SPField.fromInt(row, 'FiscalYearSartMonth', 1) - 1; + config.defaultView = row.DefaultView as ViewKeys || ViewKeys.monthly; + config.useRefiners = SPField.fromYesNo(row, 'UseRefiners', true); + config.refinerRailInitiallyExpanded = SPField.fromYesNo(row, 'RefinerRailInitiallyExpanded', true); + config.quarterViewGroupByRefinerId = SPField.fromInt(row, 'QuarterViewGroupByRefinerId', undefined); + config.useApprovals = SPField.fromYesNo(row, 'UseApprovals', false); + config.allowConfidentialEvents = SPField.fromYesNo(row, 'AllowConfidentialEvents', false); +}; + +const toUpdateListItem = (config: Configuration): IConfigurationUpdateListItem => { + return { + // 1.0 fields + ...{ + Title: config.title, + SchemaVersion: config.schemaVersion, + CurrentUpgradeAction: config.currentUpgradeAction, + FiscalYearSartMonth: config.fiscalYearSartMonth + 1, + DefaultView: config.defaultView, + UseRefiners: config.useRefiners, + RefinerRailInitiallyExpanded: config.refinerRailInitiallyExpanded, + QuarterViewGroupByRefinerId: config.quarterViewGroupByRefinerId || 0, + UseApprovals: config.useApprovals, + AllowConfidentialEvents: config.allowConfidentialEvents + }, + // 1.1 fields + ...(config.schemaVersion >= 1.1 && { + }) + }; +}; + +export class ConfigurationLoader extends PagedViewLoader { + constructor(timezones: ITimeZoneService, spo: ISharePointService, liveUpdate: ILiveUpdateService) { + super({ ctor: Configuration, view: buildLiveList(ConfigurationList).view_AllItems, timezones, spo, liveUpdate, fastLoad: { useCache: true } }); + } + + protected readonly toEntity = toConfiguration; + protected readonly updateListItem = toUpdateListItem; + protected readonly diagnosePersistError = (error: any) => ErrorHandler.is_412_PRECONDITION_FAILED(error) ? ErrorDiagnosis.Propogate : ErrorDiagnosis.Critical; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/services/configuration/ConfigurationServiceDescriptor.ts b/samples/react-rhythm-of-business-calendar/src/services/configuration/ConfigurationServiceDescriptor.ts new file mode 100644 index 000000000..3eb248bec --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/services/configuration/ConfigurationServiceDescriptor.ts @@ -0,0 +1,27 @@ +import { IService, IServiceDescriptor, DirectoryService, DeveloperService, TimeZoneService, SharePointService, useServices, LiveUpdateService } from "common/services"; +import { Configuration } from 'schema'; +import { OnlineConfigurationService } from "./OnlineConfigurationService"; + +export const ConfigurationService: unique symbol = Symbol("Configuration Service"); + +export interface IConfigurationService extends IService { + active: Configuration; + + readonly all: readonly Configuration[]; + getById(id: number): Configuration; + + track(entity: Configuration): void; + persist(): Promise; +} + +export type ConfigurationServiceProp = { + [ConfigurationService]: IConfigurationService; +}; + +export const useConfigurationService = () => useServices()[ConfigurationService]; + +export const ConfigurationServiceDescriptor: IServiceDescriptor = { + symbol: ConfigurationService, + dependencies: [DirectoryService, DeveloperService, TimeZoneService, SharePointService, LiveUpdateService], + online: OnlineConfigurationService +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/services/configuration/OnlineConfigurationService.ts b/samples/react-rhythm-of-business-calendar/src/services/configuration/OnlineConfigurationService.ts new file mode 100644 index 000000000..748392765 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/services/configuration/OnlineConfigurationService.ts @@ -0,0 +1,91 @@ +import { first } from 'lodash'; +import { sp } from "@pnp/sp"; +import "@pnp/sp/lists"; +import { ErrorHandler } from "common"; +import { ServiceContext, DeveloperService, DeveloperServiceProp, ISharePointService, SharePointService, SharePointServiceProp, IDeveloperService, TimeZoneService, TimeZoneServiceProp, ITimeZoneService, LiveUpdateServiceProp, LiveUpdateService, ILiveUpdateService } from "common/services"; +import { Configuration, ReadonlyConfigurationMap, ConfigurationList } from "schema"; +import { IConfigurationService } from "./ConfigurationServiceDescriptor"; +import { ConfigurationLoader } from "./ConfigurationLoader"; + +export class OnlineConfigurationService implements IConfigurationService { + private readonly _dev: IDeveloperService; + private readonly _timezones: ITimeZoneService; + private readonly _liveUpdate: ILiveUpdateService; + private readonly _spo: ISharePointService; + + private _configurations: readonly Configuration[]; + private _configurationsById: ReadonlyConfigurationMap; + private _active: Configuration; + + private _configurationLoader: ConfigurationLoader; + + constructor({ + [DeveloperService]: dev, + [TimeZoneService]: timezones, + [LiveUpdateService]: liveUpdate, + [SharePointService]: spo + }: ServiceContext) { + this._dev = dev; + this._timezones = timezones; + this._liveUpdate = liveUpdate; + this._spo = spo; + } + + public async initialize(): Promise { + this._configurationLoader = new ConfigurationLoader(this._timezones, this._spo, this._liveUpdate); + + await this._spo.preflightSchema(); + this._configurations = await this._configurationLoader.all(); + this._configurationsById = await this._configurationLoader.entitiesById(); + this._active = first(this._configurations); + + this._dev.registerScripts(this._devScripts); + } + + public get active(): Configuration { return this._active; } + public set active(val: Configuration) { + if (!val || this._configurationsById.has(val.id)) + this._active = val; + } + + public get all(): readonly Configuration[] { return this._configurations; } + public getById(id: number): Configuration { return this._configurationsById.get(id); } + + public track(entity: Configuration): void { + this._configurationLoader.track(entity); + } + + public async persist(): Promise { + await this._configurationLoader.persist(); + } + + private readonly _devScripts = { + schema: { + obliterate: async () => { + console.log(`Starting 'obliterate()'`); + + const { id, title, schema } = this._active; + + console.log(`Deleting '${title}' (${id}) configuration list item`); + this._active.snapshot(); + this._active.delete(); + await this.persist(); + + const eh = new ErrorHandler(); + const batch = sp.web.createBatch(); + + schema.lists.forEach(list => { + if (list !== ConfigurationList || this._configurations.length === 0) { // only delete the Configurations list if this is the last configuration + console.log(`\tDeleteing list '${list.title}'`); + sp.web.lists.getByTitle(list.title).inBatch(batch).delete().catch(eh.catch); + } + }); + + await batch.execute(); + eh.reportIfError(); + + console.log(`Completed 'obliterate()'`); + } + } + }; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/services/configuration/index.ts b/samples/react-rhythm-of-business-calendar/src/services/configuration/index.ts new file mode 100644 index 000000000..6397f598a --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/services/configuration/index.ts @@ -0,0 +1 @@ +export * from "./ConfigurationServiceDescriptor"; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/services/events/ApproversLoader.ts b/samples/react-rhythm-of-business-calendar/src/services/events/ApproversLoader.ts new file mode 100644 index 000000000..28b318a1c --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/services/events/ApproversLoader.ts @@ -0,0 +1,47 @@ +import { ErrorHandler } from "common"; +import { PagedViewLoader, IListItemResult, SPField, IUpdateListItem, ErrorDiagnosis } from "common/sharepoint"; +import { ISharePointService, ILiveUpdateService, ITimeZoneService } from "common/services"; +import { Approvers } from "model"; +import { IRhythmOfBusinessCalendarSchema } from "schema"; +import { RefinerValueLoader } from "./RefinerValueLoader"; + +interface IApproversListItemResult extends IListItemResult { + RefinerValues: SPField.Query_LookupMulti; + IncludeInApprovalEmail: SPField.Query_Boolean; + Users: SPField.Query_UserMulti; +} + +interface IApproversUpdateListItem extends IUpdateListItem { + RefinerValuesId: SPField.Update_LookupIdMulti; + IncludeInApprovalEmail: SPField.Update_Boolean; + UsersId: SPField.Update_UserIdMulti; +} + +const toApprovers = async (row: IApproversListItemResult, approver: Approvers, refinerValueLoader: RefinerValueLoader): Promise => { + approver.title = row.Title; + approver.users = SPField.toUsers(row.Users); + approver.includeInApprovalEmail = SPField.fromYesNo(row, 'IncludeInApprovalEmail'); + approver.refinerValues.set(await SPField.fromLookupMultiAsync(row.RefinerValues, refinerValueLoader.getById)); +}; + +const toUpdateListItem = (approver: Approvers): IApproversUpdateListItem => { + return { + Title: approver.title, + UsersId: SPField.fromUsers(approver.users), + IncludeInApprovalEmail: approver.includeInApprovalEmail, + RefinerValuesId: SPField.toLookupMulti(approver.refinerValues.get()) + }; +}; + +export class ApproversLoader extends PagedViewLoader { + constructor(schema: IRhythmOfBusinessCalendarSchema, timezones: ITimeZoneService, spo: ISharePointService, liveUpdate: ILiveUpdateService, private readonly _refinerValueLoader: RefinerValueLoader) { + super({ ctor: Approvers, view: schema.approversList.view_AllApprovers, timezones, spo, liveUpdate, fastLoad: { useCache: true } }); + + _refinerValueLoader.registerDependency(this); + } + + protected readonly extractReferencedUsers = (approver: Approvers) => [...approver.users]; + protected readonly toEntity = (row: IApproversListItemResult, entity: Approvers) => toApprovers(row, entity, this._refinerValueLoader); + protected readonly updateListItem = toUpdateListItem; + protected readonly diagnosePersistError = (error: any) => ErrorHandler.is_412_PRECONDITION_FAILED(error) ? ErrorDiagnosis.Propogate : ErrorDiagnosis.Critical; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/services/events/Defaults.ts b/samples/react-rhythm-of-business-calendar/src/services/events/Defaults.ts new file mode 100644 index 000000000..cd0148847 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/services/events/Defaults.ts @@ -0,0 +1,15 @@ +import { Guid } from "@microsoft/sp-core-library"; + +const Environments = { + LOCAL: { TeamsAppId: Guid.empty }, + DEV: { TeamsAppId: Guid.parse('771c6f47-c589-4bdd-af37-8584f753b5da') }, + TEST: { TeamsAppId: Guid.parse('21ddbee7-d6be-4eb3-8888-a3a5ae388810') }, + STAGE: { TeamsAppId: Guid.empty }, + PROD: { TeamsAppId: Guid.parse('1e92a7c2-d849-4fa7-bd2d-8fb9f876609d') } +}; + +const Environment = Environments.LOCAL; + +export const Defaults = { + TeamsAppId: Environment.TeamsAppId +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/services/events/EventLoader.ts b/samples/react-rhythm-of-business-calendar/src/services/events/EventLoader.ts new file mode 100644 index 000000000..dad2f2536 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/services/events/EventLoader.ts @@ -0,0 +1,142 @@ +import { decode } from "he"; +import { ErrorHandler } from "common"; +import { PagedViewLoader, IListItemResult, SPField, IUpdateListItem, ErrorDiagnosis } from "common/sharepoint"; +import { ISharePointService, ILiveUpdateService, ITimeZoneService, ITimeZone } from "common/services"; +import { Event, EventModerationStatus, ReadonlyEventMap } from "model"; +import { IRhythmOfBusinessCalendarSchema } from "schema"; +import { RefinerValueLoader } from "./RefinerValueLoader"; +import { RecurrenceData } from "./RecurrenceData"; + +interface IEventListItemResult extends IListItemResult { + Description: SPField.Query_TextMultiLine; + Location: SPField.Query_Text; + Contacts: SPField.Query_UserMulti; + RefinerValues: SPField.Query_LookupMulti; + EventDate: SPField.Query_DateTime; + EndDate: SPField.Query_DateTime; + fAllDayEvent: SPField.Query_Boolean; + IsConfidential: SPField.Query_Boolean; + RestrictedToAccounts: SPField.Query_UserMulti; + ModerationStatus: SPField.Query_Choice; + Moderator: SPField.Query_User; + ModerationTimestamp: SPField.Query_DateTime; + ModerationMessage: SPField.Query_TextMultiLine; + fRecurrence: SPField.Query_Recurrence; + EventType: SPField.Query_Integer; + RecurrenceData: SPField.Query_TextMultiLine; + MasterSeriesItemID: SPField.Query_Integer; + RecurrenceID: SPField.Query_DateTime; + UID: SPField.Query_Guid; + Duration: SPField.Query_Integer; +} + +interface IEventUpdateListItem extends IUpdateListItem { + Description: SPField.Update_TextMultiLine; + Location: SPField.Update_Text; + ContactsId: SPField.Update_UserIdMulti; + RefinerValuesId: SPField.Update_LookupIdMulti; + EventDate: SPField.Update_DateTime; + EndDate: SPField.Update_DateTime; + fAllDayEvent: SPField.Update_Boolean; + IsConfidential: SPField.Update_Boolean; + RestrictedToAccountsId: SPField.Update_UserIdMulti; + ModerationStatus: SPField.Update_Choice; + ModeratorId: SPField.Update_UserId; + ModerationTimestamp: SPField.Update_DateTime; + ModerationMessage: SPField.Update_TextMultiLine; + fRecurrence: SPField.Update_Recurrence; + EventType: SPField.Update_Integer; + RecurrenceData: SPField.Update_TextMultiLine; + MasterSeriesItemID: SPField.Update_Integer; + RecurrenceID: SPField.Update_DateTime; + UID: SPField.Update_Guid; + Duration: SPField.Update_Integer; +} + +const toEvent = async (row: IEventListItemResult, event: Event, siteTimeZone: ITimeZone, refinerValueLoader: RefinerValueLoader, eventsById: ReadonlyEventMap): Promise => { + event.title = decode(row.Title); + event.description = decode(row.Description); + event.location = decode(row.Location); + event.contacts = SPField.toUsers(row.Contacts); + event.refinerValues.set(await SPField.fromLookupMultiAsync(row.RefinerValues, refinerValueLoader.getById)); + + const isAllDay = SPField.fromYesNo(row, 'fAllDayEvent'); + const start = SPField.fromDateTime(row, 'EventDate', siteTimeZone); + const end = SPField.fromDateTime(row, 'EndDate', siteTimeZone); + if (isAllDay) { + start.utc().tz(siteTimeZone.momentId, true); + end.utc().tz(siteTimeZone.momentId, true); + } + event.start = start; + event.end = end; + event.isAllDay = isAllDay; + + event.isConfidential = SPField.fromYesNo(row, 'IsConfidential'); + event.restrictedToAccounts = SPField.toUsers(row.RestrictedToAccounts); + event.moderationStatus = EventModerationStatus.fromName(row.ModerationStatus); + event.moderator = SPField.toUser(row.Moderator); + event.moderationTimestamp = SPField.fromDateTime(row, 'ModerationTimestamp', siteTimeZone); + event.moderationMessage = decode(row.ModerationMessage); + event.isRecurring = SPField.fromRecurrence(row, 'fRecurrence'); + event.recurrenceUID = SPField.fromGuid(row, 'UID'); + + if (event.isRecurring) { + const seriesMasterId = SPField.fromInteger(row, 'MasterSeriesItemID'); + if (seriesMasterId) { // this is an exception occurrence to the series + event.seriesMaster.set(eventsById.get(seriesMasterId)); + event.recurrenceExceptionInstanceDate = SPField.fromDateTime(row, 'RecurrenceID', siteTimeZone); + event.recurrenceInstanceCancelled = (SPField.fromInteger(row, 'EventType') === 3); + } else { // this is the series master + const duration = SPField.fromInteger(row, 'Duration'); + event.end = event.start.clone().add(duration, 'seconds'); + event.recurrence = RecurrenceData.deserialize(decode(row.RecurrenceData || '')); + } + } +}; + +const getEventTypeValue = (event: Event) => { + if (!event.isRecurring) return 0; // 0 = non-recurring event + if (!event.isSeriesException) return 1; // 1 = series master + if (!event.recurrenceInstanceCancelled) return 4; // 4 = this one occurrence of the series is an exception (date/time change) + return 3; // 3 = cancelled this one occurrence of a series +} + +const toUpdateListItem = (event: Event): IEventUpdateListItem => { + const { isNew, isAllDay, isRecurring, isSeriesMaster, isSeriesException } = event; + return { + Title: event.title, + Description: event.description, + Location: event.location, + ContactsId: SPField.fromUsers(event.contacts), + RefinerValuesId: SPField.toLookupMulti(event.refinerValues.get()), + EventDate: isAllDay ? SPField.toDateOnly(event.start) : SPField.toDateTime(event.start), + EndDate: isAllDay ? SPField.toDateOnly(event.end) : SPField.toDateTime(event.end), + fAllDayEvent: event.isAllDay, + IsConfidential: event.isConfidential, + RestrictedToAccountsId: SPField.fromUsers(event.restrictedToAccounts), + ModerationStatus: event.moderationStatus?.name || EventModerationStatus.Pending.name, + ModeratorId: SPField.fromUser(event.moderator), + ModerationTimestamp: SPField.toDateTime(event.moderationTimestamp), + ModerationMessage: event.moderationMessage, + fRecurrence: SPField.tofRecurrence(isRecurring), + EventType: getEventTypeValue(event), + RecurrenceData: isSeriesMaster ? RecurrenceData.serialize(event.recurrence) : undefined, + MasterSeriesItemID: isSeriesException ? event.seriesMaster.get()?.id : undefined, + RecurrenceID: isSeriesException ? SPField.toDateTime(event.recurrenceExceptionInstanceDate) : undefined, + UID: isRecurring && isNew ? event.recurrenceUID?.toString() : undefined, + Duration: event.duration.asSeconds() + }; +}; + +export class EventLoader extends PagedViewLoader { + constructor(schema: IRhythmOfBusinessCalendarSchema, timezones: ITimeZoneService, spo: ISharePointService, liveUpdate: ILiveUpdateService, private readonly _refinerValueLoader: RefinerValueLoader) { + super({ ctor: Event, view: schema.eventsList.view_AllEvents, timezones, spo, liveUpdate, fastLoad: { useCache: true } }); + + this.registerDependency(_refinerValueLoader); + } + + protected readonly extractReferencedUsers = (event: Event) => [...event.contacts, ...event.restrictedToAccounts, event.moderator]; + protected readonly toEntity = (row: IEventListItemResult, event: Event) => toEvent(row, event, this.timezones.siteTimeZone, this._refinerValueLoader, this._entitiesById); + protected readonly updateListItem = toUpdateListItem; + protected readonly diagnosePersistError = (error: any) => ErrorHandler.is_412_PRECONDITION_FAILED(error) ? ErrorDiagnosis.Propogate : ErrorDiagnosis.Critical; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/services/events/EventsServiceDescriptor.ts b/samples/react-rhythm-of-business-calendar/src/services/events/EventsServiceDescriptor.ts new file mode 100644 index 000000000..3112728de --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/services/events/EventsServiceDescriptor.ts @@ -0,0 +1,40 @@ +import { IAsyncData } from "common"; +import { IService, IServiceDescriptor, DeveloperService, SharePointService, TimeZoneService, DirectoryService, LiveUpdateService, useServices } from "common/services"; +import { Approvers, Event, ReadonlyEventMap, Refiner, RefinerValue } from "model"; +import { ConfigurationService } from "../configuration"; +import { OnlineEventsService } from "./OnlineEventsService"; + +export const EventsService: unique symbol = Symbol("Events Service"); + +export interface IEventsService extends IService { + readonly eventsAsync: IAsyncData; + eventsById(): Promise; + + readonly refinersAsync: IAsyncData; + readonly refinerValuesAsync: IAsyncData; + + readonly approversAsync: IAsyncData; + + track(event: Event): void; + track(refiner: Refiner): void; + track(refinerValue: RefinerValue): void; + track(approver: Approvers): void; + + persist(): Promise; + + addToOutlook(event: Event): void; + + createEventDeepLink(event: Event): string; +} + +export type EventsServiceProp = { + [EventsService]: IEventsService; +}; + +export const useEventsService = () => useServices()[EventsService]; + +export const EventsServiceDescriptor: IServiceDescriptor = { + symbol: EventsService, + dependencies: [DeveloperService, TimeZoneService, LiveUpdateService, DirectoryService, SharePointService, ConfigurationService], + online: OnlineEventsService +}; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/services/events/OnlineEventsService.ts b/samples/react-rhythm-of-business-calendar/src/services/events/OnlineEventsService.ts new file mode 100644 index 000000000..a63823531 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/services/events/OnlineEventsService.ts @@ -0,0 +1,481 @@ +import { sp } from '@pnp/sp'; +import { IEmailProperties } from '@pnp/sp/sputilities'; +import { IMicrosoftTeams } from '@microsoft/sp-webpart-base'; +import { format } from '@fluentui/react'; +import { Color, Entity, humanizeFixedList, IAsyncData, multifilter, now, User } from 'common'; +import { ServiceContext, DeveloperService, DeveloperServiceProp, SharePointServiceProp, SharePointService, ISharePointService, TimeZoneServiceProp, TimeZoneService, ITimeZoneService, LiveUpdateServiceProp, LiveUpdateService, ILiveUpdateService, DirectoryService, DirectoryServiceProp, IDirectoryService, SpfxContext, TeamsJs } from 'common/services'; +import { RoleType } from 'common/sharepoint'; +import { Approvers, Event, EventModerationStatus, humanizeDateRange, humanizeRecurrencePattern, ReadonlyEventMap, Refiner, RefinerValue } from 'model'; +import { ConfigurationService, IConfigurationService, ConfigurationServiceProp } from '../configuration'; +import { IEventsService } from './EventsServiceDescriptor'; +import { EventLoader } from './EventLoader'; +import { iCalendarFileBuilder } from './iCalendarFileBuilder'; +import { RefinerLoader } from './RefinerLoader'; +import { RefinerValueLoader } from './RefinerValueLoader'; +import { ApproversLoader } from './ApproversLoader'; +import { Defaults } from './Defaults'; + +import { AppName, ApprovalEmails as strings } from 'ComponentStrings'; + +export class OnlineEventsService implements IEventsService { + private readonly _context: SpfxContext; + private readonly _teams: IMicrosoftTeams; + private readonly _timezones: ITimeZoneService; + private readonly _liveUpdate: ILiveUpdateService; + private readonly _directory: IDirectoryService; + private readonly _spo: ISharePointService; + private readonly _configurations: IConfigurationService; + + private _eventLoader: EventLoader; + private _refinerLoader: RefinerLoader; + private _refinerValueLoader: RefinerValueLoader; + private _approversLoader: ApproversLoader; + + constructor({ + [SpfxContext]: context, + [TeamsJs]: teams, + [DeveloperService]: dev, + [TimeZoneService]: timezones, + [LiveUpdateService]: liveUpdate, + [DirectoryService]: directory, + [SharePointService]: spo, + [ConfigurationService]: configurations + }: ServiceContext) { + this._context = context; + this._teams = teams; + this._timezones = timezones; + this._liveUpdate = liveUpdate; + this._directory = directory; + this._spo = spo; + this._configurations = configurations; + + dev.registerScripts(this._devScripts); + } + + public async initialize(): Promise { + const configuration = this._configurations.active; + + if (configuration && !configuration.isNew) { + const schema = configuration.schema; + + this._refinerLoader = new RefinerLoader(schema, this._timezones, this._spo, this._liveUpdate); + this._refinerValueLoader = new RefinerValueLoader(schema, this._timezones, this._spo, this._liveUpdate, this._refinerLoader); + this._eventLoader = new EventLoader(schema, this._timezones, this._spo, this._liveUpdate, this._refinerValueLoader); + this._approversLoader = new ApproversLoader(schema, this._timezones, this._spo, this._liveUpdate, this._refinerValueLoader); + } + } + + public get eventsAsync(): IAsyncData { + return this._eventLoader.asyncData(); + } + + public async eventsById(): Promise { + return this._eventLoader.entitiesById(); + } + + public get refinersAsync(): IAsyncData { + return this._refinerLoader.asyncData(); + } + + public get refinerValuesAsync(): IAsyncData { + return this._refinerValueLoader.asyncData(); + } + + public get approversAsync(): IAsyncData { + return this._approversLoader.asyncData(); + } + + public track(event: Event): void; + public track(refiner: Refiner): void; + public track(refinerValue: RefinerValue): void; + public track(approvers: Approvers): void; + public track(entity: Event | Refiner | RefinerValue | Approvers): void { + if (entity instanceof Event) { + this._eventLoader.track(entity); + } else if (entity instanceof Refiner) { + this._refinerLoader.track(entity); + entity.values.forEach(value => this.track(value)); + } else if (entity instanceof RefinerValue) { + this._refinerValueLoader.track(entity); + } else if (entity instanceof Approvers) { + this._approversLoader.track(entity); + } + } + + public async persist(): Promise { + await this._refinerLoader.persist(); + await this._refinerValueLoader.persist(); + await this._approversLoader.persist(); + await this._eventLoader.persist(); + await this._handleRestrictedPermissionsEvents(); + await this._handleEventApprovals(); + } + + public addToOutlook(event: Event): void { + const builder = new iCalendarFileBuilder(); + const ics = builder.build(event); + + const filename = event.title; + const blob = new Blob([ics], { type: "text/html" }); + + const url = URL.createObjectURL(blob); + + const element = document.createElement("a"); + element.href = url; + element.setAttribute("download", `${filename}.ics`); + element.click(); + + URL.revokeObjectURL(url); + } + + public createEventDeepLink(event: Event): string { + let path = ''; + + const { id, seriesMaster, isNew, isSeriesException, recurrenceExceptionInstanceDate } = event; + const eventId = (isSeriesException && isNew) ? seriesMaster.get().id : id; + + if (this._teams) { + const { entityId, channelId, groupId, tid } = this._teams.context; + const subEntityId = JSON.stringify({ + eventId, + recurrenceDate: isSeriesException ? recurrenceExceptionInstanceDate.toISOString() : undefined + }); + const appId = Defaults.TeamsAppId; + + path = `https://teams.microsoft.com/l/entity/${appId.toString()}/${entityId}` + + `?context=${encodeURIComponent(JSON.stringify({ subEntityId, channelId }))}` + + `&groupId=${groupId}&tenantId=${tid}&allowXTenantAccess=false`; + } else { + const { origin, pathname, search } = window.location; + const searchParams = new URLSearchParams(search); + + searchParams.set('eventid', eventId.toString()); + + if (isSeriesException) { + searchParams.set('recurrencedate', recurrenceExceptionInstanceDate.toISOString()); + } + + path = `${origin}${pathname}?${searchParams.toString()}`; + } + + return path; + } + + private async _handleRestrictedPermissionsEvents(): Promise { + const events = this._eventLoader.entitiesWithChanges; + const eventsList = this._configurations.active.schema.eventsList; + const approvers = (await this._approversLoader.all()).filter(Entity.NotDeletedFilter); + + const adminRoleDefinitionId = await this._directory.roleDefinitionId(RoleType.Administrator); + + await this._spo.preflightEnsureUsers([ + ...approvers.flatMap(a => a.users), + ...events.map(event => event.author), + ...events.flatMap(event => event.restrictedToAccounts) + ]); + + for (const event of events) { + const { isConfidential, author, restrictedToAccounts } = event; + const isConfidentialChanged = event.hasChanges('isConfidential'); + const restrictedToAccountsChanged = event.hasChanges('restrictedToAccounts'); + + if (isConfidentialChanged || restrictedToAccountsChanged) { + if (isConfidential) { + const selectedValuesByRefiner = event.valuesByRefiner(); + const approversForEvent = approvers.filter(a => Approvers.appliesTo(a, selectedValuesByRefiner)); + const approversUsers = approversForEvent.flatMap(a => a.users); + const permissions = new Map(); + + permissions.set(adminRoleDefinitionId, [ + author, + ...approversUsers, + ...restrictedToAccounts + ]); + + await this._spo.configureEntityPermissions(event, eventsList, permissions); + } else { + await this._spo.configureEntityPermissions(event, eventsList, undefined); + } + } + } + } + + private async _handleEventApprovals(): Promise { + const events = multifilter(this._eventLoader.entitiesWithChanges, Entity.NotDeletedFilter, e => e.hasSnapshot); + const refiners = (await this._refinerLoader.all()).filter(Entity.NotDeletedFilter); + const approvers = (await this._approversLoader.all()).filter(Entity.NotDeletedFilter); + + for (const event of events) { + const { isPendingApproval, isRejected } = event; + const isNew = event.snapshotValue('isNew'); + const moderationStatusChanged = event.hasChanges('moderationStatus'); + + try { + if (isNew && isPendingApproval) { + const email = this._constructEmail_EventApprovalRequest(event, refiners, approvers); + await sp.utility.sendEmail(email); + } else if (moderationStatusChanged && isRejected) { + const email = this._constructEmail_EventRejected(event, refiners); + await sp.utility.sendEmail(email); + } + } catch (ex) { + console.error('Failed to send event approval e-mail', ex); + } + } + } + + private _constructEmail_EventApprovalRequest(event: Event, refiners: Refiner[], approvers: Approvers[]): IEmailProperties { + const { author } = event; + + const selectedValuesByRefiner = event.valuesByRefiner(); + const approversForEvent = approvers.filter(a => Approvers.appliesTo(a, selectedValuesByRefiner)); + const approversUsers = approversForEvent.flatMap(a => a.users); + + const toAddresses = [ + ...approversUsers + ].map(user => user.email); + + const ccAddresses = [ + author + ].map(user => user.email); + + const itemUrl = this.createEventDeepLink(event); + + const eventDetailsHtml = this._constructEventDetailsHtml(event, refiners); + + const body = + `

${format(strings.RequestEmail.Intro, AppName, `${author.title}`)}

` + + `

${strings.RequestEmail.EventLinkText}

` + + `

${strings.RequestEmail.EventDetailsHeading}

` + + eventDetailsHtml; + + return { + To: toAddresses, + CC: ccAddresses, + Subject: strings.RequestEmail.Subject, + Body: body + }; + } + + private _constructEmail_EventRejected(event: Event, refiners: Refiner[]): IEmailProperties { + const { author, moderator, moderationMessage } = event; + + const toAddresses = [ + author + ].map(user => user.email); + + const itemUrl = this.createEventDeepLink(event); + + const eventDetailsHtml = this._constructEventDetailsHtml(event, refiners); + + const body = + `

${format(strings.RejectedEmail.Intro, AppName, `${moderator.title}`)}

` + + `

Reason: ${moderationMessage || strings.RejectedEmail.NoReasonGiven}

` + + `
` + + `

${strings.RejectedEmail.EventLinkText}

` + + `

${strings.RejectedEmail.EventDetailsHeading}

` + + eventDetailsHtml; + + return { + To: toAddresses, + Subject: strings.RejectedEmail.Subject, + Body: body + }; + } + + private _constructEventDetailsHtml(event: Event, refiners: Refiner[]): string { + const { displayName, start, end, isAllDay, location, description, isRecurring, recurrence, isConfidential } = event; + const dateAndTimeString = isRecurring ? humanizeRecurrencePattern(start, recurrence) : humanizeDateRange(start, end, isAllDay); + const { EventName, Location, DateAndTime, Description, ConfidentialEvent } = strings.EventDetails; + + return ( + `` + + ` ` + + ` ` + + ` ` + + ` ` + + refiners.sort(Refiner.OrderAscComparer).map(refiner => + `` + ).join('') + + (isConfidential + ? `` + : '' + ) + + `
${EventName}: ${displayName}
${Location}: ${location || '-'}
${DateAndTime}: ${dateAndTimeString}
${Description}: ${description || '-'}
${refiner.displayName}: ${this._humanizeSelectedRefinerValues(refiner, event)}
${ConfidentialEvent}
` + ); + } + + private _humanizeSelectedRefinerValues(refiner: Refiner, event: Event): string { + const refinerValues = refiner.values.get().filter(Entity.NotDeletedFilter); + const selectedValues = multifilter(event.refinerValues.get(), Entity.NotDeletedFilter, value => value.refiner.get() === refiner); + return humanizeFixedList(selectedValues, refinerValues, value => value.displayName) || strings.RefinerNoValueSelected; + } + + private readonly _devScripts = { + events: { + createSampleRefiners: async () => { + console.log(`Starting 'createSampleRefiners()'`); + + { + const refiner = new Refiner(); + refiner.title = "Departments"; + refiner.enableColors = true; + refiner.required = true; + refiner.order = 0; + + const value1 = new RefinerValue(); + value1.title = "Sales"; + value1.color = new Color(0, 175, 0); + value1.refiner.set(refiner); + + const value2 = new RefinerValue(); + value2.title = "Marketing"; + value2.color = new Color(235, 0, 0); + value2.refiner.set(refiner); + + const value3 = new RefinerValue(); + value3.title = "Engineering"; + value3.color = new Color(50, 100, 255); + value3.refiner.set(refiner); + + refiner.values.forEach((v, idx) => v.order = idx); + + this.track(refiner); + } + + { + const refiner = new Refiner(); + refiner.title = "Tiers"; + refiner.enableTags = true; + refiner.required = true; + refiner.order = 1; + + const value1 = new RefinerValue(); + value1.title = "Tier 1"; + value1.tag = "1" + value1.refiner.set(refiner); + + const value2 = new RefinerValue(); + value2.title = "Tier 2"; + value2.tag = "2"; + value2.refiner.set(refiner); + + const value3 = new RefinerValue(); + value3.title = "Tier 3"; + value3.tag = "3"; + value3.refiner.set(refiner); + + const value4 = new RefinerValue(); + value4.title = "Tier 4"; + value4.tag = "4"; + value4.refiner.set(refiner); + + refiner.values.forEach((v, idx) => v.order = idx); + + this.track(refiner); + } + + { + const refiner = new Refiner(); + refiner.title = "Sample Refiner"; + refiner.initiallyExpanded = false; + refiner.allowMultiselect = true; + refiner.order = 2; + + const value1 = new RefinerValue(); + value1.title = "Value A"; + value1.refiner.set(refiner); + + const value2 = new RefinerValue(); + value2.title = "Value B"; + value2.refiner.set(refiner); + + const value3 = new RefinerValue(); + value3.title = "Value C"; + value3.refiner.set(refiner); + + refiner.values.forEach((v, idx) => v.order = idx); + + this.track(refiner); + } + + await this.persist(); + + console.log(`Completed 'createSampleRefiners()'`); + }, + createSampleEvents: async () => { + console.log(`Starting 'createSampleEvents()'`); + + const refiners = await this._refinerLoader.all(); + + const { currentUser } = this._directory; + + const events: Event[] = []; + + { + const event = new Event(); + event.snapshot(); + event.title = "North America East Quarterly Connect - Broadcast"; + event.start = now().add(2, 'days').startOf('day').add(10, 'hours'); + event.end = event.start.clone().add(2, 'hours'); + event.location = "Online Teams Meeting"; + + for (const refiner of refiners) + event.refinerValues.add(refiner.values.get()[0]); + + event.moderator = currentUser; + event.moderationTimestamp = now(); + event.moderationStatus = EventModerationStatus.Approved; + + events.push(event); + this.track(event); + } + + { + const event = new Event(); + event.snapshot(); + event.title = "Priority Aligment"; + event.start = now().add(5, 'days').startOf('day').add(8, 'hours'); + event.end = event.start.clone().add(6, 'hours'); + event.location = "Executive Room 6"; + + for (const refiner of refiners) + event.refinerValues.add(refiner.values.get()[1]); + + event.moderator = currentUser; + event.moderationTimestamp = now(); + event.moderationStatus = EventModerationStatus.Approved; + + events.push(event); + this.track(event); + } + + { + const event = new Event(); + event.snapshot(); + event.title = "Southeast Conference Week"; + event.start = now().add(5, 'days'); + event.end = event.start.clone().add(4, 'days'); + event.isAllDay = true; + event.location = "Miami Conference Center"; + + for (const refiner of refiners) + event.refinerValues.add(refiner.values.get()[2]); + + event.moderator = currentUser; + event.moderationTimestamp = now(); + event.moderationStatus = EventModerationStatus.Approved; + + events.push(event); + this.track(event); + } + + await this.persist(); + + events.forEach(event => event.immortalize()); + + console.log(`Completed 'createSampleEvents()'`); + } + } + }; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/services/events/RecurrenceData.ts b/samples/react-rhythm-of-business-calendar/src/services/events/RecurrenceData.ts new file mode 100644 index 000000000..4f50b6354 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/services/events/RecurrenceData.ts @@ -0,0 +1,375 @@ +import moment from "moment-timezone"; +import { Recurrence } from "model"; +import { RecurDay, RecurPattern, RecurPatternOption, RecurUntilType, RecurWeekOfMonth } from "model/Recurrence"; + +const daysOfWeek = [ + { attr: 'su', day: RecurDay.sunday }, + { attr: 'mo', day: RecurDay.monday }, + { attr: 'tu', day: RecurDay.tuesday }, + { attr: 'we', day: RecurDay.wednesday }, + { attr: 'th', day: RecurDay.thursday }, + { attr: 'fr', day: RecurDay.friday }, + { attr: 'sa', day: RecurDay.saturday } +]; + +export class RecurrenceData { + public static deserialize(data: string): Recurrence { + const recurrence = new Recurrence(); + + if (!data) return recurrence; + + const parser = new DOMParser(); + const doc = parser.parseFromString(data, 'application/xml'); + + const ruleNode = this._evaluate(doc, '/recurrence/rule'); + if (!ruleNode) return recurrence; + + const firstDayOfWeekNode = this._evaluate(doc, 'firstDayOfWeek', ruleNode); + if (!firstDayOfWeekNode) return recurrence; + + const firstDayOfWeek = firstDayOfWeekNode.textContent; + recurrence.firstDayOfWeek = firstDayOfWeek; + + const repeatNode = this._evaluate(doc, 'repeat', ruleNode); + if (!repeatNode) return recurrence; + + const repeatInstancesNode = this._evaluate(doc, 'repeatInstances', ruleNode); + const repeatForeverNode = this._evaluate(doc, 'repeatForever', ruleNode); + const windowEndNode = this._evaluate(doc, 'windowEnd', ruleNode); + + if (!(repeatInstancesNode || repeatForeverNode || windowEndNode)) return recurrence; + + const repeatInstances = repeatInstancesNode && parseInt(repeatInstancesNode.textContent); + const repeatForever = !!repeatForeverNode; + const windowEnd = windowEndNode && moment(windowEndNode.textContent); + + const { until } = recurrence; + if (repeatForever) { + until.type = RecurUntilType.forever; + } else if (repeatInstances) { + until.type = RecurUntilType.count; + until.count = repeatInstances; + } else if (windowEnd) { + until.type = RecurUntilType.date; + until.date = windowEnd.clone(); + } + + const dailyNode = this._evaluate(doc, 'daily', repeatNode); + const weeklyNode = this._evaluate(doc, 'weekly', repeatNode); + const monthlyNode = this._evaluate(doc, 'monthly', repeatNode); + const monthlyByDayNode = this._evaluate(doc, 'monthlyByDay', repeatNode); + const yearlyNode = this._evaluate(doc, 'yearly', repeatNode); + const yearlyByDayNode = this._evaluate(doc, 'yearlyByDay', repeatNode); + + if (dailyNode) { + recurrence.pattern = RecurPattern.daily; + const { daily } = recurrence; + + if (dailyNode.getAttribute('weekday') === 'TRUE') + daily.weekdaysOnly = true; + else + daily.every = parseInt(dailyNode.getAttribute('dayFrequency')); + + // Examples: + // + // + } + else if (weeklyNode) { + recurrence.pattern = RecurPattern.weekly; + const { weekly } = recurrence; + + weekly.every = parseInt(weeklyNode.getAttribute('weekFrequency')); + + for (let d = 0; d < daysOfWeek.length; d++) { + weekly.days[d] = (weeklyNode.getAttribute(daysOfWeek[d].attr) === 'TRUE'); + } + + // Example: + } + else if (monthlyNode) { + recurrence.pattern = RecurPattern.monthly; + const { monthly } = recurrence; + + monthly.option = RecurPatternOption.byDate; + monthly.every = parseInt(monthlyNode.getAttribute('monthFrequency')); + monthly.byDate.date = parseInt(monthlyNode.getAttribute('day')); + + // Example: + } + else if (monthlyByDayNode) { + recurrence.pattern = RecurPattern.monthly; + const { monthly } = recurrence; + + monthly.option = RecurPatternOption.byDay; + monthly.every = parseInt(monthlyByDayNode.getAttribute('monthFrequency')); + + if (monthlyByDayNode.getAttribute('day') === 'TRUE') + monthly.byDay.day = RecurDay.day; + else if (monthlyByDayNode.getAttribute('weekday') === 'TRUE') + monthly.byDay.day = RecurDay.weekday; + else if (monthlyByDayNode.getAttribute('weekend_day') === 'TRUE') + monthly.byDay.day = RecurDay.weekend; + else + monthly.byDay.day = daysOfWeek.find(dow => monthlyByDayNode.getAttribute(dow.attr) === 'TRUE')?.day; + + const weekdayOfMonth = monthlyByDayNode.getAttribute('weekdayOfMonth'); + switch (weekdayOfMonth) { + case 'first': + monthly.byDay.weekOf = RecurWeekOfMonth.first; break; + case 'second': + monthly.byDay.weekOf = RecurWeekOfMonth.second; break; + case 'third': + monthly.byDay.weekOf = RecurWeekOfMonth.third; break; + case 'fourth': + monthly.byDay.weekOf = RecurWeekOfMonth.fourth; break; + case 'last': + monthly.byDay.weekOf = RecurWeekOfMonth.last; break; + } + + // Examples: + // + // + // + } + else if (yearlyNode) { + recurrence.pattern = RecurPattern.yearly; + const { yearly } = recurrence; + + yearly.option = RecurPatternOption.byDate; + yearly.every = parseInt(yearlyNode.getAttribute('yearFrequency')); + yearly.month = parseInt(yearlyNode.getAttribute('month')) - 1; // SPO months are 1 to 12 and Moment months are 0 to 11 + yearly.byDate.date = parseInt(yearlyNode.getAttribute('day')); + + // Example: + } + else if (yearlyByDayNode) { + recurrence.pattern = RecurPattern.yearly; + const { yearly } = recurrence; + + yearly.option = RecurPatternOption.byDay; + yearly.every = parseInt(yearlyByDayNode.getAttribute('yearFrequency')); + yearly.month = parseInt(yearlyByDayNode.getAttribute('month')) - 1; // SPO months are 1 to 12 and Moment months are 0 to 11 + + if (yearlyByDayNode.getAttribute('day') === 'TRUE') + yearly.byDay.day = RecurDay.day; + else if (yearlyByDayNode.getAttribute('weekday') === 'TRUE') + yearly.byDay.day = RecurDay.weekday; + else if (yearlyByDayNode.getAttribute('weekend_day') === 'TRUE') + yearly.byDay.day = RecurDay.weekend; + else + yearly.byDay.day = daysOfWeek.find(dow => yearlyByDayNode.getAttribute(dow.attr) === 'TRUE')?.day; + + const weekdayOfMonth = yearlyByDayNode.getAttribute('weekdayOfMonth'); + switch (weekdayOfMonth) { + case 'first': + yearly.byDay.weekOf = RecurWeekOfMonth.first; break; + case 'second': + yearly.byDay.weekOf = RecurWeekOfMonth.second; break; + case 'third': + yearly.byDay.weekOf = RecurWeekOfMonth.third; break; + case 'fourth': + yearly.byDay.weekOf = RecurWeekOfMonth.fourth; break; + case 'last': + yearly.byDay.weekOf = RecurWeekOfMonth.last; break; + } + + // Example: + } + + return recurrence; + } + + public static serialize(recurrence: Recurrence): string { + const doc: XMLDocument = document.implementation.createDocument('', '', null); + + const recurrenceNode = doc.createElement('recurrence'); + const ruleNode = doc.createElement('rule'); + + const firstDayOfWeekNode = doc.createElement('firstDayOfWeek'); + firstDayOfWeekNode.textContent = recurrence.firstDayOfWeek; + ruleNode.appendChild(firstDayOfWeekNode); + + const repeatNode = doc.createElement('repeat'); + + const { pattern } = recurrence; + switch (pattern) { + case RecurPattern.daily: { + const { daily: { weekdaysOnly, every } } = recurrence; + const dailyNode = doc.createElement('daily'); + + if (weekdaysOnly) + dailyNode.setAttribute('weekday', "TRUE"); + else + dailyNode.setAttribute('dayFrequency', every.toString()); + + repeatNode.appendChild(dailyNode); + + // Examples: + // + // + break; + } + case RecurPattern.weekly: { + const { weekly: { days, every } } = recurrence; + const weeklyNode = doc.createElement('weekly'); + + for (let d = 0; d < days.length; d++) { + if (days[d]) + weeklyNode.setAttribute(daysOfWeek[d].attr, 'TRUE'); + } + + weeklyNode.setAttribute('weekFrequency', every.toString()); + + repeatNode.appendChild(weeklyNode); + + // Example: + break; + } + case RecurPattern.monthly: { + const { monthly: { option, every } } = recurrence; + + if (option === RecurPatternOption.byDate) { + const { monthly: { byDate: { date } } } = recurrence; + const monthlyNode = doc.createElement('monthly'); + + monthlyNode.setAttribute('monthFrequency', every.toString()); + monthlyNode.setAttribute('day', date.toString()); + + repeatNode.appendChild(monthlyNode); + + // Example: + } + else if (option === RecurPatternOption.byDay) { + const { monthly: { byDay: { day, weekOf } } } = recurrence; + const monthlyByDayNode = doc.createElement('monthlyByDay'); + + switch (day) { + case RecurDay.day: + monthlyByDayNode.setAttribute('day', 'TRUE'); break; + case RecurDay.weekday: + monthlyByDayNode.setAttribute('weekday', 'TRUE'); break; + case RecurDay.weekend: + monthlyByDayNode.setAttribute('weekend_day', 'TRUE'); break; + default: { + const { attr } = daysOfWeek.find(dow => dow.day === day); + monthlyByDayNode.setAttribute(attr, 'TRUE'); break; + } + } + + switch (weekOf) { + case RecurWeekOfMonth.first: + monthlyByDayNode.setAttribute('weekdayOfMonth', 'first'); break; + case RecurWeekOfMonth.second: + monthlyByDayNode.setAttribute('weekdayOfMonth', 'second'); break; + case RecurWeekOfMonth.third: + monthlyByDayNode.setAttribute('weekdayOfMonth', 'third'); break; + case RecurWeekOfMonth.fourth: + monthlyByDayNode.setAttribute('weekdayOfMonth', 'fourth'); break; + case RecurWeekOfMonth.last: + monthlyByDayNode.setAttribute('weekdayOfMonth', 'last'); break; + } + + monthlyByDayNode.setAttribute('monthFrequency', every.toString()); + + repeatNode.appendChild(monthlyByDayNode); + + // + // + // + } + + break; + } + case RecurPattern.yearly: { + const { yearly: { option, month, every } } = recurrence; + + if (option === RecurPatternOption.byDate) { + const { yearly: { byDate: { date } } } = recurrence; + const yearlyNode = doc.createElement('yearly'); + + yearlyNode.setAttribute('yearFrequency', every.toString()); + yearlyNode.setAttribute('month', (month + 1).toString()); // SPO months are 1 to 12 and Moment months are 0 to 11 + yearlyNode.setAttribute('day', date.toString()); + + repeatNode.appendChild(yearlyNode); + + // Example: + } + else if (option === RecurPatternOption.byDay) { + const { yearly: { byDay: { day, weekOf } } } = recurrence; + const yearlyByDayNode = doc.createElement('yearlyByDay'); + + yearlyByDayNode.setAttribute('yearFrequency', every.toString()); + + switch (day) { + case RecurDay.day: + yearlyByDayNode.setAttribute('day', 'TRUE'); break; + case RecurDay.weekday: + yearlyByDayNode.setAttribute('weekday', 'TRUE'); break; + case RecurDay.weekend: + yearlyByDayNode.setAttribute('weekend_day', 'TRUE'); break; + default: { + const { attr } = daysOfWeek.find(dow => dow.day === day); + yearlyByDayNode.setAttribute(attr, 'TRUE'); break; + } + } + + switch (weekOf) { + case RecurWeekOfMonth.first: + yearlyByDayNode.setAttribute('weekdayOfMonth', 'first'); break; + case RecurWeekOfMonth.second: + yearlyByDayNode.setAttribute('weekdayOfMonth', 'second'); break; + case RecurWeekOfMonth.third: + yearlyByDayNode.setAttribute('weekdayOfMonth', 'third'); break; + case RecurWeekOfMonth.fourth: + yearlyByDayNode.setAttribute('weekdayOfMonth', 'fourth'); break; + case RecurWeekOfMonth.last: + yearlyByDayNode.setAttribute('weekdayOfMonth', 'last'); break; + } + + yearlyByDayNode.setAttribute('month', (month + 1).toString()); // SPO months are 1 to 12 and Moment months are 0 to 11 + + repeatNode.appendChild(yearlyByDayNode); + + // Example: + } + + break; + } + } + + ruleNode.appendChild(repeatNode); + + const { until } = recurrence; + switch (until.type) { + case RecurUntilType.forever: { + const repeatForeverNode = doc.createElement('repeatForever'); + repeatForeverNode.textContent = "FALSE"; + ruleNode.appendChild(repeatForeverNode); + break; + } + case RecurUntilType.count: { + const repeatInstancesNode = doc.createElement('repeatInstances'); + repeatInstancesNode.textContent = until.count?.toString(); + ruleNode.appendChild(repeatInstancesNode); + break; + } + case RecurUntilType.date: { + const windowEndNode = doc.createElement('windowEnd'); + windowEndNode.textContent = until.date?.clone().utc().format(); + ruleNode.appendChild(windowEndNode); + break; + } + } + + recurrenceNode.appendChild(ruleNode); + doc.appendChild(recurrenceNode); + + const serializer = new XMLSerializer(); + return serializer.serializeToString(doc); + } + + private static _evaluate(document: Document, expression: string, contextNode?: Element): Element { + return document.evaluate(expression, contextNode || document.documentElement, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue as Element; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/services/events/RefinerLoader.ts b/samples/react-rhythm-of-business-calendar/src/services/events/RefinerLoader.ts new file mode 100644 index 000000000..bc87773bc --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/services/events/RefinerLoader.ts @@ -0,0 +1,59 @@ +import { ErrorHandler } from "common"; +import { PagedViewLoader, IListItemResult, SPField, IUpdateListItem, ErrorDiagnosis } from "common/sharepoint"; +import { ISharePointService, ILiveUpdateService, ITimeZoneService } from "common/services"; +import { Refiner } from "model"; +import { IRhythmOfBusinessCalendarSchema } from "schema"; + +interface IRefinerListItemResult extends IListItemResult { + Order: SPField.Query_Number; + AllowMultiselect: SPField.Query_Boolean; + Required: SPField.Query_Boolean; + InitiallyExpanded: SPField.Query_Boolean; + EnableColors: SPField.Query_Boolean; + EnableTags: SPField.Query_Boolean; + CustomSort: SPField.Query_Boolean; +} + +interface IRefinerUpdateListItem extends IUpdateListItem { + Order: SPField.Update_Number; + AllowMultiselect: SPField.Update_Boolean; + Required: SPField.Update_Boolean; + InitiallyExpanded: SPField.Update_Boolean; + EnableColors: SPField.Update_Boolean; + EnableTags: SPField.Update_Boolean; + CustomSort: SPField.Update_Boolean; +} + +const toRefiner = (row: IRefinerListItemResult, refiner: Refiner): void => { + refiner.title = row.Title; + refiner.order = SPField.fromInt(row, 'Order'); + refiner.allowMultiselect = SPField.fromYesNo(row, 'AllowMultiselect'); + refiner.required = SPField.fromYesNo(row, 'Required'); + refiner.initiallyExpanded = SPField.fromYesNo(row, 'InitiallyExpanded'); + refiner.enableColors = SPField.fromYesNo(row, 'EnableColors'); + refiner.enableTags = SPField.fromYesNo(row, 'EnableTags'); + refiner.customSort = SPField.fromYesNo(row, 'CustomSort'); +}; + +const toUpdateListItem = (refiner: Refiner): IRefinerUpdateListItem => { + return { + Title: refiner.title, + Order: refiner.order, + AllowMultiselect: refiner.allowMultiselect, + Required: refiner.required, + InitiallyExpanded: refiner.initiallyExpanded, + EnableColors: refiner.enableColors, + EnableTags: refiner.enableTags, + CustomSort: refiner.customSort + }; +}; + +export class RefinerLoader extends PagedViewLoader { + constructor(schema: IRhythmOfBusinessCalendarSchema, timezones: ITimeZoneService, spo: ISharePointService, liveUpdate: ILiveUpdateService) { + super({ ctor: Refiner, view: schema.refinersList.view_AllRefiners, timezones, spo, liveUpdate, fastLoad: { useCache: true } }); + } + + protected readonly toEntity = toRefiner; + protected readonly updateListItem = toUpdateListItem; + protected readonly diagnosePersistError = (error: any) => ErrorHandler.is_412_PRECONDITION_FAILED(error) ? ErrorDiagnosis.Propogate : ErrorDiagnosis.Critical; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/services/events/RefinerValueLoader.ts b/samples/react-rhythm-of-business-calendar/src/services/events/RefinerValueLoader.ts new file mode 100644 index 000000000..adc7c0324 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/services/events/RefinerValueLoader.ts @@ -0,0 +1,54 @@ +import { Color, ErrorHandler } from "common"; +import { PagedViewLoader, IListItemResult, SPField, IUpdateListItem, ErrorDiagnosis } from "common/sharepoint"; +import { ISharePointService, ILiveUpdateService, ITimeZoneService } from "common/services"; +import { RefinerValue } from "model"; +import { IRhythmOfBusinessCalendarSchema } from "schema"; +import { RefinerLoader } from "./RefinerLoader"; + +interface IRefinerValueListItemResult extends IListItemResult { + Order: SPField.Query_Number; + Refiner: SPField.Query_Lookup; + Color: SPField.Query_Text; + Tag: SPField.Query_Text; + Archived: SPField.Query_Boolean; +} + +interface IRefinerValueUpdateListItem extends IUpdateListItem { + Order: SPField.Update_Number; + RefinerId: SPField.Update_LookupId; + Color: SPField.Update_Text; + Tag: SPField.Update_Text; + Archived: SPField.Update_Boolean; +} + +const toRefinerValue = async (row: IRefinerValueListItemResult, value: RefinerValue, refinerLoader: RefinerLoader): Promise => { + value.title = row.Title; + value.order = SPField.fromInt(row, 'Order'); + value.refiner.set(await SPField.fromLookupAsync(row.Refiner, refinerLoader.getById)); + value.color = row.Color ? Color.parse(row.Color) : new Color(255, 255, 255); + value.tag = row.Tag; + value.isActive = !SPField.fromYesNo(row, 'Archived', false); +}; + +const toUpdateListItem = (value: RefinerValue): IRefinerValueUpdateListItem => { + return { + Title: value.title, + Order: value.order, + RefinerId: value.refiner.get()?.id, + Color: value.color?.toHexString() || '', + Tag: value.tag, + Archived: !value.isActive + }; +}; + +export class RefinerValueLoader extends PagedViewLoader { + constructor(schema: IRhythmOfBusinessCalendarSchema, timezones: ITimeZoneService, spo: ISharePointService, liveUpdate: ILiveUpdateService, private readonly _refinerLoader: RefinerLoader) { + super({ ctor: RefinerValue, view: schema.refinerValuesList.view_AllRefinerValues, timezones, spo, liveUpdate, fastLoad: { useCache: true } }); + + _refinerLoader.registerDependency(this); + } + + protected readonly toEntity = (row: IRefinerValueListItemResult, entity: RefinerValue) => toRefinerValue(row, entity, this._refinerLoader); + protected readonly updateListItem = toUpdateListItem; + protected readonly diagnosePersistError = (error: any) => ErrorHandler.is_412_PRECONDITION_FAILED(error) ? ErrorDiagnosis.Propogate : ErrorDiagnosis.Critical; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/services/events/iCalendarFileBuilder.ts b/samples/react-rhythm-of-business-calendar/src/services/events/iCalendarFileBuilder.ts new file mode 100644 index 000000000..17ec8d0d9 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/services/events/iCalendarFileBuilder.ts @@ -0,0 +1,161 @@ +import { Event, RecurDay, RecurPattern, RecurPatternOption, Recurrence, RecurUntilType, RecurWeekOfMonth } from "model"; +import { Cadence } from "model/Cadence"; + +export class iCalendarFileBuilder { + public build(event: Event) { + const { start, startTime, end, duration, isAllDay, isSeriesMaster, recurrence, location, title, description } = event; + + let adjustedStart = start; + let adjustedEnd = end; + + // iCalendar format requires the DTSTART/DTEND date to be a valid meeting occurence date or it will not load in Outlook + if (isSeriesMaster) { + const cadence = new Cadence(start, recurrence); + const dates = cadence.generate({ start, end: start.clone().add(3, 'years') }); + const firstDate = dates.next().value; + if (firstDate) { + adjustedStart = firstDate.clone().startOf('day').add(startTime); + adjustedEnd = firstDate.clone().startOf('day').add(duration); + } + } + + const dtstart = adjustedStart.format(isAllDay ? "YYYYMMDD" : "YYYYMMDD[T]HHmmss"); + const dtend = adjustedEnd.format(isAllDay ? "YYYYMMDD" : "YYYYMMDD[T]HHmmss"); + + const ics = `BEGIN:VCALENDAR +PRODID:-//Microsoft Corporation//SharePoint MIMEDIR//EN +VERSION:2.0 +METHOD:PUBLISH +BEGIN:VEVENT +UID;TYPE=SharePoint:321 +DTSTART:${dtstart} +DTEND:${dtend} +${isSeriesMaster ? this._buildRRule(recurrence) : ''} +LOCATION;ENCODING=8BIT;CHARSET=utf-8:${location} +TRANSP:OPAQUE +SEQUENCE:1 +DTSTAMP:20220225T045349Z +SUMMARY;ENCODING=8BIT;CHARSET=utf-8:${title} +X-ALT-DESC;FMTTYPE=text/html:${description} +CLASS:PUBLIC +END:VEVENT +END:VCALENDAR`; + + return ics; + } + + private _buildRRule(recurrence: Recurrence): string { + const rrule = 'RRULE:' + [ + this._freq(recurrence), + this._interval(recurrence), + this._bySetPos(recurrence), + this._byDay(recurrence), + this._byMonth(recurrence), + this._byMonthDay(recurrence), + this._untilCount(recurrence), + this._untilDate(recurrence) + ].filter(Boolean).join(';'); + + return rrule; + } + + private _freq({ pattern }: Recurrence): string { + switch (pattern) { + case RecurPattern.daily: return "FREQ=DAILY"; + case RecurPattern.weekly: return "FREQ=WEEKLY"; + case RecurPattern.monthly: return "FREQ=MONTHLY"; + case RecurPattern.yearly: return "FREQ=YEARLY"; + } + } + + private _interval({ pattern, daily, weekly, monthly, yearly }: Recurrence): string { + switch (pattern) { + case RecurPattern.daily: return "INTERVAL=" + daily.every; + case RecurPattern.weekly: return "INTERVAL=" + weekly.every; + case RecurPattern.monthly: return "INTERVAL=" + monthly.every; + case RecurPattern.yearly: return "INTERVAL=" + yearly.every; + } + } + + private _bySetPos({ pattern, monthly, yearly }: Recurrence): string { + if (pattern === RecurPattern.monthly && monthly.option === RecurPatternOption.byDay) + return "BYSETPOS=" + this._weekOfToBySetPos(monthly.byDay.weekOf); + else if (pattern === RecurPattern.yearly && yearly.option === RecurPatternOption.byDay) + return "BYSETPOS=" + this._weekOfToBySetPos(yearly.byDay.weekOf); + else + return ''; + } + + private _weekOfToBySetPos(weekOf: RecurWeekOfMonth): number { + switch (weekOf) { + case RecurWeekOfMonth.first: return 1; + case RecurWeekOfMonth.second: return 2; + case RecurWeekOfMonth.third: return 3; + case RecurWeekOfMonth.fourth: return 4; + case RecurWeekOfMonth.last: return -1; + } + } + + private _byDay({ pattern, daily, weekly, monthly, yearly }: Recurrence): string { + switch (pattern) { + case RecurPattern.daily: { + return daily.weekdaysOnly ? "BYDAY=MO,TU,WE,TH,FR" : ''; + } + case RecurPattern.weekly: { + const dayNames = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA']; + return "BYDAY=" + weekly.days.map((include, idx) => include ? dayNames[idx] : '').filter(Boolean).join(','); + } + case RecurPattern.monthly: { + if (monthly.option === RecurPatternOption.byDay) + return "BYDAY=" + this._recurDayToByDay(monthly.byDay.day); + else + return ''; + } + case RecurPattern.yearly: { + if (yearly.option === RecurPatternOption.byDay) + return "BYDAY=" + this._recurDayToByDay(yearly.byDay.day); + else + return ''; + } + } + } + + private _recurDayToByDay(recurDay: RecurDay): string { + switch (recurDay) { + case RecurDay.day: return "SU,MO,TU,WE,TH,FR,SA"; + case RecurDay.weekday: return "MO,TU,WE,TH,FR"; + case RecurDay.weekend: return "SU,SA"; + case RecurDay.sunday: return "SU"; + case RecurDay.monday: return "MO"; + case RecurDay.tuesday: return "TU"; + case RecurDay.wednesday: return "WE"; + case RecurDay.thursday: return "TH"; + case RecurDay.friday: return "FR"; + case RecurDay.saturday: return "SU"; + } + } + + private _byMonth({ pattern, yearly }: Recurrence): string { + if (pattern === RecurPattern.yearly) + return "BYMONTH=" + (yearly.month + 1); + else + return ''; + } + + private _byMonthDay({ pattern, monthly, yearly }: Recurrence): string { + if (pattern === RecurPattern.monthly && monthly.option === RecurPatternOption.byDate) + return "BYMONTHDAY=" + monthly.byDate.date; + if (pattern === RecurPattern.yearly && yearly.option === RecurPatternOption.byDate) + return "BYMONTHDAY=" + yearly.byDate.date; + else + return ''; + } + + private _untilCount({ until: { type, count } }: Recurrence): string { + return type === RecurUntilType.count ? "COUNT=" + count : ''; + } + + private _untilDate({ until: { type, date } }: Recurrence): string { + return type === RecurUntilType.date ? "UNTIL=" + date.clone().add(1, 'day').format('YYYYMMDD[T]HHmmss') : ''; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/services/events/index.ts b/samples/react-rhythm-of-business-calendar/src/services/events/index.ts new file mode 100644 index 000000000..0fd312305 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/services/events/index.ts @@ -0,0 +1 @@ +export * from './EventsServiceDescriptor'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/services/index.ts b/samples/react-rhythm-of-business-calendar/src/services/index.ts new file mode 100644 index 000000000..7c4897a32 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/services/index.ts @@ -0,0 +1,3 @@ +export * from 'common/services'; +export * from './configuration'; +export * from './events'; \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/RhythmOfBusinessCalendar.module.scss b/samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/RhythmOfBusinessCalendar.module.scss new file mode 100644 index 000000000..8f64502de --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/RhythmOfBusinessCalendar.module.scss @@ -0,0 +1,3 @@ +@import '../../components/common.module'; + +@include dev-workbench-wide(); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/RhythmOfBusinessCalendarWebPart.manifest.json b/samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/RhythmOfBusinessCalendarWebPart.manifest.json new file mode 100644 index 000000000..944625f54 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/RhythmOfBusinessCalendarWebPart.manifest.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://dev.office.com/json-schemas/spfx/client-side-web-part-manifest.schema.json", + "id": "ff77b45a-483c-4fe7-94b4-b5fc8def29c0", + "alias": "RhythmOfBusinessCalendarWebPartLOCAL", + "componentType": "WebPart", + "version": "*", + "manifestVersion": 2, + "requiresCustomScript": false, + "supportedHosts": [ + "SharePointWebPart", + "SharePointFullPage", + "TeamsTab" + ], + "supportsFullBleed": true, + "supportsThemeVariants": true, + "preconfiguredEntries": [ + { + "groupId": "5c03119e-3074-46fd-976b-c60198311f70", + "group": { + "default": "Other" + }, + "title": { + "default": "(LOCAL) Rhythm of Business Calendar" + }, + "description": { + "default": "One calendar for managing and maintaining all team and organizational events" + }, + "officeFabricIconFontName": "Calendar", + "properties": {} + } + ] +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/RhythmOfBusinessCalendarWebPart.tsx b/samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/RhythmOfBusinessCalendarWebPart.tsx new file mode 100644 index 000000000..8822200dd --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/RhythmOfBusinessCalendarWebPart.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import ReactDom from "react-dom"; +import { Version } from '@microsoft/sp-core-library'; +import { BaseClientSideWebPart } from '@microsoft/sp-webpart-base'; +import { IPropertyPaneConfiguration } from '@microsoft/sp-property-pane'; +import { RhythmOfBusinessCalendarApp } from 'apps'; + +import * as strings from 'RhythmOfBusinessCalendarWebPartStrings'; +import './RhythmOfBusinessCalendar.module.scss'; + +export interface IWebPartProps { +} + +export default class RhythmOfBusinessCalendarWebPart extends BaseClientSideWebPart { + public render(): void { + ReactDom.render( + , + this.domElement + ); + } + + protected onDispose(): void { + ReactDom.unmountComponentAtNode(this.domElement); + } + + protected get dataVersion(): Version { + return Version.parse('1.0'); + } + + protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration { + return { + pages: [ + { + header: { + description: strings.PropertyPane.Heading + }, + groups: [ + ] + } + ] + }; + } +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/loc/en-us.js b/samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/loc/en-us.js new file mode 100644 index 000000000..b8a26a458 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/loc/en-us.js @@ -0,0 +1,7 @@ +define([], function () { + return { + PropertyPane: { + Heading: "Rhythm of Business Calendar Web Part Properties", + } + } +}); \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/loc/mystrings.d.ts b/samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/loc/mystrings.d.ts new file mode 100644 index 000000000..44b11d561 --- /dev/null +++ b/samples/react-rhythm-of-business-calendar/src/webparts/rhythmOfBusinessCalendar/loc/mystrings.d.ts @@ -0,0 +1,12 @@ +declare module 'RhythmOfBusinessCalendarWebPartStrings' { + interface IPropertyPaneStrings { + Heading: string; + } + + declare interface IRhythmOfBusinessCalendarWebPartStrings { + PropertyPane: IPropertyPaneStrings; + } + + const strings: IRhythmOfBusinessCalendarWebPartStrings; + export = strings; +} \ No newline at end of file diff --git a/samples/react-rhythm-of-business-calendar/teams/dev/RhythmOfBusinessCalendarDEV.zip b/samples/react-rhythm-of-business-calendar/teams/dev/RhythmOfBusinessCalendarDEV.zip new file mode 100644 index 0000000000000000000000000000000000000000..9f1622f34dd559de08c1f8faf144697cbed3b3e0 GIT binary patch literal 8077 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 GvHlJG6*R;E literal 0 HcmV?d00001 diff --git a/samples/react-rhythm-of-business-calendar/teams/prod/color.png b/samples/react-rhythm-of-business-calendar/teams/prod/color.png new file mode 100644 index 0000000000000000000000000000000000000000..5d529d081448e7314d7549373d13d9b41b0b0a82 GIT binary patch literal 6300 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 Lf3+hN|9JlfAY>n2 literal 0 HcmV?d00001 diff --git a/samples/react-rhythm-of-business-calendar/teams/test/color.png b/samples/react-rhythm-of-business-calendar/teams/test/color.png new file mode 100644 index 0000000000000000000000000000000000000000..5d529d081448e7314d7549373d13d9b41b0b0a82 GIT binary patch literal 6300 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