studiokit-scaffolding-js 7.0.12 → 7.1.0
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 +166 -87
- package/lib/components/AlertDialog.d.ts +3 -3
- package/lib/components/AlertDialog.js +133 -18
- package/lib/components/AlertWithIcon.js +93 -52
- package/lib/components/ConnectedModal.d.ts +1 -2
- package/lib/components/ConnectedModal.js +43 -37
- package/lib/components/Dropdowns/GroupsDropdown.d.ts +4 -4
- package/lib/components/Dropdowns/GroupsDropdown.js +69 -82
- package/lib/components/Dropdowns/ManagedNavDropdown.d.ts +2 -2
- package/lib/components/Dropdowns/ManagedNavDropdown.js +99 -111
- package/lib/components/Dropdowns/UserDropdown.js +109 -70
- package/lib/components/Dropdowns/index.js +27 -11
- package/lib/components/EntityOwnerList.d.ts +3 -3
- package/lib/components/EntityOwnerList.js +52 -60
- package/lib/components/Error.js +107 -27
- package/lib/components/ErrorBoundary.js +133 -94
- package/lib/components/ErrorMessage.d.ts +2 -2
- package/lib/components/ErrorMessage.js +44 -14
- package/lib/components/Forms/DateField.d.ts +2 -2
- package/lib/components/Forms/DateField.js +63 -95
- package/lib/components/Forms/TimeField.d.ts +2 -2
- package/lib/components/Forms/TimeField.js +84 -108
- package/lib/components/Forms/index.js +27 -13
- package/lib/components/Groups/CreateEditCopySaveButtons.d.ts +2 -2
- package/lib/components/Groups/CreateEditCopySaveButtons.js +102 -14
- package/lib/components/Groups/ExternalGroups/Attach.d.ts +6 -7
- package/lib/components/Groups/ExternalGroups/Attach.js +213 -188
- package/lib/components/Groups/ExternalGroups/Table.js +183 -76
- package/lib/components/Groups/GroupCreateOrEditCommonProps.js +5 -1
- package/lib/components/Groups/RosterSyncInfo.js +140 -49
- package/lib/components/HOC/AccessibleAppComponent.d.ts +2 -2
- package/lib/components/HOC/AccessibleAppComponent.js +101 -124
- package/lib/components/HOC/ActivityRequiredComponent.d.ts +14 -14
- package/lib/components/HOC/ActivityRequiredComponent.js +93 -107
- package/lib/components/HOC/AsyncComponent.d.ts +9 -9
- package/lib/components/HOC/AsyncComponent.js +53 -129
- package/lib/components/HOC/AuthenticatedComponent.d.ts +4 -4
- package/lib/components/HOC/AuthenticatedComponent.js +59 -96
- 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 +52 -94
- package/lib/components/HOC/CollectionItemComponent.d.ts +9 -9
- package/lib/components/HOC/CollectionItemComponent.js +169 -168
- package/lib/components/HOC/ConnectedModalComponent.d.ts +9 -9
- package/lib/components/HOC/ConnectedModalComponent.js +110 -140
- package/lib/components/HOC/DataDependentComponent.d.ts +3 -55
- package/lib/components/HOC/DataDependentComponent.js +30 -79
- package/lib/components/HOC/EntityComponent.d.ts +13 -13
- package/lib/components/HOC/EntityComponent.js +74 -112
- package/lib/components/HOC/FullscreenModalComponent.d.ts +9 -9
- package/lib/components/HOC/FullscreenModalComponent.js +165 -185
- package/lib/components/HOC/GroupActivityRequiredComponent.d.ts +2 -2
- package/lib/components/HOC/GroupActivityRequiredComponent.js +48 -47
- package/lib/components/HOC/GuidComponent.d.ts +1 -1
- package/lib/components/HOC/GuidComponent.js +29 -68
- package/lib/components/HOC/ModelContextDependencyVerifyComponent.d.ts +28 -29
- package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +42 -65
- package/lib/components/HOC/ModelErrorRedirectComponent.d.ts +10 -10
- package/lib/components/HOC/ModelErrorRedirectComponent.js +51 -94
- package/lib/components/HOC/SearchPersistorComponent.d.ts +4 -4
- package/lib/components/HOC/SearchPersistorComponent.js +243 -216
- package/lib/components/HOC/UnauthenticatedComponent.d.ts +12 -12
- package/lib/components/HOC/UnauthenticatedComponent.js +37 -82
- package/lib/components/HOC/UserComponent.d.ts +1 -1
- package/lib/components/HOC/UserComponent.js +12 -11
- package/lib/components/Icons/IconAlphaList.js +34 -20
- package/lib/components/Icons/IconExternalUser.js +34 -20
- package/lib/components/Icons/IconImpersonation.js +34 -20
- package/lib/components/Icons/IconStopImpersonating.js +34 -20
- package/lib/components/Icons/IconTable.js +35 -21
- package/lib/components/Icons/IconTableDeleteCol.js +34 -20
- package/lib/components/Icons/IconTableDeleteRow.js +34 -20
- package/lib/components/Icons/IconTableInsertCol.js +34 -20
- package/lib/components/Icons/IconTableInsertRow.js +34 -20
- package/lib/components/Impersonation/Button.d.ts +2 -2
- package/lib/components/Impersonation/Button.js +76 -56
- package/lib/components/Impersonation/Link.d.ts +2 -2
- package/lib/components/Impersonation/Link.js +76 -53
- package/lib/components/Impersonation/UserDetail.css +22 -22
- package/lib/components/Impersonation/UserDetail.d.ts +2 -2
- package/lib/components/Impersonation/UserDetail.js +66 -17
- package/lib/components/Loading.js +27 -21
- package/lib/components/LockDownBrowser/Check.js +194 -107
- package/lib/components/LockDownBrowser/ExitButton.js +27 -14
- package/lib/components/LockDownBrowser/Launch.js +70 -85
- package/lib/components/Lti/Confirm.js +152 -33
- package/lib/components/Lti/CreateNonLtiGroupAlertDialog.d.ts +4 -2
- package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +170 -78
- package/lib/components/Lti/Launch.js +105 -49
- package/lib/components/Lti/LaunchGroup.js +85 -39
- package/lib/components/ManageTable.d.ts +1 -2
- package/lib/components/ManageTable.js +309 -104
- package/lib/components/ManageTableNoDataComponent.js +42 -22
- package/lib/components/NewVersionAlert.d.ts +2 -2
- package/lib/components/NewVersionAlert.js +82 -91
- package/lib/components/NotFound.js +87 -28
- package/lib/components/Notifications.d.ts +4 -4
- package/lib/components/Notifications.js +187 -169
- package/lib/components/PaginationNextButton.js +33 -21
- package/lib/components/PaginationPreviousButton.js +33 -21
- package/lib/components/Quill/CustomToolbar.d.ts +2 -2
- package/lib/components/Quill/CustomToolbar.js +432 -257
- package/lib/components/Quill/Formats/Image.d.ts +10 -25
- package/lib/components/Quill/Formats/Image.js +80 -86
- package/lib/components/Quill/Formats/List.d.ts +6 -3
- package/lib/components/Quill/Formats/List.js +52 -74
- package/lib/components/Quill/Formats/Video.d.ts +2 -1
- package/lib/components/Quill/Formats/Video.js +31 -45
- package/lib/components/Quill/ImageDropModule.d.ts +1 -1
- package/lib/components/Quill/ImageDropModule.js +149 -122
- package/lib/components/Quill/ImageWarning.d.ts +2 -2
- package/lib/components/Quill/ImageWarning.js +45 -32
- package/lib/components/Quill/ImageWithAltTextModal.d.ts +0 -1
- package/lib/components/Quill/ImageWithAltTextModal.js +425 -141
- package/lib/components/Quill/Specs/CustomImageSpec.d.ts +1 -1
- package/lib/components/Quill/Specs/CustomImageSpec.js +43 -51
- package/lib/components/Quill/Specs/CustomVideoSpec.d.ts +1 -1
- package/lib/components/Quill/Specs/CustomVideoSpec.js +35 -44
- package/lib/components/Quill/TableModule/Blots/BaseTableBlot.d.ts +2 -1
- package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +105 -121
- package/lib/components/Quill/TableModule/Blots/TableBlot.js +53 -66
- package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +54 -67
- package/lib/components/Quill/TableModule/Blots/TableCellBlot.d.ts +1 -1
- package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +225 -241
- package/lib/components/Quill/TableModule/Blots/TableContainer.js +82 -99
- package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +76 -87
- package/lib/components/Quill/TableModule/constants.js +45 -41
- package/lib/components/Quill/TableModule/index.css +171 -171
- package/lib/components/Quill/TableModule/index.d.ts +14 -5
- package/lib/components/Quill/TableModule/index.js +373 -313
- package/lib/components/Quill/TableModule/utils.js +45 -45
- package/lib/components/Quill/accessibilityFix.d.ts +0 -1
- package/lib/components/Quill/accessibilityFix.js +235 -251
- package/lib/components/Quill/index.js +36 -32
- package/lib/components/RefreshIndicator/Bordered.js +48 -32
- package/lib/components/RefreshIndicator/Inline.js +48 -33
- package/lib/components/RefreshIndicator/index.d.ts +2 -2
- package/lib/components/RefreshIndicator/index.js +263 -113
- package/lib/components/SearchControls.js +216 -31
- package/lib/components/SentryRoute.js +10 -23
- package/lib/components/Tables/RoleFilter.d.ts +3 -4
- package/lib/components/Tables/RoleFilter.js +71 -46
- package/lib/components/Tables/TextFilter.d.ts +2 -3
- package/lib/components/Tables/TextFilter.js +62 -20
- package/lib/components/UserRoles/Add.d.ts +3 -3
- package/lib/components/UserRoles/Add.js +199 -161
- package/lib/components/UserRoles/Context.js +11 -9
- package/lib/components/UserRoles/RoleCell.js +180 -100
- package/lib/components/UserRoles/Select.js +157 -51
- package/lib/components/UserRoles/Table.js +221 -102
- package/lib/components/UserRoles/index.d.ts +6 -6
- package/lib/components/UserRoles/index.js +537 -466
- package/lib/config/eslint/index.d.ts +2 -0
- package/lib/config/eslint/index.js +36 -0
- package/lib/config/eslint/lib/order.d.ts +3 -0
- package/lib/config/eslint/lib/order.js +30 -0
- package/lib/config/eslint/lib/prettier.d.ts +3 -0
- package/lib/config/eslint/lib/prettier.js +23 -0
- package/lib/config/eslint/lib/typescript.d.ts +2 -0
- package/lib/config/eslint/lib/typescript.js +98 -0
- package/lib/config/eslint/react.d.ts +2 -0
- package/lib/config/eslint/react.js +30 -0
- package/lib/constants/baseActivity.js +30 -26
- package/lib/constants/baseRole.js +14 -10
- package/lib/constants/configuration.d.ts +1 -1
- package/lib/constants/configuration.js +43 -39
- package/lib/constants/externalProviderType.js +10 -6
- package/lib/constants/fetchErrorData.js +15 -11
- package/lib/constants/index.js +137 -23
- package/lib/constants/lockDownBrowser.js +28 -24
- package/lib/constants/mockData.d.ts +4 -6
- package/lib/constants/mockData.js +385 -326
- package/lib/constants/modelStatus.js +15 -11
- package/lib/constants/notificationType.js +12 -8
- package/lib/constants/operatingSystem.js +12 -8
- package/lib/constants/shard.js +11 -7
- package/lib/constants/table.js +21 -21
- package/lib/constants/tier.js +12 -8
- package/lib/constants/userRole.d.ts +1 -2
- package/lib/constants/userRole.js +15 -17
- 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 +305 -312
- package/lib/css/utils/_general.css +48 -48
- package/lib/css/utils/_icon.css +16 -16
- package/lib/css/utils/_text.css +25 -24
- package/lib/css/utils/_width.css +60 -60
- package/lib/css/variables.css +84 -84
- package/lib/endpointMappings.js +197 -193
- package/lib/hooks/useCollection.js +83 -65
- package/lib/hooks/useCollectionConfiguration.d.ts +0 -1
- package/lib/hooks/useCollectionConfiguration.js +185 -88
- package/lib/hooks/useCollectionItem.js +155 -58
- package/lib/hooks/useEventCalback.d.ts +14 -0
- package/lib/hooks/useEventCalback.js +51 -0
- package/lib/hooks/useGuid.js +21 -10
- package/lib/hooks/usePrevious.d.ts +24 -1
- package/lib/hooks/usePrevious.js +84 -14
- package/lib/index.js +156 -36
- package/lib/redux/actionCreator.d.ts +6 -6
- package/lib/redux/actionCreator.js +51 -40
- package/lib/redux/actions/AuthAction.js +44 -31
- package/lib/redux/actions/ModalAction.d.ts +1 -1
- package/lib/redux/actions/ModalAction.js +10 -6
- package/lib/redux/actions/ModelAction.d.ts +1 -1
- package/lib/redux/actions/ModelAction.js +77 -49
- package/lib/redux/actions/NotificationAction.js +10 -6
- package/lib/redux/actions/SearchAction.js +9 -5
- package/lib/redux/actions/index.js +60 -16
- package/lib/redux/configureReducers.d.ts +2 -5
- package/lib/redux/configureReducers.js +67 -78
- package/lib/redux/configureStore.d.ts +2 -2
- package/lib/redux/configureStore.js +83 -115
- package/lib/redux/helpers.js +7 -2
- package/lib/redux/reducers/authReducer.js +52 -46
- package/lib/redux/reducers/index.js +41 -15
- package/lib/redux/reducers/modalsReducer.js +49 -52
- package/lib/redux/reducers/modelsReducer.d.ts +2 -2
- package/lib/redux/reducers/modelsReducer.js +183 -182
- package/lib/redux/reducers/notificationsReducer.js +26 -21
- package/lib/redux/reducers/searchReducer.js +26 -20
- package/lib/redux/sagas/appInsightsSaga.js +24 -62
- package/lib/redux/sagas/authSaga.js +287 -414
- package/lib/redux/sagas/caliperSaga.js +169 -263
- package/lib/redux/sagas/clockOffsetSaga.js +36 -77
- package/lib/redux/sagas/configurationSaga.js +13 -46
- package/lib/redux/sagas/downtimeApiErrorSaga.d.ts +0 -1
- package/lib/redux/sagas/downtimeApiErrorSaga.js +23 -64
- package/lib/redux/sagas/errorSaga.d.ts +0 -1
- package/lib/redux/sagas/errorSaga.js +29 -63
- package/lib/redux/sagas/googleAnalyticsSaga.js +29 -69
- package/lib/redux/sagas/identityProviderSaga.js +24 -69
- package/lib/redux/sagas/initialDataLoadSaga.js +38 -29
- package/lib/redux/sagas/lockDownBrowserErrorSaga.d.ts +0 -1
- package/lib/redux/sagas/lockDownBrowserErrorSaga.js +32 -81
- package/lib/redux/sagas/modelFetchSaga.js +379 -459
- package/lib/redux/sagas/noStoreSaga.d.ts +1 -1
- package/lib/redux/sagas/noStoreSaga.js +68 -101
- package/lib/redux/sagas/postLoginDataSaga.js +47 -79
- package/lib/redux/sagas/postLoginRedirectSaga.js +30 -71
- package/lib/redux/sagas/rootSaga.js +85 -137
- package/lib/redux/sagas/sentrySaga.js +29 -85
- package/lib/redux/sagas/userIdSaga.js +18 -54
- package/lib/services/codeProviderService.js +25 -29
- package/lib/services/dateService.js +14 -12
- package/lib/services/documentService.js +18 -13
- package/lib/services/fetchService.js +134 -168
- package/lib/services/persistenceService.d.ts +4 -4
- package/lib/services/persistenceService.js +45 -43
- package/lib/services/ticketProviderService.js +29 -33
- package/lib/services/tokenPersistenceService.js +13 -9
- package/lib/services/windowService.js +21 -17
- package/lib/startup.d.ts +1 -1
- package/lib/startup.js +132 -135
- package/lib/types/AppConfiguration.js +5 -1
- package/lib/types/Artifact.js +11 -7
- package/lib/types/BaseReduxState.js +5 -1
- package/lib/types/Client.js +5 -1
- package/lib/types/Collection.d.ts +3 -3
- package/lib/types/Collection.js +5 -1
- package/lib/types/Configuration.js +5 -1
- package/lib/types/DeepLinkingResponseRequest.js +5 -1
- package/lib/types/DeletableModel.js +5 -1
- package/lib/types/Event.js +5 -1
- package/lib/types/ExternalGroup.js +5 -1
- package/lib/types/ExternalProvider.js +5 -1
- package/lib/types/ExternalTerm.js +5 -1
- package/lib/types/Group.js +5 -1
- package/lib/types/IdentityProvider.js +5 -1
- package/lib/types/LtiLaunch.js +5 -1
- package/lib/types/NameOnlyEntity.js +5 -1
- package/lib/types/Notification.d.ts +2 -2
- package/lib/types/Notification.js +5 -1
- package/lib/types/OptionalRecord.d.ts +1 -1
- package/lib/types/OptionalRecord.js +5 -1
- package/lib/types/OwnerSchedule.d.ts +3 -1
- package/lib/types/OwnerSchedule.js +5 -1
- package/lib/types/PropertyOfType.d.ts +3 -3
- package/lib/types/PropertyOfType.js +5 -1
- package/lib/types/Quill.js +5 -1
- package/lib/types/RoleDescription.d.ts +0 -1
- package/lib/types/RoleDescription.js +5 -1
- package/lib/types/Search.js +5 -1
- package/lib/types/SimpleLocation.js +5 -1
- package/lib/types/UniTime.js +5 -1
- package/lib/types/User.js +5 -1
- package/lib/types/UserRole.js +5 -1
- package/lib/types/auth/AuthState.js +5 -1
- package/lib/types/auth/CasV1LoginRequestBody.js +5 -1
- package/lib/types/auth/ClientCredentials.js +5 -1
- package/lib/types/auth/CodeProviderService.js +5 -1
- package/lib/types/auth/LocalLoginRequestBody.js +5 -1
- package/lib/types/auth/TicketProviderService.js +5 -1
- package/lib/types/auth/TokenPersistenceService.js +5 -1
- package/lib/types/auth/index.js +82 -18
- package/lib/types/externals.d.js +2 -0
- package/lib/types/index.js +313 -39
- package/lib/types/net/EndpointConfig.js +5 -1
- package/lib/types/net/EndpointMapping.js +5 -1
- package/lib/types/net/EndpointMappings.js +5 -1
- package/lib/types/net/ErrorHandler.d.ts +1 -1
- package/lib/types/net/ErrorHandler.js +5 -1
- package/lib/types/net/FetchConfig.d.ts +1 -1
- package/lib/types/net/FetchConfig.js +5 -1
- package/lib/types/net/FetchErrorData.js +10 -6
- package/lib/types/net/FetchResult.d.ts +2 -2
- package/lib/types/net/FetchResult.js +5 -1
- package/lib/types/net/HTTPMethod.d.ts +1 -1
- package/lib/types/net/HTTPMethod.js +5 -1
- package/lib/types/net/HTTPStatusCode.js +16 -12
- package/lib/types/net/Metadata.js +5 -1
- package/lib/types/net/Model.js +5 -1
- package/lib/types/net/ModelCollection.js +5 -1
- package/lib/types/net/ModelsState.js +5 -1
- package/lib/types/net/OAuthToken.js +5 -1
- package/lib/types/net/OAuthTokenOrNull.d.ts +1 -1
- package/lib/types/net/OAuthTokenOrNull.js +5 -1
- package/lib/types/net/TokenAccessFunction.d.ts +1 -1
- package/lib/types/net/TokenAccessFunction.js +5 -1
- package/lib/types/net/index.js +181 -27
- package/lib/utils/baseActivity.d.ts +2 -2
- package/lib/utils/baseActivity.js +138 -136
- package/lib/utils/baseRole.js +37 -33
- package/lib/utils/collection.js +432 -310
- package/lib/utils/cookies.js +22 -37
- package/lib/utils/date.js +320 -320
- package/lib/utils/dom.js +186 -174
- package/lib/utils/domainIdentifier.js +9 -9
- package/lib/utils/entityUserRole.js +6 -2
- package/lib/utils/error.d.ts +1 -1
- package/lib/utils/error.js +18 -16
- package/lib/utils/events.js +40 -33
- package/lib/utils/externalGroup.js +25 -21
- package/lib/utils/externalProviders.js +8 -4
- package/lib/utils/externalTerms.js +9 -6
- package/lib/utils/fetch.d.ts +1 -1
- package/lib/utils/fetch.js +188 -185
- package/lib/utils/group.js +17 -9
- package/lib/utils/groupDates.d.ts +1 -1
- package/lib/utils/groupDates.js +43 -39
- package/lib/utils/groupRoles.js +28 -28
- package/lib/utils/lockDownBrowser.js +16 -12
- package/lib/utils/logger.js +30 -25
- package/lib/utils/lti.js +10 -5
- package/lib/utils/model.d.ts +2 -2
- package/lib/utils/model.js +39 -48
- package/lib/utils/number.js +23 -26
- package/lib/utils/promise.d.ts +6 -1
- package/lib/utils/promise.js +34 -15
- package/lib/utils/quill.js +66 -77
- package/lib/utils/route.d.ts +2 -2
- package/lib/utils/route.js +61 -60
- package/lib/utils/search.d.ts +1 -1
- package/lib/utils/search.js +78 -85
- package/lib/utils/shard.js +38 -41
- package/lib/utils/sort.d.ts +3 -3
- package/lib/utils/sort.js +62 -58
- package/lib/utils/string.js +14 -10
- package/lib/utils/table.d.ts +3 -3
- package/lib/utils/table.js +39 -36
- package/lib/utils/timezone.js +12 -26
- package/lib/utils/url.d.ts +2 -1
- package/lib/utils/url.js +146 -200
- package/lib/utils/user.js +59 -61
- package/lib/utils/userAgent.js +11 -11
- package/lib/utils/userRole.d.ts +3 -3
- package/lib/utils/userRole.js +58 -56
- package/package.json +224 -207
- package/lib/config/eslint/index.cjs +0 -21
- package/lib/config/eslint/lib/order.cjs +0 -22
- package/lib/config/eslint/lib/prettier.cjs +0 -18
- package/lib/config/eslint/lib/typescript.cjs +0 -86
- package/lib/config/eslint/react.cjs +0 -9
|
@@ -1,195 +1,220 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
extendStatics(d, b);
|
|
11
|
-
function __() { this.constructor = d; }
|
|
12
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
13
|
-
};
|
|
14
|
-
})();
|
|
15
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
16
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
17
|
-
};
|
|
18
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
19
7
|
exports.ExternalGroupsAttach = void 0;
|
|
20
|
-
var
|
|
21
|
-
var
|
|
22
|
-
var
|
|
23
|
-
var
|
|
24
|
-
var
|
|
25
|
-
var
|
|
26
|
-
var
|
|
27
|
-
var
|
|
28
|
-
var
|
|
29
|
-
var
|
|
30
|
-
var
|
|
31
|
-
var
|
|
32
|
-
var
|
|
33
|
-
var
|
|
34
|
-
var
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
_this.setState({
|
|
58
|
-
ownerSchedules: ownersInitialScheduleData,
|
|
59
|
-
isUniTimeScheduleLoadingDone: false
|
|
60
|
-
}, function () {
|
|
61
|
-
return lodash_1.forEach(ownersInitialScheduleData, function (ownerSchedule, userId) {
|
|
62
|
-
return _this.getOwnerUniTimeGroups(ownerSchedule, userId, externalTermId);
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
};
|
|
66
|
-
_this.handleSelectExternalGroups = function (event) {
|
|
67
|
-
var externalId = event.target.value;
|
|
68
|
-
var checked = event.target.checked;
|
|
69
|
-
var _a = _this.props, originalConnectedExternalGroups = _a.originalConnectedExternalGroups, selectedExternalGroups = _a.selectedExternalGroups;
|
|
70
|
-
var allOwnerExternalGroups = lodash_1.map(_this.state.ownerSchedules, function (os) { return os.externalGroups; }).reduce(function (a, b) {
|
|
71
|
-
return a.concat(b);
|
|
72
|
-
});
|
|
73
|
-
var selectedExternalGroupsCopy = selectedExternalGroups.slice();
|
|
74
|
-
if (checked) {
|
|
75
|
-
var originalConnectedExternalGroup = originalConnectedExternalGroups.find(function (oeg) { return oeg.externalId === externalId; });
|
|
76
|
-
var selectedExternalGroup = originalConnectedExternalGroup
|
|
77
|
-
? originalConnectedExternalGroup
|
|
78
|
-
: allOwnerExternalGroups === null || allOwnerExternalGroups === void 0 ? void 0 : allOwnerExternalGroups.find(function (ao) { return ao.externalId === externalId; });
|
|
79
|
-
if (selectedExternalGroup) {
|
|
80
|
-
selectedExternalGroupsCopy.push(selectedExternalGroup);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
lodash_1.remove(selectedExternalGroupsCopy, function (seg) { return seg.externalId === externalId; });
|
|
85
|
-
}
|
|
86
|
-
_this.props.handleSelectedExternalGroups(selectedExternalGroupsCopy);
|
|
87
|
-
};
|
|
88
|
-
_this.getOwnerUniTimeGroups = function (ownerSchedule, userId, externalTermId) {
|
|
89
|
-
if (shard_1.isPurdueShard() && ownerSchedule.status === constants_1.MODEL_STATUS.UNINITIALIZED && !ownerSchedule.externalGroups) {
|
|
90
|
-
noStoreSaga_1.registerNoStoreActionHook(ownerSchedule.hookId, function (data) {
|
|
91
|
-
noStoreSaga_1.unregisterNoStoreActionHook(ownerSchedule.hookId);
|
|
92
|
-
if (!data || fetch_1.isFetchErrorData(data)) {
|
|
93
|
-
_this.setState({ isShowingErrorAlert: true, isUniTimeScheduleLoadingDone: true });
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
_this.setUserUniTimeGroups(userId, data.externalGroups);
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
actionCreator_1.dispatchModelFetchRequest({
|
|
100
|
-
modelName: 'uniTimeInstructorSchedule',
|
|
101
|
-
queryParams: {
|
|
102
|
-
externalTermId: externalTermId,
|
|
103
|
-
userId: userId
|
|
104
|
-
},
|
|
105
|
-
noStore: true,
|
|
106
|
-
guid: ownerSchedule.hookId
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
_this.setUserUniTimeGroups = function (userId, externalGroups) {
|
|
111
|
-
// Setting the user's course sections load status to be ready
|
|
112
|
-
var ownerSchedules = _this.state.ownerSchedules || {};
|
|
113
|
-
ownerSchedules[userId].status = constants_1.MODEL_STATUS.READY;
|
|
114
|
-
ownerSchedules[userId].externalGroups = externalGroups;
|
|
115
|
-
var isUniTimeScheduleLoadingDone = lodash_1.every(ownerSchedules, function (os) { return os.status === constants_1.MODEL_STATUS.READY; });
|
|
116
|
-
_this.setState({
|
|
117
|
-
ownerSchedules: ownerSchedules,
|
|
118
|
-
isUniTimeScheduleLoadingDone: isUniTimeScheduleLoadingDone
|
|
119
|
-
});
|
|
120
|
-
};
|
|
121
|
-
_this.displayOwnerSchedules = function (ownerSchedules) {
|
|
122
|
-
return lodash_1.map(ownerSchedules, function (os) {
|
|
123
|
-
if (!!os.externalGroups && os.externalGroups.length > 0) {
|
|
124
|
-
return (react_1.default.createElement("div", { key: os.hookId },
|
|
125
|
-
react_1.default.createElement("h4", null, user_1.displayName(os.owner)),
|
|
126
|
-
_this.displayUniTimeGroups(os.externalGroups)));
|
|
127
|
-
}
|
|
128
|
-
});
|
|
8
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
var _lodash = require("lodash");
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
var _reactBootstrap = require("react-bootstrap");
|
|
12
|
+
var _uuid = require("uuid");
|
|
13
|
+
var _constants = require("../../../constants");
|
|
14
|
+
var _actionCreator = require("../../../redux/actionCreator");
|
|
15
|
+
var _noStoreSaga = require("../../../redux/sagas/noStoreSaga");
|
|
16
|
+
var _fetch = require("../../../utils/fetch");
|
|
17
|
+
var _model = require("../../../utils/model");
|
|
18
|
+
var _shard = require("../../../utils/shard");
|
|
19
|
+
var _user = require("../../../utils/user");
|
|
20
|
+
var _AlertWithIcon = require("../../AlertWithIcon");
|
|
21
|
+
var _Loading = require("../../Loading");
|
|
22
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
23
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
24
|
+
class ExternalGroupsAttach extends _react.Component {
|
|
25
|
+
constructor(props) {
|
|
26
|
+
super(props);
|
|
27
|
+
(0, _defineProperty2.default)(this, "setOwnerSchedules", (groupUserRoles, externalTermId, selectedExternalGroups) => {
|
|
28
|
+
const {
|
|
29
|
+
canConnectAnyExternalGroups,
|
|
30
|
+
canConnectOwnExternalGroups,
|
|
31
|
+
userInfo
|
|
32
|
+
} = this.props;
|
|
33
|
+
const owners = groupUserRoles.filter(groupUserRole => {
|
|
34
|
+
return groupUserRole.role === _constants.BASE_ROLE.GROUP_OWNER;
|
|
35
|
+
});
|
|
36
|
+
const ownersInitialScheduleData = {};
|
|
37
|
+
owners.forEach(owner => {
|
|
38
|
+
const ownerData = {
|
|
39
|
+
hookId: (0, _uuid.v4)(),
|
|
40
|
+
status: canConnectAnyExternalGroups || userInfo.id === owner.id && canConnectOwnExternalGroups ? _constants.MODEL_STATUS.UNINITIALIZED : _constants.MODEL_STATUS.READY,
|
|
41
|
+
owner,
|
|
42
|
+
externalGroups: !(canConnectAnyExternalGroups || userInfo.id === owner.id && canConnectOwnExternalGroups) ? selectedExternalGroups.filter(seg => seg.userId === owner.id) : undefined
|
|
129
43
|
};
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
44
|
+
(0, _lodash.set)(ownersInitialScheduleData, [owner.userId], ownerData);
|
|
45
|
+
});
|
|
46
|
+
this.setState({
|
|
47
|
+
ownerSchedules: ownersInitialScheduleData,
|
|
48
|
+
isUniTimeScheduleLoadingDone: false
|
|
49
|
+
}, () => (0, _lodash.forEach)(ownersInitialScheduleData, (ownerSchedule, userId) => {
|
|
50
|
+
this.getOwnerUniTimeGroups(ownerSchedule, userId, externalTermId);
|
|
51
|
+
}));
|
|
52
|
+
});
|
|
53
|
+
(0, _defineProperty2.default)(this, "handleSelectExternalGroups", event => {
|
|
54
|
+
const externalId = event.target.value;
|
|
55
|
+
const checked = event.target.checked;
|
|
56
|
+
const {
|
|
57
|
+
originalConnectedExternalGroups,
|
|
58
|
+
selectedExternalGroups
|
|
59
|
+
} = this.props;
|
|
60
|
+
const allOwnerExternalGroups = (0, _lodash.map)(this.state.ownerSchedules, os => os.externalGroups).reduce((a, b) => (a || []).concat(b || []));
|
|
61
|
+
const selectedExternalGroupsCopy = selectedExternalGroups.slice();
|
|
62
|
+
if (checked) {
|
|
63
|
+
const originalConnectedExternalGroup = originalConnectedExternalGroups.find(oeg => oeg.externalId === externalId);
|
|
64
|
+
const selectedExternalGroup = originalConnectedExternalGroup ? originalConnectedExternalGroup : allOwnerExternalGroups?.find(ao => ao.externalId === externalId);
|
|
65
|
+
if (selectedExternalGroup) {
|
|
66
|
+
selectedExternalGroupsCopy.push(selectedExternalGroup);
|
|
67
|
+
}
|
|
68
|
+
} else {
|
|
69
|
+
(0, _lodash.remove)(selectedExternalGroupsCopy, seg => seg.externalId === externalId);
|
|
70
|
+
}
|
|
71
|
+
this.props.handleSelectedExternalGroups(selectedExternalGroupsCopy);
|
|
72
|
+
});
|
|
73
|
+
(0, _defineProperty2.default)(this, "getOwnerUniTimeGroups", (ownerSchedule, userId, externalTermId) => {
|
|
74
|
+
if ((0, _shard.isPurdueShard)() && ownerSchedule.status === _constants.MODEL_STATUS.UNINITIALIZED && !ownerSchedule.externalGroups) {
|
|
75
|
+
(0, _noStoreSaga.registerNoStoreActionHook)(ownerSchedule.hookId, data => {
|
|
76
|
+
(0, _noStoreSaga.unregisterNoStoreActionHook)(ownerSchedule.hookId);
|
|
77
|
+
if (!data || (0, _fetch.isFetchErrorData)(data)) {
|
|
78
|
+
this.setState({
|
|
79
|
+
isShowingErrorAlert: true,
|
|
80
|
+
isUniTimeScheduleLoadingDone: true
|
|
144
81
|
});
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
82
|
+
} else {
|
|
83
|
+
this.setUserUniTimeGroups(userId, data.externalGroups);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
(0, _actionCreator.dispatchModelFetchRequest)({
|
|
87
|
+
modelName: 'uniTimeInstructorSchedule',
|
|
88
|
+
queryParams: {
|
|
89
|
+
externalTermId,
|
|
90
|
+
userId
|
|
91
|
+
},
|
|
92
|
+
noStore: true,
|
|
93
|
+
guid: ownerSchedule.hookId
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
(0, _defineProperty2.default)(this, "setUserUniTimeGroups", (userId, externalGroups) => {
|
|
98
|
+
// Setting the user's course sections load status to be ready
|
|
99
|
+
const ownerSchedules = this.state.ownerSchedules || {};
|
|
100
|
+
ownerSchedules[userId].status = _constants.MODEL_STATUS.READY;
|
|
101
|
+
ownerSchedules[userId].externalGroups = externalGroups;
|
|
102
|
+
const isUniTimeScheduleLoadingDone = (0, _lodash.every)(ownerSchedules, os => os.status === _constants.MODEL_STATUS.READY);
|
|
103
|
+
this.setState({
|
|
104
|
+
ownerSchedules,
|
|
105
|
+
isUniTimeScheduleLoadingDone
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
(0, _defineProperty2.default)(this, "displayOwnerSchedules", ownerSchedules => {
|
|
109
|
+
return (0, _lodash.map)(ownerSchedules, os => {
|
|
110
|
+
if (!!os.externalGroups && os.externalGroups.length > 0) {
|
|
111
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
112
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h4", {
|
|
113
|
+
children: (0, _user.displayName)(os.owner)
|
|
114
|
+
}), this.displayUniTimeGroups(os.externalGroups)]
|
|
115
|
+
}, os.hookId);
|
|
170
116
|
}
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
(0, _defineProperty2.default)(this, "displayUniTimeGroups", externalGroups => {
|
|
120
|
+
const {
|
|
121
|
+
selectedExternalGroups,
|
|
122
|
+
canConnectAnyExternalGroups,
|
|
123
|
+
canConnectOwnExternalGroups,
|
|
124
|
+
userInfo,
|
|
125
|
+
disabled
|
|
126
|
+
} = this.props;
|
|
127
|
+
return (0, _lodash.orderBy)(externalGroups, ['description']).map((eg, index) => {
|
|
128
|
+
const isConnected = selectedExternalGroups.some(seg => seg.externalId === eg.externalId && seg.externalProviderId === eg.externalProviderId && seg.userId === eg.userId);
|
|
129
|
+
if (canConnectAnyExternalGroups || userInfo.id === eg.userId && canConnectOwnExternalGroups || isConnected) {
|
|
130
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.FormCheck, {
|
|
131
|
+
id: `external-group-${eg.id}`,
|
|
132
|
+
type: "checkbox",
|
|
133
|
+
onChange: this.handleSelectExternalGroups,
|
|
134
|
+
value: eg.externalId,
|
|
135
|
+
checked: isConnected,
|
|
136
|
+
disabled: userInfo.id !== eg.userId && !canConnectAnyExternalGroups || disabled,
|
|
137
|
+
label: `${eg.name} ${eg.description ? `(${eg.description})` : ''}`
|
|
138
|
+
}, index);
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
this.state = {
|
|
144
|
+
ownerSchedules: undefined,
|
|
145
|
+
isUniTimeScheduleLoadingDone: false,
|
|
146
|
+
isShowingErrorAlert: false
|
|
171
147
|
};
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
148
|
+
}
|
|
149
|
+
componentDidMount() {
|
|
150
|
+
const {
|
|
151
|
+
groupUserRoles,
|
|
152
|
+
externalTermId,
|
|
153
|
+
selectedExternalGroups
|
|
154
|
+
} = this.props;
|
|
155
|
+
this.setOwnerSchedules((0, _model.getModelArray)(groupUserRoles), externalTermId, selectedExternalGroups);
|
|
156
|
+
}
|
|
157
|
+
componentWillUnmount() {
|
|
158
|
+
const {
|
|
159
|
+
ownerSchedules
|
|
160
|
+
} = this.state;
|
|
161
|
+
(0, _lodash.forEach)(ownerSchedules, os => (0, _noStoreSaga.unregisterNoStoreActionHook)(os.hookId));
|
|
162
|
+
}
|
|
163
|
+
componentDidUpdate(prevProps) {
|
|
164
|
+
const {
|
|
165
|
+
externalTermId: prevExternalTermId,
|
|
166
|
+
groupUserRoles: prevGroupUserRoles
|
|
167
|
+
} = prevProps;
|
|
168
|
+
const {
|
|
169
|
+
externalTermId,
|
|
170
|
+
groupUserRoles,
|
|
171
|
+
selectedExternalGroups
|
|
172
|
+
} = this.props;
|
|
173
|
+
// Assumes group user roles are changing one at a time. Can be made fancier if the need arises
|
|
174
|
+
if (prevExternalTermId !== externalTermId || Object.keys(prevGroupUserRoles).length !== Object.keys(groupUserRoles).length) {
|
|
175
|
+
this.setOwnerSchedules((0, _model.getModelArray)(groupUserRoles), externalTermId, selectedExternalGroups);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
render() {
|
|
179
|
+
const {
|
|
180
|
+
disabledInfoMessage
|
|
181
|
+
} = this.props;
|
|
182
|
+
const {
|
|
183
|
+
ownerSchedules,
|
|
184
|
+
isUniTimeScheduleLoadingDone,
|
|
185
|
+
isShowingErrorAlert
|
|
186
|
+
} = this.state;
|
|
187
|
+
const hasAnyExternalGroups = (0, _lodash.some)(ownerSchedules, os => !!os.externalGroups && os.externalGroups.length > 0);
|
|
188
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
189
|
+
children: [!isUniTimeScheduleLoadingDone && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Loading.Loading, {}), isUniTimeScheduleLoadingDone && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
190
|
+
children: [!hasAnyExternalGroups && /*#__PURE__*/(0, _jsxRuntime.jsx)(_AlertWithIcon.AlertWithIcon, {
|
|
191
|
+
variant: "info",
|
|
192
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
193
|
+
children: "No course sections eligible for roster sync."
|
|
194
|
+
})
|
|
195
|
+
}), !!disabledInfoMessage && hasAnyExternalGroups && /*#__PURE__*/(0, _jsxRuntime.jsx)(_AlertWithIcon.AlertWithIcon, {
|
|
196
|
+
variant: "info",
|
|
197
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
198
|
+
children: disabledInfoMessage
|
|
199
|
+
})
|
|
200
|
+
}), isShowingErrorAlert && /*#__PURE__*/(0, _jsxRuntime.jsx)(_AlertWithIcon.AlertWithIcon, {
|
|
201
|
+
variant: "warning",
|
|
202
|
+
onClose: () => {
|
|
203
|
+
this.setState({
|
|
204
|
+
isShowingErrorAlert: false
|
|
205
|
+
});
|
|
206
|
+
},
|
|
207
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
208
|
+
className: "ma0",
|
|
209
|
+
children: "Oops! Something went wrong while loading. Please try again."
|
|
210
|
+
})
|
|
211
|
+
}), ' ', hasAnyExternalGroups && !!ownerSchedules && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.FormGroup, {
|
|
212
|
+
className: "ml4 f6",
|
|
213
|
+
children: this.displayOwnerSchedules(ownerSchedules)
|
|
214
|
+
})]
|
|
215
|
+
})]
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
195
219
|
exports.ExternalGroupsAttach = ExternalGroupsAttach;
|
|
220
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX3JlYWN0Qm9vdHN0cmFwIiwiX3V1aWQiLCJfY29uc3RhbnRzIiwiX2FjdGlvbkNyZWF0b3IiLCJfbm9TdG9yZVNhZ2EiLCJfZmV0Y2giLCJfbW9kZWwiLCJfc2hhcmQiLCJfdXNlciIsIl9BbGVydFdpdGhJY29uIiwiX0xvYWRpbmciLCJfanN4UnVudGltZSIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIkV4dGVybmFsR3JvdXBzQXR0YWNoIiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJncm91cFVzZXJSb2xlcyIsImV4dGVybmFsVGVybUlkIiwic2VsZWN0ZWRFeHRlcm5hbEdyb3VwcyIsImNhbkNvbm5lY3RBbnlFeHRlcm5hbEdyb3VwcyIsImNhbkNvbm5lY3RPd25FeHRlcm5hbEdyb3VwcyIsInVzZXJJbmZvIiwib3duZXJzIiwiZmlsdGVyIiwiZ3JvdXBVc2VyUm9sZSIsInJvbGUiLCJCQVNFX1JPTEUiLCJHUk9VUF9PV05FUiIsIm93bmVyc0luaXRpYWxTY2hlZHVsZURhdGEiLCJmb3JFYWNoIiwib3duZXIiLCJvd25lckRhdGEiLCJob29rSWQiLCJ1dWlkdjQiLCJzdGF0dXMiLCJpZCIsIk1PREVMX1NUQVRVUyIsIlVOSU5JVElBTElaRUQiLCJSRUFEWSIsImV4dGVybmFsR3JvdXBzIiwic2VnIiwidXNlcklkIiwidW5kZWZpbmVkIiwic2V0U3RhdGUiLCJvd25lclNjaGVkdWxlcyIsImlzVW5pVGltZVNjaGVkdWxlTG9hZGluZ0RvbmUiLCJvd25lclNjaGVkdWxlIiwiZ2V0T3duZXJVbmlUaW1lR3JvdXBzIiwiZXZlbnQiLCJleHRlcm5hbElkIiwidGFyZ2V0IiwidmFsdWUiLCJjaGVja2VkIiwib3JpZ2luYWxDb25uZWN0ZWRFeHRlcm5hbEdyb3VwcyIsImFsbE93bmVyRXh0ZXJuYWxHcm91cHMiLCJtYXAiLCJzdGF0ZSIsIm9zIiwicmVkdWNlIiwiYSIsImIiLCJjb25jYXQiLCJzZWxlY3RlZEV4dGVybmFsR3JvdXBzQ29weSIsInNsaWNlIiwib3JpZ2luYWxDb25uZWN0ZWRFeHRlcm5hbEdyb3VwIiwiZmluZCIsIm9lZyIsInNlbGVjdGVkRXh0ZXJuYWxHcm91cCIsImFvIiwicHVzaCIsInJlbW92ZSIsImhhbmRsZVNlbGVjdGVkRXh0ZXJuYWxHcm91cHMiLCJpc1B1cmR1ZVNoYXJkIiwicmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vayIsImRhdGEiLCJ1bnJlZ2lzdGVyTm9TdG9yZUFjdGlvbkhvb2siLCJpc0ZldGNoRXJyb3JEYXRhIiwiaXNTaG93aW5nRXJyb3JBbGVydCIsInNldFVzZXJVbmlUaW1lR3JvdXBzIiwiZGlzcGF0Y2hNb2RlbEZldGNoUmVxdWVzdCIsIm1vZGVsTmFtZSIsInF1ZXJ5UGFyYW1zIiwibm9TdG9yZSIsImd1aWQiLCJldmVyeSIsImxlbmd0aCIsImpzeHMiLCJjaGlsZHJlbiIsImpzeCIsImRpc3BsYXlOYW1lIiwiZGlzcGxheVVuaVRpbWVHcm91cHMiLCJkaXNhYmxlZCIsIm9yZGVyQnkiLCJlZyIsImluZGV4IiwiaXNDb25uZWN0ZWQiLCJzb21lIiwiZXh0ZXJuYWxQcm92aWRlcklkIiwiRm9ybUNoZWNrIiwidHlwZSIsIm9uQ2hhbmdlIiwiaGFuZGxlU2VsZWN0RXh0ZXJuYWxHcm91cHMiLCJsYWJlbCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsImNvbXBvbmVudERpZE1vdW50Iiwic2V0T3duZXJTY2hlZHVsZXMiLCJnZXRNb2RlbEFycmF5IiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJjb21wb25lbnREaWRVcGRhdGUiLCJwcmV2UHJvcHMiLCJwcmV2RXh0ZXJuYWxUZXJtSWQiLCJwcmV2R3JvdXBVc2VyUm9sZXMiLCJrZXlzIiwicmVuZGVyIiwiZGlzYWJsZWRJbmZvTWVzc2FnZSIsImhhc0FueUV4dGVybmFsR3JvdXBzIiwiTG9hZGluZyIsIkFsZXJ0V2l0aEljb24iLCJ2YXJpYW50Iiwib25DbG9zZSIsImNsYXNzTmFtZSIsIkZvcm1Hcm91cCIsImRpc3BsYXlPd25lclNjaGVkdWxlcyIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9Hcm91cHMvRXh0ZXJuYWxHcm91cHMvQXR0YWNoLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaWN0aW9uYXJ5LCBldmVyeSwgZm9yRWFjaCwgbWFwLCBvcmRlckJ5LCByZW1vdmUsIHNldCwgc29tZSB9IGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IFJlYWN0LCB7IENoYW5nZUV2ZW50LCBDb21wb25lbnQgfSBmcm9tICdyZWFjdCdcclxuaW1wb3J0IHsgRm9ybUNoZWNrLCBGb3JtR3JvdXAgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXHJcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnXHJcbmltcG9ydCB7IEJBU0VfUk9MRSwgTU9ERUxfU1RBVFVTIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzJ1xyXG5pbXBvcnQgeyBkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vcmVkdXgvYWN0aW9uQ3JlYXRvcidcclxuaW1wb3J0IHsgcmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vaywgdW5yZWdpc3Rlck5vU3RvcmVBY3Rpb25Ib29rIH0gZnJvbSAnLi4vLi4vLi4vcmVkdXgvc2FnYXMvbm9TdG9yZVNhZ2EnXHJcbmltcG9ydCB7XHJcblx0RXh0ZXJuYWxHcm91cCxcclxuXHRGZXRjaEVycm9yRGF0YSxcclxuXHRHcm91cFVzZXJSb2xlLFxyXG5cdEluc3RydWN0b3JTY2hlZHVsZSxcclxuXHRMdGlMYXVuY2gsXHJcblx0TW9kZWxDb2xsZWN0aW9uLFxyXG5cdE93bmVyU2NoZWR1bGUsXHJcblx0VW5pVGltZUdyb3VwLFxyXG5cdFVzZXJJbmZvXHJcbn0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnXHJcbmltcG9ydCB7IGlzRmV0Y2hFcnJvckRhdGEgfSBmcm9tICcuLi8uLi8uLi91dGlscy9mZXRjaCdcclxuaW1wb3J0IHsgZ2V0TW9kZWxBcnJheSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL21vZGVsJ1xyXG5pbXBvcnQgeyBpc1B1cmR1ZVNoYXJkIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvc2hhcmQnXHJcbmltcG9ydCB7IGRpc3BsYXlOYW1lIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvdXNlcidcclxuaW1wb3J0IHsgQWxlcnRXaXRoSWNvbiB9IGZyb20gJy4uLy4uL0FsZXJ0V2l0aEljb24nXHJcbmltcG9ydCB7IExvYWRpbmcgfSBmcm9tICcuLi8uLi9Mb2FkaW5nJ1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbEdyb3Vwc0F0dGFjaFByb3BzIHtcclxuXHR1c2VySW5mbzogVXNlckluZm9cclxuXHRjYW5SZWFkRXh0ZXJuYWxHcm91cHM6IGJvb2xlYW5cclxuXHRjYW5Db25uZWN0QW55RXh0ZXJuYWxHcm91cHM6IGJvb2xlYW5cclxuXHRjYW5Db25uZWN0T3duRXh0ZXJuYWxHcm91cHM6IGJvb2xlYW5cclxuXHRvcmlnaW5hbENvbm5lY3RlZEV4dGVybmFsR3JvdXBzOiBBcnJheTxFeHRlcm5hbEdyb3VwIHwgTHRpTGF1bmNoPlxyXG5cdHNlbGVjdGVkRXh0ZXJuYWxHcm91cHM6IEFycmF5PEV4dGVybmFsR3JvdXAgfCBMdGlMYXVuY2ggfCBVbmlUaW1lR3JvdXA+XHJcblx0ZXh0ZXJuYWxUZXJtSWQ6IG51bWJlclxyXG5cdGhhbmRsZVNlbGVjdGVkRXh0ZXJuYWxHcm91cHM6IChleHRlcm5hbEdyb3VwczogQXJyYXk8RXh0ZXJuYWxHcm91cCB8IEx0aUxhdW5jaCB8IFVuaVRpbWVHcm91cD4pID0+IHZvaWRcclxuXHRncm91cFVzZXJSb2xlczogTW9kZWxDb2xsZWN0aW9uPEdyb3VwVXNlclJvbGU+XHJcblx0ZGlzYWJsZWQ/OiBib29sZWFuXHJcblx0ZGlzYWJsZWRJbmZvTWVzc2FnZT86IHN0cmluZyB8IFJlYWN0LkpTWC5FbGVtZW50XHJcbn1cclxuXHJcbmludGVyZmFjZSBFeHRlcm5hbEdyb3Vwc0F0dGFjaFN0YXRlIHtcclxuXHRvd25lclNjaGVkdWxlcz86IERpY3Rpb25hcnk8T3duZXJTY2hlZHVsZT5cclxuXHRpc1VuaVRpbWVTY2hlZHVsZUxvYWRpbmdEb25lOiBib29sZWFuXHJcblx0aXNTaG93aW5nRXJyb3JBbGVydDogYm9vbGVhblxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxHcm91cHNBdHRhY2ggZXh0ZW5kcyBDb21wb25lbnQ8RXh0ZXJuYWxHcm91cHNBdHRhY2hQcm9wcywgRXh0ZXJuYWxHcm91cHNBdHRhY2hTdGF0ZT4ge1xyXG5cdGNvbnN0cnVjdG9yKHByb3BzOiBFeHRlcm5hbEdyb3Vwc0F0dGFjaFByb3BzKSB7XHJcblx0XHRzdXBlcihwcm9wcylcclxuXHRcdHRoaXMuc3RhdGUgPSB7XHJcblx0XHRcdG93bmVyU2NoZWR1bGVzOiB1bmRlZmluZWQsXHJcblx0XHRcdGlzVW5pVGltZVNjaGVkdWxlTG9hZGluZ0RvbmU6IGZhbHNlLFxyXG5cdFx0XHRpc1Nob3dpbmdFcnJvckFsZXJ0OiBmYWxzZVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Y29tcG9uZW50RGlkTW91bnQoKSB7XHJcblx0XHRjb25zdCB7IGdyb3VwVXNlclJvbGVzLCBleHRlcm5hbFRlcm1JZCwgc2VsZWN0ZWRFeHRlcm5hbEdyb3VwcyB9ID0gdGhpcy5wcm9wc1xyXG5cdFx0dGhpcy5zZXRPd25lclNjaGVkdWxlcyhnZXRNb2RlbEFycmF5KGdyb3VwVXNlclJvbGVzKSwgZXh0ZXJuYWxUZXJtSWQsIHNlbGVjdGVkRXh0ZXJuYWxHcm91cHMpXHJcblx0fVxyXG5cclxuXHRjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuXHRcdGNvbnN0IHsgb3duZXJTY2hlZHVsZXMgfSA9IHRoaXMuc3RhdGVcclxuXHRcdGZvckVhY2gob3duZXJTY2hlZHVsZXMsIG9zID0+IHVucmVnaXN0ZXJOb1N0b3JlQWN0aW9uSG9vayhvcy5ob29rSWQpKVxyXG5cdH1cclxuXHJcblx0Y29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wczogUmVhZG9ubHk8RXh0ZXJuYWxHcm91cHNBdHRhY2hQcm9wcz4pIHtcclxuXHRcdGNvbnN0IHsgZXh0ZXJuYWxUZXJtSWQ6IHByZXZFeHRlcm5hbFRlcm1JZCwgZ3JvdXBVc2VyUm9sZXM6IHByZXZHcm91cFVzZXJSb2xlcyB9ID0gcHJldlByb3BzXHJcblx0XHRjb25zdCB7IGV4dGVybmFsVGVybUlkLCBncm91cFVzZXJSb2xlcywgc2VsZWN0ZWRFeHRlcm5hbEdyb3VwcyB9ID0gdGhpcy5wcm9wc1xyXG5cdFx0Ly8gQXNzdW1lcyBncm91cCB1c2VyIHJvbGVzIGFyZSBjaGFuZ2luZyBvbmUgYXQgYSB0aW1lLiBDYW4gYmUgbWFkZSBmYW5jaWVyIGlmIHRoZSBuZWVkIGFyaXNlc1xyXG5cdFx0aWYgKFxyXG5cdFx0XHRwcmV2RXh0ZXJuYWxUZXJtSWQgIT09IGV4dGVybmFsVGVybUlkIHx8XHJcblx0XHRcdE9iamVjdC5rZXlzKHByZXZHcm91cFVzZXJSb2xlcykubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhncm91cFVzZXJSb2xlcykubGVuZ3RoXHJcblx0XHQpIHtcclxuXHRcdFx0dGhpcy5zZXRPd25lclNjaGVkdWxlcyhnZXRNb2RlbEFycmF5KGdyb3VwVXNlclJvbGVzKSwgZXh0ZXJuYWxUZXJtSWQsIHNlbGVjdGVkRXh0ZXJuYWxHcm91cHMpXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzZXRPd25lclNjaGVkdWxlcyA9IChcclxuXHRcdGdyb3VwVXNlclJvbGVzOiBHcm91cFVzZXJSb2xlW10sXHJcblx0XHRleHRlcm5hbFRlcm1JZDogbnVtYmVyLFxyXG5cdFx0c2VsZWN0ZWRFeHRlcm5hbEdyb3VwczogQXJyYXk8RXh0ZXJuYWxHcm91cCB8IEx0aUxhdW5jaCB8IFVuaVRpbWVHcm91cD5cclxuXHQpID0+IHtcclxuXHRcdGNvbnN0IHsgY2FuQ29ubmVjdEFueUV4dGVybmFsR3JvdXBzLCBjYW5Db25uZWN0T3duRXh0ZXJuYWxHcm91cHMsIHVzZXJJbmZvIH0gPSB0aGlzLnByb3BzXHJcblx0XHRjb25zdCBvd25lcnMgPSBncm91cFVzZXJSb2xlcy5maWx0ZXIoZ3JvdXBVc2VyUm9sZSA9PiB7XHJcblx0XHRcdHJldHVybiBncm91cFVzZXJSb2xlLnJvbGUgPT09IEJBU0VfUk9MRS5HUk9VUF9PV05FUlxyXG5cdFx0fSlcclxuXHJcblx0XHRjb25zdCBvd25lcnNJbml0aWFsU2NoZWR1bGVEYXRhOiBEaWN0aW9uYXJ5PE93bmVyU2NoZWR1bGU+ID0ge31cclxuXHRcdG93bmVycy5mb3JFYWNoKG93bmVyID0+IHtcclxuXHRcdFx0Y29uc3Qgb3duZXJEYXRhOiBPd25lclNjaGVkdWxlID0ge1xyXG5cdFx0XHRcdGhvb2tJZDogdXVpZHY0KCksXHJcblx0XHRcdFx0c3RhdHVzOlxyXG5cdFx0XHRcdFx0Y2FuQ29ubmVjdEFueUV4dGVybmFsR3JvdXBzIHx8ICh1c2VySW5mby5pZCA9PT0gb3duZXIuaWQgJiYgY2FuQ29ubmVjdE93bkV4dGVybmFsR3JvdXBzKVxyXG5cdFx0XHRcdFx0XHQ/IE1PREVMX1NUQVRVUy5VTklOSVRJQUxJWkVEXHJcblx0XHRcdFx0XHRcdDogTU9ERUxfU1RBVFVTLlJFQURZLFxyXG5cdFx0XHRcdG93bmVyLFxyXG5cdFx0XHRcdGV4dGVybmFsR3JvdXBzOiAhKFxyXG5cdFx0XHRcdFx0Y2FuQ29ubmVjdEFueUV4dGVybmFsR3JvdXBzIHx8XHJcblx0XHRcdFx0XHQodXNlckluZm8uaWQgPT09IG93bmVyLmlkICYmIGNhbkNvbm5lY3RPd25FeHRlcm5hbEdyb3VwcylcclxuXHRcdFx0XHQpXHJcblx0XHRcdFx0XHQ/IHNlbGVjdGVkRXh0ZXJuYWxHcm91cHMuZmlsdGVyKHNlZyA9PiBzZWcudXNlcklkID09PSBvd25lci5pZClcclxuXHRcdFx0XHRcdDogdW5kZWZpbmVkXHJcblx0XHRcdH1cclxuXHRcdFx0c2V0KG93bmVyc0luaXRpYWxTY2hlZHVsZURhdGEsIFtvd25lci51c2VySWRdLCBvd25lckRhdGEpXHJcblx0XHR9KVxyXG5cdFx0dGhpcy5zZXRTdGF0ZShcclxuXHRcdFx0e1xyXG5cdFx0XHRcdG93bmVyU2NoZWR1bGVzOiBvd25lcnNJbml0aWFsU2NoZWR1bGVEYXRhLFxyXG5cdFx0XHRcdGlzVW5pVGltZVNjaGVkdWxlTG9hZGluZ0RvbmU6IGZhbHNlXHJcblx0XHRcdH0sXHJcblx0XHRcdCgpID0+XHJcblx0XHRcdFx0Zm9yRWFjaChvd25lcnNJbml0aWFsU2NoZWR1bGVEYXRhLCAob3duZXJTY2hlZHVsZSwgdXNlcklkKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLmdldE93bmVyVW5pVGltZUdyb3Vwcyhvd25lclNjaGVkdWxlLCB1c2VySWQsIGV4dGVybmFsVGVybUlkKVxyXG5cdFx0XHRcdH0pXHJcblx0XHQpXHJcblx0fVxyXG5cclxuXHRoYW5kbGVTZWxlY3RFeHRlcm5hbEdyb3VwcyA9IChldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcclxuXHRcdGNvbnN0IGV4dGVybmFsSWQgPSBldmVudC50YXJnZXQudmFsdWVcclxuXHRcdGNvbnN0IGNoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZFxyXG5cdFx0Y29uc3QgeyBvcmlnaW5hbENvbm5lY3RlZEV4dGVybmFsR3JvdXBzLCBzZWxlY3RlZEV4dGVybmFsR3JvdXBzIH0gPSB0aGlzLnByb3BzXHJcblxyXG5cdFx0Y29uc3QgYWxsT3duZXJFeHRlcm5hbEdyb3VwcyA9IG1hcCh0aGlzLnN0YXRlLm93bmVyU2NoZWR1bGVzLCBvcyA9PiBvcy5leHRlcm5hbEdyb3VwcykucmVkdWNlKChhLCBiKSA9PlxyXG5cdFx0XHQoYSB8fCBbXSkuY29uY2F0KGIgfHwgW10pXHJcblx0XHQpXHJcblx0XHRjb25zdCBzZWxlY3RlZEV4dGVybmFsR3JvdXBzQ29weSA9IHNlbGVjdGVkRXh0ZXJuYWxHcm91cHMuc2xpY2UoKVxyXG5cclxuXHRcdGlmIChjaGVja2VkKSB7XHJcblx0XHRcdGNvbnN0IG9yaWdpbmFsQ29ubmVjdGVkRXh0ZXJuYWxHcm91cCA9IG9yaWdpbmFsQ29ubmVjdGVkRXh0ZXJuYWxHcm91cHMuZmluZChcclxuXHRcdFx0XHRvZWcgPT4gb2VnLmV4dGVybmFsSWQgPT09IGV4dGVybmFsSWRcclxuXHRcdFx0KVxyXG5cdFx0XHRjb25zdCBzZWxlY3RlZEV4dGVybmFsR3JvdXAgPSBvcmlnaW5hbENvbm5lY3RlZEV4dGVybmFsR3JvdXBcclxuXHRcdFx0XHQ/IG9yaWdpbmFsQ29ubmVjdGVkRXh0ZXJuYWxHcm91cFxyXG5cdFx0XHRcdDogYWxsT3duZXJFeHRlcm5hbEdyb3Vwcz8uZmluZChhbyA9PiBhby5leHRlcm5hbElkID09PSBleHRlcm5hbElkKVxyXG5cclxuXHRcdFx0aWYgKHNlbGVjdGVkRXh0ZXJuYWxHcm91cCkge1xyXG5cdFx0XHRcdHNlbGVjdGVkRXh0ZXJuYWxHcm91cHNDb3B5LnB1c2goc2VsZWN0ZWRFeHRlcm5hbEdyb3VwKVxyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZW1vdmUoc2VsZWN0ZWRFeHRlcm5hbEdyb3Vwc0NvcHksIHNlZyA9PiBzZWcuZXh0ZXJuYWxJZCA9PT0gZXh0ZXJuYWxJZClcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnByb3BzLmhhbmRsZVNlbGVjdGVkRXh0ZXJuYWxHcm91cHMoc2VsZWN0ZWRFeHRlcm5hbEdyb3Vwc0NvcHkpXHJcblx0fVxyXG5cclxuXHRnZXRPd25lclVuaVRpbWVHcm91cHMgPSAob3duZXJTY2hlZHVsZTogT3duZXJTY2hlZHVsZSwgdXNlcklkOiBzdHJpbmcsIGV4dGVybmFsVGVybUlkOiBudW1iZXIpID0+IHtcclxuXHRcdGlmIChpc1B1cmR1ZVNoYXJkKCkgJiYgb3duZXJTY2hlZHVsZS5zdGF0dXMgPT09IE1PREVMX1NUQVRVUy5VTklOSVRJQUxJWkVEICYmICFvd25lclNjaGVkdWxlLmV4dGVybmFsR3JvdXBzKSB7XHJcblx0XHRcdHJlZ2lzdGVyTm9TdG9yZUFjdGlvbkhvb2sob3duZXJTY2hlZHVsZS5ob29rSWQsIChkYXRhOiBJbnN0cnVjdG9yU2NoZWR1bGUgfCBGZXRjaEVycm9yRGF0YSB8IG51bGwpID0+IHtcclxuXHRcdFx0XHR1bnJlZ2lzdGVyTm9TdG9yZUFjdGlvbkhvb2sob3duZXJTY2hlZHVsZS5ob29rSWQpXHJcblx0XHRcdFx0aWYgKCFkYXRhIHx8IGlzRmV0Y2hFcnJvckRhdGEoZGF0YSkpIHtcclxuXHRcdFx0XHRcdHRoaXMuc2V0U3RhdGUoeyBpc1Nob3dpbmdFcnJvckFsZXJ0OiB0cnVlLCBpc1VuaVRpbWVTY2hlZHVsZUxvYWRpbmdEb25lOiB0cnVlIH0pXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRoaXMuc2V0VXNlclVuaVRpbWVHcm91cHModXNlcklkLCBkYXRhLmV4dGVybmFsR3JvdXBzKVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSlcclxuXHRcdFx0ZGlzcGF0Y2hNb2RlbEZldGNoUmVxdWVzdCh7XHJcblx0XHRcdFx0bW9kZWxOYW1lOiAndW5pVGltZUluc3RydWN0b3JTY2hlZHVsZScsXHJcblx0XHRcdFx0cXVlcnlQYXJhbXM6IHtcclxuXHRcdFx0XHRcdGV4dGVybmFsVGVybUlkLFxyXG5cdFx0XHRcdFx0dXNlcklkXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRub1N0b3JlOiB0cnVlLFxyXG5cdFx0XHRcdGd1aWQ6IG93bmVyU2NoZWR1bGUuaG9va0lkXHJcblx0XHRcdH0pXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzZXRVc2VyVW5pVGltZUdyb3VwcyA9ICh1c2VySWQ6IHN0cmluZywgZXh0ZXJuYWxHcm91cHM6IFVuaVRpbWVHcm91cFtdKSA9PiB7XHJcblx0XHQvLyBTZXR0aW5nIHRoZSB1c2VyJ3MgY291cnNlIHNlY3Rpb25zIGxvYWQgc3RhdHVzIHRvIGJlIHJlYWR5XHJcblx0XHRjb25zdCBvd25lclNjaGVkdWxlcyA9IHRoaXMuc3RhdGUub3duZXJTY2hlZHVsZXMgfHwge31cclxuXHRcdG93bmVyU2NoZWR1bGVzW3VzZXJJZF0uc3RhdHVzID0gTU9ERUxfU1RBVFVTLlJFQURZXHJcblx0XHRvd25lclNjaGVkdWxlc1t1c2VySWRdLmV4dGVybmFsR3JvdXBzID0gZXh0ZXJuYWxHcm91cHNcclxuXHJcblx0XHRjb25zdCBpc1VuaVRpbWVTY2hlZHVsZUxvYWRpbmdEb25lID0gZXZlcnkob3duZXJTY2hlZHVsZXMsIG9zID0+IG9zLnN0YXR1cyA9PT0gTU9ERUxfU1RBVFVTLlJFQURZKVxyXG5cclxuXHRcdHRoaXMuc2V0U3RhdGUoe1xyXG5cdFx0XHRvd25lclNjaGVkdWxlcyxcclxuXHRcdFx0aXNVbmlUaW1lU2NoZWR1bGVMb2FkaW5nRG9uZVxyXG5cdFx0fSlcclxuXHR9XHJcblxyXG5cdGRpc3BsYXlPd25lclNjaGVkdWxlcyA9IChvd25lclNjaGVkdWxlczogRGljdGlvbmFyeTxPd25lclNjaGVkdWxlPikgPT4ge1xyXG5cdFx0cmV0dXJuIG1hcChvd25lclNjaGVkdWxlcywgb3MgPT4ge1xyXG5cdFx0XHRpZiAoISFvcy5leHRlcm5hbEdyb3VwcyAmJiBvcy5leHRlcm5hbEdyb3Vwcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0cmV0dXJuIChcclxuXHRcdFx0XHRcdDxkaXYga2V5PXtvcy5ob29rSWR9PlxyXG5cdFx0XHRcdFx0XHQ8aDQ+e2Rpc3BsYXlOYW1lKG9zLm93bmVyKX08L2g0PlxyXG5cdFx0XHRcdFx0XHR7dGhpcy5kaXNwbGF5VW5pVGltZUdyb3Vwcyhvcy5leHRlcm5hbEdyb3Vwcyl9XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQpXHJcblx0XHRcdH1cclxuXHRcdH0pXHJcblx0fVxyXG5cclxuXHRkaXNwbGF5VW5pVGltZUdyb3VwcyA9IChleHRlcm5hbEdyb3VwczogQXJyYXk8RXh0ZXJuYWxHcm91cCB8IEx0aUxhdW5jaCB8IFVuaVRpbWVHcm91cD4pID0+IHtcclxuXHRcdGNvbnN0IHsgc2VsZWN0ZWRFeHRlcm5hbEdyb3VwcywgY2FuQ29ubmVjdEFueUV4dGVybmFsR3JvdXBzLCBjYW5Db25uZWN0T3duRXh0ZXJuYWxHcm91cHMsIHVzZXJJbmZvLCBkaXNhYmxlZCB9ID1cclxuXHRcdFx0dGhpcy5wcm9wc1xyXG5cclxuXHRcdHJldHVybiBvcmRlckJ5KGV4dGVybmFsR3JvdXBzLCBbJ2Rlc2NyaXB0aW9uJ10pLm1hcCgoZWcsIGluZGV4KSA9PiB7XHJcblx0XHRcdGNvbnN0IGlzQ29ubmVjdGVkID0gc2VsZWN0ZWRFeHRlcm5hbEdyb3Vwcy5zb21lKFxyXG5cdFx0XHRcdHNlZyA9PlxyXG5cdFx0XHRcdFx0c2VnLmV4dGVybmFsSWQgPT09IGVnLmV4dGVybmFsSWQgJiZcclxuXHRcdFx0XHRcdHNlZy5leHRlcm5hbFByb3ZpZGVySWQgPT09IGVnLmV4dGVybmFsUHJvdmlkZXJJZCAmJlxyXG5cdFx0XHRcdFx0c2VnLnVzZXJJZCA9PT0gZWcudXNlcklkXHJcblx0XHRcdClcclxuXHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRjYW5Db25uZWN0QW55RXh0ZXJuYWxHcm91cHMgfHxcclxuXHRcdFx0XHQodXNlckluZm8uaWQgPT09IGVnLnVzZXJJZCAmJiBjYW5Db25uZWN0T3duRXh0ZXJuYWxHcm91cHMpIHx8XHJcblx0XHRcdFx0aXNDb25uZWN0ZWRcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0cmV0dXJuIChcclxuXHRcdFx0XHRcdDxGb3JtQ2hlY2tcclxuXHRcdFx0XHRcdFx0aWQ9e2BleHRlcm5hbC1ncm91cC0ke2VnLmlkfWB9XHJcblx0XHRcdFx0XHRcdHR5cGU9XCJjaGVja2JveFwiXHJcblx0XHRcdFx0XHRcdGtleT17aW5kZXh9XHJcblx0XHRcdFx0XHRcdG9uQ2hhbmdlPXt0aGlzLmhhbmRsZVNlbGVjdEV4dGVybmFsR3JvdXBzfVxyXG5cdFx0XHRcdFx0XHR2YWx1ZT17ZWcuZXh0ZXJuYWxJZH1cclxuXHRcdFx0XHRcdFx0Y2hlY2tlZD17aXNDb25uZWN0ZWR9XHJcblx0XHRcdFx0XHRcdGRpc2FibGVkPXsodXNlckluZm8uaWQgIT09IGVnLnVzZXJJZCAmJiAhY2FuQ29ubmVjdEFueUV4dGVybmFsR3JvdXBzKSB8fCBkaXNhYmxlZH1cclxuXHRcdFx0XHRcdFx0bGFiZWw9e2Ake2VnLm5hbWV9ICR7ZWcuZGVzY3JpcHRpb24gPyBgKCR7ZWcuZGVzY3JpcHRpb259KWAgOiAnJ31gfVxyXG5cdFx0XHRcdFx0Lz5cclxuXHRcdFx0XHQpXHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIG51bGxcclxuXHRcdH0pXHJcblx0fVxyXG5cclxuXHRyZW5kZXIoKSB7XHJcblx0XHRjb25zdCB7IGRpc2FibGVkSW5mb01lc3NhZ2UgfSA9IHRoaXMucHJvcHNcclxuXHRcdGNvbnN0IHsgb3duZXJTY2hlZHVsZXMsIGlzVW5pVGltZVNjaGVkdWxlTG9hZGluZ0RvbmUsIGlzU2hvd2luZ0Vycm9yQWxlcnQgfSA9IHRoaXMuc3RhdGVcclxuXHRcdGNvbnN0IGhhc0FueUV4dGVybmFsR3JvdXBzID0gc29tZShvd25lclNjaGVkdWxlcywgb3MgPT4gISFvcy5leHRlcm5hbEdyb3VwcyAmJiBvcy5leHRlcm5hbEdyb3Vwcy5sZW5ndGggPiAwKVxyXG5cclxuXHRcdHJldHVybiAoXHJcblx0XHRcdDxkaXY+XHJcblx0XHRcdFx0eyFpc1VuaVRpbWVTY2hlZHVsZUxvYWRpbmdEb25lICYmIDxMb2FkaW5nIC8+fVxyXG5cdFx0XHRcdHtpc1VuaVRpbWVTY2hlZHVsZUxvYWRpbmdEb25lICYmIChcclxuXHRcdFx0XHRcdDxkaXY+XHJcblx0XHRcdFx0XHRcdHshaGFzQW55RXh0ZXJuYWxHcm91cHMgJiYgKFxyXG5cdFx0XHRcdFx0XHRcdDxBbGVydFdpdGhJY29uIHZhcmlhbnQ9XCJpbmZvXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8cD5ObyBjb3Vyc2Ugc2VjdGlvbnMgZWxpZ2libGUgZm9yIHJvc3RlciBzeW5jLjwvcD5cclxuXHRcdFx0XHRcdFx0XHQ8L0FsZXJ0V2l0aEljb24+XHJcblx0XHRcdFx0XHRcdCl9XHJcblx0XHRcdFx0XHRcdHshIWRpc2FibGVkSW5mb01lc3NhZ2UgJiYgaGFzQW55RXh0ZXJuYWxHcm91cHMgJiYgKFxyXG5cdFx0XHRcdFx0XHRcdDxBbGVydFdpdGhJY29uIHZhcmlhbnQ9XCJpbmZvXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8cD57ZGlzYWJsZWRJbmZvTWVzc2FnZX08L3A+XHJcblx0XHRcdFx0XHRcdFx0PC9BbGVydFdpdGhJY29uPlxyXG5cdFx0XHRcdFx0XHQpfVxyXG5cdFx0XHRcdFx0XHR7aXNTaG93aW5nRXJyb3JBbGVydCAmJiAoXHJcblx0XHRcdFx0XHRcdFx0PEFsZXJ0V2l0aEljb25cclxuXHRcdFx0XHRcdFx0XHRcdHZhcmlhbnQ9XCJ3YXJuaW5nXCJcclxuXHRcdFx0XHRcdFx0XHRcdG9uQ2xvc2U9eygpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5zZXRTdGF0ZSh7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aXNTaG93aW5nRXJyb3JBbGVydDogZmFsc2VcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdFx0XHRcdH19PlxyXG5cdFx0XHRcdFx0XHRcdFx0PHAgY2xhc3NOYW1lPVwibWEwXCI+T29wcyEgU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2hpbGUgbG9hZGluZy4gUGxlYXNlIHRyeSBhZ2Fpbi48L3A+XHJcblx0XHRcdFx0XHRcdFx0PC9BbGVydFdpdGhJY29uPlxyXG5cdFx0XHRcdFx0XHQpfXsnICd9XHJcblx0XHRcdFx0XHRcdHtoYXNBbnlFeHRlcm5hbEdyb3VwcyAmJiAhIW93bmVyU2NoZWR1bGVzICYmIChcclxuXHRcdFx0XHRcdFx0XHQ8Rm9ybUdyb3VwIGNsYXNzTmFtZT1cIm1sNCBmNlwiPnt0aGlzLmRpc3BsYXlPd25lclNjaGVkdWxlcyhvd25lclNjaGVkdWxlcyl9PC9Gb3JtR3JvdXA+XHJcblx0XHRcdFx0XHRcdCl9XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQpfVxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdClcclxuXHR9XHJcbn1cclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLGVBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLEtBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFVBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLGNBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFlBQUEsR0FBQVAsT0FBQTtBQVlBLElBQUFRLE1BQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLE1BQUEsR0FBQVQsT0FBQTtBQUNBLElBQUFVLE1BQUEsR0FBQVYsT0FBQTtBQUNBLElBQUFXLEtBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLGNBQUEsR0FBQVosT0FBQTtBQUNBLElBQUFhLFFBQUEsR0FBQWIsT0FBQTtBQUF1QyxJQUFBYyxXQUFBLEdBQUFkLE9BQUE7QUFBQSxTQUFBRSx3QkFBQWEsQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQWYsdUJBQUEsWUFBQUEsQ0FBQWEsQ0FBQSxFQUFBQyxDQUFBLFNBQUFBLENBQUEsSUFBQUQsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsU0FBQUwsQ0FBQSxNQUFBTSxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxLQUFBQyxTQUFBLFFBQUFDLE9BQUEsRUFBQVYsQ0FBQSxpQkFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxTQUFBUSxDQUFBLE1BQUFGLENBQUEsR0FBQUwsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsUUFBQUcsQ0FBQSxDQUFBSyxHQUFBLENBQUFYLENBQUEsVUFBQU0sQ0FBQSxDQUFBTSxHQUFBLENBQUFaLENBQUEsR0FBQU0sQ0FBQSxDQUFBTyxHQUFBLENBQUFiLENBQUEsRUFBQVEsQ0FBQSxnQkFBQVAsQ0FBQSxJQUFBRCxDQUFBLGdCQUFBQyxDQUFBLE9BQUFhLGNBQUEsQ0FBQUMsSUFBQSxDQUFBZixDQUFBLEVBQUFDLENBQUEsT0FBQU0sQ0FBQSxJQUFBRCxDQUFBLEdBQUFVLE1BQUEsQ0FBQUMsY0FBQSxLQUFBRCxNQUFBLENBQUFFLHdCQUFBLENBQUFsQixDQUFBLEVBQUFDLENBQUEsT0FBQU0sQ0FBQSxDQUFBSyxHQUFBLElBQUFMLENBQUEsQ0FBQU0sR0FBQSxJQUFBUCxDQUFBLENBQUFFLENBQUEsRUFBQVAsQ0FBQSxFQUFBTSxDQUFBLElBQUFDLENBQUEsQ0FBQVAsQ0FBQSxJQUFBRCxDQUFBLENBQUFDLENBQUEsV0FBQU8sQ0FBQSxLQUFBUixDQUFBLEVBQUFDLENBQUE7QUFzQmhDLE1BQU1rQixvQkFBb0IsU0FBU0MsZ0JBQVMsQ0FBdUQ7RUFDekdDLFdBQVdBLENBQUNDLEtBQWdDLEVBQUU7SUFDN0MsS0FBSyxDQUFDQSxLQUFLLENBQUM7SUFBQSxJQUFBQyxnQkFBQSxDQUFBYixPQUFBLDZCQThCTyxDQUNuQmMsY0FBK0IsRUFDL0JDLGNBQXNCLEVBQ3RCQyxzQkFBdUUsS0FDbkU7TUFDSixNQUFNO1FBQUVDLDJCQUEyQjtRQUFFQywyQkFBMkI7UUFBRUM7TUFBUyxDQUFDLEdBQUcsSUFBSSxDQUFDUCxLQUFLO01BQ3pGLE1BQU1RLE1BQU0sR0FBR04sY0FBYyxDQUFDTyxNQUFNLENBQUNDLGFBQWEsSUFBSTtRQUNyRCxPQUFPQSxhQUFhLENBQUNDLElBQUksS0FBS0Msb0JBQVMsQ0FBQ0MsV0FBVztNQUNwRCxDQUFDLENBQUM7TUFFRixNQUFNQyx5QkFBb0QsR0FBRyxDQUFDLENBQUM7TUFDL0ROLE1BQU0sQ0FBQ08sT0FBTyxDQUFDQyxLQUFLLElBQUk7UUFDdkIsTUFBTUMsU0FBd0IsR0FBRztVQUNoQ0MsTUFBTSxFQUFFLElBQUFDLFFBQU0sRUFBQyxDQUFDO1VBQ2hCQyxNQUFNLEVBQ0xmLDJCQUEyQixJQUFLRSxRQUFRLENBQUNjLEVBQUUsS0FBS0wsS0FBSyxDQUFDSyxFQUFFLElBQUlmLDJCQUE0QixHQUNyRmdCLHVCQUFZLENBQUNDLGFBQWEsR0FDMUJELHVCQUFZLENBQUNFLEtBQUs7VUFDdEJSLEtBQUs7VUFDTFMsY0FBYyxFQUFFLEVBQ2ZwQiwyQkFBMkIsSUFDMUJFLFFBQVEsQ0FBQ2MsRUFBRSxLQUFLTCxLQUFLLENBQUNLLEVBQUUsSUFBSWYsMkJBQTRCLENBQ3pELEdBQ0VGLHNCQUFzQixDQUFDSyxNQUFNLENBQUNpQixHQUFHLElBQUlBLEdBQUcsQ0FBQ0MsTUFBTSxLQUFLWCxLQUFLLENBQUNLLEVBQUUsQ0FBQyxHQUM3RE87UUFDSixDQUFDO1FBQ0QsSUFBQXJDLFdBQUcsRUFBQ3VCLHlCQUF5QixFQUFFLENBQUNFLEtBQUssQ0FBQ1csTUFBTSxDQUFDLEVBQUVWLFNBQVMsQ0FBQztNQUMxRCxDQUFDLENBQUM7TUFDRixJQUFJLENBQUNZLFFBQVEsQ0FDWjtRQUNDQyxjQUFjLEVBQUVoQix5QkFBeUI7UUFDekNpQiw0QkFBNEIsRUFBRTtNQUMvQixDQUFDLEVBQ0QsTUFDQyxJQUFBaEIsZUFBTyxFQUFDRCx5QkFBeUIsRUFBRSxDQUFDa0IsYUFBYSxFQUFFTCxNQUFNLEtBQUs7UUFDN0QsSUFBSSxDQUFDTSxxQkFBcUIsQ0FBQ0QsYUFBYSxFQUFFTCxNQUFNLEVBQUV4QixjQUFjLENBQUM7TUFDbEUsQ0FBQyxDQUNILENBQUM7SUFDRixDQUFDO0lBQUEsSUFBQUYsZ0JBQUEsQ0FBQWIsT0FBQSxzQ0FFNkI4QyxLQUFvQyxJQUFLO01BQ3RFLE1BQU1DLFVBQVUsR0FBR0QsS0FBSyxDQUFDRSxNQUFNLENBQUNDLEtBQUs7TUFDckMsTUFBTUMsT0FBTyxHQUFHSixLQUFLLENBQUNFLE1BQU0sQ0FBQ0UsT0FBTztNQUNwQyxNQUFNO1FBQUVDLCtCQUErQjtRQUFFbkM7TUFBdUIsQ0FBQyxHQUFHLElBQUksQ0FBQ0osS0FBSztNQUU5RSxNQUFNd0Msc0JBQXNCLEdBQUcsSUFBQUMsV0FBRyxFQUFDLElBQUksQ0FBQ0MsS0FBSyxDQUFDWixjQUFjLEVBQUVhLEVBQUUsSUFBSUEsRUFBRSxDQUFDbEIsY0FBYyxDQUFDLENBQUNtQixNQUFNLENBQUMsQ0FBQ0MsQ0FBQyxFQUFFQyxDQUFDLEtBQ2xHLENBQUNELENBQUMsSUFBSSxFQUFFLEVBQUVFLE1BQU0sQ0FBQ0QsQ0FBQyxJQUFJLEVBQUUsQ0FDekIsQ0FBQztNQUNELE1BQU1FLDBCQUEwQixHQUFHNUMsc0JBQXNCLENBQUM2QyxLQUFLLENBQUMsQ0FBQztNQUVqRSxJQUFJWCxPQUFPLEVBQUU7UUFDWixNQUFNWSw4QkFBOEIsR0FBR1gsK0JBQStCLENBQUNZLElBQUksQ0FDMUVDLEdBQUcsSUFBSUEsR0FBRyxDQUFDakIsVUFBVSxLQUFLQSxVQUMzQixDQUFDO1FBQ0QsTUFBTWtCLHFCQUFxQixHQUFHSCw4QkFBOEIsR0FDekRBLDhCQUE4QixHQUM5QlYsc0JBQXNCLEVBQUVXLElBQUksQ0FBQ0csRUFBRSxJQUFJQSxFQUFFLENBQUNuQixVQUFVLEtBQUtBLFVBQVUsQ0FBQztRQUVuRSxJQUFJa0IscUJBQXFCLEVBQUU7VUFDMUJMLDBCQUEwQixDQUFDTyxJQUFJLENBQUNGLHFCQUFxQixDQUFDO1FBQ3ZEO01BQ0QsQ0FBQyxNQUFNO1FBQ04sSUFBQUcsY0FBTSxFQUFDUiwwQkFBMEIsRUFBRXRCLEdBQUcsSUFBSUEsR0FBRyxDQUFDUyxVQUFVLEtBQUtBLFVBQVUsQ0FBQztNQUN6RTtNQUVBLElBQUksQ0FBQ25DLEtBQUssQ0FBQ3lELDRCQUE0QixDQUFDVCwwQkFBMEIsQ0FBQztJQUNwRSxDQUFDO0lBQUEsSUFBQS9DLGdCQUFBLENBQUFiLE9BQUEsaUNBRXVCLENBQUM0QyxhQUE0QixFQUFFTCxNQUFjLEVBQUV4QixjQUFzQixLQUFLO01BQ2pHLElBQUksSUFBQXVELG9CQUFhLEVBQUMsQ0FBQyxJQUFJMUIsYUFBYSxDQUFDWixNQUFNLEtBQUtFLHVCQUFZLENBQUNDLGFBQWEsSUFBSSxDQUFDUyxhQUFhLENBQUNQLGNBQWMsRUFBRTtRQUM1RyxJQUFBa0Msc0NBQXlCLEVBQUMzQixhQUFhLENBQUNkLE1BQU0sRUFBRzBDLElBQWdELElBQUs7VUFDckcsSUFBQUMsd0NBQTJCLEVBQUM3QixhQUFhLENBQUNkLE1BQU0sQ0FBQztVQUNqRCxJQUFJLENBQUMwQyxJQUFJLElBQUksSUFBQUUsdUJBQWdCLEVBQUNGLElBQUksQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQy9CLFFBQVEsQ0FBQztjQUFFa0MsbUJBQW1CLEVBQUUsSUFBSTtjQUFFaEMsNEJBQTRCLEVBQUU7WUFBSyxDQUFDLENBQUM7VUFDakYsQ0FBQyxNQUFNO1lBQ04sSUFBSSxDQUFDaUMsb0JBQW9CLENBQUNyQyxNQUFNLEVBQUVpQyxJQUFJLENBQUNuQyxjQUFjLENBQUM7VUFDdkQ7UUFDRCxDQUFDLENBQUM7UUFDRixJQUFBd0Msd0NBQXlCLEVBQUM7VUFDekJDLFNBQVMsRUFBRSwyQkFBMkI7VUFDdENDLFdBQVcsRUFBRTtZQUNaaEUsY0FBYztZQUNkd0I7VUFDRCxDQUFDO1VBQ0R5QyxPQUFPLEVBQUUsSUFBSTtVQUNiQyxJQUFJLEVBQUVyQyxhQUFhLENBQUNkO1FBQ3JCLENBQUMsQ0FBQztNQUNIO0lBQ0QsQ0FBQztJQUFBLElBQUFqQixnQkFBQSxDQUFBYixPQUFBLGdDQUVzQixDQUFDdUMsTUFBYyxFQUFFRixjQUE4QixLQUFLO01BQzFFO01BQ0EsTUFBTUssY0FBYyxHQUFHLElBQUksQ0FBQ1ksS0FBSyxDQUFDWixjQUFjLElBQUksQ0FBQyxDQUFDO01BQ3REQSxjQUFjLENBQUNILE1BQU0sQ0FBQyxDQUFDUCxNQUFNLEdBQUdFLHVCQUFZLENBQUNFLEtBQUs7TUFDbERNLGNBQWMsQ0FBQ0gsTUFBTSxDQUFDLENBQUNGLGNBQWMsR0FBR0EsY0FBYztNQUV0RCxNQUFNTSw0QkFBNEIsR0FBRyxJQUFBdUMsYUFBSyxFQUFDeEMsY0FBYyxFQUFFYSxFQUFFLElBQUlBLEVBQUUsQ0FBQ3ZCLE1BQU0sS0FBS0UsdUJBQVksQ0FBQ0UsS0FBSyxDQUFDO01BRWxHLElBQUksQ0FBQ0ssUUFBUSxDQUFDO1FBQ2JDLGNBQWM7UUFDZEM7TUFDRCxDQUFDLENBQUM7SUFDSCxDQUFDO0lBQUEsSUFBQTlCLGdCQUFBLENBQUFiLE9BQUEsaUNBRXdCMEMsY0FBeUMsSUFBSztNQUN0RSxPQUFPLElBQUFXLFdBQUcsRUFBQ1gsY0FBYyxFQUFFYSxFQUFFLElBQUk7UUFDaEMsSUFBSSxDQUFDLENBQUNBLEVBQUUsQ0FBQ2xCLGNBQWMsSUFBSWtCLEVBQUUsQ0FBQ2xCLGNBQWMsQ0FBQzhDLE1BQU0sR0FBRyxDQUFDLEVBQUU7VUFDeEQsb0JBQ0MsSUFBQTlGLFdBQUEsQ0FBQStGLElBQUE7WUFBQUMsUUFBQSxnQkFDQyxJQUFBaEcsV0FBQSxDQUFBaUcsR0FBQTtjQUFBRCxRQUFBLEVBQUssSUFBQUUsaUJBQVcsRUFBQ2hDLEVBQUUsQ0FBQzNCLEtBQUs7WUFBQyxDQUFLLENBQUMsRUFDL0IsSUFBSSxDQUFDNEQsb0JBQW9CLENBQUNqQyxFQUFFLENBQUNsQixjQUFjLENBQUM7VUFBQSxHQUZwQ2tCLEVBQUUsQ0FBQ3pCLE1BR1IsQ0FBQztRQUVSO01BQ0QsQ0FBQyxDQUFDO0lBQ0gsQ0FBQztJQUFBLElBQUFqQixnQkFBQSxDQUFBYixPQUFBLGdDQUV1QnFDLGNBQStELElBQUs7TUFDM0YsTUFBTTtRQUFFckIsc0JBQXNCO1FBQUVDLDJCQUEyQjtRQUFFQywyQkFBMkI7UUFBRUMsUUFBUTtRQUFFc0U7TUFBUyxDQUFDLEdBQzdHLElBQUksQ0FBQzdFLEtBQUs7TUFFWCxPQUFPLElBQUE4RSxlQUFPLEVBQUNyRCxjQUFjLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDZ0IsR0FBRyxDQUFDLENBQUNzQyxFQUFFLEVBQUVDLEtBQUssS0FBSztRQUNsRSxNQUFNQyxXQUFXLEdBQUc3RSxzQkFBc0IsQ0FBQzhFLElBQUksQ0FDOUN4RCxHQUFHLElBQ0ZBLEdBQUcsQ0FBQ1MsVUFBVSxLQUFLNEMsRUFBRSxDQUFDNUMsVUFBVSxJQUNoQ1QsR0FBRyxDQUFDeUQsa0JBQWtCLEtBQUtKLEVBQUUsQ0FBQ0ksa0JBQWtCLElBQ2hEekQsR0FBRyxDQUFDQyxNQUFNLEtBQUtvRCxFQUFFLENBQUNwRCxNQUNwQixDQUFDO1FBRUQsSUFDQ3RCLDJCQUEyQixJQUMxQkUsUUFBUSxDQUFDYyxFQUFFLEtBQUswRCxFQUFFLENBQUNwRCxNQUFNLElBQUlyQiwyQkFBNEIsSUFDMUQyRSxXQUFXLEVBQ1Y7VUFDRCxvQkFDQyxJQUFBeEcsV0FBQSxDQUFBaUcsR0FBQSxFQUFDNUcsZUFBQSxDQUFBc0gsU0FBUztZQUNUL0QsRUFBRSxFQUFFLGtCQUFrQjBELEVBQUUsQ0FBQzFELEVBQUUsRUFBRztZQUM5QmdFLElBQUksRUFBQyxVQUFVO1lBRWZDLFFBQVEsRUFBRSxJQUFJLENBQUNDLDBCQUEyQjtZQUMxQ2xELEtBQUssRUFBRTBDLEVBQUUsQ0FBQzVDLFVBQVc7WUFDckJHLE9BQU8sRUFBRTJDLFdBQVk7WUFDckJKLFFBQVEsRUFBR3RFLFFBQVEsQ0FBQ2MsRUFBRSxLQUFLMEQsRUFBRSxDQUFDcEQsTUFBTSxJQUFJLENBQUN0QiwyQkFBMkIsSUFBS3dFLFFBQVM7WUFDbEZXLEtBQUssRUFBRSxHQUFHVCxFQUFFLENBQUNVLElBQUksSUFBSVYsRUFBRSxDQUFDVyxXQUFXLEdBQUcsSUFBSVgsRUFBRSxDQUFDVyxXQUFXLEdBQUcsR0FBRyxFQUFFO1VBQUcsR0FMOURWLEtBTUwsQ0FBQztRQUVKO1FBQ0EsT0FBTyxJQUFJO01BQ1osQ0FBQyxDQUFDO0lBQ0gsQ0FBQztJQWxMQSxJQUFJLENBQUN0QyxLQUFLLEdBQUc7TUFDWlosY0FBYyxFQUFFRixTQUFTO01BQ3pCRyw0QkFBNEIsRUFBRSxLQUFLO01BQ25DZ0MsbUJBQW1CLEVBQUU7SUFDdEIsQ0FBQztFQUNGO0VBRUE0QixpQkFBaUJBLENBQUEsRUFBRztJQUNuQixNQUFNO01BQUV6RixjQUFjO01BQUVDLGNBQWM7TUFBRUM7SUFBdUIsQ0FBQyxHQUFHLElBQUksQ0FBQ0osS0FBSztJQUM3RSxJQUFJLENBQUM0RixpQkFBaUIsQ0FBQyxJQUFBQyxvQkFBYSxFQUFDM0YsY0FBYyxDQUFDLEVBQUVDLGNBQWMsRUFBRUMsc0JBQXNCLENBQUM7RUFDOUY7RUFFQTBGLG9CQUFvQkEsQ0FBQSxFQUFHO0lBQ3RCLE1BQU07TUFBRWhFO0lBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQ1ksS0FBSztJQUNyQyxJQUFBM0IsZUFBTyxFQUFDZSxjQUFjLEVBQUVhLEVBQUUsSUFBSSxJQUFBa0Isd0NBQTJCLEVBQUNsQixFQUFFLENBQUN6QixNQUFNLENBQUMsQ0FBQztFQUN0RTtFQUVBNkUsa0JBQWtCQSxDQUFDQyxTQUE4QyxFQUFFO0lBQ2xFLE1BQU07TUFBRTdGLGNBQWMsRUFBRThGLGtCQUFrQjtNQUFFL0YsY0FBYyxFQUFFZ0c7SUFBbUIsQ0FBQyxHQUFHRixTQUFTO0lBQzVGLE1BQU07TUFBRTdGLGNBQWM7TUFBRUQsY0FBYztNQUFFRTtJQUF1QixDQUFDLEdBQUcsSUFBSSxDQUFDSixLQUFLO0lBQzdFO0lBQ0EsSUFDQ2lHLGtCQUFrQixLQUFLOUYsY0FBYyxJQUNyQ1QsTUFBTSxDQUFDeUcsSUFBSSxDQUFDRCxrQkFBa0IsQ0FBQyxDQUFDM0IsTUFBTSxLQUFLN0UsTUFBTSxDQUFDeUcsSUFBSSxDQUFDakcsY0FBYyxDQUFDLENBQUNxRSxNQUFNLEVBQzVFO01BQ0QsSUFBSSxDQUFDcUIsaUJBQWlCLENBQUMsSUFBQUMsb0JBQWEsRUFBQzNGLGNBQWMsQ0FBQyxFQUFFQyxjQUFjLEVBQUVDLHNCQUFzQixDQUFDO0lBQzlGO0VBQ0Q7RUF5SkFnRyxNQUFNQSxDQUFBLEVBQUc7SUFDUixNQUFNO01BQUVDO0lBQW9CLENBQUMsR0FBRyxJQUFJLENBQUNyRyxLQUFLO0lBQzFDLE1BQU07TUFBRThCLGNBQWM7TUFBRUMsNEJBQTRCO01BQUVnQztJQUFvQixDQUFDLEdBQUcsSUFBSSxDQUFDckIsS0FBSztJQUN4RixNQUFNNEQsb0JBQW9CLEdBQUcsSUFBQXBCLFlBQUksRUFBQ3BELGNBQWMsRUFBRWEsRUFBRSxJQUFJLENBQUMsQ0FBQ0EsRUFBRSxDQUFDbEIsY0FBYyxJQUFJa0IsRUFBRSxDQUFDbEIsY0FBYyxDQUFDOEMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUU1RyxvQkFDQyxJQUFBOUYsV0FBQSxDQUFBK0YsSUFBQTtNQUFBQyxRQUFBLEdBQ0UsQ0FBQzFDLDRCQUE0QixpQkFBSSxJQUFBdEQsV0FBQSxDQUFBaUcsR0FBQSxFQUFDbEcsUUFBQSxDQUFBK0gsT0FBTyxJQUFFLENBQUMsRUFDNUN4RSw0QkFBNEIsaUJBQzVCLElBQUF0RCxXQUFBLENBQUErRixJQUFBO1FBQUFDLFFBQUEsR0FDRSxDQUFDNkIsb0JBQW9CLGlCQUNyQixJQUFBN0gsV0FBQSxDQUFBaUcsR0FBQSxFQUFDbkcsY0FBQSxDQUFBaUksYUFBYTtVQUFDQyxPQUFPLEVBQUMsTUFBTTtVQUFBaEMsUUFBQSxlQUM1QixJQUFBaEcsV0FBQSxDQUFBaUcsR0FBQTtZQUFBRCxRQUFBLEVBQUc7VUFBNEMsQ0FBRztRQUFDLENBQ3JDLENBQ2YsRUFDQSxDQUFDLENBQUM0QixtQkFBbUIsSUFBSUMsb0JBQW9CLGlCQUM3QyxJQUFBN0gsV0FBQSxDQUFBaUcsR0FBQSxFQUFDbkcsY0FBQSxDQUFBaUksYUFBYTtVQUFDQyxPQUFPLEVBQUMsTUFBTTtVQUFBaEMsUUFBQSxlQUM1QixJQUFBaEcsV0FBQSxDQUFBaUcsR0FBQTtZQUFBRCxRQUFBLEVBQUk0QjtVQUFtQixDQUFJO1FBQUMsQ0FDZCxDQUNmLEVBQ0F0QyxtQkFBbUIsaUJBQ25CLElBQUF0RixXQUFBLENBQUFpRyxHQUFBLEVBQUNuRyxjQUFBLENBQUFpSSxhQUFhO1VBQ2JDLE9BQU8sRUFBQyxTQUFTO1VBQ2pCQyxPQUFPLEVBQUVBLENBQUEsS0FBTTtZQUNkLElBQUksQ0FBQzdFLFFBQVEsQ0FBQztjQUNia0MsbUJBQW1CLEVBQUU7WUFDdEIsQ0FBQyxDQUFDO1VBQ0gsQ0FBRTtVQUFBVSxRQUFBLGVBQ0YsSUFBQWhHLFdBQUEsQ0FBQWlHLEdBQUE7WUFBR2lDLFNBQVMsRUFBQyxLQUFLO1lBQUFsQyxRQUFBLEVBQUM7VUFBMkQsQ0FBRztRQUFDLENBQ3BFLENBQ2YsRUFBRSxHQUFHLEVBQ0w2QixvQkFBb0IsSUFBSSxDQUFDLENBQUN4RSxjQUFjLGlCQUN4QyxJQUFBckQsV0FBQSxDQUFBaUcsR0FBQSxFQUFDNUcsZUFBQSxDQUFBOEksU0FBUztVQUFDRCxTQUFTLEVBQUMsUUFBUTtVQUFBbEMsUUFBQSxFQUFFLElBQUksQ0FBQ29DLHFCQUFxQixDQUFDL0UsY0FBYztRQUFDLENBQVksQ0FDckY7TUFBQSxDQUNHLENBQ0w7SUFBQSxDQUNHLENBQUM7RUFFUjtBQUNEO0FBQUNnRixPQUFBLENBQUFqSCxvQkFBQSxHQUFBQSxvQkFBQSIsImlnbm9yZUxpc3QiOltdfQ==
|