studiokit-scaffolding-js 7.0.12-next.2.9 → 7.0.13-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +137 -137
- package/lib/components/ActionList.d.ts +2 -2
- package/lib/components/ActionList.js +87 -166
- package/lib/components/AlertDialog.d.ts +3 -3
- package/lib/components/AlertDialog.js +18 -133
- package/lib/components/AlertWithIcon.js +52 -93
- package/lib/components/ConnectedModal.d.ts +2 -1
- package/lib/components/ConnectedModal.js +37 -43
- package/lib/components/Dropdowns/GroupsDropdown.d.ts +4 -4
- package/lib/components/Dropdowns/GroupsDropdown.js +82 -69
- package/lib/components/Dropdowns/ManagedNavDropdown.d.ts +2 -2
- package/lib/components/Dropdowns/ManagedNavDropdown.js +111 -99
- package/lib/components/Dropdowns/UserDropdown.js +70 -109
- package/lib/components/Dropdowns/index.js +11 -27
- package/lib/components/EntityOwnerList.d.ts +3 -3
- package/lib/components/EntityOwnerList.js +60 -52
- package/lib/components/Error.js +27 -107
- package/lib/components/ErrorBoundary.js +94 -133
- package/lib/components/ErrorMessage.d.ts +2 -2
- package/lib/components/ErrorMessage.js +14 -44
- package/lib/components/Forms/DateField.d.ts +2 -2
- package/lib/components/Forms/DateField.js +95 -63
- package/lib/components/Forms/TimeField.d.ts +2 -2
- package/lib/components/Forms/TimeField.js +108 -84
- package/lib/components/Forms/index.js +13 -27
- package/lib/components/Groups/CreateEditCopySaveButtons.d.ts +2 -2
- package/lib/components/Groups/CreateEditCopySaveButtons.js +14 -102
- package/lib/components/Groups/ExternalGroups/Attach.d.ts +7 -6
- package/lib/components/Groups/ExternalGroups/Attach.js +188 -213
- package/lib/components/Groups/ExternalGroups/Table.js +76 -183
- package/lib/components/Groups/GroupCreateOrEditCommonProps.js +1 -5
- package/lib/components/Groups/RosterSyncInfo.js +49 -140
- package/lib/components/HOC/AccessibleAppComponent.d.ts +2 -2
- package/lib/components/HOC/AccessibleAppComponent.js +124 -101
- package/lib/components/HOC/ActivityRequiredComponent.d.ts +14 -14
- package/lib/components/HOC/ActivityRequiredComponent.js +107 -93
- package/lib/components/HOC/AsyncComponent.d.ts +9 -9
- package/lib/components/HOC/AsyncComponent.js +129 -53
- package/lib/components/HOC/AuthenticatedComponent.d.ts +4 -4
- package/lib/components/HOC/AuthenticatedComponent.js +96 -59
- package/lib/components/HOC/CollectionComponent.d.ts +12 -12
- package/lib/components/HOC/CollectionComponent.js +171 -171
- package/lib/components/HOC/CollectionFirstItemComponent.d.ts +13 -13
- package/lib/components/HOC/CollectionFirstItemComponent.js +94 -52
- package/lib/components/HOC/CollectionItemComponent.d.ts +9 -9
- package/lib/components/HOC/CollectionItemComponent.js +168 -169
- package/lib/components/HOC/ConnectedModalComponent.d.ts +9 -9
- package/lib/components/HOC/ConnectedModalComponent.js +140 -110
- package/lib/components/HOC/DataDependentComponent.d.ts +55 -3
- package/lib/components/HOC/DataDependentComponent.js +79 -30
- package/lib/components/HOC/EntityComponent.d.ts +13 -13
- package/lib/components/HOC/EntityComponent.js +112 -74
- package/lib/components/HOC/FullscreenModalComponent.d.ts +9 -9
- package/lib/components/HOC/FullscreenModalComponent.js +185 -165
- package/lib/components/HOC/GroupActivityRequiredComponent.d.ts +2 -2
- package/lib/components/HOC/GroupActivityRequiredComponent.js +47 -48
- package/lib/components/HOC/GuidComponent.d.ts +1 -1
- package/lib/components/HOC/GuidComponent.js +68 -29
- package/lib/components/HOC/ModelContextDependencyVerifyComponent.d.ts +29 -28
- package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +65 -42
- package/lib/components/HOC/ModelErrorRedirectComponent.d.ts +10 -10
- package/lib/components/HOC/ModelErrorRedirectComponent.js +94 -51
- package/lib/components/HOC/SearchPersistorComponent.d.ts +4 -4
- package/lib/components/HOC/SearchPersistorComponent.js +216 -243
- package/lib/components/HOC/UnauthenticatedComponent.d.ts +12 -12
- package/lib/components/HOC/UnauthenticatedComponent.js +82 -37
- package/lib/components/HOC/UserComponent.d.ts +1 -1
- package/lib/components/HOC/UserComponent.js +11 -12
- package/lib/components/Icons/IconAlphaList.js +20 -34
- package/lib/components/Icons/IconExternalUser.js +20 -34
- package/lib/components/Icons/IconImpersonation.js +20 -34
- package/lib/components/Icons/IconStopImpersonating.js +20 -34
- package/lib/components/Icons/IconTable.js +21 -35
- package/lib/components/Icons/IconTableDeleteCol.js +20 -34
- package/lib/components/Icons/IconTableDeleteRow.js +20 -34
- package/lib/components/Icons/IconTableInsertCol.js +20 -34
- package/lib/components/Icons/IconTableInsertRow.js +20 -34
- package/lib/components/Impersonation/Button.d.ts +2 -2
- package/lib/components/Impersonation/Button.js +56 -76
- package/lib/components/Impersonation/Link.d.ts +2 -2
- package/lib/components/Impersonation/Link.js +53 -76
- package/lib/components/Impersonation/UserDetail.css +22 -22
- package/lib/components/Impersonation/UserDetail.d.ts +2 -2
- package/lib/components/Impersonation/UserDetail.js +17 -66
- package/lib/components/Loading.js +21 -27
- package/lib/components/LockDownBrowser/Check.js +107 -194
- package/lib/components/LockDownBrowser/ExitButton.js +14 -27
- package/lib/components/LockDownBrowser/Launch.js +85 -70
- package/lib/components/Lti/Confirm.js +33 -152
- package/lib/components/Lti/CreateNonLtiGroupAlertDialog.d.ts +2 -4
- package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +78 -170
- package/lib/components/Lti/Launch.js +49 -105
- package/lib/components/Lti/LaunchGroup.js +39 -85
- package/lib/components/ManageTable.d.ts +2 -1
- package/lib/components/ManageTable.js +104 -309
- package/lib/components/ManageTableNoDataComponent.js +22 -42
- package/lib/components/NewVersionAlert.d.ts +2 -2
- package/lib/components/NewVersionAlert.js +91 -82
- package/lib/components/NotFound.js +28 -87
- package/lib/components/Notifications.d.ts +4 -4
- package/lib/components/Notifications.js +169 -187
- package/lib/components/PaginationNextButton.js +21 -33
- package/lib/components/PaginationPreviousButton.js +21 -33
- package/lib/components/Quill/CustomToolbar.d.ts +2 -2
- package/lib/components/Quill/CustomToolbar.js +257 -432
- package/lib/components/Quill/Formats/Image.d.ts +25 -10
- package/lib/components/Quill/Formats/Image.js +86 -80
- package/lib/components/Quill/Formats/List.d.ts +3 -6
- package/lib/components/Quill/Formats/List.js +74 -52
- package/lib/components/Quill/Formats/Video.d.ts +1 -2
- package/lib/components/Quill/Formats/Video.js +45 -31
- package/lib/components/Quill/ImageDropModule.d.ts +1 -1
- package/lib/components/Quill/ImageDropModule.js +122 -149
- package/lib/components/Quill/ImageWarning.d.ts +2 -2
- package/lib/components/Quill/ImageWarning.js +32 -45
- package/lib/components/Quill/ImageWithAltTextModal.d.ts +1 -0
- package/lib/components/Quill/ImageWithAltTextModal.js +141 -425
- package/lib/components/Quill/Specs/CustomImageSpec.d.ts +1 -1
- package/lib/components/Quill/Specs/CustomImageSpec.js +51 -43
- package/lib/components/Quill/Specs/CustomVideoSpec.d.ts +1 -1
- package/lib/components/Quill/Specs/CustomVideoSpec.js +44 -35
- package/lib/components/Quill/TableModule/Blots/BaseTableBlot.d.ts +1 -2
- package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +121 -105
- package/lib/components/Quill/TableModule/Blots/TableBlot.js +66 -53
- package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +67 -54
- package/lib/components/Quill/TableModule/Blots/TableCellBlot.d.ts +1 -1
- package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +241 -225
- package/lib/components/Quill/TableModule/Blots/TableContainer.js +99 -82
- package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +87 -76
- package/lib/components/Quill/TableModule/constants.js +41 -45
- package/lib/components/Quill/TableModule/index.css +171 -171
- package/lib/components/Quill/TableModule/index.d.ts +5 -14
- package/lib/components/Quill/TableModule/index.js +313 -373
- package/lib/components/Quill/TableModule/utils.js +45 -45
- package/lib/components/Quill/accessibilityFix.d.ts +1 -0
- package/lib/components/Quill/accessibilityFix.js +251 -235
- package/lib/components/Quill/index.js +32 -36
- package/lib/components/RefreshIndicator/Bordered.js +32 -48
- package/lib/components/RefreshIndicator/Inline.js +33 -48
- package/lib/components/RefreshIndicator/index.d.ts +2 -2
- package/lib/components/RefreshIndicator/index.js +113 -263
- package/lib/components/SearchControls.js +31 -216
- package/lib/components/SentryRoute.js +23 -10
- package/lib/components/Tables/RoleFilter.d.ts +4 -3
- package/lib/components/Tables/RoleFilter.js +46 -71
- package/lib/components/Tables/TextFilter.d.ts +3 -2
- package/lib/components/Tables/TextFilter.js +20 -62
- package/lib/components/UserRoles/Add.d.ts +3 -3
- package/lib/components/UserRoles/Add.js +161 -199
- package/lib/components/UserRoles/Context.js +9 -11
- package/lib/components/UserRoles/RoleCell.js +100 -180
- package/lib/components/UserRoles/Select.js +54 -157
- package/lib/components/UserRoles/Table.js +102 -221
- package/lib/components/UserRoles/index.d.ts +6 -6
- package/lib/components/UserRoles/index.js +466 -537
- package/lib/config/eslint/index.cjs +21 -0
- package/lib/config/eslint/lib/order.cjs +22 -0
- package/lib/config/eslint/lib/prettier.cjs +18 -0
- package/lib/config/eslint/lib/typescript.cjs +86 -0
- package/lib/config/eslint/react.cjs +9 -0
- package/lib/constants/baseActivity.js +26 -30
- package/lib/constants/baseRole.js +10 -14
- package/lib/constants/configuration.d.ts +1 -1
- package/lib/constants/configuration.js +39 -43
- package/lib/constants/externalProviderType.js +6 -10
- package/lib/constants/fetchErrorData.js +11 -15
- package/lib/constants/index.js +23 -137
- package/lib/constants/lockDownBrowser.js +24 -28
- package/lib/constants/mockData.d.ts +6 -4
- package/lib/constants/mockData.js +326 -385
- package/lib/constants/modelStatus.js +11 -15
- package/lib/constants/notificationType.js +8 -12
- package/lib/constants/operatingSystem.js +8 -12
- package/lib/constants/shard.js +7 -11
- package/lib/constants/table.js +21 -21
- package/lib/constants/tier.js +8 -12
- package/lib/constants/userRole.d.ts +2 -1
- package/lib/constants/userRole.js +17 -15
- package/lib/css/base/_base.css +98 -98
- package/lib/css/base/_typography.css +130 -130
- package/lib/css/components/_alert.css +86 -86
- package/lib/css/components/_bootstrap-grid.css +28 -28
- package/lib/css/components/_buttons.css +397 -397
- package/lib/css/components/_forms.css +101 -101
- package/lib/css/components/_menu.css +56 -56
- package/lib/css/components/_modals.css +46 -46
- package/lib/css/components/_quill.css +315 -315
- package/lib/css/components/_tables.css +497 -497
- package/lib/css/components/_tags.css +12 -12
- package/lib/css/index-with-variables.css +15 -15
- package/lib/css/index.css +14 -14
- package/lib/css/utils/_border.css +463 -463
- package/lib/css/utils/_color.css +317 -317
- package/lib/css/utils/_display.css +312 -305
- package/lib/css/utils/_general.css +48 -48
- package/lib/css/utils/_icon.css +16 -16
- package/lib/css/utils/_text.css +24 -25
- package/lib/css/utils/_width.css +60 -60
- package/lib/css/variables.css +84 -84
- package/lib/endpointMappings.js +193 -197
- package/lib/hooks/useCollection.js +65 -83
- package/lib/hooks/useCollectionConfiguration.d.ts +1 -0
- package/lib/hooks/useCollectionConfiguration.js +88 -185
- package/lib/hooks/useCollectionItem.js +58 -155
- package/lib/hooks/useGuid.js +10 -21
- package/lib/hooks/usePrevious.d.ts +1 -24
- package/lib/hooks/usePrevious.js +14 -84
- package/lib/index.js +36 -156
- package/lib/redux/actionCreator.d.ts +6 -6
- package/lib/redux/actionCreator.js +40 -51
- package/lib/redux/actions/AuthAction.js +31 -44
- package/lib/redux/actions/ModalAction.d.ts +1 -1
- package/lib/redux/actions/ModalAction.js +6 -10
- package/lib/redux/actions/ModelAction.d.ts +1 -1
- package/lib/redux/actions/ModelAction.js +49 -77
- package/lib/redux/actions/NotificationAction.js +6 -10
- package/lib/redux/actions/SearchAction.js +5 -9
- package/lib/redux/actions/index.js +16 -60
- package/lib/redux/configureReducers.d.ts +5 -2
- package/lib/redux/configureReducers.js +78 -67
- package/lib/redux/configureStore.d.ts +2 -2
- package/lib/redux/configureStore.js +115 -83
- package/lib/redux/helpers.js +2 -7
- package/lib/redux/reducers/authReducer.js +46 -52
- package/lib/redux/reducers/index.js +15 -41
- package/lib/redux/reducers/modalsReducer.js +52 -49
- package/lib/redux/reducers/modelsReducer.d.ts +2 -2
- package/lib/redux/reducers/modelsReducer.js +182 -183
- package/lib/redux/reducers/notificationsReducer.js +21 -26
- package/lib/redux/reducers/searchReducer.js +20 -26
- package/lib/redux/sagas/appInsightsSaga.js +62 -24
- package/lib/redux/sagas/authSaga.js +414 -287
- package/lib/redux/sagas/caliperSaga.js +263 -169
- package/lib/redux/sagas/clockOffsetSaga.js +77 -36
- package/lib/redux/sagas/configurationSaga.js +46 -13
- package/lib/redux/sagas/downtimeApiErrorSaga.d.ts +1 -0
- package/lib/redux/sagas/downtimeApiErrorSaga.js +64 -23
- package/lib/redux/sagas/errorSaga.d.ts +1 -0
- package/lib/redux/sagas/errorSaga.js +63 -29
- package/lib/redux/sagas/googleAnalyticsSaga.js +69 -29
- package/lib/redux/sagas/identityProviderSaga.js +69 -24
- package/lib/redux/sagas/initialDataLoadSaga.js +29 -38
- package/lib/redux/sagas/lockDownBrowserErrorSaga.d.ts +1 -0
- package/lib/redux/sagas/lockDownBrowserErrorSaga.js +81 -32
- package/lib/redux/sagas/modelFetchSaga.js +459 -379
- package/lib/redux/sagas/noStoreSaga.d.ts +1 -1
- package/lib/redux/sagas/noStoreSaga.js +101 -68
- package/lib/redux/sagas/postLoginDataSaga.js +79 -47
- package/lib/redux/sagas/postLoginRedirectSaga.js +71 -30
- package/lib/redux/sagas/rootSaga.js +137 -85
- package/lib/redux/sagas/sentrySaga.js +85 -29
- package/lib/redux/sagas/userIdSaga.js +54 -18
- package/lib/services/codeProviderService.js +29 -25
- package/lib/services/dateService.js +12 -14
- package/lib/services/documentService.js +13 -18
- package/lib/services/fetchService.js +168 -134
- package/lib/services/persistenceService.d.ts +4 -4
- package/lib/services/persistenceService.js +43 -45
- package/lib/services/ticketProviderService.js +33 -29
- package/lib/services/tokenPersistenceService.js +9 -13
- package/lib/services/windowService.js +17 -21
- package/lib/startup.d.ts +1 -1
- package/lib/startup.js +135 -132
- package/lib/types/AppConfiguration.js +1 -5
- package/lib/types/Artifact.js +7 -11
- package/lib/types/BaseReduxState.js +1 -5
- package/lib/types/Client.js +1 -5
- package/lib/types/Collection.d.ts +3 -3
- package/lib/types/Collection.js +1 -5
- package/lib/types/Configuration.js +1 -5
- package/lib/types/DeepLinkingResponseRequest.js +1 -5
- package/lib/types/DeletableModel.js +1 -5
- package/lib/types/Event.js +1 -5
- package/lib/types/ExternalGroup.js +1 -5
- package/lib/types/ExternalProvider.js +1 -5
- package/lib/types/ExternalTerm.js +1 -5
- package/lib/types/Group.js +1 -5
- package/lib/types/IdentityProvider.js +1 -5
- package/lib/types/LtiLaunch.js +1 -5
- package/lib/types/NameOnlyEntity.js +1 -5
- package/lib/types/Notification.d.ts +2 -2
- package/lib/types/Notification.js +1 -5
- package/lib/types/OptionalRecord.d.ts +1 -1
- package/lib/types/OptionalRecord.js +1 -5
- package/lib/types/OwnerSchedule.d.ts +1 -3
- package/lib/types/OwnerSchedule.js +1 -5
- package/lib/types/PropertyOfType.d.ts +3 -3
- package/lib/types/PropertyOfType.js +1 -5
- package/lib/types/Quill.js +1 -5
- package/lib/types/RoleDescription.d.ts +1 -0
- package/lib/types/RoleDescription.js +1 -5
- package/lib/types/Search.js +1 -5
- package/lib/types/SimpleLocation.js +1 -5
- package/lib/types/UniTime.js +1 -5
- package/lib/types/User.js +1 -5
- package/lib/types/UserRole.js +1 -5
- package/lib/types/auth/AuthState.js +1 -5
- package/lib/types/auth/CasV1LoginRequestBody.js +1 -5
- package/lib/types/auth/ClientCredentials.js +1 -5
- package/lib/types/auth/CodeProviderService.js +1 -5
- package/lib/types/auth/LocalLoginRequestBody.js +1 -5
- package/lib/types/auth/TicketProviderService.js +1 -5
- package/lib/types/auth/TokenPersistenceService.js +1 -5
- package/lib/types/auth/index.js +18 -82
- package/lib/types/index.js +39 -313
- package/lib/types/net/EndpointConfig.js +1 -5
- package/lib/types/net/EndpointMapping.js +1 -5
- package/lib/types/net/EndpointMappings.js +1 -5
- package/lib/types/net/ErrorHandler.d.ts +1 -1
- package/lib/types/net/ErrorHandler.js +1 -5
- package/lib/types/net/FetchConfig.d.ts +1 -1
- package/lib/types/net/FetchConfig.js +1 -5
- package/lib/types/net/FetchErrorData.js +6 -10
- package/lib/types/net/FetchResult.d.ts +2 -2
- package/lib/types/net/FetchResult.js +1 -5
- package/lib/types/net/HTTPMethod.d.ts +1 -1
- package/lib/types/net/HTTPMethod.js +1 -5
- package/lib/types/net/HTTPStatusCode.js +12 -16
- package/lib/types/net/Metadata.js +1 -5
- package/lib/types/net/Model.js +1 -5
- package/lib/types/net/ModelCollection.js +1 -5
- package/lib/types/net/ModelsState.js +1 -5
- package/lib/types/net/OAuthToken.js +1 -5
- package/lib/types/net/OAuthTokenOrNull.d.ts +1 -1
- package/lib/types/net/OAuthTokenOrNull.js +1 -5
- package/lib/types/net/TokenAccessFunction.d.ts +1 -1
- package/lib/types/net/TokenAccessFunction.js +1 -5
- package/lib/types/net/index.js +27 -181
- package/lib/utils/baseActivity.d.ts +2 -2
- package/lib/utils/baseActivity.js +136 -138
- package/lib/utils/baseRole.js +33 -37
- package/lib/utils/collection.js +310 -432
- package/lib/utils/cookies.js +37 -22
- package/lib/utils/date.js +320 -320
- package/lib/utils/dom.js +174 -186
- package/lib/utils/domainIdentifier.js +9 -9
- package/lib/utils/entityUserRole.js +2 -6
- package/lib/utils/error.d.ts +1 -1
- package/lib/utils/error.js +16 -18
- package/lib/utils/events.js +33 -40
- package/lib/utils/externalGroup.js +21 -25
- package/lib/utils/externalProviders.js +4 -8
- package/lib/utils/externalTerms.js +6 -9
- package/lib/utils/fetch.d.ts +1 -1
- package/lib/utils/fetch.js +185 -188
- package/lib/utils/group.js +9 -17
- package/lib/utils/groupDates.d.ts +1 -1
- package/lib/utils/groupDates.js +39 -43
- package/lib/utils/groupRoles.js +28 -28
- package/lib/utils/lockDownBrowser.js +12 -16
- package/lib/utils/logger.js +25 -30
- package/lib/utils/lti.js +5 -10
- package/lib/utils/model.d.ts +2 -2
- package/lib/utils/model.js +48 -39
- package/lib/utils/number.js +26 -23
- package/lib/utils/promise.d.ts +1 -6
- package/lib/utils/promise.js +15 -34
- package/lib/utils/quill.js +77 -66
- package/lib/utils/route.d.ts +2 -2
- package/lib/utils/route.js +60 -61
- package/lib/utils/search.d.ts +1 -1
- package/lib/utils/search.js +85 -78
- package/lib/utils/shard.js +41 -38
- package/lib/utils/sort.d.ts +3 -3
- package/lib/utils/sort.js +58 -62
- package/lib/utils/string.js +10 -14
- package/lib/utils/table.d.ts +3 -3
- package/lib/utils/table.js +36 -39
- package/lib/utils/timezone.js +26 -12
- package/lib/utils/url.d.ts +1 -2
- package/lib/utils/url.js +201 -146
- package/lib/utils/user.js +61 -59
- package/lib/utils/userAgent.js +11 -11
- package/lib/utils/userRole.d.ts +3 -3
- package/lib/utils/userRole.js +56 -58
- package/package.json +207 -226
- package/lib/config/eslint/index.d.ts +0 -2
- package/lib/config/eslint/index.js +0 -36
- package/lib/config/eslint/lib/order.d.ts +0 -3
- package/lib/config/eslint/lib/order.js +0 -30
- package/lib/config/eslint/lib/prettier.d.ts +0 -3
- package/lib/config/eslint/lib/prettier.js +0 -23
- package/lib/config/eslint/lib/typescript.d.ts +0 -2
- package/lib/config/eslint/lib/typescript.js +0 -98
- package/lib/config/eslint/react.d.ts +0 -2
- package/lib/config/eslint/react.js +0 -30
- package/lib/hooks/useEventCalback.d.ts +0 -14
- package/lib/hooks/useEventCalback.js +0 -51
- package/lib/types/externals.d.js +0 -2
package/lib/utils/collection.js
CHANGED
|
@@ -1,484 +1,362 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
exports.handleCollectionItemParamsChange = handleCollectionItemParamsChange;
|
|
13
|
-
exports.handleCollectionParamsChange = handleCollectionParamsChange;
|
|
14
|
-
exports.initializeCollection = initializeCollection;
|
|
15
|
-
exports.initializeCollectionItem = initializeCollectionItem;
|
|
16
|
-
exports.loadCollection = loadCollection;
|
|
17
|
-
exports.loadCollectionItem = loadCollectionItem;
|
|
18
|
-
exports.selectCollectionFromState = selectCollectionFromState;
|
|
19
|
-
exports.selectCollectionItemFromState = selectCollectionItemFromState;
|
|
20
|
-
exports.stopCollectionPeriodicLoad = stopCollectionPeriodicLoad;
|
|
21
|
-
exports.updateCollectionItem = updateCollectionItem;
|
|
22
|
-
exports.updateItemInCollection = updateItemInCollection;
|
|
23
|
-
var _lodash = require("lodash");
|
|
24
|
-
var _memoizeOne = _interopRequireDefault(require("memoize-one"));
|
|
25
|
-
var _constants = require("../constants");
|
|
26
|
-
var _actionCreator = require("../redux/actionCreator");
|
|
27
|
-
var _route = require("./route");
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.cleanupCollectionGuidKey = exports.handleCollectionParamsChange = exports.handleCollectionItemParamsChange = exports.initializeCollection = exports.initializeCollectionItem = exports.deleteCollectionItem = exports.deleteItemFromCollection = exports.updateCollectionItem = exports.updateItemInCollection = exports.createCollectionItem = exports.createItemInCollection = exports.loadCollectionItem = exports.loadCollection = exports.stopCollectionPeriodicLoad = exports.selectCollectionFromState = exports.selectCollectionItemFromState = void 0;
|
|
7
|
+
var lodash_1 = require("lodash");
|
|
8
|
+
var memoize_one_1 = __importDefault(require("memoize-one"));
|
|
9
|
+
var constants_1 = require("../constants");
|
|
10
|
+
var actionCreator_1 = require("../redux/actionCreator");
|
|
11
|
+
var route_1 = require("./route");
|
|
28
12
|
//#region Redux Methods
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
// Provide a stable object reference for empty collections
|
|
33
|
-
const DEFAULT_MODEL = Object.freeze({});
|
|
13
|
+
var getPathParams = memoize_one_1.default(function (pathParams, routeMatchParams, modelName) {
|
|
14
|
+
return pathParams || route_1.getPathParamsFromRouteMatchParams(routeMatchParams, modelName);
|
|
15
|
+
});
|
|
34
16
|
function selectCollectionItemFromState(params) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
modelName
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
model = collection[guid];
|
|
51
|
-
} else {
|
|
52
|
-
const modelByGuid = (0, _lodash.find)((0, _lodash.values)(collection), m => !!m && 'guid' in m && m.guid === guid);
|
|
53
|
-
model = modelByGuid || model;
|
|
17
|
+
var guid = params.guid, modelName = params.modelName, pathParams = params.pathParams, routeMatchParams = params.routeMatchParams, state = params.state;
|
|
18
|
+
var modelNameLevelCount = route_1.getMinRequiredPathParamsCount(modelName);
|
|
19
|
+
var p = getPathParams(pathParams, routeMatchParams, modelName);
|
|
20
|
+
var reduxModelName = route_1.getReduxModelName(p, modelName);
|
|
21
|
+
var model = {};
|
|
22
|
+
// find `model` using `guid` as its key, to match new item created in `create()`
|
|
23
|
+
if (p.length === modelNameLevelCount) {
|
|
24
|
+
var collection = (lodash_1.get(state.models, reduxModelName) || {});
|
|
25
|
+
if (Object.prototype.hasOwnProperty.call(collection, guid)) {
|
|
26
|
+
model = collection[guid];
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
var modelByGuid = lodash_1.find(lodash_1.values(collection), function (m) { return m && m.guid && m.guid === guid; });
|
|
30
|
+
model = modelByGuid || model;
|
|
31
|
+
}
|
|
54
32
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
33
|
+
else {
|
|
34
|
+
// find `model` using pathParams
|
|
35
|
+
var reduxModel = (lodash_1.get(state.models, reduxModelName) || {});
|
|
36
|
+
model = (Object.keys(reduxModel).length > 0 ? reduxModel : {});
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
modelName: modelName,
|
|
40
|
+
pathParams: p,
|
|
41
|
+
model: model,
|
|
42
|
+
isCollectionItem: true
|
|
43
|
+
};
|
|
66
44
|
}
|
|
45
|
+
exports.selectCollectionItemFromState = selectCollectionItemFromState;
|
|
67
46
|
function selectCollectionFromState(params) {
|
|
68
|
-
|
|
69
|
-
modelName
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
modelName,
|
|
80
|
-
pathParams: p,
|
|
81
|
-
model,
|
|
82
|
-
isCollectionItem: false
|
|
83
|
-
};
|
|
47
|
+
var modelName = params.modelName, pathParams = params.pathParams, routeMatchParams = params.routeMatchParams, state = params.state;
|
|
48
|
+
var p = getPathParams(pathParams, routeMatchParams, modelName);
|
|
49
|
+
var reduxModelName = route_1.getReduxModelName(p, modelName);
|
|
50
|
+
var model = lodash_1.get(state.models, reduxModelName);
|
|
51
|
+
model = model && Object.keys(model).length > 0 ? model : {};
|
|
52
|
+
return {
|
|
53
|
+
modelName: modelName,
|
|
54
|
+
pathParams: p,
|
|
55
|
+
model: model,
|
|
56
|
+
isCollectionItem: false
|
|
57
|
+
};
|
|
84
58
|
}
|
|
85
|
-
|
|
59
|
+
exports.selectCollectionFromState = selectCollectionFromState;
|
|
86
60
|
//#endregion Redux Methods
|
|
87
|
-
|
|
88
61
|
//#region Collection/Item CRUD Methods
|
|
89
|
-
|
|
90
62
|
//#region Load
|
|
91
|
-
|
|
92
63
|
function stopCollectionPeriodicLoad(taskId) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
function loadCollection(config) {
|
|
98
|
-
let params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
99
|
-
const {
|
|
100
|
-
modelName,
|
|
101
|
-
isInitialized,
|
|
102
|
-
pathParams: configPathParams,
|
|
103
|
-
queryParams: configQueryParams,
|
|
104
|
-
changeModelStatus
|
|
105
|
-
} = config;
|
|
106
|
-
const {
|
|
107
|
-
id,
|
|
108
|
-
pathParams,
|
|
109
|
-
queryParams,
|
|
110
|
-
period,
|
|
111
|
-
taskId,
|
|
112
|
-
replaceValue
|
|
113
|
-
} = params;
|
|
114
|
-
const p = (0, _lodash.concat)([], pathParams || configPathParams, id ? [id] : []);
|
|
115
|
-
if (p.length !== (0, _route.getMinRequiredPathParamsCount)(modelName) + (id ? 1 : 0)) {
|
|
116
|
-
throw new Error('pathParams length does not match length of path components');
|
|
117
|
-
}
|
|
118
|
-
if (isInitialized) {
|
|
119
|
-
changeModelStatus(_constants.MODEL_STATUS.LOADING, id);
|
|
120
|
-
}
|
|
121
|
-
if (!period) {
|
|
122
|
-
(0, _actionCreator.dispatchModelFetchRequest)({
|
|
123
|
-
modelName,
|
|
124
|
-
method: 'GET',
|
|
125
|
-
pathParams: p,
|
|
126
|
-
queryParams: queryParams || configQueryParams,
|
|
127
|
-
replaceValue
|
|
128
|
-
});
|
|
129
|
-
} else {
|
|
130
|
-
if (!taskId) throw new Error('taskId is required for periodic data requests');
|
|
131
|
-
(0, _actionCreator.dispatchPeriodicModelFetchRequest)({
|
|
132
|
-
modelName,
|
|
133
|
-
method: 'GET',
|
|
134
|
-
pathParams: p,
|
|
135
|
-
queryParams: queryParams || configQueryParams,
|
|
136
|
-
period,
|
|
137
|
-
taskId,
|
|
138
|
-
replaceValue
|
|
64
|
+
actionCreator_1.dispatchPeriodicModelFetchTerminateAction({
|
|
65
|
+
taskId: taskId
|
|
139
66
|
});
|
|
140
|
-
}
|
|
141
67
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
modelName,
|
|
146
|
-
|
|
147
|
-
pathParams
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
period
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
modelName,
|
|
177
|
-
method: 'GET',
|
|
178
|
-
pathParams: p,
|
|
179
|
-
queryParams: queryParams || configQueryParams,
|
|
180
|
-
period,
|
|
181
|
-
taskId,
|
|
182
|
-
replaceValue
|
|
183
|
-
});
|
|
184
|
-
}
|
|
68
|
+
exports.stopCollectionPeriodicLoad = stopCollectionPeriodicLoad;
|
|
69
|
+
function loadCollection(config, params) {
|
|
70
|
+
if (params === void 0) { params = {}; }
|
|
71
|
+
var modelName = config.modelName, isInitialized = config.isInitialized, configPathParams = config.pathParams, configQueryParams = config.queryParams, changeModelStatus = config.changeModelStatus;
|
|
72
|
+
var id = params.id, pathParams = params.pathParams, queryParams = params.queryParams, period = params.period, taskId = params.taskId, replaceValue = params.replaceValue;
|
|
73
|
+
var p = lodash_1.concat([], pathParams || configPathParams, id ? [id] : []);
|
|
74
|
+
if (p.length !== route_1.getMinRequiredPathParamsCount(modelName) + (id ? 1 : 0)) {
|
|
75
|
+
throw new Error('pathParams length does not match length of path components');
|
|
76
|
+
}
|
|
77
|
+
if (isInitialized) {
|
|
78
|
+
changeModelStatus(constants_1.MODEL_STATUS.LOADING, id);
|
|
79
|
+
}
|
|
80
|
+
if (!period) {
|
|
81
|
+
actionCreator_1.dispatchModelFetchRequest({
|
|
82
|
+
modelName: modelName,
|
|
83
|
+
method: 'GET',
|
|
84
|
+
pathParams: p,
|
|
85
|
+
queryParams: queryParams || configQueryParams,
|
|
86
|
+
replaceValue: replaceValue
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
if (!taskId)
|
|
91
|
+
throw new Error('taskId is required for periodic data requests');
|
|
92
|
+
actionCreator_1.dispatchPeriodicModelFetchRequest({
|
|
93
|
+
modelName: modelName,
|
|
94
|
+
method: 'GET',
|
|
95
|
+
pathParams: p,
|
|
96
|
+
queryParams: queryParams || configQueryParams,
|
|
97
|
+
period: period,
|
|
98
|
+
taskId: taskId,
|
|
99
|
+
replaceValue: replaceValue
|
|
100
|
+
});
|
|
101
|
+
}
|
|
185
102
|
}
|
|
186
|
-
|
|
103
|
+
exports.loadCollection = loadCollection;
|
|
104
|
+
function loadCollectionItem(config, params) {
|
|
105
|
+
if (params === void 0) { params = {}; }
|
|
106
|
+
var modelName = config.modelName, isInitialized = config.isInitialized, configPathParams = config.pathParams, configQueryParams = config.queryParams, changeModelStatus = config.changeModelStatus;
|
|
107
|
+
var pathParams = params.pathParams, queryParams = params.queryParams, period = params.period, taskId = params.taskId, replaceValue = params.replaceValue;
|
|
108
|
+
var p = pathParams || configPathParams;
|
|
109
|
+
if (p && p.length < route_1.getMinRequiredPathParamsCount(modelName) + 1) {
|
|
110
|
+
throw new Error('pathParams length does not match length of path components');
|
|
111
|
+
}
|
|
112
|
+
if (isInitialized) {
|
|
113
|
+
changeModelStatus(constants_1.MODEL_STATUS.LOADING);
|
|
114
|
+
}
|
|
115
|
+
if (!period) {
|
|
116
|
+
actionCreator_1.dispatchModelFetchRequest({
|
|
117
|
+
modelName: modelName,
|
|
118
|
+
method: 'GET',
|
|
119
|
+
pathParams: p,
|
|
120
|
+
queryParams: queryParams || configQueryParams,
|
|
121
|
+
replaceValue: replaceValue
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
if (!taskId)
|
|
126
|
+
throw new Error('taskId is required for periodic data requests');
|
|
127
|
+
actionCreator_1.dispatchPeriodicModelFetchRequest({
|
|
128
|
+
modelName: modelName,
|
|
129
|
+
method: 'GET',
|
|
130
|
+
pathParams: p,
|
|
131
|
+
queryParams: queryParams || configQueryParams,
|
|
132
|
+
period: period,
|
|
133
|
+
taskId: taskId,
|
|
134
|
+
replaceValue: replaceValue
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.loadCollectionItem = loadCollectionItem;
|
|
187
139
|
//#endregion Load
|
|
188
|
-
|
|
189
140
|
//#region Create
|
|
190
|
-
|
|
191
141
|
function createItemInCollection(config, params) {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
modelName
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
changeModelStatus
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
changeModelStatus(_constants.MODEL_STATUS.CREATING, guid);
|
|
208
|
-
(0, _actionCreator.dispatchModelFetchRequest)({
|
|
209
|
-
modelName,
|
|
210
|
-
guid,
|
|
211
|
-
method: 'POST',
|
|
212
|
-
body,
|
|
213
|
-
pathParams,
|
|
214
|
-
contentType,
|
|
215
|
-
queryParams: queryParams || configQueryParams
|
|
216
|
-
});
|
|
142
|
+
var guid = config.guid, modelName = config.modelName, pathParams = config.pathParams, configQueryParams = config.queryParams, changeModelStatus = config.changeModelStatus;
|
|
143
|
+
var body = params.body, contentType = params.contentType, queryParams = params.queryParams;
|
|
144
|
+
if (pathParams && pathParams.length < route_1.getMinRequiredPathParamsCount(modelName)) {
|
|
145
|
+
throw new Error('pathParams length does not match length of path components');
|
|
146
|
+
}
|
|
147
|
+
changeModelStatus(constants_1.MODEL_STATUS.CREATING, guid);
|
|
148
|
+
actionCreator_1.dispatchModelFetchRequest({
|
|
149
|
+
modelName: modelName,
|
|
150
|
+
guid: guid,
|
|
151
|
+
method: 'POST',
|
|
152
|
+
body: body,
|
|
153
|
+
pathParams: pathParams,
|
|
154
|
+
contentType: contentType,
|
|
155
|
+
queryParams: queryParams || configQueryParams
|
|
156
|
+
});
|
|
217
157
|
}
|
|
158
|
+
exports.createItemInCollection = createItemInCollection;
|
|
218
159
|
function createCollectionItem(model, config, params) {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
modelName
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
changeModelStatus
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
changeModelStatus(_constants.MODEL_STATUS.CREATING);
|
|
238
|
-
(0, _actionCreator.dispatchModelFetchRequest)({
|
|
239
|
-
modelName,
|
|
240
|
-
guid,
|
|
241
|
-
method: 'POST',
|
|
242
|
-
body,
|
|
243
|
-
pathParams,
|
|
244
|
-
contentType,
|
|
245
|
-
queryParams: queryParams || configQueryParams
|
|
246
|
-
});
|
|
160
|
+
if (model.id) {
|
|
161
|
+
throw new Error('model already exists');
|
|
162
|
+
}
|
|
163
|
+
var guid = config.guid, modelName = config.modelName, pathParams = config.pathParams, configQueryParams = config.queryParams, changeModelStatus = config.changeModelStatus;
|
|
164
|
+
var body = params.body, contentType = params.contentType, queryParams = params.queryParams;
|
|
165
|
+
if (pathParams && pathParams.length < route_1.getMinRequiredPathParamsCount(modelName)) {
|
|
166
|
+
throw new Error('pathParams length does not match length of path components');
|
|
167
|
+
}
|
|
168
|
+
changeModelStatus(constants_1.MODEL_STATUS.CREATING);
|
|
169
|
+
actionCreator_1.dispatchModelFetchRequest({
|
|
170
|
+
modelName: modelName,
|
|
171
|
+
guid: guid,
|
|
172
|
+
method: 'POST',
|
|
173
|
+
body: body,
|
|
174
|
+
pathParams: pathParams,
|
|
175
|
+
contentType: contentType,
|
|
176
|
+
queryParams: queryParams || configQueryParams
|
|
177
|
+
});
|
|
247
178
|
}
|
|
248
|
-
|
|
179
|
+
exports.createCollectionItem = createCollectionItem;
|
|
249
180
|
//#endregion Create
|
|
250
|
-
|
|
251
181
|
//#region Update
|
|
252
|
-
|
|
253
182
|
function updateItemInCollection(config, params) {
|
|
254
|
-
|
|
255
|
-
id
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
}
|
|
277
|
-
const m = method || 'PUT';
|
|
278
|
-
changeModelStatus(_constants.MODEL_STATUS.UPDATING, id);
|
|
279
|
-
(0, _actionCreator.dispatchModelFetchRequest)({
|
|
280
|
-
modelName,
|
|
281
|
-
method: m,
|
|
282
|
-
pathParams,
|
|
283
|
-
queryParams: queryParams || configQueryParams,
|
|
284
|
-
body,
|
|
285
|
-
contentType
|
|
286
|
-
});
|
|
183
|
+
var id = params.id, body = params.body, contentType = params.contentType, method = params.method, queryParams = params.queryParams;
|
|
184
|
+
if (!id) {
|
|
185
|
+
throw new Error("'id' is required");
|
|
186
|
+
}
|
|
187
|
+
if (!body) {
|
|
188
|
+
throw new Error("'body' is required");
|
|
189
|
+
}
|
|
190
|
+
var modelName = config.modelName, configPathParams = config.pathParams, configQueryParams = config.queryParams, changeModelStatus = config.changeModelStatus;
|
|
191
|
+
var pathParams = lodash_1.concat([], configPathParams, [id]);
|
|
192
|
+
if (pathParams.length !== route_1.getMinRequiredPathParamsCount(modelName) + 1) {
|
|
193
|
+
throw new Error('pathParams+id length does not match length of path components');
|
|
194
|
+
}
|
|
195
|
+
var m = method || 'PUT';
|
|
196
|
+
changeModelStatus(constants_1.MODEL_STATUS.UPDATING, id);
|
|
197
|
+
actionCreator_1.dispatchModelFetchRequest({
|
|
198
|
+
modelName: modelName,
|
|
199
|
+
method: m,
|
|
200
|
+
pathParams: pathParams,
|
|
201
|
+
queryParams: queryParams || configQueryParams,
|
|
202
|
+
body: body,
|
|
203
|
+
contentType: contentType
|
|
204
|
+
});
|
|
287
205
|
}
|
|
206
|
+
exports.updateItemInCollection = updateItemInCollection;
|
|
288
207
|
function updateCollectionItem(model, config, params) {
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
body
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
queryParams
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
const m = method || 'PUT';
|
|
311
|
-
changeModelStatus(_constants.MODEL_STATUS.UPDATING);
|
|
312
|
-
(0, _actionCreator.dispatchModelFetchRequest)({
|
|
313
|
-
modelName,
|
|
314
|
-
method: m,
|
|
315
|
-
pathParams,
|
|
316
|
-
body,
|
|
317
|
-
contentType,
|
|
318
|
-
queryParams: queryParams || configQueryParams
|
|
319
|
-
});
|
|
208
|
+
if (!model.id) {
|
|
209
|
+
throw new Error('model does not exist');
|
|
210
|
+
}
|
|
211
|
+
var body = params.body, contentType = params.contentType, method = params.method, queryParams = params.queryParams;
|
|
212
|
+
if (!body) {
|
|
213
|
+
throw new Error("'body' is required");
|
|
214
|
+
}
|
|
215
|
+
var modelName = config.modelName, pathParams = config.pathParams, configQueryParams = config.queryParams, changeModelStatus = config.changeModelStatus;
|
|
216
|
+
if (pathParams && pathParams.length < route_1.getMinRequiredPathParamsCount(modelName) + 1) {
|
|
217
|
+
throw new Error('pathParams length does not match length of path components');
|
|
218
|
+
}
|
|
219
|
+
var m = method || 'PUT';
|
|
220
|
+
changeModelStatus(constants_1.MODEL_STATUS.UPDATING);
|
|
221
|
+
actionCreator_1.dispatchModelFetchRequest({
|
|
222
|
+
modelName: modelName,
|
|
223
|
+
method: m,
|
|
224
|
+
pathParams: pathParams,
|
|
225
|
+
body: body,
|
|
226
|
+
contentType: contentType,
|
|
227
|
+
queryParams: queryParams || configQueryParams
|
|
228
|
+
});
|
|
320
229
|
}
|
|
321
|
-
|
|
230
|
+
exports.updateCollectionItem = updateCollectionItem;
|
|
322
231
|
//#endregion Update
|
|
323
|
-
|
|
324
232
|
//#region Delete
|
|
325
|
-
|
|
326
233
|
function deleteItemFromCollection(config, params) {
|
|
327
|
-
|
|
328
|
-
id
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
}
|
|
345
|
-
changeModelStatus(_constants.MODEL_STATUS.DELETING, id);
|
|
346
|
-
(0, _actionCreator.dispatchModelFetchRequest)({
|
|
347
|
-
modelName,
|
|
348
|
-
method: 'DELETE',
|
|
349
|
-
pathParams: p,
|
|
350
|
-
queryParams: queryParams || configQueryParams,
|
|
351
|
-
body
|
|
352
|
-
});
|
|
234
|
+
var id = params.id, body = params.body, queryParams = params.queryParams;
|
|
235
|
+
if (!id) {
|
|
236
|
+
throw new Error("'id' is required");
|
|
237
|
+
}
|
|
238
|
+
var modelName = config.modelName, pathParams = config.pathParams, configQueryParams = config.queryParams, changeModelStatus = config.changeModelStatus;
|
|
239
|
+
var p = lodash_1.concat([], pathParams, [id]);
|
|
240
|
+
if (p.length !== route_1.getMinRequiredPathParamsCount(modelName) + 1) {
|
|
241
|
+
throw new Error('pathParams+id length does not match length of path components');
|
|
242
|
+
}
|
|
243
|
+
changeModelStatus(constants_1.MODEL_STATUS.DELETING, id);
|
|
244
|
+
actionCreator_1.dispatchModelFetchRequest({
|
|
245
|
+
modelName: modelName,
|
|
246
|
+
method: 'DELETE',
|
|
247
|
+
pathParams: p,
|
|
248
|
+
queryParams: queryParams || configQueryParams,
|
|
249
|
+
body: body
|
|
250
|
+
});
|
|
353
251
|
}
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
body,
|
|
361
|
-
queryParams
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
(0, _actionCreator.dispatchModelFetchRequest)({
|
|
374
|
-
modelName,
|
|
375
|
-
method: 'DELETE',
|
|
376
|
-
pathParams,
|
|
377
|
-
body,
|
|
378
|
-
queryParams: queryParams || configQueryParams
|
|
379
|
-
});
|
|
252
|
+
exports.deleteItemFromCollection = deleteItemFromCollection;
|
|
253
|
+
function deleteCollectionItem(model, config, params) {
|
|
254
|
+
if (params === void 0) { params = {}; }
|
|
255
|
+
if (!model.id) {
|
|
256
|
+
throw new Error('model does not exist');
|
|
257
|
+
}
|
|
258
|
+
var body = params.body, queryParams = params.queryParams;
|
|
259
|
+
var modelName = config.modelName, pathParams = config.pathParams, configQueryParams = config.queryParams, changeModelStatus = config.changeModelStatus;
|
|
260
|
+
if (pathParams && pathParams.length < route_1.getMinRequiredPathParamsCount(modelName) + 1) {
|
|
261
|
+
throw new Error('pathParams length does not match length of path components');
|
|
262
|
+
}
|
|
263
|
+
changeModelStatus(constants_1.MODEL_STATUS.DELETING);
|
|
264
|
+
actionCreator_1.dispatchModelFetchRequest({
|
|
265
|
+
modelName: modelName,
|
|
266
|
+
method: 'DELETE',
|
|
267
|
+
pathParams: pathParams,
|
|
268
|
+
body: body,
|
|
269
|
+
queryParams: queryParams || configQueryParams
|
|
270
|
+
});
|
|
380
271
|
}
|
|
381
|
-
|
|
272
|
+
exports.deleteCollectionItem = deleteCollectionItem;
|
|
382
273
|
//#endregion Delete
|
|
383
|
-
|
|
384
274
|
//#endregion Collection/Item CRUD Methods
|
|
385
|
-
|
|
386
275
|
//#region Helper Methods
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
*
|
|
390
|
-
*
|
|
391
|
-
*
|
|
392
|
-
* *
|
|
393
|
-
* *
|
|
394
|
-
* * auto load is disabled.
|
|
276
|
+
/**
|
|
277
|
+
* Automatically call `load`, or `changeModelStatus` to `READY`.
|
|
278
|
+
*
|
|
279
|
+
* Does NOT automatically load if:
|
|
280
|
+
* * pathParams does not contain enough items.
|
|
281
|
+
* * model is already fetching.
|
|
282
|
+
* * auto load is disabled.
|
|
395
283
|
*/
|
|
396
284
|
function initializeCollectionItem(model, load, config) {
|
|
397
|
-
|
|
398
|
-
modelName
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
changeModelStatus(_constants.MODEL_STATUS.READY);
|
|
407
|
-
}
|
|
285
|
+
var modelName = config.modelName, pathParams = config.pathParams, disableAutoLoad = config.disableAutoLoad, changeModelStatus = config.changeModelStatus;
|
|
286
|
+
if (pathParams.length === route_1.getMinRequiredPathParamsCount(modelName) + 1 &&
|
|
287
|
+
!disableAutoLoad &&
|
|
288
|
+
(!model._metadata || model._metadata.isFetching === false)) {
|
|
289
|
+
load();
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
changeModelStatus(constants_1.MODEL_STATUS.READY);
|
|
293
|
+
}
|
|
408
294
|
}
|
|
409
|
-
|
|
410
|
-
/**
|
|
411
|
-
* Automatically call `load`, or `changeModelStatus` to `READY`.
|
|
412
|
-
*
|
|
413
|
-
* Does NOT automatically load if:
|
|
414
|
-
* * model is already fetching.
|
|
415
|
-
* * auto load is disabled.
|
|
295
|
+
exports.initializeCollectionItem = initializeCollectionItem;
|
|
296
|
+
/**
|
|
297
|
+
* Automatically call `load`, or `changeModelStatus` to `READY`.
|
|
298
|
+
*
|
|
299
|
+
* Does NOT automatically load if:
|
|
300
|
+
* * model is already fetching.
|
|
301
|
+
* * auto load is disabled.
|
|
416
302
|
*/
|
|
417
303
|
function initializeCollection(model, load, config) {
|
|
418
|
-
|
|
419
|
-
disableAutoLoad
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
changeModelStatus(_constants.MODEL_STATUS.READY);
|
|
426
|
-
}
|
|
304
|
+
var disableAutoLoad = config.disableAutoLoad, changeModelStatus = config.changeModelStatus;
|
|
305
|
+
if (!disableAutoLoad && (!model._metadata || !model._metadata.isFetching)) {
|
|
306
|
+
load();
|
|
307
|
+
}
|
|
308
|
+
else if (disableAutoLoad) {
|
|
309
|
+
changeModelStatus(constants_1.MODEL_STATUS.READY);
|
|
310
|
+
}
|
|
427
311
|
}
|
|
428
|
-
|
|
429
|
-
/**
|
|
430
|
-
* When `pathParams` or `queryParams` change, call `load`
|
|
312
|
+
exports.initializeCollection = initializeCollection;
|
|
313
|
+
/**
|
|
314
|
+
* When `pathParams` or `queryParams` change, call `load`
|
|
431
315
|
*/
|
|
432
316
|
function handleCollectionItemParamsChange(modelName, prevModelName, pathParams, prevPathParams, queryParams, prevQueryParams, load) {
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
}
|
|
438
|
-
}
|
|
317
|
+
if (modelName !== prevModelName ||
|
|
318
|
+
(pathParams.length === route_1.getMinRequiredPathParamsCount(modelName) + 1 && !lodash_1.isEqual(prevPathParams, pathParams)) ||
|
|
319
|
+
!lodash_1.isEqual(prevQueryParams, queryParams)) {
|
|
320
|
+
load({ pathParams: pathParams, queryParams: queryParams });
|
|
321
|
+
}
|
|
439
322
|
}
|
|
440
|
-
|
|
441
|
-
/**
|
|
442
|
-
* When `pathParams` or `queryParams` change, call `load`
|
|
323
|
+
exports.handleCollectionItemParamsChange = handleCollectionItemParamsChange;
|
|
324
|
+
/**
|
|
325
|
+
* When `pathParams` or `queryParams` change, call `load`
|
|
443
326
|
*/
|
|
444
327
|
function handleCollectionParamsChange(modelName, prevModelName, pathParams, prevPathParams, queryParams, prevQueryParams, load) {
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
}
|
|
450
|
-
}
|
|
328
|
+
if (modelName !== prevModelName ||
|
|
329
|
+
(pathParams.length > 0 && !lodash_1.isEqual(prevPathParams, pathParams)) ||
|
|
330
|
+
!lodash_1.isEqual(prevQueryParams, queryParams)) {
|
|
331
|
+
load({ pathParams: pathParams, queryParams: queryParams });
|
|
332
|
+
}
|
|
451
333
|
}
|
|
452
|
-
|
|
453
|
-
/**
|
|
454
|
-
* Delete the guid in the model
|
|
334
|
+
exports.handleCollectionParamsChange = handleCollectionParamsChange;
|
|
335
|
+
/**
|
|
336
|
+
* Delete the guid in the model
|
|
455
337
|
*/
|
|
456
338
|
function cleanupCollectionGuidKey(model, config) {
|
|
457
|
-
|
|
458
|
-
guid
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
339
|
+
var guid = config.guid, modelName = config.modelName, pathParams = config.pathParams;
|
|
340
|
+
if (lodash_1.includes(Object.keys(model), guid)) {
|
|
341
|
+
var modelNames = modelName.split('.');
|
|
342
|
+
var tempPathParams_1 = pathParams.slice();
|
|
343
|
+
// should include the guid at the end
|
|
344
|
+
tempPathParams_1.push(guid);
|
|
345
|
+
if (modelNames.length === tempPathParams_1.length) {
|
|
346
|
+
var path_1 = '';
|
|
347
|
+
modelNames.forEach(function (m, i) {
|
|
348
|
+
if (i === 0) {
|
|
349
|
+
path_1 += m + "." + tempPathParams_1[i];
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
path_1 += "." + m + "." + tempPathParams_1[i];
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
actionCreator_1.dispatchModelRemoveKeyAction({
|
|
356
|
+
modelPath: path_1
|
|
357
|
+
});
|
|
474
358
|
}
|
|
475
|
-
});
|
|
476
|
-
(0, _actionCreator.dispatchModelRemoveKeyAction)({
|
|
477
|
-
modelPath: path
|
|
478
|
-
});
|
|
479
359
|
}
|
|
480
|
-
}
|
|
481
360
|
}
|
|
482
|
-
|
|
361
|
+
exports.cleanupCollectionGuidKey = cleanupCollectionGuidKey;
|
|
483
362
|
//#endregion Helper Methods
|
|
484
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwicmVxdWlyZSIsIl9tZW1vaXplT25lIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jb25zdGFudHMiLCJfYWN0aW9uQ3JlYXRvciIsIl9yb3V0ZSIsImdldFBhdGhQYXJhbXMiLCJtZW1vaXplT25lIiwicGF0aFBhcmFtcyIsInJvdXRlTWF0Y2hQYXJhbXMiLCJtb2RlbE5hbWUiLCJnZXRQYXRoUGFyYW1zRnJvbVJvdXRlTWF0Y2hQYXJhbXMiLCJERUZBVUxUX01PREVMIiwiT2JqZWN0IiwiZnJlZXplIiwic2VsZWN0Q29sbGVjdGlvbkl0ZW1Gcm9tU3RhdGUiLCJwYXJhbXMiLCJndWlkIiwic3RhdGUiLCJtb2RlbE5hbWVMZXZlbENvdW50IiwiZ2V0TWluUmVxdWlyZWRQYXRoUGFyYW1zQ291bnQiLCJwIiwicmVkdXhNb2RlbE5hbWUiLCJnZXRSZWR1eE1vZGVsTmFtZSIsIm1vZGVsIiwibGVuZ3RoIiwiY29sbGVjdGlvbiIsImdldCIsIm1vZGVscyIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIm1vZGVsQnlHdWlkIiwiZmluZCIsInZhbHVlcyIsIm0iLCJyZWR1eE1vZGVsIiwia2V5cyIsImlzQ29sbGVjdGlvbkl0ZW0iLCJzZWxlY3RDb2xsZWN0aW9uRnJvbVN0YXRlIiwic3RvcENvbGxlY3Rpb25QZXJpb2RpY0xvYWQiLCJ0YXNrSWQiLCJkaXNwYXRjaFBlcmlvZGljTW9kZWxGZXRjaFRlcm1pbmF0ZUFjdGlvbiIsImxvYWRDb2xsZWN0aW9uIiwiY29uZmlnIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiaXNJbml0aWFsaXplZCIsImNvbmZpZ1BhdGhQYXJhbXMiLCJxdWVyeVBhcmFtcyIsImNvbmZpZ1F1ZXJ5UGFyYW1zIiwiY2hhbmdlTW9kZWxTdGF0dXMiLCJpZCIsInBlcmlvZCIsInJlcGxhY2VWYWx1ZSIsImNvbmNhdCIsIkVycm9yIiwiTU9ERUxfU1RBVFVTIiwiTE9BRElORyIsImRpc3BhdGNoTW9kZWxGZXRjaFJlcXVlc3QiLCJtZXRob2QiLCJkaXNwYXRjaFBlcmlvZGljTW9kZWxGZXRjaFJlcXVlc3QiLCJsb2FkQ29sbGVjdGlvbkl0ZW0iLCJjcmVhdGVJdGVtSW5Db2xsZWN0aW9uIiwiYm9keSIsImNvbnRlbnRUeXBlIiwiQ1JFQVRJTkciLCJjcmVhdGVDb2xsZWN0aW9uSXRlbSIsInVwZGF0ZUl0ZW1JbkNvbGxlY3Rpb24iLCJVUERBVElORyIsInVwZGF0ZUNvbGxlY3Rpb25JdGVtIiwiZGVsZXRlSXRlbUZyb21Db2xsZWN0aW9uIiwiREVMRVRJTkciLCJkZWxldGVDb2xsZWN0aW9uSXRlbSIsImluaXRpYWxpemVDb2xsZWN0aW9uSXRlbSIsImxvYWQiLCJkaXNhYmxlQXV0b0xvYWQiLCJfbWV0YWRhdGEiLCJpc0ZldGNoaW5nIiwiUkVBRFkiLCJpbml0aWFsaXplQ29sbGVjdGlvbiIsImhhbmRsZUNvbGxlY3Rpb25JdGVtUGFyYW1zQ2hhbmdlIiwicHJldk1vZGVsTmFtZSIsInByZXZQYXRoUGFyYW1zIiwicHJldlF1ZXJ5UGFyYW1zIiwiaXNFcXVhbCIsImhhbmRsZUNvbGxlY3Rpb25QYXJhbXNDaGFuZ2UiLCJjbGVhbnVwQ29sbGVjdGlvbkd1aWRLZXkiLCJpbmNsdWRlcyIsIm1vZGVsTmFtZXMiLCJzcGxpdCIsInRlbXBQYXRoUGFyYW1zIiwic2xpY2UiLCJwdXNoIiwicGF0aCIsImZvckVhY2giLCJpIiwiZGlzcGF0Y2hNb2RlbFJlbW92ZUtleUFjdGlvbiIsIm1vZGVsUGF0aCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9jb2xsZWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbmNhdCwgRGljdGlvbmFyeSwgZmluZCwgZ2V0LCBpbmNsdWRlcywgaXNFcXVhbCwgdmFsdWVzIH0gZnJvbSAnbG9kYXNoJ1xyXG5pbXBvcnQgbWVtb2l6ZU9uZSBmcm9tICdtZW1vaXplLW9uZSdcclxuaW1wb3J0IHsgTU9ERUxfU1RBVFVTIH0gZnJvbSAnLi4vY29uc3RhbnRzJ1xyXG5pbXBvcnQge1xyXG5cdGRpc3BhdGNoTW9kZWxGZXRjaFJlcXVlc3QsXHJcblx0ZGlzcGF0Y2hNb2RlbFJlbW92ZUtleUFjdGlvbixcclxuXHRkaXNwYXRjaFBlcmlvZGljTW9kZWxGZXRjaFJlcXVlc3QsXHJcblx0ZGlzcGF0Y2hQZXJpb2RpY01vZGVsRmV0Y2hUZXJtaW5hdGVBY3Rpb25cclxufSBmcm9tICcuLi9yZWR1eC9hY3Rpb25DcmVhdG9yJ1xyXG5pbXBvcnQge1xyXG5cdENvbGxlY3Rpb25DcmVhdGVQYXJhbXMsXHJcblx0Q29sbGVjdGlvbkRlbGV0ZVBhcmFtcyxcclxuXHRDb2xsZWN0aW9uSXRlbURlbGV0ZVBhcmFtcyxcclxuXHRDb2xsZWN0aW9uSXRlbUxvYWRQYXJhbXMsXHJcblx0Q29sbGVjdGlvbkl0ZW1VcGRhdGVQYXJhbXMsXHJcblx0Q29sbGVjdGlvbkxvYWRQYXJhbXMsXHJcblx0Q29sbGVjdGlvbk1ldGhvZENvbmZpZ3VyYXRpb24sXHJcblx0Q29sbGVjdGlvblNlbGVjdG9yTWV0aG9kUGFyYW1zLFxyXG5cdENvbGxlY3Rpb25TZWxlY3Rvck1ldGhvZFJlc3BvbnNlLFxyXG5cdENvbGxlY3Rpb25VcGRhdGVQYXJhbXMsXHJcblx0TW9kZWwsXHJcblx0TW9kZWxDb2xsZWN0aW9uXHJcbn0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCB7IGdldE1pblJlcXVpcmVkUGF0aFBhcmFtc0NvdW50LCBnZXRQYXRoUGFyYW1zRnJvbVJvdXRlTWF0Y2hQYXJhbXMsIGdldFJlZHV4TW9kZWxOYW1lIH0gZnJvbSAnLi9yb3V0ZSdcclxuXHJcbi8vI3JlZ2lvbiBSZWR1eCBNZXRob2RzXHJcblxyXG5jb25zdCBnZXRQYXRoUGFyYW1zID0gbWVtb2l6ZU9uZShcclxuXHQocGF0aFBhcmFtczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiB8IHVuZGVmaW5lZCwgcm91dGVNYXRjaFBhcmFtczogRGljdGlvbmFyeTxzdHJpbmc+LCBtb2RlbE5hbWU6IHN0cmluZykgPT5cclxuXHRcdHBhdGhQYXJhbXMgfHwgZ2V0UGF0aFBhcmFtc0Zyb21Sb3V0ZU1hdGNoUGFyYW1zKHJvdXRlTWF0Y2hQYXJhbXMsIG1vZGVsTmFtZSlcclxuKVxyXG5cclxuLy8gUHJvdmlkZSBhIHN0YWJsZSBvYmplY3QgcmVmZXJlbmNlIGZvciBlbXB0eSBjb2xsZWN0aW9uc1xyXG5jb25zdCBERUZBVUxUX01PREVMID0gT2JqZWN0LmZyZWV6ZSh7fSlcclxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdENvbGxlY3Rpb25JdGVtRnJvbVN0YXRlPFRNb2RlbCBleHRlbmRzIE1vZGVsPihcclxuXHRwYXJhbXM6IENvbGxlY3Rpb25TZWxlY3Rvck1ldGhvZFBhcmFtc1xyXG4pOiBDb2xsZWN0aW9uU2VsZWN0b3JNZXRob2RSZXNwb25zZTxUTW9kZWw+IHtcclxuXHRjb25zdCB7IGd1aWQsIG1vZGVsTmFtZSwgcGF0aFBhcmFtcywgcm91dGVNYXRjaFBhcmFtcywgc3RhdGUgfSA9IHBhcmFtc1xyXG5cdGNvbnN0IG1vZGVsTmFtZUxldmVsQ291bnQgPSBnZXRNaW5SZXF1aXJlZFBhdGhQYXJhbXNDb3VudChtb2RlbE5hbWUpXHJcblx0Y29uc3QgcCA9IGdldFBhdGhQYXJhbXMocGF0aFBhcmFtcywgcm91dGVNYXRjaFBhcmFtcywgbW9kZWxOYW1lKVxyXG5cdGNvbnN0IHJlZHV4TW9kZWxOYW1lID0gZ2V0UmVkdXhNb2RlbE5hbWUocCwgbW9kZWxOYW1lKVxyXG5cclxuXHRsZXQgbW9kZWwgPSBERUZBVUxUX01PREVMIGFzIFRNb2RlbFxyXG5cdC8vIGZpbmQgYG1vZGVsYCB1c2luZyBgZ3VpZGAgYXMgaXRzIGtleSwgdG8gbWF0Y2ggbmV3IGl0ZW0gY3JlYXRlZCBpbiBgY3JlYXRlKClgXHJcblx0aWYgKHAubGVuZ3RoID09PSBtb2RlbE5hbWVMZXZlbENvdW50KSB7XHJcblx0XHRjb25zdCBjb2xsZWN0aW9uID0gKGdldChzdGF0ZS5tb2RlbHMsIHJlZHV4TW9kZWxOYW1lKSB8fCB7fSkgYXMgTW9kZWxDb2xsZWN0aW9uPFRNb2RlbD5cclxuXHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29sbGVjdGlvbiwgZ3VpZCkpIHtcclxuXHRcdFx0bW9kZWwgPSBjb2xsZWN0aW9uW2d1aWRdIGFzIFRNb2RlbFxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29uc3QgbW9kZWxCeUd1aWQgPSBmaW5kKHZhbHVlcyhjb2xsZWN0aW9uKSwgKG0pOiBtIGlzIFRNb2RlbCA9PiAhIW0gJiYgJ2d1aWQnIGluIG0gJiYgbS5ndWlkID09PSBndWlkKVxyXG5cdFx0XHRtb2RlbCA9IG1vZGVsQnlHdWlkIHx8IG1vZGVsXHJcblx0XHR9XHJcblx0fSBlbHNlIHtcclxuXHRcdC8vIGZpbmQgYG1vZGVsYCB1c2luZyBwYXRoUGFyYW1zXHJcblx0XHRjb25zdCByZWR1eE1vZGVsID0gKGdldChzdGF0ZS5tb2RlbHMsIHJlZHV4TW9kZWxOYW1lKSB8fCB7fSkgYXMgVE1vZGVsXHJcblx0XHRtb2RlbCA9IChPYmplY3Qua2V5cyhyZWR1eE1vZGVsKS5sZW5ndGggPiAwID8gcmVkdXhNb2RlbCA6IERFRkFVTFRfTU9ERUwpIGFzIFRNb2RlbFxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdG1vZGVsTmFtZSxcclxuXHRcdHBhdGhQYXJhbXM6IHAsXHJcblx0XHRtb2RlbCxcclxuXHRcdGlzQ29sbGVjdGlvbkl0ZW06IHRydWVcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RDb2xsZWN0aW9uRnJvbVN0YXRlPFRNb2RlbCBleHRlbmRzIE1vZGVsPihcclxuXHRwYXJhbXM6IENvbGxlY3Rpb25TZWxlY3Rvck1ldGhvZFBhcmFtc1xyXG4pOiBDb2xsZWN0aW9uU2VsZWN0b3JNZXRob2RSZXNwb25zZTxUTW9kZWw+IHtcclxuXHRjb25zdCB7IG1vZGVsTmFtZSwgcGF0aFBhcmFtcywgcm91dGVNYXRjaFBhcmFtcywgc3RhdGUgfSA9IHBhcmFtc1xyXG5cdGNvbnN0IHAgPSBnZXRQYXRoUGFyYW1zKHBhdGhQYXJhbXMsIHJvdXRlTWF0Y2hQYXJhbXMsIG1vZGVsTmFtZSlcclxuXHRjb25zdCByZWR1eE1vZGVsTmFtZSA9IGdldFJlZHV4TW9kZWxOYW1lKHAsIG1vZGVsTmFtZSlcclxuXHJcblx0bGV0IG1vZGVsID0gZ2V0KHN0YXRlLm1vZGVscywgcmVkdXhNb2RlbE5hbWUpIGFzIE1vZGVsQ29sbGVjdGlvbjxUTW9kZWw+IHwgdW5kZWZpbmVkXHJcblx0bW9kZWwgPSBtb2RlbCAmJiBPYmplY3Qua2V5cyhtb2RlbCkubGVuZ3RoID4gMCA/IG1vZGVsIDogKERFRkFVTFRfTU9ERUwgYXMgTW9kZWxDb2xsZWN0aW9uPFRNb2RlbD4pXHJcblxyXG5cdHJldHVybiB7XHJcblx0XHRtb2RlbE5hbWUsXHJcblx0XHRwYXRoUGFyYW1zOiBwLFxyXG5cdFx0bW9kZWwsXHJcblx0XHRpc0NvbGxlY3Rpb25JdGVtOiBmYWxzZVxyXG5cdH1cclxufVxyXG5cclxuLy8jZW5kcmVnaW9uIFJlZHV4IE1ldGhvZHNcclxuXHJcbi8vI3JlZ2lvbiBDb2xsZWN0aW9uL0l0ZW0gQ1JVRCBNZXRob2RzXHJcblxyXG4vLyNyZWdpb24gTG9hZFxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN0b3BDb2xsZWN0aW9uUGVyaW9kaWNMb2FkKHRhc2tJZDogc3RyaW5nKSB7XHJcblx0ZGlzcGF0Y2hQZXJpb2RpY01vZGVsRmV0Y2hUZXJtaW5hdGVBY3Rpb24oe1xyXG5cdFx0dGFza0lkXHJcblx0fSlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRDb2xsZWN0aW9uKGNvbmZpZzogQ29sbGVjdGlvbk1ldGhvZENvbmZpZ3VyYXRpb24sIHBhcmFtczogQ29sbGVjdGlvbkxvYWRQYXJhbXMgPSB7fSkge1xyXG5cdGNvbnN0IHtcclxuXHRcdG1vZGVsTmFtZSxcclxuXHRcdGlzSW5pdGlhbGl6ZWQsXHJcblx0XHRwYXRoUGFyYW1zOiBjb25maWdQYXRoUGFyYW1zLFxyXG5cdFx0cXVlcnlQYXJhbXM6IGNvbmZpZ1F1ZXJ5UGFyYW1zLFxyXG5cdFx0Y2hhbmdlTW9kZWxTdGF0dXNcclxuXHR9ID0gY29uZmlnXHJcblx0Y29uc3QgeyBpZCwgcGF0aFBhcmFtcywgcXVlcnlQYXJhbXMsIHBlcmlvZCwgdGFza0lkLCByZXBsYWNlVmFsdWUgfSA9IHBhcmFtc1xyXG5cdGNvbnN0IHAgPSBjb25jYXQoW10sIHBhdGhQYXJhbXMgfHwgY29uZmlnUGF0aFBhcmFtcywgaWQgPyBbaWRdIDogW10pXHJcblx0aWYgKHAubGVuZ3RoICE9PSBnZXRNaW5SZXF1aXJlZFBhdGhQYXJhbXNDb3VudChtb2RlbE5hbWUpICsgKGlkID8gMSA6IDApKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3BhdGhQYXJhbXMgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBvZiBwYXRoIGNvbXBvbmVudHMnKVxyXG5cdH1cclxuXHRpZiAoaXNJbml0aWFsaXplZCkge1xyXG5cdFx0Y2hhbmdlTW9kZWxTdGF0dXMoTU9ERUxfU1RBVFVTLkxPQURJTkcsIGlkKVxyXG5cdH1cclxuXHRpZiAoIXBlcmlvZCkge1xyXG5cdFx0ZGlzcGF0Y2hNb2RlbEZldGNoUmVxdWVzdCh7XHJcblx0XHRcdG1vZGVsTmFtZSxcclxuXHRcdFx0bWV0aG9kOiAnR0VUJyxcclxuXHRcdFx0cGF0aFBhcmFtczogcCxcclxuXHRcdFx0cXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zIHx8IGNvbmZpZ1F1ZXJ5UGFyYW1zLFxyXG5cdFx0XHRyZXBsYWNlVmFsdWVcclxuXHRcdH0pXHJcblx0fSBlbHNlIHtcclxuXHRcdGlmICghdGFza0lkKSB0aHJvdyBuZXcgRXJyb3IoJ3Rhc2tJZCBpcyByZXF1aXJlZCBmb3IgcGVyaW9kaWMgZGF0YSByZXF1ZXN0cycpXHJcblx0XHRkaXNwYXRjaFBlcmlvZGljTW9kZWxGZXRjaFJlcXVlc3Qoe1xyXG5cdFx0XHRtb2RlbE5hbWUsXHJcblx0XHRcdG1ldGhvZDogJ0dFVCcsXHJcblx0XHRcdHBhdGhQYXJhbXM6IHAsXHJcblx0XHRcdHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtcyB8fCBjb25maWdRdWVyeVBhcmFtcyxcclxuXHRcdFx0cGVyaW9kLFxyXG5cdFx0XHR0YXNrSWQsXHJcblx0XHRcdHJlcGxhY2VWYWx1ZVxyXG5cdFx0fSlcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ29sbGVjdGlvbkl0ZW0oY29uZmlnOiBDb2xsZWN0aW9uTWV0aG9kQ29uZmlndXJhdGlvbiwgcGFyYW1zOiBDb2xsZWN0aW9uSXRlbUxvYWRQYXJhbXMgPSB7fSkge1xyXG5cdGNvbnN0IHtcclxuXHRcdG1vZGVsTmFtZSxcclxuXHRcdGlzSW5pdGlhbGl6ZWQsXHJcblx0XHRwYXRoUGFyYW1zOiBjb25maWdQYXRoUGFyYW1zLFxyXG5cdFx0cXVlcnlQYXJhbXM6IGNvbmZpZ1F1ZXJ5UGFyYW1zLFxyXG5cdFx0Y2hhbmdlTW9kZWxTdGF0dXNcclxuXHR9ID0gY29uZmlnXHJcblx0Y29uc3QgeyBwYXRoUGFyYW1zLCBxdWVyeVBhcmFtcywgcGVyaW9kLCB0YXNrSWQsIHJlcGxhY2VWYWx1ZSB9ID0gcGFyYW1zXHJcblx0Y29uc3QgcCA9IHBhdGhQYXJhbXMgfHwgY29uZmlnUGF0aFBhcmFtc1xyXG5cdGlmIChwLmxlbmd0aCA8IGdldE1pblJlcXVpcmVkUGF0aFBhcmFtc0NvdW50KG1vZGVsTmFtZSkgKyAxKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3BhdGhQYXJhbXMgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBvZiBwYXRoIGNvbXBvbmVudHMnKVxyXG5cdH1cclxuXHRpZiAoaXNJbml0aWFsaXplZCkge1xyXG5cdFx0Y2hhbmdlTW9kZWxTdGF0dXMoTU9ERUxfU1RBVFVTLkxPQURJTkcpXHJcblx0fVxyXG5cdGlmICghcGVyaW9kKSB7XHJcblx0XHRkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0KHtcclxuXHRcdFx0bW9kZWxOYW1lLFxyXG5cdFx0XHRtZXRob2Q6ICdHRVQnLFxyXG5cdFx0XHRwYXRoUGFyYW1zOiBwLFxyXG5cdFx0XHRxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMgfHwgY29uZmlnUXVlcnlQYXJhbXMsXHJcblx0XHRcdHJlcGxhY2VWYWx1ZVxyXG5cdFx0fSlcclxuXHR9IGVsc2Uge1xyXG5cdFx0aWYgKCF0YXNrSWQpIHRocm93IG5ldyBFcnJvcigndGFza0lkIGlzIHJlcXVpcmVkIGZvciBwZXJpb2RpYyBkYXRhIHJlcXVlc3RzJylcclxuXHRcdGRpc3BhdGNoUGVyaW9kaWNNb2RlbEZldGNoUmVxdWVzdCh7XHJcblx0XHRcdG1vZGVsTmFtZSxcclxuXHRcdFx0bWV0aG9kOiAnR0VUJyxcclxuXHRcdFx0cGF0aFBhcmFtczogcCxcclxuXHRcdFx0cXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zIHx8IGNvbmZpZ1F1ZXJ5UGFyYW1zLFxyXG5cdFx0XHRwZXJpb2QsXHJcblx0XHRcdHRhc2tJZCxcclxuXHRcdFx0cmVwbGFjZVZhbHVlXHJcblx0XHR9KVxyXG5cdH1cclxufVxyXG5cclxuLy8jZW5kcmVnaW9uIExvYWRcclxuXHJcbi8vI3JlZ2lvbiBDcmVhdGVcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJdGVtSW5Db2xsZWN0aW9uKGNvbmZpZzogQ29sbGVjdGlvbk1ldGhvZENvbmZpZ3VyYXRpb24sIHBhcmFtczogQ29sbGVjdGlvbkNyZWF0ZVBhcmFtcykge1xyXG5cdGNvbnN0IHsgZ3VpZCwgbW9kZWxOYW1lLCBwYXRoUGFyYW1zLCBxdWVyeVBhcmFtczogY29uZmlnUXVlcnlQYXJhbXMsIGNoYW5nZU1vZGVsU3RhdHVzIH0gPSBjb25maWdcclxuXHRjb25zdCB7IGJvZHksIGNvbnRlbnRUeXBlLCBxdWVyeVBhcmFtcyB9ID0gcGFyYW1zXHJcblx0aWYgKHBhdGhQYXJhbXMubGVuZ3RoIDwgZ2V0TWluUmVxdWlyZWRQYXRoUGFyYW1zQ291bnQobW9kZWxOYW1lKSkge1xyXG5cdFx0dGhyb3cgbmV3IEVycm9yKCdwYXRoUGFyYW1zIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBsZW5ndGggb2YgcGF0aCBjb21wb25lbnRzJylcclxuXHR9XHJcblx0Y2hhbmdlTW9kZWxTdGF0dXMoTU9ERUxfU1RBVFVTLkNSRUFUSU5HLCBndWlkKVxyXG5cdGRpc3BhdGNoTW9kZWxGZXRjaFJlcXVlc3Qoe1xyXG5cdFx0bW9kZWxOYW1lLFxyXG5cdFx0Z3VpZCxcclxuXHRcdG1ldGhvZDogJ1BPU1QnLFxyXG5cdFx0Ym9keSxcclxuXHRcdHBhdGhQYXJhbXMsXHJcblx0XHRjb250ZW50VHlwZSxcclxuXHRcdHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtcyB8fCBjb25maWdRdWVyeVBhcmFtc1xyXG5cdH0pXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb2xsZWN0aW9uSXRlbShcclxuXHRtb2RlbDogTW9kZWwsXHJcblx0Y29uZmlnOiBDb2xsZWN0aW9uTWV0aG9kQ29uZmlndXJhdGlvbixcclxuXHRwYXJhbXM6IENvbGxlY3Rpb25DcmVhdGVQYXJhbXNcclxuKSB7XHJcblx0aWYgKG1vZGVsLmlkKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21vZGVsIGFscmVhZHkgZXhpc3RzJylcclxuXHR9XHJcblx0Y29uc3QgeyBndWlkLCBtb2RlbE5hbWUsIHBhdGhQYXJhbXMsIHF1ZXJ5UGFyYW1zOiBjb25maWdRdWVyeVBhcmFtcywgY2hhbmdlTW9kZWxTdGF0dXMgfSA9IGNvbmZpZ1xyXG5cdGNvbnN0IHsgYm9keSwgY29udGVudFR5cGUsIHF1ZXJ5UGFyYW1zIH0gPSBwYXJhbXNcclxuXHRpZiAocGF0aFBhcmFtcy5sZW5ndGggPCBnZXRNaW5SZXF1aXJlZFBhdGhQYXJhbXNDb3VudChtb2RlbE5hbWUpKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3BhdGhQYXJhbXMgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBvZiBwYXRoIGNvbXBvbmVudHMnKVxyXG5cdH1cclxuXHRjaGFuZ2VNb2RlbFN0YXR1cyhNT0RFTF9TVEFUVVMuQ1JFQVRJTkcpXHJcblx0ZGlzcGF0Y2hNb2RlbEZldGNoUmVxdWVzdCh7XHJcblx0XHRtb2RlbE5hbWUsXHJcblx0XHRndWlkLFxyXG5cdFx0bWV0aG9kOiAnUE9TVCcsXHJcblx0XHRib2R5LFxyXG5cdFx0cGF0aFBhcmFtcyxcclxuXHRcdGNvbnRlbnRUeXBlLFxyXG5cdFx0cXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zIHx8IGNvbmZpZ1F1ZXJ5UGFyYW1zXHJcblx0fSlcclxufVxyXG5cclxuLy8jZW5kcmVnaW9uIENyZWF0ZVxyXG5cclxuLy8jcmVnaW9uIFVwZGF0ZVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUl0ZW1JbkNvbGxlY3Rpb24oY29uZmlnOiBDb2xsZWN0aW9uTWV0aG9kQ29uZmlndXJhdGlvbiwgcGFyYW1zOiBDb2xsZWN0aW9uVXBkYXRlUGFyYW1zKSB7XHJcblx0Y29uc3QgeyBpZCwgYm9keSwgY29udGVudFR5cGUsIG1ldGhvZCwgcXVlcnlQYXJhbXMgfSA9IHBhcmFtc1xyXG5cdGlmICghaWQpIHtcclxuXHRcdHRocm93IG5ldyBFcnJvcihgJ2lkJyBpcyByZXF1aXJlZGApXHJcblx0fVxyXG5cdGlmICghYm9keSkge1xyXG5cdFx0dGhyb3cgbmV3IEVycm9yKGAnYm9keScgaXMgcmVxdWlyZWRgKVxyXG5cdH1cclxuXHRjb25zdCB7IG1vZGVsTmFtZSwgcGF0aFBhcmFtczogY29uZmlnUGF0aFBhcmFtcywgcXVlcnlQYXJhbXM6IGNvbmZpZ1F1ZXJ5UGFyYW1zLCBjaGFuZ2VNb2RlbFN0YXR1cyB9ID0gY29uZmlnXHJcblx0Y29uc3QgcGF0aFBhcmFtcyA9IGNvbmNhdChbXSwgY29uZmlnUGF0aFBhcmFtcywgW2lkXSlcclxuXHRpZiAocGF0aFBhcmFtcy5sZW5ndGggIT09IGdldE1pblJlcXVpcmVkUGF0aFBhcmFtc0NvdW50KG1vZGVsTmFtZSkgKyAxKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3BhdGhQYXJhbXMraWQgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBvZiBwYXRoIGNvbXBvbmVudHMnKVxyXG5cdH1cclxuXHRjb25zdCBtID0gbWV0aG9kIHx8ICdQVVQnXHJcblx0Y2hhbmdlTW9kZWxTdGF0dXMoTU9ERUxfU1RBVFVTLlVQREFUSU5HLCBpZClcclxuXHRkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0KHtcclxuXHRcdG1vZGVsTmFtZSxcclxuXHRcdG1ldGhvZDogbSxcclxuXHRcdHBhdGhQYXJhbXMsXHJcblx0XHRxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMgfHwgY29uZmlnUXVlcnlQYXJhbXMsXHJcblx0XHRib2R5LFxyXG5cdFx0Y29udGVudFR5cGVcclxuXHR9KVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQ29sbGVjdGlvbkl0ZW0oXHJcblx0bW9kZWw6IE1vZGVsLFxyXG5cdGNvbmZpZzogQ29sbGVjdGlvbk1ldGhvZENvbmZpZ3VyYXRpb24sXHJcblx0cGFyYW1zOiBDb2xsZWN0aW9uSXRlbVVwZGF0ZVBhcmFtc1xyXG4pIHtcclxuXHRpZiAoIW1vZGVsLmlkKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21vZGVsIGRvZXMgbm90IGV4aXN0JylcclxuXHR9XHJcblx0Y29uc3QgeyBib2R5LCBjb250ZW50VHlwZSwgbWV0aG9kLCBxdWVyeVBhcmFtcyB9ID0gcGFyYW1zXHJcblx0aWYgKCFib2R5KSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoYCdib2R5JyBpcyByZXF1aXJlZGApXHJcblx0fVxyXG5cdGNvbnN0IHsgbW9kZWxOYW1lLCBwYXRoUGFyYW1zLCBxdWVyeVBhcmFtczogY29uZmlnUXVlcnlQYXJhbXMsIGNoYW5nZU1vZGVsU3RhdHVzIH0gPSBjb25maWdcclxuXHRpZiAocGF0aFBhcmFtcy5sZW5ndGggPCBnZXRNaW5SZXF1aXJlZFBhdGhQYXJhbXNDb3VudChtb2RlbE5hbWUpICsgMSkge1xyXG5cdFx0dGhyb3cgbmV3IEVycm9yKCdwYXRoUGFyYW1zIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBsZW5ndGggb2YgcGF0aCBjb21wb25lbnRzJylcclxuXHR9XHJcblx0Y29uc3QgbSA9IG1ldGhvZCB8fCAnUFVUJ1xyXG5cdGNoYW5nZU1vZGVsU3RhdHVzKE1PREVMX1NUQVRVUy5VUERBVElORylcclxuXHRkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0KHtcclxuXHRcdG1vZGVsTmFtZSxcclxuXHRcdG1ldGhvZDogbSxcclxuXHRcdHBhdGhQYXJhbXMsXHJcblx0XHRib2R5LFxyXG5cdFx0Y29udGVudFR5cGUsXHJcblx0XHRxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMgfHwgY29uZmlnUXVlcnlQYXJhbXNcclxuXHR9KVxyXG59XHJcblxyXG4vLyNlbmRyZWdpb24gVXBkYXRlXHJcblxyXG4vLyNyZWdpb24gRGVsZXRlXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlSXRlbUZyb21Db2xsZWN0aW9uKGNvbmZpZzogQ29sbGVjdGlvbk1ldGhvZENvbmZpZ3VyYXRpb24sIHBhcmFtczogQ29sbGVjdGlvbkRlbGV0ZVBhcmFtcykge1xyXG5cdGNvbnN0IHsgaWQsIGJvZHksIHF1ZXJ5UGFyYW1zIH0gPSBwYXJhbXNcclxuXHRpZiAoIWlkKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoYCdpZCcgaXMgcmVxdWlyZWRgKVxyXG5cdH1cclxuXHRjb25zdCB7IG1vZGVsTmFtZSwgcGF0aFBhcmFtcywgcXVlcnlQYXJhbXM6IGNvbmZpZ1F1ZXJ5UGFyYW1zLCBjaGFuZ2VNb2RlbFN0YXR1cyB9ID0gY29uZmlnXHJcblx0Y29uc3QgcCA9IGNvbmNhdChbXSwgcGF0aFBhcmFtcywgW2lkXSlcclxuXHRpZiAocC5sZW5ndGggIT09IGdldE1pblJlcXVpcmVkUGF0aFBhcmFtc0NvdW50KG1vZGVsTmFtZSkgKyAxKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3BhdGhQYXJhbXMraWQgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBvZiBwYXRoIGNvbXBvbmVudHMnKVxyXG5cdH1cclxuXHRjaGFuZ2VNb2RlbFN0YXR1cyhNT0RFTF9TVEFUVVMuREVMRVRJTkcsIGlkKVxyXG5cdGRpc3BhdGNoTW9kZWxGZXRjaFJlcXVlc3Qoe1xyXG5cdFx0bW9kZWxOYW1lLFxyXG5cdFx0bWV0aG9kOiAnREVMRVRFJyxcclxuXHRcdHBhdGhQYXJhbXM6IHAsXHJcblx0XHRxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMgfHwgY29uZmlnUXVlcnlQYXJhbXMsXHJcblx0XHRib2R5XHJcblx0fSlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUNvbGxlY3Rpb25JdGVtKFxyXG5cdG1vZGVsOiBNb2RlbCxcclxuXHRjb25maWc6IENvbGxlY3Rpb25NZXRob2RDb25maWd1cmF0aW9uLFxyXG5cdHBhcmFtczogQ29sbGVjdGlvbkl0ZW1EZWxldGVQYXJhbXMgPSB7fVxyXG4pIHtcclxuXHRpZiAoIW1vZGVsLmlkKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21vZGVsIGRvZXMgbm90IGV4aXN0JylcclxuXHR9XHJcblx0Y29uc3QgeyBib2R5LCBxdWVyeVBhcmFtcyB9ID0gcGFyYW1zXHJcblx0Y29uc3QgeyBtb2RlbE5hbWUsIHBhdGhQYXJhbXMsIHF1ZXJ5UGFyYW1zOiBjb25maWdRdWVyeVBhcmFtcywgY2hhbmdlTW9kZWxTdGF0dXMgfSA9IGNvbmZpZ1xyXG5cdGlmIChwYXRoUGFyYW1zLmxlbmd0aCA8IGdldE1pblJlcXVpcmVkUGF0aFBhcmFtc0NvdW50KG1vZGVsTmFtZSkgKyAxKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3BhdGhQYXJhbXMgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBvZiBwYXRoIGNvbXBvbmVudHMnKVxyXG5cdH1cclxuXHRjaGFuZ2VNb2RlbFN0YXR1cyhNT0RFTF9TVEFUVVMuREVMRVRJTkcpXHJcblx0ZGlzcGF0Y2hNb2RlbEZldGNoUmVxdWVzdCh7XHJcblx0XHRtb2RlbE5hbWUsXHJcblx0XHRtZXRob2Q6ICdERUxFVEUnLFxyXG5cdFx0cGF0aFBhcmFtcyxcclxuXHRcdGJvZHksXHJcblx0XHRxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMgfHwgY29uZmlnUXVlcnlQYXJhbXNcclxuXHR9KVxyXG59XHJcblxyXG4vLyNlbmRyZWdpb24gRGVsZXRlXHJcblxyXG4vLyNlbmRyZWdpb24gQ29sbGVjdGlvbi9JdGVtIENSVUQgTWV0aG9kc1xyXG5cclxuLy8jcmVnaW9uIEhlbHBlciBNZXRob2RzXHJcblxyXG4vKipcclxuICogQXV0b21hdGljYWxseSBjYWxsIGBsb2FkYCwgb3IgYGNoYW5nZU1vZGVsU3RhdHVzYCB0byBgUkVBRFlgLlxyXG4gKlxyXG4gKiBEb2VzIE5PVCBhdXRvbWF0aWNhbGx5IGxvYWQgaWY6XHJcbiAqICogcGF0aFBhcmFtcyBkb2VzIG5vdCBjb250YWluIGVub3VnaCBpdGVtcy5cclxuICogKiBtb2RlbCBpcyBhbHJlYWR5IGZldGNoaW5nLlxyXG4gKiAqIGF1dG8gbG9hZCBpcyBkaXNhYmxlZC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQ29sbGVjdGlvbkl0ZW0oXHJcblx0bW9kZWw6IE1vZGVsLFxyXG5cdGxvYWQ6IChwYXJhbXM/OiBDb2xsZWN0aW9uSXRlbUxvYWRQYXJhbXMpID0+IHZvaWQsXHJcblx0Y29uZmlnOiBDb2xsZWN0aW9uTWV0aG9kQ29uZmlndXJhdGlvblxyXG4pIHtcclxuXHRjb25zdCB7IG1vZGVsTmFtZSwgcGF0aFBhcmFtcywgZGlzYWJsZUF1dG9Mb2FkLCBjaGFuZ2VNb2RlbFN0YXR1cyB9ID0gY29uZmlnXHJcblx0aWYgKFxyXG5cdFx0cGF0aFBhcmFtcy5sZW5ndGggPT09IGdldE1pblJlcXVpcmVkUGF0aFBhcmFtc0NvdW50KG1vZGVsTmFtZSkgKyAxICYmXHJcblx0XHQhZGlzYWJsZUF1dG9Mb2FkICYmXHJcblx0XHQoIW1vZGVsLl9tZXRhZGF0YSB8fCAhbW9kZWwuX21ldGFkYXRhLmlzRmV0Y2hpbmcpXHJcblx0KSB7XHJcblx0XHRsb2FkKClcclxuXHR9IGVsc2Uge1xyXG5cdFx0Y2hhbmdlTW9kZWxTdGF0dXMoTU9ERUxfU1RBVFVTLlJFQURZKVxyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEF1dG9tYXRpY2FsbHkgY2FsbCBgbG9hZGAsIG9yIGBjaGFuZ2VNb2RlbFN0YXR1c2AgdG8gYFJFQURZYC5cclxuICpcclxuICogRG9lcyBOT1QgYXV0b21hdGljYWxseSBsb2FkIGlmOlxyXG4gKiAqIG1vZGVsIGlzIGFscmVhZHkgZmV0Y2hpbmcuXHJcbiAqICogYXV0byBsb2FkIGlzIGRpc2FibGVkLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVDb2xsZWN0aW9uKFxyXG5cdG1vZGVsOiBNb2RlbCxcclxuXHRsb2FkOiAocGFyYW1zPzogQ29sbGVjdGlvbkl0ZW1Mb2FkUGFyYW1zKSA9PiB2b2lkLFxyXG5cdGNvbmZpZzogQ29sbGVjdGlvbk1ldGhvZENvbmZpZ3VyYXRpb25cclxuKSB7XHJcblx0Y29uc3QgeyBkaXNhYmxlQXV0b0xvYWQsIGNoYW5nZU1vZGVsU3RhdHVzIH0gPSBjb25maWdcclxuXHRpZiAoIWRpc2FibGVBdXRvTG9hZCAmJiAoIW1vZGVsLl9tZXRhZGF0YSB8fCAhbW9kZWwuX21ldGFkYXRhLmlzRmV0Y2hpbmcpKSB7XHJcblx0XHRsb2FkKClcclxuXHR9IGVsc2UgaWYgKGRpc2FibGVBdXRvTG9hZCkge1xyXG5cdFx0Y2hhbmdlTW9kZWxTdGF0dXMoTU9ERUxfU1RBVFVTLlJFQURZKVxyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFdoZW4gYHBhdGhQYXJhbXNgIG9yIGBxdWVyeVBhcmFtc2AgY2hhbmdlLCBjYWxsIGBsb2FkYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUNvbGxlY3Rpb25JdGVtUGFyYW1zQ2hhbmdlKFxyXG5cdG1vZGVsTmFtZTogc3RyaW5nLFxyXG5cdHByZXZNb2RlbE5hbWU6IHN0cmluZyxcclxuXHRwYXRoUGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LFxyXG5cdHByZXZQYXRoUGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+IHwgdW5kZWZpbmVkLFxyXG5cdHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiB8IHVuZGVmaW5lZCxcclxuXHRwcmV2UXVlcnlQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+IHwgdW5kZWZpbmVkLFxyXG5cdGxvYWQ6IChwYXJhbXM/OiBDb2xsZWN0aW9uSXRlbUxvYWRQYXJhbXMpID0+IHZvaWRcclxuKSB7XHJcblx0aWYgKFxyXG5cdFx0bW9kZWxOYW1lICE9PSBwcmV2TW9kZWxOYW1lIHx8XHJcblx0XHQocGF0aFBhcmFtcy5sZW5ndGggPT09IGdldE1pblJlcXVpcmVkUGF0aFBhcmFtc0NvdW50KG1vZGVsTmFtZSkgKyAxICYmICFpc0VxdWFsKHByZXZQYXRoUGFyYW1zLCBwYXRoUGFyYW1zKSkgfHxcclxuXHRcdCFpc0VxdWFsKHByZXZRdWVyeVBhcmFtcywgcXVlcnlQYXJhbXMpXHJcblx0KSB7XHJcblx0XHRsb2FkKHsgcGF0aFBhcmFtcywgcXVlcnlQYXJhbXMgfSlcclxuXHR9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBXaGVuIGBwYXRoUGFyYW1zYCBvciBgcXVlcnlQYXJhbXNgIGNoYW5nZSwgY2FsbCBgbG9hZGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVDb2xsZWN0aW9uUGFyYW1zQ2hhbmdlKFxyXG5cdG1vZGVsTmFtZTogc3RyaW5nLFxyXG5cdHByZXZNb2RlbE5hbWU6IHN0cmluZyxcclxuXHRwYXRoUGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LFxyXG5cdHByZXZQYXRoUGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+IHwgdW5kZWZpbmVkLFxyXG5cdHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiB8IHVuZGVmaW5lZCxcclxuXHRwcmV2UXVlcnlQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+IHwgdW5kZWZpbmVkLFxyXG5cdGxvYWQ6IChwYXJhbXM/OiBDb2xsZWN0aW9uTG9hZFBhcmFtcykgPT4gdm9pZFxyXG4pIHtcclxuXHRpZiAoXHJcblx0XHRtb2RlbE5hbWUgIT09IHByZXZNb2RlbE5hbWUgfHxcclxuXHRcdChwYXRoUGFyYW1zLmxlbmd0aCA+IDAgJiYgIWlzRXF1YWwocHJldlBhdGhQYXJhbXMsIHBhdGhQYXJhbXMpKSB8fFxyXG5cdFx0IWlzRXF1YWwocHJldlF1ZXJ5UGFyYW1zLCBxdWVyeVBhcmFtcylcclxuXHQpIHtcclxuXHRcdGxvYWQoeyBwYXRoUGFyYW1zLCBxdWVyeVBhcmFtcyB9KVxyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqIERlbGV0ZSB0aGUgZ3VpZCBpbiB0aGUgbW9kZWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjbGVhbnVwQ29sbGVjdGlvbkd1aWRLZXk8VE1vZGVsIGV4dGVuZHMgTW9kZWw+KFxyXG5cdG1vZGVsOiBNb2RlbENvbGxlY3Rpb248VE1vZGVsPixcclxuXHRjb25maWc6IENvbGxlY3Rpb25NZXRob2RDb25maWd1cmF0aW9uXHJcbikge1xyXG5cdGNvbnN0IHsgZ3VpZCwgbW9kZWxOYW1lLCBwYXRoUGFyYW1zIH0gPSBjb25maWdcclxuXHRpZiAoaW5jbHVkZXMoT2JqZWN0LmtleXMobW9kZWwpLCBndWlkKSkge1xyXG5cdFx0Y29uc3QgbW9kZWxOYW1lcyA9IG1vZGVsTmFtZS5zcGxpdCgnLicpXHJcblx0XHRjb25zdCB0ZW1wUGF0aFBhcmFtcyA9IHBhdGhQYXJhbXMuc2xpY2UoKVxyXG5cdFx0Ly8gc2hvdWxkIGluY2x1ZGUgdGhlIGd1aWQgYXQgdGhlIGVuZFxyXG5cdFx0dGVtcFBhdGhQYXJhbXMucHVzaChndWlkKVxyXG5cdFx0aWYgKG1vZGVsTmFtZXMubGVuZ3RoID09PSB0ZW1wUGF0aFBhcmFtcy5sZW5ndGgpIHtcclxuXHRcdFx0bGV0IHBhdGggPSAnJ1xyXG5cdFx0XHRtb2RlbE5hbWVzLmZvckVhY2goKG0sIGkpID0+IHtcclxuXHRcdFx0XHRpZiAoaSA9PT0gMCkge1xyXG5cdFx0XHRcdFx0cGF0aCArPSBgJHttfS4ke3RlbXBQYXRoUGFyYW1zW2ldfWBcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0cGF0aCArPSBgLiR7bX0uJHt0ZW1wUGF0aFBhcmFtc1tpXX1gXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KVxyXG5cdFx0XHRkaXNwYXRjaE1vZGVsUmVtb3ZlS2V5QWN0aW9uKHtcclxuXHRcdFx0XHRtb2RlbFBhdGg6IHBhdGhcclxuXHRcdFx0fSlcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuXHJcbi8vI2VuZHJlZ2lvbiBIZWxwZXIgTWV0aG9kc1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxVQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxjQUFBLEdBQUFKLE9BQUE7QUFvQkEsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBRUE7O0FBRUEsTUFBTU0sYUFBYSxHQUFHLElBQUFDLG1CQUFVLEVBQy9CLENBQUNDLFVBQThDLEVBQUVDLGdCQUFvQyxFQUFFQyxTQUFpQixLQUN2R0YsVUFBVSxJQUFJLElBQUFHLHdDQUFpQyxFQUFDRixnQkFBZ0IsRUFBRUMsU0FBUyxDQUM3RSxDQUFDOztBQUVEO0FBQ0EsTUFBTUUsYUFBYSxHQUFHQyxNQUFNLENBQUNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxTQUFTQyw2QkFBNkJBLENBQzVDQyxNQUFzQyxFQUNLO0VBQzNDLE1BQU07SUFBRUMsSUFBSTtJQUFFUCxTQUFTO0lBQUVGLFVBQVU7SUFBRUMsZ0JBQWdCO0lBQUVTO0VBQU0sQ0FBQyxHQUFHRixNQUFNO0VBQ3ZFLE1BQU1HLG1CQUFtQixHQUFHLElBQUFDLG9DQUE2QixFQUFDVixTQUFTLENBQUM7RUFDcEUsTUFBTVcs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V0FBa0UsRUFDbEVtQyxlQUFzRSxFQUN0RVQsSUFBNkMsRUFDNUM7RUFDRCxJQUNDakUsU0FBUyxLQUFLd0UsYUFBYSxJQUMxQjFFLFVBQVUsQ0FBQ2lCLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFBNEQsZUFBTyxFQUFDRixjQUFjLEVBQUUzRSxVQUFVLENBQUUsSUFDL0QsQ0FBQyxJQUFBNkUsZUFBTyxFQUFDRCxlQUFlLEVBQUVuQyxXQUFXLENBQUMsRUFDckM7SUFDRDBCLElBQUksQ0FBQztNQUFFbkUsVUFBVTtNQUFFeUM7SUFBWSxDQUFDLENBQUM7RUFDbEM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDTyxTQUFTc0Msd0JBQXdCQSxDQUN2Qy9ELEtBQThCLEVBQzlCb0IsTUFBcUMsRUFDcEM7RUFDRCxNQUFNO0lBQUUzQixJQUFJO0lBQUVQLFNBQVM7SUFBRUY7RUFBVyxDQUFDLEdBQUdvQyxNQUFNO0VBQzlDLElBQUksSUFBQTRDLGdCQUFRLEVBQUMzRSxNQUFNLENBQUN3QixJQUFJLENBQUNiLEtBQUssQ0FBQyxFQUFFUCxJQUFJLENBQUMsRUFBRTtJQUN2QyxNQUFNd0UsVUFBVSxHQUFHL0UsU0FBUyxDQUFDZ0YsS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUN2QyxNQUFNQyxjQUFjLEdBQUduRixVQUFVLENBQUNvRixLQUFLLENBQUMsQ0FBQztJQUN6QztJQUNBRCxjQUFjLENBQUNFLElBQUksQ0FBQzVFLElBQUksQ0FBQztJQUN6QixJQUFJd0UsVUFBVSxDQUFDaEUsTUFBTSxLQUFLa0UsY0FBYyxDQUFDbEUsTUFBTSxFQUFFO01BQ2hELElBQUlxRSxJQUFJLEdBQUcsRUFBRTtNQUNiTCxVQUFVLENBQUNNLE9BQU8sQ0FBQyxDQUFDNUQsQ0FBQyxFQUFFNkQsQ0FBQyxLQUFLO1FBQzVCLElBQUlBLENBQUMsS0FBSyxDQUFDLEVBQUU7VUFDWkYsSUFBSSxJQUFJLEdBQUczRCxDQUFDLElBQUl3RCxjQUFjLENBQUNLLENBQUMsQ0FBQyxFQUFFO1FBQ3BDLENBQUMsTUFBTTtVQUNORixJQUFJLElBQUksSUFBSTNELENBQUMsSUFBSXdELGNBQWMsQ0FBQ0ssQ0FBQyxDQUFDLEVBQUU7UUFDckM7TUFDRCxDQUFDLENBQUM7TUFDRixJQUFBQywyQ0FBNEIsRUFBQztRQUM1QkMsU0FBUyxFQUFFSjtNQUNaLENBQUMsQ0FBQztJQUNIO0VBQ0Q7QUFDRDs7QUFFQSIsImlnbm9yZUxpc3QiOltdfQ==
|