studiokit-scaffolding-js 7.0.12-next.1.3 → 7.0.12-next.2.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.
Files changed (258) hide show
  1. package/lib/components/ActionList.js +164 -37
  2. package/lib/components/AlertDialog.js +128 -12
  3. package/lib/components/AlertWithIcon.js +88 -29
  4. package/lib/components/ConnectedModal.js +35 -12
  5. package/lib/components/Dropdowns/GroupsDropdown.js +63 -45
  6. package/lib/components/Dropdowns/ManagedNavDropdown.js +92 -67
  7. package/lib/components/Dropdowns/UserDropdown.js +105 -24
  8. package/lib/components/Dropdowns/index.js +4 -10
  9. package/lib/components/EntityOwnerList.js +47 -21
  10. package/lib/components/Error.js +101 -12
  11. package/lib/components/ErrorBoundary.js +127 -38
  12. package/lib/components/ErrorMessage.js +39 -12
  13. package/lib/components/Forms/DateField.js +56 -45
  14. package/lib/components/Forms/TimeField.js +76 -45
  15. package/lib/components/Forms/index.js +3 -5
  16. package/lib/components/Groups/CreateEditCopySaveButtons.js +109 -14
  17. package/lib/components/Groups/ExternalGroups/Attach.js +206 -151
  18. package/lib/components/Groups/ExternalGroups/Table.js +176 -48
  19. package/lib/components/Groups/GroupCreateOrEditCommonProps.js +2 -2
  20. package/lib/components/Groups/RosterSyncInfo.js +142 -23
  21. package/lib/components/HOC/AccessibleAppComponent.js +88 -72
  22. package/lib/components/HOC/ActivityRequiredComponent.js +68 -33
  23. package/lib/components/HOC/AsyncComponent.js +49 -41
  24. package/lib/components/HOC/AuthenticatedComponent.js +55 -44
  25. package/lib/components/HOC/CollectionComponent.js +154 -104
  26. package/lib/components/HOC/CollectionFirstItemComponent.js +45 -40
  27. package/lib/components/HOC/CollectionItemComponent.js +152 -100
  28. package/lib/components/HOC/ConnectedModalComponent.js +87 -69
  29. package/lib/components/HOC/DataDependentComponent.js +26 -27
  30. package/lib/components/HOC/EntityComponent.js +57 -53
  31. package/lib/components/HOC/FullscreenModalComponent.js +139 -108
  32. package/lib/components/HOC/GroupActivityRequiredComponent.js +27 -20
  33. package/lib/components/HOC/GuidComponent.js +20 -20
  34. package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +32 -29
  35. package/lib/components/HOC/ModelErrorRedirectComponent.js +37 -39
  36. package/lib/components/HOC/SearchPersistorComponent.js +237 -173
  37. package/lib/components/HOC/UnauthenticatedComponent.js +32 -30
  38. package/lib/components/HOC/UserComponent.js +6 -8
  39. package/lib/components/Icons/IconAlphaList.js +28 -8
  40. package/lib/components/Icons/IconExternalUser.js +28 -8
  41. package/lib/components/Icons/IconImpersonation.js +28 -8
  42. package/lib/components/Icons/IconStopImpersonating.js +28 -8
  43. package/lib/components/Icons/IconTable.js +29 -9
  44. package/lib/components/Icons/IconTableDeleteCol.js +28 -8
  45. package/lib/components/Icons/IconTableDeleteRow.js +28 -8
  46. package/lib/components/Icons/IconTableInsertCol.js +28 -8
  47. package/lib/components/Icons/IconTableInsertRow.js +28 -8
  48. package/lib/components/Impersonation/Button.js +71 -16
  49. package/lib/components/Impersonation/Link.js +72 -16
  50. package/lib/components/Impersonation/UserDetail.js +60 -11
  51. package/lib/components/Loading.js +23 -8
  52. package/lib/components/LockDownBrowser/Check.js +188 -51
  53. package/lib/components/LockDownBrowser/ExitButton.js +22 -13
  54. package/lib/components/LockDownBrowser/Launch.js +64 -64
  55. package/lib/components/Lti/Confirm.js +147 -14
  56. package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +165 -36
  57. package/lib/components/Lti/Launch.js +99 -25
  58. package/lib/components/Lti/LaunchGroup.js +81 -16
  59. package/lib/components/ManageTable.js +304 -90
  60. package/lib/components/ManageTableNoDataComponent.js +38 -7
  61. package/lib/components/NewVersionAlert.js +76 -49
  62. package/lib/components/NotFound.js +81 -11
  63. package/lib/components/Notifications.js +179 -129
  64. package/lib/components/PaginationNextButton.js +28 -9
  65. package/lib/components/PaginationPreviousButton.js +28 -9
  66. package/lib/components/Quill/CustomToolbar.js +427 -222
  67. package/lib/components/Quill/Formats/Image.js +67 -67
  68. package/lib/components/Quill/Formats/List.js +38 -47
  69. package/lib/components/Quill/Formats/Video.js +23 -26
  70. package/lib/components/Quill/ImageDropModule.js +136 -114
  71. package/lib/components/Quill/ImageWarning.js +41 -12
  72. package/lib/components/Quill/ImageWithAltTextModal.js +420 -89
  73. package/lib/components/Quill/Specs/CustomImageSpec.js +32 -31
  74. package/lib/components/Quill/Specs/CustomVideoSpec.js +22 -23
  75. package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +89 -97
  76. package/lib/components/Quill/TableModule/Blots/TableBlot.js +47 -50
  77. package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +48 -51
  78. package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +219 -224
  79. package/lib/components/Quill/TableModule/Blots/TableContainer.js +75 -86
  80. package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +70 -73
  81. package/lib/components/Quill/TableModule/constants.js +40 -42
  82. package/lib/components/Quill/TableModule/index.js +357 -305
  83. package/lib/components/Quill/TableModule/utils.js +39 -48
  84. package/lib/components/Quill/accessibilityFix.js +219 -223
  85. package/lib/components/Quill/index.js +30 -33
  86. package/lib/components/RefreshIndicator/Bordered.js +44 -10
  87. package/lib/components/RefreshIndicator/Inline.js +43 -12
  88. package/lib/components/RefreshIndicator/index.js +257 -62
  89. package/lib/components/SearchControls.js +211 -14
  90. package/lib/components/SentryRoute.js +5 -7
  91. package/lib/components/Tables/RoleFilter.js +66 -38
  92. package/lib/components/Tables/TextFilter.js +58 -18
  93. package/lib/components/UserRoles/Add.js +193 -99
  94. package/lib/components/UserRoles/Context.js +3 -6
  95. package/lib/components/UserRoles/RoleCell.js +176 -75
  96. package/lib/components/UserRoles/Select.js +151 -20
  97. package/lib/components/UserRoles/Table.js +215 -82
  98. package/lib/components/UserRoles/index.js +526 -386
  99. package/lib/config/eslint/index.js +26 -29
  100. package/lib/config/eslint/lib/order.js +21 -28
  101. package/lib/config/eslint/lib/prettier.js +15 -19
  102. package/lib/config/eslint/lib/typescript.js +87 -113
  103. package/lib/config/eslint/react.js +18 -15
  104. package/lib/constants/baseActivity.js +26 -28
  105. package/lib/constants/baseRole.js +10 -12
  106. package/lib/constants/configuration.js +43 -55
  107. package/lib/constants/externalProviderType.js +6 -8
  108. package/lib/constants/fetchErrorData.js +10 -12
  109. package/lib/constants/index.js +13 -15
  110. package/lib/constants/lockDownBrowser.js +23 -25
  111. package/lib/constants/mockData.js +370 -300
  112. package/lib/constants/modelStatus.js +11 -13
  113. package/lib/constants/notificationType.js +8 -10
  114. package/lib/constants/operatingSystem.js +8 -10
  115. package/lib/constants/shard.js +7 -9
  116. package/lib/constants/table.js +18 -22
  117. package/lib/constants/tier.js +8 -10
  118. package/lib/constants/userRole.js +11 -8
  119. package/lib/endpointMappings.js +191 -182
  120. package/lib/hooks/useCollection.js +79 -65
  121. package/lib/hooks/useCollectionConfiguration.js +220 -80
  122. package/lib/hooks/useCollectionItem.js +151 -57
  123. package/lib/hooks/useGuid.js +16 -9
  124. package/lib/hooks/usePrevious.js +14 -13
  125. package/lib/index.js +11 -26
  126. package/lib/redux/actionCreator.js +44 -35
  127. package/lib/redux/actions/AuthAction.js +45 -32
  128. package/lib/redux/actions/ModalAction.js +6 -8
  129. package/lib/redux/actions/ModelAction.js +95 -43
  130. package/lib/redux/actions/NotificationAction.js +6 -8
  131. package/lib/redux/actions/SearchAction.js +5 -7
  132. package/lib/redux/actions/index.js +6 -8
  133. package/lib/redux/configureReducers.js +48 -46
  134. package/lib/redux/configureStore.js +77 -91
  135. package/lib/redux/helpers.js +2 -5
  136. package/lib/redux/reducers/authReducer.js +44 -43
  137. package/lib/redux/reducers/index.js +7 -14
  138. package/lib/redux/reducers/modalsReducer.js +43 -31
  139. package/lib/redux/reducers/modelsReducer.js +131 -137
  140. package/lib/redux/reducers/notificationsReducer.js +20 -20
  141. package/lib/redux/reducers/searchReducer.js +13 -13
  142. package/lib/redux/sagas/appInsightsSaga.js +19 -21
  143. package/lib/redux/sagas/authSaga.js +248 -234
  144. package/lib/redux/sagas/caliperSaga.js +142 -131
  145. package/lib/redux/sagas/clockOffsetSaga.js +29 -32
  146. package/lib/redux/sagas/configurationSaga.js +8 -10
  147. package/lib/redux/sagas/downtimeApiErrorSaga.js +16 -19
  148. package/lib/redux/sagas/errorSaga.js +23 -24
  149. package/lib/redux/sagas/googleAnalyticsSaga.js +24 -27
  150. package/lib/redux/sagas/identityProviderSaga.js +19 -21
  151. package/lib/redux/sagas/initialDataLoadSaga.js +34 -31
  152. package/lib/redux/sagas/lockDownBrowserErrorSaga.js +25 -22
  153. package/lib/redux/sagas/modelFetchSaga.js +302 -286
  154. package/lib/redux/sagas/noStoreSaga.js +60 -61
  155. package/lib/redux/sagas/postLoginDataSaga.js +37 -32
  156. package/lib/redux/sagas/postLoginRedirectSaga.js +22 -27
  157. package/lib/redux/sagas/rootSaga.js +77 -60
  158. package/lib/redux/sagas/sentrySaga.js +25 -28
  159. package/lib/redux/sagas/userIdSaga.js +13 -15
  160. package/lib/services/codeProviderService.js +21 -21
  161. package/lib/services/dateService.js +6 -8
  162. package/lib/services/documentService.js +10 -11
  163. package/lib/services/fetchService.js +103 -95
  164. package/lib/services/persistenceService.js +27 -30
  165. package/lib/services/ticketProviderService.js +25 -25
  166. package/lib/services/tokenPersistenceService.js +8 -10
  167. package/lib/services/windowService.js +14 -16
  168. package/lib/startup.js +110 -101
  169. package/lib/types/AppConfiguration.js +2 -2
  170. package/lib/types/Artifact.js +7 -9
  171. package/lib/types/BaseReduxState.js +2 -2
  172. package/lib/types/Client.js +2 -2
  173. package/lib/types/Collection.js +2 -2
  174. package/lib/types/Configuration.js +2 -2
  175. package/lib/types/DeepLinkingResponseRequest.js +2 -2
  176. package/lib/types/DeletableModel.js +2 -2
  177. package/lib/types/Event.js +2 -2
  178. package/lib/types/ExternalGroup.js +2 -2
  179. package/lib/types/ExternalProvider.js +2 -2
  180. package/lib/types/ExternalTerm.js +2 -2
  181. package/lib/types/Group.js +2 -2
  182. package/lib/types/IdentityProvider.js +2 -2
  183. package/lib/types/LtiLaunch.js +2 -2
  184. package/lib/types/NameOnlyEntity.js +2 -2
  185. package/lib/types/Notification.js +2 -2
  186. package/lib/types/OptionalRecord.js +2 -2
  187. package/lib/types/OwnerSchedule.js +2 -2
  188. package/lib/types/PropertyOfType.js +2 -2
  189. package/lib/types/Quill.js +2 -2
  190. package/lib/types/RoleDescription.js +2 -2
  191. package/lib/types/Search.js +2 -2
  192. package/lib/types/SimpleLocation.js +2 -2
  193. package/lib/types/UniTime.js +2 -2
  194. package/lib/types/User.js +2 -2
  195. package/lib/types/UserRole.js +2 -2
  196. package/lib/types/auth/AuthState.js +2 -2
  197. package/lib/types/auth/CasV1LoginRequestBody.js +2 -2
  198. package/lib/types/auth/ClientCredentials.js +2 -2
  199. package/lib/types/auth/CodeProviderService.js +2 -2
  200. package/lib/types/auth/LocalLoginRequestBody.js +2 -2
  201. package/lib/types/auth/TicketProviderService.js +2 -2
  202. package/lib/types/auth/TokenPersistenceService.js +2 -2
  203. package/lib/types/auth/index.js +8 -10
  204. package/lib/types/externals.d.js +2 -0
  205. package/lib/types/index.js +29 -31
  206. package/lib/types/net/EndpointConfig.js +2 -2
  207. package/lib/types/net/EndpointMapping.js +2 -2
  208. package/lib/types/net/EndpointMappings.js +2 -2
  209. package/lib/types/net/ErrorHandler.js +2 -2
  210. package/lib/types/net/FetchConfig.js +2 -2
  211. package/lib/types/net/FetchErrorData.js +6 -8
  212. package/lib/types/net/FetchResult.js +2 -2
  213. package/lib/types/net/HTTPMethod.js +2 -2
  214. package/lib/types/net/HTTPStatusCode.js +12 -14
  215. package/lib/types/net/Metadata.js +2 -2
  216. package/lib/types/net/Model.js +2 -2
  217. package/lib/types/net/ModelCollection.js +2 -2
  218. package/lib/types/net/ModelsState.js +2 -2
  219. package/lib/types/net/OAuthToken.js +2 -2
  220. package/lib/types/net/OAuthTokenOrNull.js +2 -2
  221. package/lib/types/net/TokenAccessFunction.js +2 -2
  222. package/lib/types/net/index.js +17 -19
  223. package/lib/utils/baseActivity.js +83 -85
  224. package/lib/utils/baseRole.js +32 -36
  225. package/lib/utils/collection.js +403 -297
  226. package/lib/utils/cookies.js +19 -23
  227. package/lib/utils/date.js +188 -205
  228. package/lib/utils/dom.js +130 -131
  229. package/lib/utils/domainIdentifier.js +4 -8
  230. package/lib/utils/entityUserRole.js +2 -5
  231. package/lib/utils/error.js +14 -19
  232. package/lib/utils/events.js +32 -31
  233. package/lib/utils/externalGroup.js +20 -25
  234. package/lib/utils/externalProviders.js +4 -7
  235. package/lib/utils/externalTerms.js +6 -6
  236. package/lib/utils/fetch.js +168 -176
  237. package/lib/utils/group.js +14 -11
  238. package/lib/utils/groupDates.js +38 -46
  239. package/lib/utils/groupRoles.js +23 -32
  240. package/lib/utils/lockDownBrowser.js +12 -15
  241. package/lib/utils/logger.js +23 -28
  242. package/lib/utils/lti.js +4 -7
  243. package/lib/utils/model.js +28 -43
  244. package/lib/utils/number.js +9 -13
  245. package/lib/utils/promise.js +23 -26
  246. package/lib/utils/quill.js +55 -60
  247. package/lib/utils/route.js +52 -60
  248. package/lib/utils/search.js +72 -87
  249. package/lib/utils/shard.js +33 -42
  250. package/lib/utils/sort.js +47 -50
  251. package/lib/utils/string.js +10 -12
  252. package/lib/utils/table.js +29 -33
  253. package/lib/utils/timezone.js +7 -12
  254. package/lib/utils/url.js +130 -144
  255. package/lib/utils/user.js +54 -64
  256. package/lib/utils/userAgent.js +7 -14
  257. package/lib/utils/userRole.js +36 -39
  258. package/package.json +17 -3
@@ -1,351 +1,421 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.badRequestFullErrorData = exports.badRequestErrorData = exports.unauthorizedErrorData = exports.forbiddenErrorData = exports.requestTimedOutErrorData = exports.internalServerErrorData = exports.defaultExternalTerms = exports.defaultExternalProviders = exports.defaultGroup = exports.defaultAdminUserRoles = exports.defaultGroupUserRoles = exports.defaultGroupGrader = exports.defaultExternalGroupLearner = exports.defaultGroupLearner = exports.defaultNamedGroupLearner = exports.defaultNamelessGroupLearner = exports.defaultGroupOwner = exports.defaultGroupOwnerUserInfo = exports.defaultNamedUserInfo = exports.defaultNamelessUserInfo = exports.defaultUser = exports.defaultDate = exports.currentDates = exports.pastDates = exports.defaultLocation = exports.defaultAppConfiguration = void 0;
4
- exports.mockHistory = mockHistory;
5
- exports.mockUser = mockUser;
6
- exports.mockGroups = mockGroups;
7
- exports.mockSyncedGroups = mockSyncedGroups;
8
- exports.mockLtiGroups = mockLtiGroups;
9
- exports.mockTermGroups = mockTermGroups;
10
- exports.mockTermAndUniTimeGroups = mockTermAndUniTimeGroups;
11
- exports.mockPastGroups = mockPastGroups;
12
- exports.mockPastAndCurrentGroups = mockPastAndCurrentGroups;
13
- const lodash_1 = require("lodash");
14
- const externalProviderType_1 = require("../constants/externalProviderType");
15
- const types_1 = require("../types");
16
- const baseRole_1 = require("./baseRole");
17
- const tier_1 = require("./tier");
1
+ import { merge } from 'lodash';
2
+ import { EXTERNAL_PROVIDER_TYPE } from '../constants/externalProviderType';
3
+ import { HTTP_STATUS_CODE } from '../types';
4
+ import { BASE_ROLE } from './baseRole';
5
+ import { TIER } from './tier';
6
+
18
7
  //#region General
19
- exports.defaultAppConfiguration = {
20
- NODE_ENV: 'test',
21
- APP_NAME: 'StudioKit',
22
- TIER: tier_1.TIER.LOCAL,
23
- API_BASE_URL: '',
24
- ROOT_DOMAIN: 'studiokit.org',
25
- CLIENT_ID: 'web',
26
- CLIENT_SECRET: '****',
27
- IS_DOWNTIME: false,
28
- LMS_NAME: 'Brightspace',
29
- GRADABLE_DESCRIPTOR: 'assessment'
8
+
9
+ export const defaultAppConfiguration = {
10
+ NODE_ENV: 'test',
11
+ APP_NAME: 'StudioKit',
12
+ TIER: TIER.LOCAL,
13
+ API_BASE_URL: '',
14
+ ROOT_DOMAIN: 'studiokit.org',
15
+ CLIENT_ID: 'web',
16
+ CLIENT_SECRET: '****',
17
+ IS_DOWNTIME: false,
18
+ LMS_NAME: 'Brightspace',
19
+ GRADABLE_DESCRIPTOR: 'assessment'
30
20
  };
31
- exports.defaultLocation = {
32
- hash: '',
33
- host: 'purdue.dev.studiokit.org',
34
- hostname: 'purdue.dev.studiokit.org',
35
- href: 'https://purdue.dev.studiokit.org/',
36
- pathname: '/',
37
- port: '',
38
- protocol: 'https:',
39
- search: ''
21
+ export const defaultLocation = {
22
+ hash: '',
23
+ host: 'purdue.dev.studiokit.org',
24
+ hostname: 'purdue.dev.studiokit.org',
25
+ href: 'https://purdue.dev.studiokit.org/',
26
+ pathname: '/',
27
+ port: '',
28
+ protocol: 'https:',
29
+ search: ''
40
30
  };
41
- function mockHistory() {
42
- return {
43
- length: 0,
44
- scrollRestoration: 'auto',
45
- state: {},
46
- back: jest.fn(),
47
- forward: jest.fn(),
48
- go: jest.fn(),
49
- pushState: jest.fn(),
50
- replaceState: jest.fn()
51
- };
31
+ export function mockHistory() {
32
+ return {
33
+ length: 0,
34
+ scrollRestoration: 'auto',
35
+ state: {},
36
+ back: jest.fn(),
37
+ forward: jest.fn(),
38
+ go: jest.fn(),
39
+ pushState: jest.fn(),
40
+ replaceState: jest.fn()
41
+ };
52
42
  }
43
+
53
44
  //#endregion General
45
+
54
46
  //#region Dates
47
+
55
48
  /** 5/15/18 - 8/14/18 */
56
- exports.pastDates = {
57
- startDate: '2018-05-15T04:00:00.000Z',
58
- endDate: '2018-08-15T03:59:59.999Z'
49
+ export const pastDates = {
50
+ startDate: '2018-05-15T04:00:00.000Z',
51
+ endDate: '2018-08-15T03:59:59.999Z'
59
52
  };
53
+
60
54
  /** 8/15/18 - 12/31/18: */
61
- exports.currentDates = {
62
- startDate: '2018-08-15T04:00:00.000Z',
63
- endDate: '2019-01-01T04:59:59.999Z'
55
+ export const currentDates = {
56
+ startDate: '2018-08-15T04:00:00.000Z',
57
+ endDate: '2019-01-01T04:59:59.999Z'
64
58
  };
59
+
65
60
  /**
66
61
  * The default date and time for all tests. Used by the 'mockdate' package. One month into `currentDates`.
67
62
  */
68
- exports.defaultDate = '2018-09-15T04:00:00.000Z';
63
+ export const defaultDate = '2018-09-15T04:00:00.000Z';
64
+
69
65
  //#endregion Dates
66
+
70
67
  //#region Users
71
- exports.defaultUser = {
72
- userInfo: {
73
- id: '1',
74
- firstName: null,
75
- lastName: null,
76
- email: null,
77
- uid: null,
78
- activities: [],
79
- roles: [],
80
- dateDemoGenerationSucceeded: null,
81
- dateStored: exports.defaultDate,
82
- dateLastUpdated: exports.defaultDate,
83
- isImpersonated: false,
84
- careerAccountAlias: null,
85
- employeeNumber: null,
86
- userName: 'test',
87
- puid: null,
88
- lockDownBrowserTestLaunchUrl: null
89
- }
68
+
69
+ export const defaultUser = {
70
+ userInfo: {
71
+ id: '1',
72
+ firstName: null,
73
+ lastName: null,
74
+ email: null,
75
+ uid: null,
76
+ activities: [],
77
+ roles: [],
78
+ dateDemoGenerationSucceeded: null,
79
+ dateStored: defaultDate,
80
+ dateLastUpdated: defaultDate,
81
+ isImpersonated: false,
82
+ careerAccountAlias: null,
83
+ employeeNumber: null,
84
+ userName: 'test',
85
+ puid: null,
86
+ lockDownBrowserTestLaunchUrl: null
87
+ }
90
88
  };
91
- exports.defaultNamelessUserInfo = Object.assign(Object.assign({}, exports.defaultUser.userInfo), {
89
+ export const defaultNamelessUserInfo = {
90
+ ...defaultUser.userInfo,
91
+ ...{
92
92
  email: 'nicki@minaj.superbass',
93
93
  uid: 'nm-nameless'
94
- });
95
- exports.defaultNamedUserInfo = Object.assign(Object.assign({}, exports.defaultUser.userInfo), {
94
+ }
95
+ };
96
+ export const defaultNamedUserInfo = {
97
+ ...defaultUser.userInfo,
98
+ ...{
96
99
  firstName: 'Nicki',
97
100
  lastName: 'Minaj',
98
101
  uid: 'nm-named'
99
- });
100
- function mockUser(activities = []) {
101
- return (0, lodash_1.merge)({ userInfo: { activities } }, exports.defaultUser);
102
+ }
103
+ };
104
+ export function mockUser() {
105
+ let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
106
+ return merge({
107
+ userInfo: {
108
+ activities
109
+ }
110
+ }, defaultUser);
102
111
  }
103
- exports.defaultGroupOwnerUserInfo = Object.assign(Object.assign({}, exports.defaultUser.userInfo), { id: '2', firstName: 'Jane', lastName: 'Doe', email: 'jane@gmail.com' });
104
- exports.defaultGroupOwner = {
105
- id: '1',
106
- userId: '2',
107
- firstName: 'Jane',
108
- lastName: 'Doe',
109
- email: 'jane@gmail.com',
110
- uid: 'jane',
111
- entityId: 1,
112
- role: baseRole_1.BASE_ROLE.GROUP_OWNER,
113
- isExternal: false
112
+ export const defaultGroupOwnerUserInfo = {
113
+ ...defaultUser.userInfo,
114
+ id: '2',
115
+ firstName: 'Jane',
116
+ lastName: 'Doe',
117
+ email: 'jane@gmail.com'
114
118
  };
115
- exports.defaultNamelessGroupLearner = {
116
- id: '2',
117
- userId: '3',
118
- firstName: null,
119
- lastName: null,
120
- email: 'nicki@minaj.superbass',
121
- uid: 'nm-nameless',
122
- entityId: 1,
123
- role: baseRole_1.BASE_ROLE.GROUP_LEARNER,
124
- isExternal: false
119
+ export const defaultGroupOwner = {
120
+ id: '1',
121
+ userId: '2',
122
+ firstName: 'Jane',
123
+ lastName: 'Doe',
124
+ email: 'jane@gmail.com',
125
+ uid: 'jane',
126
+ entityId: 1,
127
+ role: BASE_ROLE.GROUP_OWNER,
128
+ isExternal: false
125
129
  };
126
- exports.defaultNamedGroupLearner = {
127
- id: '3',
128
- userId: '4',
129
- firstName: 'Nicki',
130
- lastName: 'Minaj',
131
- email: null,
132
- uid: 'nm-named',
133
- entityId: 1,
134
- role: baseRole_1.BASE_ROLE.GROUP_LEARNER,
135
- isExternal: false
130
+ export const defaultNamelessGroupLearner = {
131
+ id: '2',
132
+ userId: '3',
133
+ firstName: null,
134
+ lastName: null,
135
+ email: 'nicki@minaj.superbass',
136
+ uid: 'nm-nameless',
137
+ entityId: 1,
138
+ role: BASE_ROLE.GROUP_LEARNER,
139
+ isExternal: false
136
140
  };
137
- exports.defaultGroupLearner = {
138
- id: '4',
139
- userId: '5',
140
- firstName: 'Joe',
141
- lastName: 'Schmoe',
142
- email: 'nope@gmail.com',
143
- uid: 'nope',
144
- entityId: 1,
145
- role: baseRole_1.BASE_ROLE.GROUP_LEARNER,
146
- isExternal: false
141
+ export const defaultNamedGroupLearner = {
142
+ id: '3',
143
+ userId: '4',
144
+ firstName: 'Nicki',
145
+ lastName: 'Minaj',
146
+ email: null,
147
+ uid: 'nm-named',
148
+ entityId: 1,
149
+ role: BASE_ROLE.GROUP_LEARNER,
150
+ isExternal: false
147
151
  };
148
- exports.defaultExternalGroupLearner = {
149
- id: '5',
150
- userId: '6',
151
- firstName: 'Bob',
152
- lastName: 'Loblaw',
153
- email: 'bobloblaw@lawblog.com',
154
- uid: 'bobloblaw',
155
- entityId: 1,
156
- role: baseRole_1.BASE_ROLE.GROUP_LEARNER,
157
- isExternal: true
152
+ export const defaultGroupLearner = {
153
+ id: '4',
154
+ userId: '5',
155
+ firstName: 'Joe',
156
+ lastName: 'Schmoe',
157
+ email: 'nope@gmail.com',
158
+ uid: 'nope',
159
+ entityId: 1,
160
+ role: BASE_ROLE.GROUP_LEARNER,
161
+ isExternal: false
158
162
  };
159
- exports.defaultGroupGrader = {
160
- id: '6',
161
- userId: '7',
162
- firstName: 'Grader',
163
- lastName: 'McGradeface',
164
- email: 'grader@gmail.com',
165
- uid: 'grader',
166
- entityId: 1,
167
- role: baseRole_1.BASE_ROLE.GROUP_GRADER,
168
- isExternal: false
163
+ export const defaultExternalGroupLearner = {
164
+ id: '5',
165
+ userId: '6',
166
+ firstName: 'Bob',
167
+ lastName: 'Loblaw',
168
+ email: 'bobloblaw@lawblog.com',
169
+ uid: 'bobloblaw',
170
+ entityId: 1,
171
+ role: BASE_ROLE.GROUP_LEARNER,
172
+ isExternal: true
169
173
  };
170
- exports.defaultGroupUserRoles = [exports.defaultGroupOwner, exports.defaultGroupLearner, exports.defaultExternalGroupLearner];
171
- exports.defaultAdminUserRoles = [
172
- {
173
- id: '1',
174
- firstName: 'Joe',
175
- lastName: 'Schmo',
176
- email: null,
177
- uid: null,
178
- role: baseRole_1.BASE_ROLE.ADMIN
179
- },
180
- {
181
- id: '2',
182
- firstName: null,
183
- lastName: null,
184
- email: 'carlysimon@clouds.in.coffee',
185
- uid: 'carlysimon',
186
- role: baseRole_1.BASE_ROLE.ADMIN
187
- }
188
- ];
174
+ export const defaultGroupGrader = {
175
+ id: '6',
176
+ userId: '7',
177
+ firstName: 'Grader',
178
+ lastName: 'McGradeface',
179
+ email: 'grader@gmail.com',
180
+ uid: 'grader',
181
+ entityId: 1,
182
+ role: BASE_ROLE.GROUP_GRADER,
183
+ isExternal: false
184
+ };
185
+ export const defaultGroupUserRoles = [defaultGroupOwner, defaultGroupLearner, defaultExternalGroupLearner];
186
+ export const defaultAdminUserRoles = [{
187
+ id: '1',
188
+ firstName: 'Joe',
189
+ lastName: 'Schmo',
190
+ email: null,
191
+ uid: null,
192
+ role: BASE_ROLE.ADMIN
193
+ }, {
194
+ id: '2',
195
+ firstName: null,
196
+ lastName: null,
197
+ email: 'carlysimon@clouds.in.coffee',
198
+ uid: 'carlysimon',
199
+ role: BASE_ROLE.ADMIN
200
+ }];
201
+
189
202
  //#endregion Users
203
+
190
204
  //#region Groups
191
- exports.defaultGroup = {
192
- roles: [],
193
- activities: [],
194
- owners: [
195
- {
196
- id: '1',
197
- entityId: 1,
198
- firstName: 'Instructor',
199
- lastName: 'McInstructor',
200
- email: null,
201
- uid: null
202
- }
203
- ],
204
- graders: [],
205
- id: 1,
206
- name: 'McGroup',
207
- externalTermId: null,
208
- startDate: exports.currentDates.startDate,
209
- endDate: exports.currentDates.endDate,
210
- isDeleted: false,
211
- isRosterSyncEnabled: false,
212
- externalGroups: []
205
+
206
+ export const defaultGroup = {
207
+ roles: [],
208
+ activities: [],
209
+ owners: [{
210
+ id: '1',
211
+ entityId: 1,
212
+ firstName: 'Instructor',
213
+ lastName: 'McInstructor',
214
+ email: null,
215
+ uid: null
216
+ }],
217
+ graders: [],
218
+ id: 1,
219
+ name: 'McGroup',
220
+ externalTermId: null,
221
+ startDate: currentDates.startDate,
222
+ endDate: currentDates.endDate,
223
+ isDeleted: false,
224
+ isRosterSyncEnabled: false,
225
+ externalGroups: []
213
226
  };
214
- function mockGroups(activities = [], roles = []) {
215
- return { '1': (0, lodash_1.merge)({ activities, roles }, exports.defaultGroup) };
227
+ export function mockGroups() {
228
+ let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
229
+ let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
230
+ return {
231
+ '1': merge({
232
+ activities,
233
+ roles
234
+ }, defaultGroup)
235
+ };
216
236
  }
217
- function mockSyncedGroups(activities = [], roles = []) {
218
- const rosterSyncEnabledGroup = (0, lodash_1.merge)({ activities, roles }, exports.defaultGroup);
219
- rosterSyncEnabledGroup.isRosterSyncEnabled = true;
220
- return { '1': rosterSyncEnabledGroup };
237
+ export function mockSyncedGroups() {
238
+ let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
239
+ let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
240
+ const rosterSyncEnabledGroup = merge({
241
+ activities,
242
+ roles
243
+ }, defaultGroup);
244
+ rosterSyncEnabledGroup.isRosterSyncEnabled = true;
245
+ return {
246
+ '1': rosterSyncEnabledGroup
247
+ };
221
248
  }
222
- function mockLtiGroups(activities = [], roles = []) {
223
- const ltiGroup = (0, lodash_1.merge)({ activities, roles }, exports.defaultGroup);
224
- ltiGroup.isRosterSyncEnabled = true;
225
- ltiGroup.externalGroups = [
226
- {
227
- id: 1,
228
- externalProviderId: 2,
229
- groupId: 1,
230
- userId: '1',
231
- name: 'LTI ExternalGroup',
232
- description: 'LTI 101',
233
- gradesUrl: 'www.lti.org',
234
- rosterUrl: null,
235
- isAutoGradePushEnabled: false,
236
- externalId: '1',
237
- typename: 'ExternalGroup'
238
- }
239
- ];
240
- return { '1': ltiGroup };
249
+ export function mockLtiGroups() {
250
+ let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
251
+ let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
252
+ const ltiGroup = merge({
253
+ activities,
254
+ roles
255
+ }, defaultGroup);
256
+ ltiGroup.isRosterSyncEnabled = true;
257
+ ltiGroup.externalGroups = [{
258
+ id: 1,
259
+ externalProviderId: 2,
260
+ groupId: 1,
261
+ userId: '1',
262
+ name: 'LTI ExternalGroup',
263
+ description: 'LTI 101',
264
+ gradesUrl: 'www.lti.org',
265
+ rosterUrl: null,
266
+ isAutoGradePushEnabled: false,
267
+ externalId: '1',
268
+ typename: 'ExternalGroup'
269
+ }];
270
+ return {
271
+ '1': ltiGroup
272
+ };
241
273
  }
242
- function mockTermGroups(activities = [], roles = []) {
243
- const group = (0, lodash_1.merge)({ activities, roles }, exports.defaultGroup);
244
- group.startDate = null;
245
- group.endDate = null;
246
- group.externalTermId = 1;
247
- return { '1': group };
274
+ export function mockTermGroups() {
275
+ let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
276
+ let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
277
+ const group = merge({
278
+ activities,
279
+ roles
280
+ }, defaultGroup);
281
+ group.startDate = null;
282
+ group.endDate = null;
283
+ group.externalTermId = 1;
284
+ return {
285
+ '1': group
286
+ };
248
287
  }
249
- function mockTermAndUniTimeGroups(activities = [], roles = []) {
250
- const group = (0, lodash_1.merge)({ activities, roles }, exports.defaultGroup);
251
- group.startDate = null;
252
- group.endDate = null;
253
- group.externalTermId = 1;
254
- group.externalGroups = [
255
- {
256
- id: 1,
257
- externalProviderId: 1,
258
- groupId: 1,
259
- userId: '1',
260
- name: 'UniTime ExternalGroup',
261
- description: 'UniTime 101',
262
- gradesUrl: null,
263
- rosterUrl: null,
264
- isAutoGradePushEnabled: false,
265
- externalId: '1',
266
- typename: 'ExternalGroup'
267
- }
268
- ];
269
- return { '1': group };
288
+ export function mockTermAndUniTimeGroups() {
289
+ let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
290
+ let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
291
+ const group = merge({
292
+ activities,
293
+ roles
294
+ }, defaultGroup);
295
+ group.startDate = null;
296
+ group.endDate = null;
297
+ group.externalTermId = 1;
298
+ group.externalGroups = [{
299
+ id: 1,
300
+ externalProviderId: 1,
301
+ groupId: 1,
302
+ userId: '1',
303
+ name: 'UniTime ExternalGroup',
304
+ description: 'UniTime 101',
305
+ gradesUrl: null,
306
+ rosterUrl: null,
307
+ isAutoGradePushEnabled: false,
308
+ externalId: '1',
309
+ typename: 'ExternalGroup'
310
+ }];
311
+ return {
312
+ '1': group
313
+ };
270
314
  }
271
- function mockPastGroups(activities = [], roles = []) {
272
- const pastGroup = (0, lodash_1.merge)({ activities, roles }, exports.defaultGroup, exports.pastDates);
273
- return { '1': pastGroup };
315
+ export function mockPastGroups() {
316
+ let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
317
+ let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
318
+ const pastGroup = merge({
319
+ activities,
320
+ roles
321
+ }, defaultGroup, pastDates);
322
+ return {
323
+ '1': pastGroup
324
+ };
274
325
  }
275
- function mockPastAndCurrentGroups(activities = [], roles = []) {
276
- const pastGroup = (0, lodash_1.merge)({ activities, roles }, exports.defaultGroup, exports.pastDates);
277
- const currentGroup = (0, lodash_1.merge)({ activities, roles }, exports.defaultGroup, {
278
- id: '2'
279
- }, exports.currentDates);
280
- return { '1': pastGroup, '2': currentGroup };
326
+ export function mockPastAndCurrentGroups() {
327
+ let activities = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
328
+ let roles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
329
+ const pastGroup = merge({
330
+ activities,
331
+ roles
332
+ }, defaultGroup, pastDates);
333
+ const currentGroup = merge({
334
+ activities,
335
+ roles
336
+ }, defaultGroup, {
337
+ id: '2'
338
+ }, currentDates);
339
+ return {
340
+ '1': pastGroup,
341
+ '2': currentGroup
342
+ };
281
343
  }
344
+
282
345
  //#endregion Groups
346
+
283
347
  //#region ExternalTerms + ExternalProviders
284
- exports.defaultExternalProviders = {
285
- '1': {
286
- id: 1,
287
- typename: externalProviderType_1.EXTERNAL_PROVIDER_TYPE.UNITIME,
288
- termSyncEnabled: true,
289
- rosterSyncEnabled: true,
290
- gradePushEnabled: false,
291
- shouldDisplayCreateNonLtiGroupAlert: false
292
- },
293
- '2': {
294
- id: 2,
295
- typename: externalProviderType_1.EXTERNAL_PROVIDER_TYPE.LTI,
296
- termSyncEnabled: false,
297
- rosterSyncEnabled: false,
298
- gradePushEnabled: true,
299
- shouldDisplayCreateNonLtiGroupAlert: true
300
- }
348
+
349
+ export const defaultExternalProviders = {
350
+ '1': {
351
+ id: 1,
352
+ typename: EXTERNAL_PROVIDER_TYPE.UNITIME,
353
+ termSyncEnabled: true,
354
+ rosterSyncEnabled: true,
355
+ gradePushEnabled: false,
356
+ shouldDisplayCreateNonLtiGroupAlert: false
357
+ },
358
+ '2': {
359
+ id: 2,
360
+ typename: EXTERNAL_PROVIDER_TYPE.LTI,
361
+ termSyncEnabled: false,
362
+ rosterSyncEnabled: false,
363
+ gradePushEnabled: true,
364
+ shouldDisplayCreateNonLtiGroupAlert: true
365
+ }
301
366
  };
302
- exports.defaultExternalTerms = {
303
- '1': {
304
- id: 1,
305
- externalProviderId: 1,
306
- externalId: 'foo',
307
- name: 'UniTime Fall Term',
308
- startDate: exports.currentDates.startDate,
309
- endDate: exports.currentDates.endDate
310
- }
367
+ export const defaultExternalTerms = {
368
+ '1': {
369
+ id: 1,
370
+ externalProviderId: 1,
371
+ externalId: 'foo',
372
+ name: 'UniTime Fall Term',
373
+ startDate: currentDates.startDate,
374
+ endDate: currentDates.endDate
375
+ }
311
376
  };
377
+
312
378
  //#endregion ExternalTerms + ExternalProviders
379
+
313
380
  //#region FetchErrorData
314
- exports.internalServerErrorData = {
315
- status: types_1.HTTP_STATUS_CODE.INTERNAL_SERVER_ERROR,
316
- title: 'Error',
317
- detail: 'An error has occurred.'
381
+
382
+ export const internalServerErrorData = {
383
+ status: HTTP_STATUS_CODE.INTERNAL_SERVER_ERROR,
384
+ title: 'Error',
385
+ detail: 'An error has occurred.'
318
386
  };
319
- exports.requestTimedOutErrorData = {
320
- status: types_1.HTTP_STATUS_CODE.REQUEST_TIMEOUT,
321
- title: 'Request Timeout',
322
- detail: null
387
+ export const requestTimedOutErrorData = {
388
+ status: HTTP_STATUS_CODE.REQUEST_TIMEOUT,
389
+ title: 'Request Timeout',
390
+ detail: null
323
391
  };
324
- exports.forbiddenErrorData = {
325
- status: types_1.HTTP_STATUS_CODE.FORBIDDEN,
326
- title: 'Forbidden',
327
- detail: 'Your request has been denied. You do not have access.'
392
+ export const forbiddenErrorData = {
393
+ status: HTTP_STATUS_CODE.FORBIDDEN,
394
+ title: 'Forbidden',
395
+ detail: 'Your request has been denied. You do not have access.'
328
396
  };
329
- exports.unauthorizedErrorData = {
330
- status: types_1.HTTP_STATUS_CODE.UNAUTHORIZED,
331
- title: 'Unauthorized',
332
- detail: 'Your request is unauthorized. You must authenticate.'
397
+ export const unauthorizedErrorData = {
398
+ status: HTTP_STATUS_CODE.UNAUTHORIZED,
399
+ title: 'Unauthorized',
400
+ detail: 'Your request is unauthorized. You must authenticate.'
333
401
  };
334
- exports.badRequestErrorData = {
335
- status: types_1.HTTP_STATUS_CODE.BAD_REQUEST,
336
- title: 'Bad Request',
337
- detail: 'Reasons'
402
+ export const badRequestErrorData = {
403
+ status: HTTP_STATUS_CODE.BAD_REQUEST,
404
+ title: 'Bad Request',
405
+ detail: 'Reasons'
338
406
  };
339
- exports.badRequestFullErrorData = {
340
- status: types_1.HTTP_STATUS_CODE.BAD_REQUEST,
341
- title: 'Bad Request',
342
- detail: 'Reasons',
343
- // include all optional properties
344
- type: 'https://tools.ietf.org/html/rfc7231#section-6.5.1',
345
- instance: 'instance',
346
- traceId: '00-3914b43b452b94e3ff4c327922880a03-4cfed6fe42afdd8f-00',
347
- errors: {
348
- password: ['The Password must be at least 6 characters long.']
349
- }
407
+ export const badRequestFullErrorData = {
408
+ status: HTTP_STATUS_CODE.BAD_REQUEST,
409
+ title: 'Bad Request',
410
+ detail: 'Reasons',
411
+ // include all optional properties
412
+ type: 'https://tools.ietf.org/html/rfc7231#section-6.5.1',
413
+ instance: 'instance',
414
+ traceId: '00-3914b43b452b94e3ff4c327922880a03-4cfed6fe42afdd8f-00',
415
+ errors: {
416
+ password: ['The Password must be at least 6 characters long.']
417
+ }
350
418
  };
419
+
351
420
  //#endregion FetchErrorData
421
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtZXJnZSIsIkVYVEVSTkFMX1BST1ZJREVSX1RZUEUiLCJIVFRQX1NUQVRVU19DT0RFIiwiQkFTRV9ST0xFIiwiVElFUiIsImRlZmF1bHRBcHBDb25maWd1cmF0aW9uIiwiTk9ERV9FTlYiLCJBUFBfTkFNRSIsIkxPQ0FMIiwiQVBJX0JBU0VfVVJMIiwiUk9PVF9ET01BSU4iLCJDTElFTlRfSUQiLCJDTElFTlRfU0VDUkVUIiwiSVNfRE9XTlRJTUUiLCJMTVNfTkFNRSIsIkdSQURBQkxFX0RFU0NSSVBUT1IiLCJkZWZhdWx0TG9jYXRpb24iLCJoYXNoIiwiaG9zdCIsImhvc3RuYW1lIiwiaHJlZiIsInBhdGhuYW1lIiwicG9ydCIsInByb3RvY29sIiwic2VhcmNoIiwibW9ja0hpc3RvcnkiLCJsZW5ndGgiLCJzY3JvbGxSZXN0b3JhdGlvbiIsInN0YXRlIiwiYmFjayIsImplc3QiLCJmbiIsImZvcndhcmQiLCJnbyIsInB1c2hTdGF0ZSIsInJlcGxhY2VTdGF0ZSIsInBhc3REYXRlcyIsInN0YXJ0RGF0ZSIsImVuZERhdGUiLCJjdXJyZW50RGF0ZXMiLCJkZWZhdWx0RGF0ZSIsImRlZmF1bHRVc2VyIiwidXNlckluZm8iLCJpZCIsImZpcnN0TmFtZSIsImxhc3ROYW1lIiwiZW1haWwiLCJ1aWQiLCJhY3Rpdml0aWVzIiwicm9sZXMiLCJkYXRlRGVtb0dlbmVyYXRpb25TdWNjZWVkZWQiLCJkYXRlU3RvcmVkIiwiZGF0ZUxhc3RVcGRhdGVkIiwiaXNJbXBlcnNvbmF0ZWQiLCJjYXJlZXJBY2NvdW50QWxpYXMiLCJlbXBsb3llZU51bWJlciIsInVzZXJOYW1lIiwicHVpZCIsImxvY2tEb3duQnJvd3NlclRlc3RMYXVuY2hVcmwiLCJkZWZhdWx0TmFtZWxlc3NVc2VySW5mbyIsImRlZmF1bHROYW1lZFVzZXJJbmZvIiwibW9ja1VzZXIiLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJkZWZhdWx0R3JvdXBPd25lclVzZXJJbmZvIiwiZGVmYXVsdEdyb3VwT3duZXIiLCJ1c2VySWQiLCJlbnRpdHlJZCIsInJvbGUiLCJHUk9VUF9PV05FUiIsImlzRXh0ZXJuYWwiLCJkZWZhdWx0TmFtZWxlc3NHcm91cExlYXJuZXIiLCJHUk9VUF9MRUFSTkVSIiwiZGVmYXVsdE5hbWVkR3JvdXBMZWFybmVyIiwiZGVmYXVsdEdyb3VwTGVhcm5lciIsImRlZmF1bHRFeHRlcm5hbEdyb3VwTGVhcm5lciIsImRlZmF1bHRHcm91cEdyYWRlciIsIkdST1VQX0dSQURFUiIsImRlZmF1bHRHcm91cFVzZXJSb2xlcyIsImRlZmF1bHRBZG1pblVzZXJSb2xlcyIsIkFETUlOIiwiZGVmYXVsdEdyb3VwIiwib3duZXJzIiwiZ3JhZGVycyIsIm5hbWUiLCJleHRlcm5hbFRlcm1JZCIsImlzRGVsZXRlZCIsImlzUm9zdGVyU3luY0VuYWJsZWQiLCJleHRlcm5hbEdyb3VwcyIsIm1vY2tHcm91cHMiLCJtb2NrU3luY2VkR3JvdXBzIiwicm9zdGVyU3luY0VuYWJsZWRHcm91cCIsIm1vY2tMdGlHcm91cHMiLCJsdGlHcm91cCIsImV4dGVybmFsUHJvdmlkZXJJZCIsImdyb3VwSWQiLCJkZXNjcmlwdGlvbiIsImdyYWRlc1VybCIsInJvc3RlclVybCIsImlzQXV0b0dyYWRlUHVzaEVuYWJsZWQiLCJleHRlcm5hbElkIiwidHlwZW5hbWUiLCJtb2NrVGVybUdyb3VwcyIsImdyb3VwIiwibW9ja1Rlcm1BbmRVbmlUaW1lR3JvdXBzIiwibW9ja1Bhc3RHcm91cHMiLCJwYXN0R3JvdXAiLCJtb2NrUGFzdEFuZEN1cnJlbnRHcm91cHMiLCJjdXJyZW50R3JvdXAiLCJkZWZhdWx0RXh0ZXJuYWxQcm92aWRlcnMiLCJVTklUSU1FIiwidGVybVN5bmNFbmFibGVkIiwicm9zdGVyU3luY0VuYWJsZWQiLCJncmFkZVB1c2hFbmFibGVkIiwic2hvdWxkRGlzcGxheUNyZWF0ZU5vbkx0aUdyb3VwQWxlcnQiLCJMVEkiLCJkZWZhdWx0RXh0ZXJuYWxUZXJtcyIsImludGVybmFsU2VydmVyRXJyb3JEYXRhIiwic3RhdHVzIiwiSU5URVJOQUxfU0VSVkVSX0VSUk9SIiwidGl0bGUiLCJkZXRhaWwiLCJyZXF1ZXN0VGltZWRPdXRFcnJvckRhdGEiLCJSRVFVRVNUX1RJTUVPVVQiLCJmb3JiaWRkZW5FcnJvckRhdGEiLCJGT1JCSURERU4iLCJ1bmF1dGhvcml6ZWRFcnJvckRhdGEiLCJVTkFVVEhPUklaRUQiLCJiYWRSZXF1ZXN0RXJyb3JEYXRhIiwiQkFEX1JFUVVFU1QiLCJiYWRSZXF1ZXN0RnVsbEVycm9yRGF0YSIsInR5cGUiLCJpbnN0YW5jZSIsInRyYWNlSWQiLCJlcnJvcnMiLCJwYXNzd29yZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdGFudHMvbW9ja0RhdGEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWVyZ2UgfSBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBFWFRFUk5BTF9QUk9WSURFUl9UWVBFIH0gZnJvbSAnLi4vY29uc3RhbnRzL2V4dGVybmFsUHJvdmlkZXJUeXBlJ1xuaW1wb3J0IHtcblx0QXBwQ29uZmlndXJhdGlvbixcblx0RXh0ZXJuYWxQcm92aWRlcixcblx0RXh0ZXJuYWxUZXJtLFxuXHRGZXRjaEVycm9yRGF0YSxcblx0R3JvdXAsXG5cdEdyb3VwVXNlclJvbGUsXG5cdEhUVFBfU1RBVFVTX0NPREUsXG5cdE1vZGVsQ29sbGVjdGlvbixcblx0U2ltcGxlTG9jYXRpb24sXG5cdFVzZXJJbmZvLFxuXHRVc2VyUm9sZVxufSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IEJBU0VfUk9MRSB9IGZyb20gJy4vYmFzZVJvbGUnXG5pbXBvcnQgeyBUSUVSIH0gZnJvbSAnLi90aWVyJ1xuXG4vLyNyZWdpb24gR2VuZXJhbFxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEFwcENvbmZpZ3VyYXRpb246IEFwcENvbmZpZ3VyYXRpb24gPSB7XG5cdE5PREVfRU5WOiAndGVzdCcsXG5cdEFQUF9OQU1FOiAnU3R1ZGlvS2l0Jyxcblx0VElFUjogVElFUi5MT0NBTCxcblx0QVBJX0JBU0VfVVJMOiAnJyxcblx0Uk9PVF9ET01BSU46ICdzdHVkaW9raXQub3JnJyxcblx0Q0xJRU5UX0lEOiAnd2ViJyxcblx0Q0xJRU5UX1NFQ1JFVDogJyoqKionLFxuXHRJU19ET1dOVElNRTogZmFsc2UsXG5cdExNU19OQU1FOiAnQnJpZ2h0c3BhY2UnLFxuXHRHUkFEQUJMRV9ERVNDUklQVE9SOiAnYXNzZXNzbWVudCdcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRMb2NhdGlvbjogU2ltcGxlTG9jYXRpb24gPSB7XG5cdGhhc2g6ICcnLFxuXHRob3N0OiAncHVyZHVlLmRldi5zdHVkaW9raXQub3JnJyxcblx0aG9zdG5hbWU6ICdwdXJkdWUuZGV2LnN0dWRpb2tpdC5vcmcnLFxuXHRocmVmOiAnaHR0cHM6Ly9wdXJkdWUuZGV2LnN0dWRpb2tpdC5vcmcvJyxcblx0cGF0aG5hbWU6ICcvJyxcblx0cG9ydDogJycsXG5cdHByb3RvY29sOiAnaHR0cHM6Jyxcblx0c2VhcmNoOiAnJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja0hpc3RvcnkoKTogSGlzdG9yeSB7XG5cdHJldHVybiB7XG5cdFx0bGVuZ3RoOiAwLFxuXHRcdHNjcm9sbFJlc3RvcmF0aW9uOiAnYXV0bycsXG5cdFx0c3RhdGU6IHt9LFxuXHRcdGJhY2s6IGplc3QuZm4oKSxcblx0XHRmb3J3YXJkOiBqZXN0LmZuKCksXG5cdFx0Z286IGplc3QuZm4oKSxcblx0XHRwdXNoU3RhdGU6IGplc3QuZm4oKSxcblx0XHRyZXBsYWNlU3RhdGU6IGplc3QuZm4oKVxuXHR9XG59XG5cbi8vI2VuZHJlZ2lvbiBHZW5lcmFsXG5cbi8vI3JlZ2lvbiBEYXRlc1xuXG4vKiogNS8xNS8xOCAtIDgvMTQvMTggKi9cbmV4cG9ydCBjb25zdCBwYXN0RGF0ZXMgPSB7XG5cdHN0YXJ0RGF0ZTogJzIwMTgtMDUtMTVUMDQ6MDA6MDAuMDAwWicsXG5cdGVuZERhdGU6ICcyMDE4LTA4LTE1VDAzOjU5OjU5Ljk5OVonXG59XG5cbi8qKiA4LzE1LzE4IC0gMTIvMzEvMTg6ICovXG5leHBvcnQgY29uc3QgY3VycmVudERhdGVzID0ge1xuXHRzdGFydERhdGU6ICcyMDE4LTA4LTE1VDA0OjAwOjAwLjAwMFonLFxuXHRlbmREYXRlOiAnMjAxOS0wMS0wMVQwNDo1OTo1OS45OTlaJ1xufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGRhdGUgYW5kIHRpbWUgZm9yIGFsbCB0ZXN0cy4gVXNlZCBieSB0aGUgJ21vY2tkYXRlJyBwYWNrYWdlLiBPbmUgbW9udGggaW50byBgY3VycmVudERhdGVzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHREYXRlID0gJzIwMTgtMDktMTVUMDQ6MDA6MDAuMDAwWidcblxuLy8jZW5kcmVnaW9uIERhdGVzXG5cbi8vI3JlZ2lvbiBVc2Vyc1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdFVzZXIgPSB7XG5cdHVzZXJJbmZvOiB7XG5cdFx0aWQ6ICcxJyxcblx0XHRmaXJzdE5hbWU6IG51bGwsXG5cdFx0bGFzdE5hbWU6IG51bGwsXG5cdFx0ZW1haWw6IG51bGwsXG5cdFx0dWlkOiBudWxsLFxuXHRcdGFjdGl2aXRpZXM6IFtdLFxuXHRcdHJvbGVzOiBbXSxcblx0XHRkYXRlRGVtb0dlbmVyYXRpb25TdWNjZWVkZWQ6IG51bGwsXG5cdFx0ZGF0ZVN0b3JlZDogZGVmYXVsdERhdGUsXG5cdFx0ZGF0ZUxhc3RVcGRhdGVkOiBkZWZhdWx0RGF0ZSxcblx0XHRpc0ltcGVyc29uYXRlZDogZmFsc2UsXG5cdFx0Y2FyZWVyQWNjb3VudEFsaWFzOiBudWxsLFxuXHRcdGVtcGxveWVlTnVtYmVyOiBudWxsLFxuXHRcdHVzZXJOYW1lOiAndGVzdCcsXG5cdFx0cHVpZDogbnVsbCxcblx0XHRsb2NrRG93bkJyb3dzZXJUZXN0TGF1bmNoVXJsOiBudWxsXG5cdH0gYXMgVXNlckluZm9cbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHROYW1lbGVzc1VzZXJJbmZvID0ge1xuXHQuLi5kZWZhdWx0VXNlci51c2VySW5mbyxcblx0Li4ue1xuXHRcdGVtYWlsOiAnbmlja2lAbWluYWouc3VwZXJiYXNzJyxcblx0XHR1aWQ6ICdubS1uYW1lbGVzcydcblx0fVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdE5hbWVkVXNlckluZm8gPSB7XG5cdC4uLmRlZmF1bHRVc2VyLnVzZXJJbmZvLFxuXHQuLi57XG5cdFx0Zmlyc3ROYW1lOiAnTmlja2knLFxuXHRcdGxhc3ROYW1lOiAnTWluYWonLFxuXHRcdHVpZDogJ25tLW5hbWVkJ1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb2NrVXNlcihhY3Rpdml0aWVzOiBzdHJpbmdbXSA9IFtdKTogeyB1c2VySW5mbzogVXNlckluZm8gfSB7XG5cdHJldHVybiBtZXJnZSh7IHVzZXJJbmZvOiB7IGFjdGl2aXRpZXMgfSB9LCBkZWZhdWx0VXNlcilcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRHcm91cE93bmVyVXNlckluZm86IFVzZXJJbmZvID0ge1xuXHQuLi5kZWZhdWx0VXNlci51c2VySW5mbyxcblx0aWQ6ICcyJyxcblx0Zmlyc3ROYW1lOiAnSmFuZScsXG5cdGxhc3ROYW1lOiAnRG9lJyxcblx0ZW1haWw6ICdqYW5lQGdtYWlsLmNvbSdcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRHcm91cE93bmVyOiBHcm91cFVzZXJSb2xlID0ge1xuXHRpZDogJzEnLFxuXHR1c2VySWQ6ICcyJyxcblx0Zmlyc3ROYW1lOiAnSmFuZScsXG5cdGxhc3ROYW1lOiAnRG9lJyxcblx0ZW1haWw6ICdqYW5lQGdtYWlsLmNvbScsXG5cdHVpZDogJ2phbmUnLFxuXHRlbnRpdHlJZDogMSxcblx0cm9sZTogQkFTRV9ST0xFLkdST1VQX09XTkVSLFxuXHRpc0V4dGVybmFsOiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdE5hbWVsZXNzR3JvdXBMZWFybmVyOiBHcm91cFVzZXJSb2xlID0ge1xuXHRpZDogJzInLFxuXHR1c2VySWQ6ICczJyxcblx0Zmlyc3ROYW1lOiBudWxsLFxuXHRsYXN0TmFtZTogbnVsbCxcblx0ZW1haWw6ICduaWNraUBtaW5hai5zdXBlcmJhc3MnLFxuXHR1aWQ6ICdubS1uYW1lbGVzcycsXG5cdGVudGl0eUlkOiAxLFxuXHRyb2xlOiBCQVNFX1JPTEUuR1JPVVBfTEVBUk5FUixcblx0aXNFeHRlcm5hbDogZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHROYW1lZEdyb3VwTGVhcm5lcjogR3JvdXBVc2VyUm9sZSA9IHtcblx0aWQ6ICczJyxcblx0dXNlcklkOiAnNCcsXG5cdGZpcnN0TmFtZTogJ05pY2tpJyxcblx0bGFzdE5hbWU6ICdNaW5haicsXG5cdGVtYWlsOiBudWxsLFxuXHR1aWQ6ICdubS1uYW1lZCcsXG5cdGVudGl0eUlkOiAxLFxuXHRyb2xlOiBCQVNFX1JPTEUuR1JPVVBfTEVBUk5FUixcblx0aXNFeHRlcm5hbDogZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRHcm91cExlYXJuZXI6IEdyb3VwVXNlclJvbGUgPSB7XG5cdGlkOiAnNCcsXG5cdHVzZXJJZDogJzUnLFxuXHRmaXJzdE5hbWU6ICdKb2UnLFxuXHRsYXN0TmFtZTogJ1NjaG1vZScsXG5cdGVtYWlsOiAnbm9wZUBnbWFpbC5jb20nLFxuXHR1aWQ6ICdub3BlJyxcblx0ZW50aXR5SWQ6IDEsXG5cdHJvbGU6IEJBU0VfUk9MRS5HUk9VUF9MRUFSTkVSLFxuXHRpc0V4dGVybmFsOiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEV4dGVybmFsR3JvdXBMZWFybmVyOiBHcm91cFVzZXJSb2xlID0ge1xuXHRpZDogJzUnLFxuXHR1c2VySWQ6ICc2Jyxcblx0Zmlyc3ROYW1lOiAnQm9iJyxcblx0bGFzdE5hbWU6ICdMb2JsYXcnLFxuXHRlbWFpbDogJ2JvYmxvYmxhd0BsYXdibG9nLmNvbScsXG5cdHVpZDogJ2JvYmxvYmxhdycsXG5cdGVudGl0eUlkOiAxLFxuXHRyb2xlOiBCQVNFX1JPTEUuR1JPVVBfTEVBUk5FUixcblx0aXNFeHRlcm5hbDogdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEdyb3VwR3JhZGVyOiBHcm91cFVzZXJSb2xlID0ge1xuXHRpZDogJzYnLFxuXHR1c2VySWQ6ICc3Jyxcblx0Zmlyc3ROYW1lOiAnR3JhZGVyJyxcblx0bGFzdE5hbWU6ICdNY0dyYWRlZmFjZScsXG5cdGVtYWlsOiAnZ3JhZGVyQGdtYWlsLmNvbScsXG5cdHVpZDogJ2dyYWRlcicsXG5cdGVudGl0eUlkOiAxLFxuXHRyb2xlOiBCQVNFX1JPTEUuR1JPVVBfR1JBREVSLFxuXHRpc0V4dGVybmFsOiBmYWxzZVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEdyb3VwVXNlclJvbGVzID0gW2RlZmF1bHRHcm91cE93bmVyLCBkZWZhdWx0R3JvdXBMZWFybmVyLCBkZWZhdWx0RXh0ZXJuYWxHcm91cExlYXJuZXJdXG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0QWRtaW5Vc2VyUm9sZXM6IFVzZXJSb2xlW10gPSBbXG5cdHtcblx0XHRpZDogJzEnLFxuXHRcdGZpcnN0TmFtZTogJ0pvZScsXG5cdFx0bGFzdE5hbWU6ICdTY2htbycsXG5cdFx0ZW1haWw6IG51bGwsXG5cdFx0dWlkOiBudWxsLFxuXHRcdHJvbGU6IEJBU0VfUk9MRS5BRE1JTlxuXHR9LFxuXHR7XG5cdFx0aWQ6ICcyJyxcblx0XHRmaXJzdE5hbWU6IG51bGwsXG5cdFx0bGFzdE5hbWU6IG51bGwsXG5cdFx0ZW1haWw6ICdjYXJseXNpbW9uQGNsb3Vkcy5pbi5jb2ZmZWUnLFxuXHRcdHVpZDogJ2Nhcmx5c2ltb24nLFxuXHRcdHJvbGU6IEJBU0VfUk9MRS5BRE1JTlxuXHR9XG5dXG5cbi8vI2VuZHJlZ2lvbiBVc2Vyc1xuXG4vLyNyZWdpb24gR3JvdXBzXG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0R3JvdXA6IEdyb3VwID0ge1xuXHRyb2xlczogW10sXG5cdGFjdGl2aXRpZXM6IFtdLFxuXHRvd25lcnM6IFtcblx0XHR7XG5cdFx0XHRpZDogJzEnLFxuXHRcdFx0ZW50aXR5SWQ6IDEsXG5cdFx0XHRmaXJzdE5hbWU6ICdJbnN0cnVjdG9yJyxcblx0XHRcdGxhc3ROYW1lOiAnTWNJbnN0cnVjdG9yJyxcblx0XHRcdGVtYWlsOiBudWxsLFxuXHRcdFx0dWlkOiBudWxsXG5cdFx0fVxuXHRdLFxuXHRncmFkZXJzOiBbXSxcblx0aWQ6IDEsXG5cdG5hbWU6ICdNY0dyb3VwJyxcblx0ZXh0ZXJuYWxUZXJtSWQ6IG51bGwsXG5cdHN0YXJ0RGF0ZTogY3VycmVudERhdGVzLnN0YXJ0RGF0ZSxcblx0ZW5kRGF0ZTogY3VycmVudERhdGVzLmVuZERhdGUsXG5cdGlzRGVsZXRlZDogZmFsc2UsXG5cdGlzUm9zdGVyU3luY0VuYWJsZWQ6IGZhbHNlLFxuXHRleHRlcm5hbEdyb3VwczogW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vY2tHcm91cHMoYWN0aXZpdGllczogc3RyaW5nW10gPSBbXSwgcm9sZXM6IHN0cmluZ1tdID0gW10pOiBNb2RlbENvbGxlY3Rpb248R3JvdXA+IHtcblx0cmV0dXJuIHsgJzEnOiBtZXJnZSh7IGFjdGl2aXRpZXMsIHJvbGVzIH0sIGRlZmF1bHRHcm91cCkgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1N5bmNlZEdyb3VwcyhhY3Rpdml0aWVzOiBzdHJpbmdbXSA9IFtdLCByb2xlczogc3RyaW5nW10gPSBbXSk6IE1vZGVsQ29sbGVjdGlvbjxHcm91cD4ge1xuXHRjb25zdCByb3N0ZXJTeW5jRW5hYmxlZEdyb3VwOiBHcm91cCA9IG1lcmdlKHsgYWN0aXZpdGllcywgcm9sZXMgfSwgZGVmYXVsdEdyb3VwKVxuXHRyb3N0ZXJTeW5jRW5hYmxlZEdyb3VwLmlzUm9zdGVyU3luY0VuYWJsZWQgPSB0cnVlXG5cdHJldHVybiB7ICcxJzogcm9zdGVyU3luY0VuYWJsZWRHcm91cCB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb2NrTHRpR3JvdXBzKGFjdGl2aXRpZXM6IHN0cmluZ1tdID0gW10sIHJvbGVzOiBzdHJpbmdbXSA9IFtdKTogTW9kZWxDb2xsZWN0aW9uPEdyb3VwPiB7XG5cdGNvbnN0IGx0aUdyb3VwOiBHcm91cCA9IG1lcmdlKHsgYWN0aXZpdGllcywgcm9sZXMgfSwgZGVmYXVsdEdyb3VwKVxuXHRsdGlHcm91cC5pc1Jvc3RlclN5bmNFbmFibGVkID0gdHJ1ZVxuXHRsdGlHcm91cC5leHRlcm5hbEdyb3VwcyA9IFtcblx0XHR7XG5cdFx0XHRpZDogMSxcblx0XHRcdGV4dGVybmFsUHJvdmlkZXJJZDogMixcblx0XHRcdGdyb3VwSWQ6IDEsXG5cdFx0XHR1c2VySWQ6ICcxJyxcblx0XHRcdG5hbWU6ICdMVEkgRXh0ZXJuYWxHcm91cCcsXG5cdFx0XHRkZXNjcmlwdGlvbjogJ0xUSSAxMDEnLFxuXHRcdFx0Z3JhZGVzVXJsOiAnd3d3Lmx0aS5vcmcnLFxuXHRcdFx0cm9zdGVyVXJsOiBudWxsLFxuXHRcdFx0aXNBdXRvR3JhZGVQdXNoRW5hYmxlZDogZmFsc2UsXG5cdFx0XHRleHRlcm5hbElkOiAnMScsXG5cdFx0XHR0eXBlbmFtZTogJ0V4dGVybmFsR3JvdXAnXG5cdFx0fVxuXHRdXG5cdHJldHVybiB7ICcxJzogbHRpR3JvdXAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1Rlcm1Hcm91cHMoYWN0aXZpdGllczogc3RyaW5nW10gPSBbXSwgcm9sZXM6IHN0cmluZ1tdID0gW10pOiBNb2RlbENvbGxlY3Rpb248R3JvdXA+IHtcblx0Y29uc3QgZ3JvdXA6IEdyb3VwID0gbWVyZ2UoeyBhY3Rpdml0aWVzLCByb2xlcyB9LCBkZWZhdWx0R3JvdXApXG5cdGdyb3VwLnN0YXJ0RGF0ZSA9IG51bGxcblx0Z3JvdXAuZW5kRGF0ZSA9IG51bGxcblx0Z3JvdXAuZXh0ZXJuYWxUZXJtSWQgPSAxXG5cdHJldHVybiB7ICcxJzogZ3JvdXAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1Rlcm1BbmRVbmlUaW1lR3JvdXBzKGFjdGl2aXRpZXM6IHN0cmluZ1tdID0gW10sIHJvbGVzOiBzdHJpbmdbXSA9IFtdKTogTW9kZWxDb2xsZWN0aW9uPEdyb3VwPiB7XG5cdGNvbnN0IGdyb3VwOiBHcm91cCA9IG1lcmdlKHsgYWN0aXZpdGllcywgcm9sZXMgfSwgZGVmYXVsdEdyb3VwKVxuXHRncm91cC5zdGFydERhdGUgPSBudWxsXG5cdGdyb3VwLmVuZERhdGUgPSBudWxsXG5cdGdyb3VwLmV4dGVybmFsVGVybUlkID0gMVxuXHRncm91cC5leHRlcm5hbEdyb3VwcyA9IFtcblx0XHR7XG5cdFx0XHRpZDogMSxcblx0XHRcdGV4dGVybmFsUHJvdmlkZXJJZDogMSxcblx0XHRcdGdyb3VwSWQ6IDEsXG5cdFx0XHR1c2VySWQ6ICcxJyxcblx0XHRcdG5hbWU6ICdVbmlUaW1lIEV4dGVybmFsR3JvdXAnLFxuXHRcdFx0ZGVzY3JpcHRpb246ICdVbmlUaW1lIDEwMScsXG5cdFx0XHRncmFkZXNVcmw6IG51bGwsXG5cdFx0XHRyb3N0ZXJVcmw6IG51bGwsXG5cdFx0XHRpc0F1dG9HcmFkZVB1c2hFbmFibGVkOiBmYWxzZSxcblx0XHRcdGV4dGVybmFsSWQ6ICcxJyxcblx0XHRcdHR5cGVuYW1lOiAnRXh0ZXJuYWxHcm91cCdcblx0XHR9XG5cdF1cblx0cmV0dXJuIHsgJzEnOiBncm91cCB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb2NrUGFzdEdyb3VwcyhhY3Rpdml0aWVzOiBzdHJpbmdbXSA9IFtdLCByb2xlczogc3RyaW5nW10gPSBbXSk6IE1vZGVsQ29sbGVjdGlvbjxHcm91cD4ge1xuXHRjb25zdCBwYXN0R3JvdXA6IEdyb3VwID0gbWVyZ2UoeyBhY3Rpdml0aWVzLCByb2xlcyB9LCBkZWZhdWx0R3JvdXAsIHBhc3REYXRlcylcblx0cmV0dXJuIHsgJzEnOiBwYXN0R3JvdXAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9ja1Bhc3RBbmRDdXJyZW50R3JvdXBzKGFjdGl2aXRpZXM6IHN0cmluZ1tdID0gW10sIHJvbGVzOiBzdHJpbmdbXSA9IFtdKTogTW9kZWxDb2xsZWN0aW9uPEdyb3VwPiB7XG5cdGNvbnN0IHBhc3RHcm91cDogR3JvdXAgPSBtZXJnZSh7IGFjdGl2aXRpZXMsIHJvbGVzIH0sIGRlZmF1bHRHcm91cCwgcGFzdERhdGVzKVxuXHRjb25zdCBjdXJyZW50R3JvdXA6IEdyb3VwID0gbWVyZ2UoXG5cdFx0eyBhY3Rpdml0aWVzLCByb2xlcyB9LFxuXHRcdGRlZmF1bHRHcm91cCxcblx0XHR7XG5cdFx0XHRpZDogJzInXG5cdFx0fSxcblx0XHRjdXJyZW50RGF0ZXNcblx0KVxuXHRyZXR1cm4geyAnMSc6IHBhc3RHcm91cCwgJzInOiBjdXJyZW50R3JvdXAgfVxufVxuXG4vLyNlbmRyZWdpb24gR3JvdXBzXG5cbi8vI3JlZ2lvbiBFeHRlcm5hbFRlcm1zICsgRXh0ZXJuYWxQcm92aWRlcnNcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRFeHRlcm5hbFByb3ZpZGVyczogTW9kZWxDb2xsZWN0aW9uPEV4dGVybmFsUHJvdmlkZXI+ID0ge1xuXHQnMSc6IHtcblx0XHRpZDogMSxcblx0XHR0eXBlbmFtZTogRVhURVJOQUxfUFJPVklERVJfVFlQRS5VTklUSU1FLFxuXHRcdHRlcm1TeW5jRW5hYmxlZDogdHJ1ZSxcblx0XHRyb3N0ZXJTeW5jRW5hYmxlZDogdHJ1ZSxcblx0XHRncmFkZVB1c2hFbmFibGVkOiBmYWxzZSxcblx0XHRzaG91bGREaXNwbGF5Q3JlYXRlTm9uTHRpR3JvdXBBbGVydDogZmFsc2Vcblx0fSxcblx0JzInOiB7XG5cdFx0aWQ6IDIsXG5cdFx0dHlwZW5hbWU6IEVYVEVSTkFMX1BST1ZJREVSX1RZUEUuTFRJLFxuXHRcdHRlcm1TeW5jRW5hYmxlZDogZmFsc2UsXG5cdFx0cm9zdGVyU3luY0VuYWJsZWQ6IGZhbHNlLFxuXHRcdGdyYWRlUHVzaEVuYWJsZWQ6IHRydWUsXG5cdFx0c2hvdWxkRGlzcGxheUNyZWF0ZU5vbkx0aUdyb3VwQWxlcnQ6IHRydWVcblx0fVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEV4dGVybmFsVGVybXM6IE1vZGVsQ29sbGVjdGlvbjxFeHRlcm5hbFRlcm0+ID0ge1xuXHQnMSc6IHtcblx0XHRpZDogMSxcblx0XHRleHRlcm5hbFByb3ZpZGVySWQ6IDEsXG5cdFx0ZXh0ZXJuYWxJZDogJ2ZvbycsXG5cdFx0bmFtZTogJ1VuaVRpbWUgRmFsbCBUZXJtJyxcblx0XHRzdGFydERhdGU6IGN1cnJlbnREYXRlcy5zdGFydERhdGUsXG5cdFx0ZW5kRGF0ZTogY3VycmVudERhdGVzLmVuZERhdGVcblx0fVxufVxuXG4vLyNlbmRyZWdpb24gRXh0ZXJuYWxUZXJtcyArIEV4dGVybmFsUHJvdmlkZXJzXG5cbi8vI3JlZ2lvbiBGZXRjaEVycm9yRGF0YVxuXG5leHBvcnQgY29uc3QgaW50ZXJuYWxTZXJ2ZXJFcnJvckRhdGE6IEZldGNoRXJyb3JEYXRhID0ge1xuXHRzdGF0dXM6IEhUVFBfU1RBVFVTX0NPREUuSU5URVJOQUxfU0VSVkVSX0VSUk9SLFxuXHR0aXRsZTogJ0Vycm9yJyxcblx0ZGV0YWlsOiAnQW4gZXJyb3IgaGFzIG9jY3VycmVkLidcbn1cblxuZXhwb3J0IGNvbnN0IHJlcXVlc3RUaW1lZE91dEVycm9yRGF0YTogRmV0Y2hFcnJvckRhdGEgPSB7XG5cdHN0YXR1czogSFRUUF9TVEFUVVNfQ09ERS5SRVFVRVNUX1RJTUVPVVQsXG5cdHRpdGxlOiAnUmVxdWVzdCBUaW1lb3V0Jyxcblx0ZGV0YWlsOiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBmb3JiaWRkZW5FcnJvckRhdGE6IEZldGNoRXJyb3JEYXRhID0ge1xuXHRzdGF0dXM6IEhUVFBfU1RBVFVTX0NPREUuRk9SQklEREVOLFxuXHR0aXRsZTogJ0ZvcmJpZGRlbicsXG5cdGRldGFpbDogJ1lvdXIgcmVxdWVzdCBoYXMgYmVlbiBkZW5pZWQuIFlvdSBkbyBub3QgaGF2ZSBhY2Nlc3MuJ1xufVxuXG5leHBvcnQgY29uc3QgdW5hdXRob3JpemVkRXJyb3JEYXRhOiBGZXRjaEVycm9yRGF0YSA9IHtcblx0c3RhdHVzOiBIVFRQX1NUQVRVU19DT0RFLlVOQVVUSE9SSVpFRCxcblx0dGl0bGU6ICdVbmF1dGhvcml6ZWQnLFxuXHRkZXRhaWw6ICdZb3VyIHJlcXVlc3QgaXMgdW5hdXRob3JpemVkLiBZb3UgbXVzdCBhdXRoZW50aWNhdGUuJ1xufVxuXG5leHBvcnQgY29uc3QgYmFkUmVxdWVzdEVycm9yRGF0YTogRmV0Y2hFcnJvckRhdGEgPSB7XG5cdHN0YXR1czogSFRUUF9TVEFUVVNfQ09ERS5CQURfUkVRVUVTVCxcblx0dGl0bGU6ICdCYWQgUmVxdWVzdCcsXG5cdGRldGFpbDogJ1JlYXNvbnMnXG59XG5cbmV4cG9ydCBjb25zdCBiYWRSZXF1ZXN0RnVsbEVycm9yRGF0YTogRmV0Y2hFcnJvckRhdGEgPSB7XG5cdHN0YXR1czogSFRUUF9TVEFUVVNfQ09ERS5CQURfUkVRVUVTVCxcblx0dGl0bGU6ICdCYWQgUmVxdWVzdCcsXG5cdGRldGFpbDogJ1JlYXNvbnMnLFxuXHQvLyBpbmNsdWRlIGFsbCBvcHRpb25hbCBwcm9wZXJ0aWVzXG5cdHR5cGU6ICdodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNS4xJyxcblx0aW5zdGFuY2U6ICdpbnN0YW5jZScsXG5cdHRyYWNlSWQ6ICcwMC0zOTE0YjQzYjQ1MmI5NGUzZmY0YzMyNzkyMjg4MGEwMy00Y2ZlZDZmZTQyYWZkZDhmLTAwJyxcblx0ZXJyb3JzOiB7XG5cdFx0cGFzc3dvcmQ6IFsnVGhlIFBhc3N3b3JkIG11c3QgYmUgYXQgbGVhc3QgNiBjaGFyYWN0ZXJzIGxvbmcuJ11cblx0fVxufVxuXG4vLyNlbmRyZWdpb24gRmV0Y2hFcnJvckRhdGFcbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsS0FBSyxRQUFRLFFBQVE7QUFDOUIsU0FBU0Msc0JBQXNCLFFBQVEsbUNBQW1DO0FBQzFFLFNBT0NDLGdCQUFnQixRQUtWLFVBQVU7QUFDakIsU0FBU0MsU0FBUyxRQUFRLFlBQVk7QUFDdEMsU0FBU0MsSUFBSSxRQUFRLFFBQVE7O0FBRTdCOztBQUVBLE9BQU8sTUFBTUMsdUJBQXlDLEdBQUc7RUFDeERDLFFBQVEsRUFBRSxNQUFNO0VBQ2hCQyxRQUFRLEVBQUUsV0FBVztFQUNyQkgsSUFBSSxFQUFFQSxJQUFJLENBQUNJLEtBQUs7RUFDaEJDLFlBQVksRUFBRSxFQUFFO0VB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