studiokit-scaffolding-js 7.0.12-next.2.9 → 7.0.13-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +137 -137
  3. package/lib/components/ActionList.d.ts +2 -2
  4. package/lib/components/ActionList.js +87 -166
  5. package/lib/components/AlertDialog.d.ts +3 -3
  6. package/lib/components/AlertDialog.js +18 -133
  7. package/lib/components/AlertWithIcon.js +52 -93
  8. package/lib/components/ConnectedModal.d.ts +2 -1
  9. package/lib/components/ConnectedModal.js +37 -43
  10. package/lib/components/Dropdowns/GroupsDropdown.d.ts +4 -4
  11. package/lib/components/Dropdowns/GroupsDropdown.js +82 -69
  12. package/lib/components/Dropdowns/ManagedNavDropdown.d.ts +2 -2
  13. package/lib/components/Dropdowns/ManagedNavDropdown.js +111 -99
  14. package/lib/components/Dropdowns/UserDropdown.js +70 -109
  15. package/lib/components/Dropdowns/index.js +11 -27
  16. package/lib/components/EntityOwnerList.d.ts +3 -3
  17. package/lib/components/EntityOwnerList.js +60 -52
  18. package/lib/components/Error.js +27 -107
  19. package/lib/components/ErrorBoundary.js +94 -133
  20. package/lib/components/ErrorMessage.d.ts +2 -2
  21. package/lib/components/ErrorMessage.js +14 -44
  22. package/lib/components/Forms/DateField.d.ts +2 -2
  23. package/lib/components/Forms/DateField.js +95 -63
  24. package/lib/components/Forms/TimeField.d.ts +2 -2
  25. package/lib/components/Forms/TimeField.js +108 -84
  26. package/lib/components/Forms/index.js +13 -27
  27. package/lib/components/Groups/CreateEditCopySaveButtons.d.ts +2 -2
  28. package/lib/components/Groups/CreateEditCopySaveButtons.js +14 -102
  29. package/lib/components/Groups/ExternalGroups/Attach.d.ts +7 -6
  30. package/lib/components/Groups/ExternalGroups/Attach.js +188 -213
  31. package/lib/components/Groups/ExternalGroups/Table.js +76 -183
  32. package/lib/components/Groups/GroupCreateOrEditCommonProps.js +1 -5
  33. package/lib/components/Groups/RosterSyncInfo.js +49 -140
  34. package/lib/components/HOC/AccessibleAppComponent.d.ts +2 -2
  35. package/lib/components/HOC/AccessibleAppComponent.js +124 -101
  36. package/lib/components/HOC/ActivityRequiredComponent.d.ts +14 -14
  37. package/lib/components/HOC/ActivityRequiredComponent.js +107 -93
  38. package/lib/components/HOC/AsyncComponent.d.ts +9 -9
  39. package/lib/components/HOC/AsyncComponent.js +129 -53
  40. package/lib/components/HOC/AuthenticatedComponent.d.ts +4 -4
  41. package/lib/components/HOC/AuthenticatedComponent.js +96 -59
  42. package/lib/components/HOC/CollectionComponent.d.ts +12 -12
  43. package/lib/components/HOC/CollectionComponent.js +171 -171
  44. package/lib/components/HOC/CollectionFirstItemComponent.d.ts +13 -13
  45. package/lib/components/HOC/CollectionFirstItemComponent.js +94 -52
  46. package/lib/components/HOC/CollectionItemComponent.d.ts +9 -9
  47. package/lib/components/HOC/CollectionItemComponent.js +168 -169
  48. package/lib/components/HOC/ConnectedModalComponent.d.ts +9 -9
  49. package/lib/components/HOC/ConnectedModalComponent.js +140 -110
  50. package/lib/components/HOC/DataDependentComponent.d.ts +55 -3
  51. package/lib/components/HOC/DataDependentComponent.js +79 -30
  52. package/lib/components/HOC/EntityComponent.d.ts +13 -13
  53. package/lib/components/HOC/EntityComponent.js +112 -74
  54. package/lib/components/HOC/FullscreenModalComponent.d.ts +9 -9
  55. package/lib/components/HOC/FullscreenModalComponent.js +185 -165
  56. package/lib/components/HOC/GroupActivityRequiredComponent.d.ts +2 -2
  57. package/lib/components/HOC/GroupActivityRequiredComponent.js +47 -48
  58. package/lib/components/HOC/GuidComponent.d.ts +1 -1
  59. package/lib/components/HOC/GuidComponent.js +68 -29
  60. package/lib/components/HOC/ModelContextDependencyVerifyComponent.d.ts +29 -28
  61. package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +65 -42
  62. package/lib/components/HOC/ModelErrorRedirectComponent.d.ts +10 -10
  63. package/lib/components/HOC/ModelErrorRedirectComponent.js +94 -51
  64. package/lib/components/HOC/SearchPersistorComponent.d.ts +4 -4
  65. package/lib/components/HOC/SearchPersistorComponent.js +216 -243
  66. package/lib/components/HOC/UnauthenticatedComponent.d.ts +12 -12
  67. package/lib/components/HOC/UnauthenticatedComponent.js +82 -37
  68. package/lib/components/HOC/UserComponent.d.ts +1 -1
  69. package/lib/components/HOC/UserComponent.js +11 -12
  70. package/lib/components/Icons/IconAlphaList.js +20 -34
  71. package/lib/components/Icons/IconExternalUser.js +20 -34
  72. package/lib/components/Icons/IconImpersonation.js +20 -34
  73. package/lib/components/Icons/IconStopImpersonating.js +20 -34
  74. package/lib/components/Icons/IconTable.js +21 -35
  75. package/lib/components/Icons/IconTableDeleteCol.js +20 -34
  76. package/lib/components/Icons/IconTableDeleteRow.js +20 -34
  77. package/lib/components/Icons/IconTableInsertCol.js +20 -34
  78. package/lib/components/Icons/IconTableInsertRow.js +20 -34
  79. package/lib/components/Impersonation/Button.d.ts +2 -2
  80. package/lib/components/Impersonation/Button.js +56 -76
  81. package/lib/components/Impersonation/Link.d.ts +2 -2
  82. package/lib/components/Impersonation/Link.js +53 -76
  83. package/lib/components/Impersonation/UserDetail.css +22 -22
  84. package/lib/components/Impersonation/UserDetail.d.ts +2 -2
  85. package/lib/components/Impersonation/UserDetail.js +17 -66
  86. package/lib/components/Loading.js +21 -27
  87. package/lib/components/LockDownBrowser/Check.js +107 -194
  88. package/lib/components/LockDownBrowser/ExitButton.js +14 -27
  89. package/lib/components/LockDownBrowser/Launch.js +85 -70
  90. package/lib/components/Lti/Confirm.js +33 -152
  91. package/lib/components/Lti/CreateNonLtiGroupAlertDialog.d.ts +2 -4
  92. package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +78 -170
  93. package/lib/components/Lti/Launch.js +49 -105
  94. package/lib/components/Lti/LaunchGroup.js +39 -85
  95. package/lib/components/ManageTable.d.ts +2 -1
  96. package/lib/components/ManageTable.js +104 -309
  97. package/lib/components/ManageTableNoDataComponent.js +22 -42
  98. package/lib/components/NewVersionAlert.d.ts +2 -2
  99. package/lib/components/NewVersionAlert.js +91 -82
  100. package/lib/components/NotFound.js +28 -87
  101. package/lib/components/Notifications.d.ts +4 -4
  102. package/lib/components/Notifications.js +169 -187
  103. package/lib/components/PaginationNextButton.js +21 -33
  104. package/lib/components/PaginationPreviousButton.js +21 -33
  105. package/lib/components/Quill/CustomToolbar.d.ts +2 -2
  106. package/lib/components/Quill/CustomToolbar.js +257 -432
  107. package/lib/components/Quill/Formats/Image.d.ts +25 -10
  108. package/lib/components/Quill/Formats/Image.js +86 -80
  109. package/lib/components/Quill/Formats/List.d.ts +3 -6
  110. package/lib/components/Quill/Formats/List.js +74 -52
  111. package/lib/components/Quill/Formats/Video.d.ts +1 -2
  112. package/lib/components/Quill/Formats/Video.js +45 -31
  113. package/lib/components/Quill/ImageDropModule.d.ts +1 -1
  114. package/lib/components/Quill/ImageDropModule.js +122 -149
  115. package/lib/components/Quill/ImageWarning.d.ts +2 -2
  116. package/lib/components/Quill/ImageWarning.js +32 -45
  117. package/lib/components/Quill/ImageWithAltTextModal.d.ts +1 -0
  118. package/lib/components/Quill/ImageWithAltTextModal.js +141 -425
  119. package/lib/components/Quill/Specs/CustomImageSpec.d.ts +1 -1
  120. package/lib/components/Quill/Specs/CustomImageSpec.js +51 -43
  121. package/lib/components/Quill/Specs/CustomVideoSpec.d.ts +1 -1
  122. package/lib/components/Quill/Specs/CustomVideoSpec.js +44 -35
  123. package/lib/components/Quill/TableModule/Blots/BaseTableBlot.d.ts +1 -2
  124. package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +121 -105
  125. package/lib/components/Quill/TableModule/Blots/TableBlot.js +66 -53
  126. package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +67 -54
  127. package/lib/components/Quill/TableModule/Blots/TableCellBlot.d.ts +1 -1
  128. package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +241 -225
  129. package/lib/components/Quill/TableModule/Blots/TableContainer.js +99 -82
  130. package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +87 -76
  131. package/lib/components/Quill/TableModule/constants.js +41 -45
  132. package/lib/components/Quill/TableModule/index.css +171 -171
  133. package/lib/components/Quill/TableModule/index.d.ts +5 -14
  134. package/lib/components/Quill/TableModule/index.js +313 -373
  135. package/lib/components/Quill/TableModule/utils.js +45 -45
  136. package/lib/components/Quill/accessibilityFix.d.ts +1 -0
  137. package/lib/components/Quill/accessibilityFix.js +251 -235
  138. package/lib/components/Quill/index.js +32 -36
  139. package/lib/components/RefreshIndicator/Bordered.js +32 -48
  140. package/lib/components/RefreshIndicator/Inline.js +33 -48
  141. package/lib/components/RefreshIndicator/index.d.ts +2 -2
  142. package/lib/components/RefreshIndicator/index.js +113 -263
  143. package/lib/components/SearchControls.js +31 -216
  144. package/lib/components/SentryRoute.js +23 -10
  145. package/lib/components/Tables/RoleFilter.d.ts +4 -3
  146. package/lib/components/Tables/RoleFilter.js +46 -71
  147. package/lib/components/Tables/TextFilter.d.ts +3 -2
  148. package/lib/components/Tables/TextFilter.js +20 -62
  149. package/lib/components/UserRoles/Add.d.ts +3 -3
  150. package/lib/components/UserRoles/Add.js +161 -199
  151. package/lib/components/UserRoles/Context.js +9 -11
  152. package/lib/components/UserRoles/RoleCell.js +100 -180
  153. package/lib/components/UserRoles/Select.js +54 -157
  154. package/lib/components/UserRoles/Table.js +102 -221
  155. package/lib/components/UserRoles/index.d.ts +6 -6
  156. package/lib/components/UserRoles/index.js +466 -537
  157. package/lib/config/eslint/index.cjs +21 -0
  158. package/lib/config/eslint/lib/order.cjs +22 -0
  159. package/lib/config/eslint/lib/prettier.cjs +18 -0
  160. package/lib/config/eslint/lib/typescript.cjs +86 -0
  161. package/lib/config/eslint/react.cjs +9 -0
  162. package/lib/constants/baseActivity.js +26 -30
  163. package/lib/constants/baseRole.js +10 -14
  164. package/lib/constants/configuration.d.ts +1 -1
  165. package/lib/constants/configuration.js +39 -43
  166. package/lib/constants/externalProviderType.js +6 -10
  167. package/lib/constants/fetchErrorData.js +11 -15
  168. package/lib/constants/index.js +23 -137
  169. package/lib/constants/lockDownBrowser.js +24 -28
  170. package/lib/constants/mockData.d.ts +6 -4
  171. package/lib/constants/mockData.js +326 -385
  172. package/lib/constants/modelStatus.js +11 -15
  173. package/lib/constants/notificationType.js +8 -12
  174. package/lib/constants/operatingSystem.js +8 -12
  175. package/lib/constants/shard.js +7 -11
  176. package/lib/constants/table.js +21 -21
  177. package/lib/constants/tier.js +8 -12
  178. package/lib/constants/userRole.d.ts +2 -1
  179. package/lib/constants/userRole.js +17 -15
  180. package/lib/css/base/_base.css +98 -98
  181. package/lib/css/base/_typography.css +130 -130
  182. package/lib/css/components/_alert.css +86 -86
  183. package/lib/css/components/_bootstrap-grid.css +28 -28
  184. package/lib/css/components/_buttons.css +397 -397
  185. package/lib/css/components/_forms.css +101 -101
  186. package/lib/css/components/_menu.css +56 -56
  187. package/lib/css/components/_modals.css +46 -46
  188. package/lib/css/components/_quill.css +315 -315
  189. package/lib/css/components/_tables.css +497 -497
  190. package/lib/css/components/_tags.css +12 -12
  191. package/lib/css/index-with-variables.css +15 -15
  192. package/lib/css/index.css +14 -14
  193. package/lib/css/utils/_border.css +463 -463
  194. package/lib/css/utils/_color.css +317 -317
  195. package/lib/css/utils/_display.css +312 -305
  196. package/lib/css/utils/_general.css +48 -48
  197. package/lib/css/utils/_icon.css +16 -16
  198. package/lib/css/utils/_text.css +24 -25
  199. package/lib/css/utils/_width.css +60 -60
  200. package/lib/css/variables.css +84 -84
  201. package/lib/endpointMappings.js +193 -197
  202. package/lib/hooks/useCollection.js +65 -83
  203. package/lib/hooks/useCollectionConfiguration.d.ts +1 -0
  204. package/lib/hooks/useCollectionConfiguration.js +88 -185
  205. package/lib/hooks/useCollectionItem.js +58 -155
  206. package/lib/hooks/useGuid.js +10 -21
  207. package/lib/hooks/usePrevious.d.ts +1 -24
  208. package/lib/hooks/usePrevious.js +14 -84
  209. package/lib/index.js +36 -156
  210. package/lib/redux/actionCreator.d.ts +6 -6
  211. package/lib/redux/actionCreator.js +40 -51
  212. package/lib/redux/actions/AuthAction.js +31 -44
  213. package/lib/redux/actions/ModalAction.d.ts +1 -1
  214. package/lib/redux/actions/ModalAction.js +6 -10
  215. package/lib/redux/actions/ModelAction.d.ts +1 -1
  216. package/lib/redux/actions/ModelAction.js +49 -77
  217. package/lib/redux/actions/NotificationAction.js +6 -10
  218. package/lib/redux/actions/SearchAction.js +5 -9
  219. package/lib/redux/actions/index.js +16 -60
  220. package/lib/redux/configureReducers.d.ts +5 -2
  221. package/lib/redux/configureReducers.js +78 -67
  222. package/lib/redux/configureStore.d.ts +2 -2
  223. package/lib/redux/configureStore.js +115 -83
  224. package/lib/redux/helpers.js +2 -7
  225. package/lib/redux/reducers/authReducer.js +46 -52
  226. package/lib/redux/reducers/index.js +15 -41
  227. package/lib/redux/reducers/modalsReducer.js +52 -49
  228. package/lib/redux/reducers/modelsReducer.d.ts +2 -2
  229. package/lib/redux/reducers/modelsReducer.js +182 -183
  230. package/lib/redux/reducers/notificationsReducer.js +21 -26
  231. package/lib/redux/reducers/searchReducer.js +20 -26
  232. package/lib/redux/sagas/appInsightsSaga.js +62 -24
  233. package/lib/redux/sagas/authSaga.js +414 -287
  234. package/lib/redux/sagas/caliperSaga.js +263 -169
  235. package/lib/redux/sagas/clockOffsetSaga.js +77 -36
  236. package/lib/redux/sagas/configurationSaga.js +46 -13
  237. package/lib/redux/sagas/downtimeApiErrorSaga.d.ts +1 -0
  238. package/lib/redux/sagas/downtimeApiErrorSaga.js +64 -23
  239. package/lib/redux/sagas/errorSaga.d.ts +1 -0
  240. package/lib/redux/sagas/errorSaga.js +63 -29
  241. package/lib/redux/sagas/googleAnalyticsSaga.js +69 -29
  242. package/lib/redux/sagas/identityProviderSaga.js +69 -24
  243. package/lib/redux/sagas/initialDataLoadSaga.js +29 -38
  244. package/lib/redux/sagas/lockDownBrowserErrorSaga.d.ts +1 -0
  245. package/lib/redux/sagas/lockDownBrowserErrorSaga.js +81 -32
  246. package/lib/redux/sagas/modelFetchSaga.js +459 -379
  247. package/lib/redux/sagas/noStoreSaga.d.ts +1 -1
  248. package/lib/redux/sagas/noStoreSaga.js +101 -68
  249. package/lib/redux/sagas/postLoginDataSaga.js +79 -47
  250. package/lib/redux/sagas/postLoginRedirectSaga.js +71 -30
  251. package/lib/redux/sagas/rootSaga.js +137 -85
  252. package/lib/redux/sagas/sentrySaga.js +85 -29
  253. package/lib/redux/sagas/userIdSaga.js +54 -18
  254. package/lib/services/codeProviderService.js +29 -25
  255. package/lib/services/dateService.js +12 -14
  256. package/lib/services/documentService.js +13 -18
  257. package/lib/services/fetchService.js +168 -134
  258. package/lib/services/persistenceService.d.ts +4 -4
  259. package/lib/services/persistenceService.js +43 -45
  260. package/lib/services/ticketProviderService.js +33 -29
  261. package/lib/services/tokenPersistenceService.js +9 -13
  262. package/lib/services/windowService.js +17 -21
  263. package/lib/startup.d.ts +1 -1
  264. package/lib/startup.js +135 -132
  265. package/lib/types/AppConfiguration.js +1 -5
  266. package/lib/types/Artifact.js +7 -11
  267. package/lib/types/BaseReduxState.js +1 -5
  268. package/lib/types/Client.js +1 -5
  269. package/lib/types/Collection.d.ts +3 -3
  270. package/lib/types/Collection.js +1 -5
  271. package/lib/types/Configuration.js +1 -5
  272. package/lib/types/DeepLinkingResponseRequest.js +1 -5
  273. package/lib/types/DeletableModel.js +1 -5
  274. package/lib/types/Event.js +1 -5
  275. package/lib/types/ExternalGroup.js +1 -5
  276. package/lib/types/ExternalProvider.js +1 -5
  277. package/lib/types/ExternalTerm.js +1 -5
  278. package/lib/types/Group.js +1 -5
  279. package/lib/types/IdentityProvider.js +1 -5
  280. package/lib/types/LtiLaunch.js +1 -5
  281. package/lib/types/NameOnlyEntity.js +1 -5
  282. package/lib/types/Notification.d.ts +2 -2
  283. package/lib/types/Notification.js +1 -5
  284. package/lib/types/OptionalRecord.d.ts +1 -1
  285. package/lib/types/OptionalRecord.js +1 -5
  286. package/lib/types/OwnerSchedule.d.ts +1 -3
  287. package/lib/types/OwnerSchedule.js +1 -5
  288. package/lib/types/PropertyOfType.d.ts +3 -3
  289. package/lib/types/PropertyOfType.js +1 -5
  290. package/lib/types/Quill.js +1 -5
  291. package/lib/types/RoleDescription.d.ts +1 -0
  292. package/lib/types/RoleDescription.js +1 -5
  293. package/lib/types/Search.js +1 -5
  294. package/lib/types/SimpleLocation.js +1 -5
  295. package/lib/types/UniTime.js +1 -5
  296. package/lib/types/User.js +1 -5
  297. package/lib/types/UserRole.js +1 -5
  298. package/lib/types/auth/AuthState.js +1 -5
  299. package/lib/types/auth/CasV1LoginRequestBody.js +1 -5
  300. package/lib/types/auth/ClientCredentials.js +1 -5
  301. package/lib/types/auth/CodeProviderService.js +1 -5
  302. package/lib/types/auth/LocalLoginRequestBody.js +1 -5
  303. package/lib/types/auth/TicketProviderService.js +1 -5
  304. package/lib/types/auth/TokenPersistenceService.js +1 -5
  305. package/lib/types/auth/index.js +18 -82
  306. package/lib/types/index.js +39 -313
  307. package/lib/types/net/EndpointConfig.js +1 -5
  308. package/lib/types/net/EndpointMapping.js +1 -5
  309. package/lib/types/net/EndpointMappings.js +1 -5
  310. package/lib/types/net/ErrorHandler.d.ts +1 -1
  311. package/lib/types/net/ErrorHandler.js +1 -5
  312. package/lib/types/net/FetchConfig.d.ts +1 -1
  313. package/lib/types/net/FetchConfig.js +1 -5
  314. package/lib/types/net/FetchErrorData.js +6 -10
  315. package/lib/types/net/FetchResult.d.ts +2 -2
  316. package/lib/types/net/FetchResult.js +1 -5
  317. package/lib/types/net/HTTPMethod.d.ts +1 -1
  318. package/lib/types/net/HTTPMethod.js +1 -5
  319. package/lib/types/net/HTTPStatusCode.js +12 -16
  320. package/lib/types/net/Metadata.js +1 -5
  321. package/lib/types/net/Model.js +1 -5
  322. package/lib/types/net/ModelCollection.js +1 -5
  323. package/lib/types/net/ModelsState.js +1 -5
  324. package/lib/types/net/OAuthToken.js +1 -5
  325. package/lib/types/net/OAuthTokenOrNull.d.ts +1 -1
  326. package/lib/types/net/OAuthTokenOrNull.js +1 -5
  327. package/lib/types/net/TokenAccessFunction.d.ts +1 -1
  328. package/lib/types/net/TokenAccessFunction.js +1 -5
  329. package/lib/types/net/index.js +27 -181
  330. package/lib/utils/baseActivity.d.ts +2 -2
  331. package/lib/utils/baseActivity.js +136 -138
  332. package/lib/utils/baseRole.js +33 -37
  333. package/lib/utils/collection.js +310 -432
  334. package/lib/utils/cookies.js +37 -22
  335. package/lib/utils/date.js +320 -320
  336. package/lib/utils/dom.js +174 -186
  337. package/lib/utils/domainIdentifier.js +9 -9
  338. package/lib/utils/entityUserRole.js +2 -6
  339. package/lib/utils/error.d.ts +1 -1
  340. package/lib/utils/error.js +16 -18
  341. package/lib/utils/events.js +33 -40
  342. package/lib/utils/externalGroup.js +21 -25
  343. package/lib/utils/externalProviders.js +4 -8
  344. package/lib/utils/externalTerms.js +6 -9
  345. package/lib/utils/fetch.d.ts +1 -1
  346. package/lib/utils/fetch.js +185 -188
  347. package/lib/utils/group.js +9 -17
  348. package/lib/utils/groupDates.d.ts +1 -1
  349. package/lib/utils/groupDates.js +39 -43
  350. package/lib/utils/groupRoles.js +28 -28
  351. package/lib/utils/lockDownBrowser.js +12 -16
  352. package/lib/utils/logger.js +25 -30
  353. package/lib/utils/lti.js +5 -10
  354. package/lib/utils/model.d.ts +2 -2
  355. package/lib/utils/model.js +48 -39
  356. package/lib/utils/number.js +26 -23
  357. package/lib/utils/promise.d.ts +1 -6
  358. package/lib/utils/promise.js +15 -34
  359. package/lib/utils/quill.js +77 -66
  360. package/lib/utils/route.d.ts +2 -2
  361. package/lib/utils/route.js +60 -61
  362. package/lib/utils/search.d.ts +1 -1
  363. package/lib/utils/search.js +85 -78
  364. package/lib/utils/shard.js +41 -38
  365. package/lib/utils/sort.d.ts +3 -3
  366. package/lib/utils/sort.js +58 -62
  367. package/lib/utils/string.js +10 -14
  368. package/lib/utils/table.d.ts +3 -3
  369. package/lib/utils/table.js +36 -39
  370. package/lib/utils/timezone.js +26 -12
  371. package/lib/utils/url.d.ts +1 -2
  372. package/lib/utils/url.js +201 -146
  373. package/lib/utils/user.js +61 -59
  374. package/lib/utils/userAgent.js +11 -11
  375. package/lib/utils/userRole.d.ts +3 -3
  376. package/lib/utils/userRole.js +56 -58
  377. package/package.json +207 -226
  378. package/lib/config/eslint/index.d.ts +0 -2
  379. package/lib/config/eslint/index.js +0 -36
  380. package/lib/config/eslint/lib/order.d.ts +0 -3
  381. package/lib/config/eslint/lib/order.js +0 -30
  382. package/lib/config/eslint/lib/prettier.d.ts +0 -3
  383. package/lib/config/eslint/lib/prettier.js +0 -23
  384. package/lib/config/eslint/lib/typescript.d.ts +0 -2
  385. package/lib/config/eslint/lib/typescript.js +0 -98
  386. package/lib/config/eslint/react.d.ts +0 -2
  387. package/lib/config/eslint/react.js +0 -30
  388. package/lib/hooks/useEventCalback.d.ts +0 -14
  389. package/lib/hooks/useEventCalback.js +0 -51
  390. package/lib/types/externals.d.js +0 -2
package/lib/utils/date.js CHANGED
@@ -1,401 +1,401 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.getDateMinusTime = void 0;
8
- exports.getEndOfDay = getEndOfDay;
9
- exports.getEndOfMinute = getEndOfMinute;
10
- exports.getFormattedFullDateAndTime = getFormattedFullDateAndTime;
11
- exports.getFormattedFullDateWithWeek = getFormattedFullDateWithWeek;
12
- exports.getFormattedNumberedDate = getFormattedNumberedDate;
13
- exports.getFormattedNumberedDateAndTime = getFormattedNumberedDateAndTime;
14
- exports.getFormattedNumberedDateAndTimeWithoutYear = getFormattedNumberedDateAndTimeWithoutYear;
15
- exports.getFormattedNumberedDateForInput = getFormattedNumberedDateForInput;
16
- exports.getFormattedNumberedDateWithFullYear = getFormattedNumberedDateWithFullYear;
17
- exports.getFormattedNumberedDateWithoutYear = getFormattedNumberedDateWithoutYear;
18
- exports.getFormattedNumberedTime = getFormattedNumberedTime;
19
- exports.getFormattedNumberedTimeWithFullZone = getFormattedNumberedTimeWithFullZone;
20
- exports.getFormattedNumberedTimeWithoutZone = getFormattedNumberedTimeWithoutZone;
21
- exports.getFormattedNumberedTimeWithoutZoneOrMeridian = getFormattedNumberedTimeWithoutZoneOrMeridian;
22
- exports.getFormattedSimplifiedDate = getFormattedSimplifiedDate;
23
- exports.getFormattedSimplifiedDateWithYearIfNotCurrent = getFormattedSimplifiedDateWithYearIfNotCurrent;
24
- exports.getFormattedSimplifiedDateWithoutYear = getFormattedSimplifiedDateWithoutYear;
25
- exports.getFormattedTimeZone = getFormattedTimeZone;
26
- exports.getFullFormattedTimeZone = getFullFormattedTimeZone;
27
- exports.isDateInputSupported = exports.getZonedMomentFromUtcInDefaultZone = exports.getZonedMomentFromUtc = exports.getZonedMomentFromLocalDateTime = exports.getServerNowUtc = exports.getOffsetDate = exports.getLocalMomentFromUtc = exports.getLocalDateTimeFromUtc = void 0;
28
- exports.isDateTimeValid = isDateTimeValid;
29
- exports.isNowAfterDate = isNowAfterDate;
30
- exports.isNowBeforeDate = isNowBeforeDate;
31
- exports.isNowEqualOrAfterDate = isNowEqualOrAfterDate;
32
- exports.isNowEqualOrBeforeDate = isNowEqualOrBeforeDate;
33
- exports.setClockOffset = exports.isTimeInputSupported = void 0;
34
- var _momentTimezone = _interopRequireDefault(require("moment-timezone"));
35
- var _momentTimezoneUtils = _interopRequireDefault(require("moment-timezone/moment-timezone-utils"));
36
- var _timezone = require("./timezone");
37
- /**
38
- * This value is used by time-sensitive functions in this module and other date/time utils. Any time
39
- * a new Date object is constructed, it will use this value to adjust the time by this offset (to
40
- * make it consistent with a known time)
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isDateTimeValid = exports.isTimeInputSupported = exports.isDateInputSupported = exports.getFormattedTimeZone = exports.getFullFormattedTimeZone = exports.getFormattedNumberedTimeWithoutZoneOrMeridian = exports.getFormattedNumberedTimeWithoutZone = exports.getFormattedNumberedTimeWithFullZone = exports.getFormattedNumberedTime = exports.getFormattedNumberedDateWithoutYear = exports.getFormattedNumberedDateForInput = exports.getFormattedNumberedDateWithFullYear = exports.getFormattedNumberedDate = exports.getFormattedSimplifiedDateWithYearIfNotCurrent = exports.getFormattedSimplifiedDateWithoutYear = exports.getFormattedSimplifiedDate = exports.getFormattedNumberedDateAndTimeWithoutYear = exports.getFormattedNumberedDateAndTime = exports.getFormattedFullDateWithWeek = exports.getFormattedFullDateAndTime = exports.isNowBeforeDate = exports.isNowAfterDate = exports.isNowEqualOrBeforeDate = exports.isNowEqualOrAfterDate = exports.getEndOfMinute = exports.getEndOfDay = exports.getDateMinusTime = exports.getLocalDateTimeFromUtc = exports.getLocalMomentFromUtc = exports.getZonedMomentFromLocalDateTime = exports.getZonedMomentFromUtcInDefaultZone = exports.getZonedMomentFromUtc = exports.getOffsetDate = exports.getServerNowUtc = exports.setClockOffset = void 0;
7
+ var moment_timezone_1 = __importDefault(require("moment-timezone"));
8
+ var moment_timezone_utils_1 = __importDefault(require("moment-timezone/moment-timezone-utils"));
9
+ var timezone_1 = require("./timezone");
10
+ /**
11
+ * This value is used by time-sensitive functions in this module and other date/time utils. Any time
12
+ * a new Date object is constructed, it will use this value to adjust the time by this offset (to
13
+ * make it consistent with a known time)
41
14
  */
42
- let clockOffset = 0;
43
-
44
- /**
45
- * When a GroupAssessment comes in the door, it includes the current UTC datetime. This method is
46
- * used to update the difference between the (accurate) server time and the browser time
15
+ var clockOffset = 0;
16
+ /**
17
+ * When a GroupAssessment comes in the door, it includes the current UTC datetime. This method is
18
+ * used to update the difference between the (accurate) server time and the browser time
47
19
  */
48
- const setClockOffset = function (offset) {
49
- clockOffset = offset;
20
+ var setClockOffset = function (offset) {
21
+ clockOffset = offset;
50
22
  };
51
-
52
- /**
53
- * Get the current UTC time, calibrated to the API server's clock
54
- */
55
23
  exports.setClockOffset = setClockOffset;
56
- const getServerNowUtc = function () {
57
- return new Date(Date.now() + clockOffset);
58
- };
59
-
60
- /**
61
- * Return the provided date, offset by the clockOffset
24
+ /**
25
+ * Get the current UTC time, calibrated to the API server's clock
62
26
  */
27
+ var getServerNowUtc = function () {
28
+ return new Date(Date.now() + clockOffset);
29
+ };
63
30
  exports.getServerNowUtc = getServerNowUtc;
64
- const getOffsetDate = date => {
65
- return new Date(date.getTime() + clockOffset);
31
+ /**
32
+ * Return the provided date, offset by the clockOffset
33
+ */
34
+ var getOffsetDate = function (date) {
35
+ return new Date(date.getTime() + clockOffset);
66
36
  };
67
37
  exports.getOffsetDate = getOffsetDate;
68
- const getZonedMomentFromUtc = function () {
69
- let dateTimeUtc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getServerNowUtc().toISOString();
70
- let timeZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _timezone.guessTimeZoneId)();
71
- return _momentTimezone.default.utc(dateTimeUtc).tz(timeZoneId);
38
+ var getZonedMomentFromUtc = function (dateTimeUtc, timeZoneId) {
39
+ if (dateTimeUtc === void 0) { dateTimeUtc = exports.getServerNowUtc().toISOString(); }
40
+ if (timeZoneId === void 0) { timeZoneId = timezone_1.guessTimeZoneId(); }
41
+ return moment_timezone_1.default.utc(dateTimeUtc).tz(timeZoneId);
72
42
  };
73
43
  exports.getZonedMomentFromUtc = getZonedMomentFromUtc;
74
- const getZonedMomentFromUtcInDefaultZone = function () {
75
- let dateTimeUtc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getServerNowUtc().toISOString();
76
- const timeZoneId = (0, _timezone.getDefaultTimeZoneId)();
77
- return getZonedMomentFromUtc(dateTimeUtc, timeZoneId);
44
+ var getZonedMomentFromUtcInDefaultZone = function (dateTimeUtc) {
45
+ if (dateTimeUtc === void 0) { dateTimeUtc = exports.getServerNowUtc().toISOString(); }
46
+ var timeZoneId = timezone_1.getDefaultTimeZoneId();
47
+ return exports.getZonedMomentFromUtc(dateTimeUtc, timeZoneId);
78
48
  };
79
49
  exports.getZonedMomentFromUtcInDefaultZone = getZonedMomentFromUtcInDefaultZone;
80
- const getZonedMomentFromLocalDateTime = function (localDateTime) {
81
- let timeZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _timezone.guessTimeZoneId)();
82
- const localMoment = (0, _momentTimezone.default)(localDateTime);
83
- const zonedMoment = _momentTimezone.default.tz([localMoment.year(), localMoment.month(), localMoment.date(), localMoment.hour(), localMoment.minute(), localMoment.second(), localMoment.millisecond()], timeZoneId);
84
- return zonedMoment;
50
+ var getZonedMomentFromLocalDateTime = function (localDateTime, timeZoneId) {
51
+ if (timeZoneId === void 0) { timeZoneId = timezone_1.guessTimeZoneId(); }
52
+ var localMoment = moment_timezone_1.default(localDateTime);
53
+ var zonedMoment = moment_timezone_1.default.tz([
54
+ localMoment.year(),
55
+ localMoment.month(),
56
+ localMoment.date(),
57
+ localMoment.hour(),
58
+ localMoment.minute(),
59
+ localMoment.second(),
60
+ localMoment.millisecond()
61
+ ], timeZoneId);
62
+ return zonedMoment;
85
63
  };
86
64
  exports.getZonedMomentFromLocalDateTime = getZonedMomentFromLocalDateTime;
87
- const getLocalMomentFromUtc = function () {
88
- let dateTimeUtc = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getServerNowUtc().toISOString();
89
- let timeZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _timezone.guessTimeZoneId)();
90
- const zonedMoment = getZonedMomentFromUtc(dateTimeUtc, timeZoneId);
91
- const localMoment = (0, _momentTimezone.default)([zonedMoment.year(), zonedMoment.month(), zonedMoment.date(), zonedMoment.hour(), zonedMoment.minute(), zonedMoment.second(), zonedMoment.millisecond()]);
92
- return localMoment;
65
+ var getLocalMomentFromUtc = function (dateTimeUtc, timeZoneId) {
66
+ if (dateTimeUtc === void 0) { dateTimeUtc = exports.getServerNowUtc().toISOString(); }
67
+ if (timeZoneId === void 0) { timeZoneId = timezone_1.guessTimeZoneId(); }
68
+ var zonedMoment = exports.getZonedMomentFromUtc(dateTimeUtc, timeZoneId);
69
+ var localMoment = moment_timezone_1.default([
70
+ zonedMoment.year(),
71
+ zonedMoment.month(),
72
+ zonedMoment.date(),
73
+ zonedMoment.hour(),
74
+ zonedMoment.minute(),
75
+ zonedMoment.second(),
76
+ zonedMoment.millisecond()
77
+ ]);
78
+ return localMoment;
93
79
  };
94
80
  exports.getLocalMomentFromUtc = getLocalMomentFromUtc;
95
- const getLocalDateTimeFromUtc = dateTimeUtc => {
96
- return getLocalMomentFromUtc(dateTimeUtc).toDate();
81
+ var getLocalDateTimeFromUtc = function (dateTimeUtc) {
82
+ return exports.getLocalMomentFromUtc(dateTimeUtc).toDate();
97
83
  };
98
84
  exports.getLocalDateTimeFromUtc = getLocalDateTimeFromUtc;
99
- const getDateMinusTime = dateTime => {
100
- return new Date(dateTime.getFullYear(), dateTime.getMonth(), dateTime.getDate());
85
+ var getDateMinusTime = function (dateTime) {
86
+ return new Date(dateTime.getFullYear(), dateTime.getMonth(), dateTime.getDate());
101
87
  };
102
88
  exports.getDateMinusTime = getDateMinusTime;
103
89
  function getEndOfDay(dateTimeUtc) {
104
- return (0, _momentTimezone.default)(dateTimeUtc).startOf('day').add(1, 'days').subtract(3, 'milliseconds') // must be minus 3 for SQL date
105
- .toDate();
90
+ return moment_timezone_1.default(dateTimeUtc)
91
+ .startOf('day')
92
+ .add(1, 'days')
93
+ .subtract(3, 'milliseconds') // must be minus 3 for SQL date
94
+ .toDate();
106
95
  }
96
+ exports.getEndOfDay = getEndOfDay;
107
97
  function getEndOfMinute(dateTimeUtc) {
108
- return (0, _momentTimezone.default)(dateTimeUtc).startOf('minute').add(1, 'minute').subtract(3, 'milliseconds') // must be minus 3 for SQL date
109
- .toDate();
98
+ return moment_timezone_1.default(dateTimeUtc)
99
+ .startOf('minute')
100
+ .add(1, 'minute')
101
+ .subtract(3, 'milliseconds') // must be minus 3 for SQL date
102
+ .toDate();
110
103
  }
111
-
112
- /**
113
- * Is the current time, "now", **after or equal to** the given date.
114
- *
115
- * @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
116
- * @param nowUtc Optional. The current time, "now", as an ISO date string.
117
- *
118
- * @returns Whether or not "now" is **after or equal to** `dateTimeUtc`
104
+ exports.getEndOfMinute = getEndOfMinute;
105
+ /**
106
+ * Is the current time, "now", **after or equal to** the given date.
107
+ *
108
+ * @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
109
+ * @param nowUtc Optional. The current time, "now", as an ISO date string.
110
+ *
111
+ * @returns Whether or not "now" is **after or equal to** `dateTimeUtc`
119
112
  */
120
- function isNowEqualOrAfterDate(dateTimeUtc) {
121
- let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
122
- if (!dateTimeUtc) {
123
- return false;
124
- }
125
- const adjustedDateTimeMoment = getLocalMomentFromUtc(dateTimeUtc);
126
- const currentMoment = getLocalMomentFromUtc(nowUtc);
127
- return currentMoment.isSameOrAfter(adjustedDateTimeMoment);
113
+ function isNowEqualOrAfterDate(dateTimeUtc, nowUtc) {
114
+ if (nowUtc === void 0) { nowUtc = exports.getServerNowUtc().toISOString(); }
115
+ if (!dateTimeUtc) {
116
+ return false;
117
+ }
118
+ var adjustedDateTimeMoment = exports.getLocalMomentFromUtc(dateTimeUtc);
119
+ var currentMoment = exports.getLocalMomentFromUtc(nowUtc);
120
+ return currentMoment.isSameOrAfter(adjustedDateTimeMoment);
128
121
  }
129
-
130
- /**
131
- * Is the current time, "now", **before or equal to** the given date.
132
- *
133
- * @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
134
- * @param nowUtc Optional. The current time, "now", as an ISO date string.
135
- *
136
- * @returns Whether or not "now" is **before or equal to** `dateTimeUtc`.
122
+ exports.isNowEqualOrAfterDate = isNowEqualOrAfterDate;
123
+ /**
124
+ * Is the current time, "now", **before or equal to** the given date.
125
+ *
126
+ * @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
127
+ * @param nowUtc Optional. The current time, "now", as an ISO date string.
128
+ *
129
+ * @returns Whether or not "now" is **before or equal to** `dateTimeUtc`.
137
130
  */
138
- function isNowEqualOrBeforeDate(dateTimeUtc) {
139
- let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
140
- if (!dateTimeUtc) {
141
- return false;
142
- }
143
- const adjustedDateTimeMoment = getLocalMomentFromUtc(dateTimeUtc);
144
- const currentMoment = getLocalMomentFromUtc(nowUtc);
145
- return currentMoment.isSameOrBefore(adjustedDateTimeMoment);
131
+ function isNowEqualOrBeforeDate(dateTimeUtc, nowUtc) {
132
+ if (nowUtc === void 0) { nowUtc = exports.getServerNowUtc().toISOString(); }
133
+ if (!dateTimeUtc) {
134
+ return false;
135
+ }
136
+ var adjustedDateTimeMoment = exports.getLocalMomentFromUtc(dateTimeUtc);
137
+ var currentMoment = exports.getLocalMomentFromUtc(nowUtc);
138
+ return currentMoment.isSameOrBefore(adjustedDateTimeMoment);
146
139
  }
147
-
148
- /**
149
- * Is the current time, "now", **after** the given date.
150
- *
151
- * @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
152
- * @param nowUtc Optional. The current time, "now", as an ISO date string.
153
- *
154
- * @returns Whether or not "now" is **after** `dateTimeUtc`.
140
+ exports.isNowEqualOrBeforeDate = isNowEqualOrBeforeDate;
141
+ /**
142
+ * Is the current time, "now", **after** the given date.
143
+ *
144
+ * @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
145
+ * @param nowUtc Optional. The current time, "now", as an ISO date string.
146
+ *
147
+ * @returns Whether or not "now" is **after** `dateTimeUtc`.
155
148
  */
156
- function isNowAfterDate(dateTimeUtc) {
157
- let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
158
- if (!dateTimeUtc) {
159
- return false;
160
- }
161
- const adjustedDateTimeMoment = getLocalMomentFromUtc(dateTimeUtc);
162
- const currentMoment = getLocalMomentFromUtc(nowUtc);
163
- return currentMoment > adjustedDateTimeMoment;
149
+ function isNowAfterDate(dateTimeUtc, nowUtc) {
150
+ if (nowUtc === void 0) { nowUtc = exports.getServerNowUtc().toISOString(); }
151
+ if (!dateTimeUtc) {
152
+ return false;
153
+ }
154
+ var adjustedDateTimeMoment = exports.getLocalMomentFromUtc(dateTimeUtc);
155
+ var currentMoment = exports.getLocalMomentFromUtc(nowUtc);
156
+ return currentMoment > adjustedDateTimeMoment;
164
157
  }
165
-
166
- /**
167
- * Is the current time, "now", **before** the given date.
168
- *
169
- * @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
170
- * @param nowUtc Optional. The current time, "now", as an ISO date string.
171
- *
172
- * @returns Whether or not "now" is **before** `dateTimeUtc`.
158
+ exports.isNowAfterDate = isNowAfterDate;
159
+ /**
160
+ * Is the current time, "now", **before** the given date.
161
+ *
162
+ * @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
163
+ * @param nowUtc Optional. The current time, "now", as an ISO date string.
164
+ *
165
+ * @returns Whether or not "now" is **before** `dateTimeUtc`.
173
166
  */
174
- function isNowBeforeDate(dateTimeUtc) {
175
- let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
176
- if (!dateTimeUtc) {
177
- return false;
178
- }
179
- const adjustedDateTimeMoment = getLocalMomentFromUtc(dateTimeUtc);
180
- const currentMoment = getLocalMomentFromUtc(nowUtc);
181
- return currentMoment < adjustedDateTimeMoment;
167
+ function isNowBeforeDate(dateTimeUtc, nowUtc) {
168
+ if (nowUtc === void 0) { nowUtc = exports.getServerNowUtc().toISOString(); }
169
+ if (!dateTimeUtc) {
170
+ return false;
171
+ }
172
+ var adjustedDateTimeMoment = exports.getLocalMomentFromUtc(dateTimeUtc);
173
+ var currentMoment = exports.getLocalMomentFromUtc(nowUtc);
174
+ return currentMoment < adjustedDateTimeMoment;
182
175
  }
183
-
184
- /**
185
- * Returns a date and time string with full date, e.g. `March 5, 2018 @ 4:05 PM EDT`
186
- * @param dateTimeUtc A UTC date time string
187
- * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
176
+ exports.isNowBeforeDate = isNowBeforeDate;
177
+ /**
178
+ * Returns a date and time string with full date, e.g. `March 5, 2018 @ 4:05 PM EDT`
179
+ * @param dateTimeUtc A UTC date time string
180
+ * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
188
181
  */
189
- function getFormattedFullDateAndTime(dateTimeUtc) {
190
- let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
191
- return applyFormat(dateTimeUtc, `MMMM D, YYYY @ h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
182
+ function getFormattedFullDateAndTime(dateTimeUtc, withTimeZone) {
183
+ if (withTimeZone === void 0) { withTimeZone = true; }
184
+ return applyFormat(dateTimeUtc, "MMMM D, YYYY @ h:mm\u00A0A" + (withTimeZone ? ' z' : ''));
192
185
  }
193
-
194
- /**
195
- * Returns a date and time string with day of week and American slash dates, e.g. `Mon, 3/5/2018 @ 4:05 PM EDT`
196
- * @param dateTimeUtc A UTC date time string
197
- * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
186
+ exports.getFormattedFullDateAndTime = getFormattedFullDateAndTime;
187
+ /**
188
+ * Returns a date and time string with day of week and American slash dates, e.g. `Mon, 3/5/2018 @ 4:05 PM EDT`
189
+ * @param dateTimeUtc A UTC date time string
190
+ * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
198
191
  */
199
- function getFormattedFullDateWithWeek(dateTimeUtc) {
200
- let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
201
- return applyFormat(dateTimeUtc, `ddd, M/D/YYYY @ h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
192
+ function getFormattedFullDateWithWeek(dateTimeUtc, withTimeZone) {
193
+ if (withTimeZone === void 0) { withTimeZone = true; }
194
+ return applyFormat(dateTimeUtc, "ddd, M/D/YYYY @ h:mm\u00A0A" + (withTimeZone ? ' z' : ''));
202
195
  }
203
-
204
- /**
205
- * Returns a date and time string with American slash dates, and no leading zeroes, e.g. `3/5/18 4:05 PM EDT`
206
- * @param dateTimeUtc A UTC date time string
207
- * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
196
+ exports.getFormattedFullDateWithWeek = getFormattedFullDateWithWeek;
197
+ /**
198
+ * Returns a date and time string with American slash dates, and no leading zeroes, e.g. `3/5/18 4:05 PM EDT`
199
+ * @param dateTimeUtc A UTC date time string
200
+ * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
208
201
  */
209
- function getFormattedNumberedDateAndTime(dateTimeUtc) {
210
- let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
211
- return applyFormat(dateTimeUtc, `M/D/YY h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
202
+ function getFormattedNumberedDateAndTime(dateTimeUtc, withTimeZone) {
203
+ if (withTimeZone === void 0) { withTimeZone = true; }
204
+ return applyFormat(dateTimeUtc, "M/D/YY h:mm\u00A0A" + (withTimeZone ? ' z' : ''));
212
205
  }
213
-
214
- /**
215
- * Returns a date and time string with American slash dates, no leading zeroes, and no year, e.g. `3/5 4:05 PM EDT`
216
- * @param dateTimeUtc A UTC date time string
217
- * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
206
+ exports.getFormattedNumberedDateAndTime = getFormattedNumberedDateAndTime;
207
+ /**
208
+ * Returns a date and time string with American slash dates, no leading zeroes, and no year, e.g. `3/5 4:05 PM EDT`
209
+ * @param dateTimeUtc A UTC date time string
210
+ * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
218
211
  */
219
- function getFormattedNumberedDateAndTimeWithoutYear(dateTimeUtc) {
220
- let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
221
- return applyFormat(dateTimeUtc, `M/D h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
212
+ function getFormattedNumberedDateAndTimeWithoutYear(dateTimeUtc, withTimeZone) {
213
+ if (withTimeZone === void 0) { withTimeZone = true; }
214
+ return applyFormat(dateTimeUtc, "M/D h:mm\u00A0A" + (withTimeZone ? ' z' : ''));
222
215
  }
223
-
224
- /**
225
- * Returns a date string with short month and full year, e.g. `Mar 5, 2018`
226
- * @param dateTimeUtc A UTC date time string
216
+ exports.getFormattedNumberedDateAndTimeWithoutYear = getFormattedNumberedDateAndTimeWithoutYear;
217
+ /**
218
+ * Returns a date string with short month and full year, e.g. `Mar 5, 2018`
219
+ * @param dateTimeUtc A UTC date time string
227
220
  */
228
221
  function getFormattedSimplifiedDate(dateTimeUtc) {
229
- return applyFormat(dateTimeUtc, 'MMM D, YYYY');
222
+ return applyFormat(dateTimeUtc, 'MMM D, YYYY');
230
223
  }
231
-
232
- /**
233
- * Returns a date string with short month and no year, e.g. `Mar 5`
234
- * @param dateTimeUtc A UTC date time string
224
+ exports.getFormattedSimplifiedDate = getFormattedSimplifiedDate;
225
+ /**
226
+ * Returns a date string with short month and no year, e.g. `Mar 5`
227
+ * @param dateTimeUtc A UTC date time string
235
228
  */
236
229
  function getFormattedSimplifiedDateWithoutYear(dateTimeUtc) {
237
- return applyFormat(dateTimeUtc, 'MMM D');
230
+ return applyFormat(dateTimeUtc, 'MMM D');
238
231
  }
239
-
240
- /**
241
- * Returns a date string as either 'MMM D, YYYY' or 'MMM D' if the date's year is the same as the current year
242
- * @param dateTimeUtc A UTC date time string
243
- * @param nowUtc (optional) A UTC date time string of "now". Used for testing.
232
+ exports.getFormattedSimplifiedDateWithoutYear = getFormattedSimplifiedDateWithoutYear;
233
+ /**
234
+ * Returns a date string as either 'MMM D, YYYY' or 'MMM D' if the date's year is the same as the current year
235
+ * @param dateTimeUtc A UTC date time string
236
+ * @param nowUtc (optional) A UTC date time string of "now". Used for testing.
244
237
  */
245
- function getFormattedSimplifiedDateWithYearIfNotCurrent(dateTimeUtc) {
246
- let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
247
- const nowUtcMoment = (0, _momentTimezone.default)(nowUtc);
248
- const dateTimeMoment = (0, _momentTimezone.default)(dateTimeUtc);
249
- return Math.abs(nowUtcMoment.year() - dateTimeMoment.year()) === 0 ? getFormattedSimplifiedDateWithoutYear(dateTimeUtc) : getFormattedSimplifiedDate(dateTimeUtc);
238
+ function getFormattedSimplifiedDateWithYearIfNotCurrent(dateTimeUtc, nowUtc) {
239
+ if (nowUtc === void 0) { nowUtc = exports.getServerNowUtc().toISOString(); }
240
+ var nowUtcMoment = moment_timezone_1.default(nowUtc);
241
+ var dateTimeMoment = moment_timezone_1.default(dateTimeUtc);
242
+ return Math.abs(nowUtcMoment.year() - dateTimeMoment.year()) === 0
243
+ ? getFormattedSimplifiedDateWithoutYear(dateTimeUtc)
244
+ : getFormattedSimplifiedDate(dateTimeUtc);
250
245
  }
251
-
252
- /**
253
- * Returns a date string with American slash dates, no leading zeroes, and short year, e.g. `3/5/18`
254
- * @param dateTimeUtc A UTC date time string
246
+ exports.getFormattedSimplifiedDateWithYearIfNotCurrent = getFormattedSimplifiedDateWithYearIfNotCurrent;
247
+ /**
248
+ * Returns a date string with American slash dates, no leading zeroes, and short year, e.g. `3/5/18`
249
+ * @param dateTimeUtc A UTC date time string
255
250
  */
256
251
  function getFormattedNumberedDate(dateTimeUtc) {
257
- return applyFormat(dateTimeUtc, 'M/D/YY');
252
+ return applyFormat(dateTimeUtc, 'M/D/YY');
258
253
  }
259
-
260
- /**
261
- * Returns a date string with American slash dates, no leading zeroes, and full year, e.g. `3/5/2018`
262
- * @param dateTimeUtc A UTC date time string
254
+ exports.getFormattedNumberedDate = getFormattedNumberedDate;
255
+ /**
256
+ * Returns a date string with American slash dates, no leading zeroes, and full year, e.g. `3/5/2018`
257
+ * @param dateTimeUtc A UTC date time string
263
258
  */
264
259
  function getFormattedNumberedDateWithFullYear(dateTimeUtc) {
265
- return applyFormat(dateTimeUtc, 'M/D/YYYY');
260
+ return applyFormat(dateTimeUtc, 'M/D/YYYY');
266
261
  }
267
-
268
- /**
269
- * Returns a date string for use in HTML inputs, e.g. `2018-03-05`
270
- * @param dateTimeUtc A UTC date time string
262
+ exports.getFormattedNumberedDateWithFullYear = getFormattedNumberedDateWithFullYear;
263
+ /**
264
+ * Returns a date string for use in HTML inputs, e.g. `2018-03-05`
265
+ * @param dateTimeUtc A UTC date time string
271
266
  */
272
267
  function getFormattedNumberedDateForInput(dateTimeUtc) {
273
- return applyFormat(dateTimeUtc, 'YYYY-MM-DD');
268
+ return applyFormat(dateTimeUtc, 'YYYY-MM-DD');
274
269
  }
275
-
276
- /**
277
- * Returns a date string with American slash dates and no year and no leading zeroes, e.g. `3/5`
278
- * @param dateTimeUtc A UTC date time string
270
+ exports.getFormattedNumberedDateForInput = getFormattedNumberedDateForInput;
271
+ /**
272
+ * Returns a date string with American slash dates and no year and no leading zeroes, e.g. `3/5`
273
+ * @param dateTimeUtc A UTC date time string
279
274
  */
280
275
  function getFormattedNumberedDateWithoutYear(dateTimeUtc) {
281
- return applyFormat(dateTimeUtc, 'M/D');
276
+ return applyFormat(dateTimeUtc, 'M/D');
282
277
  }
283
-
284
- /**
285
- * Returns a time string, e.g. `4:05 PM EDT`
286
- * @param dateTimeUtc A UTC date time string
287
- * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
278
+ exports.getFormattedNumberedDateWithoutYear = getFormattedNumberedDateWithoutYear;
279
+ /**
280
+ * Returns a time string, e.g. `4:05 PM EDT`
281
+ * @param dateTimeUtc A UTC date time string
282
+ * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
288
283
  */
289
- function getFormattedNumberedTime(dateTimeUtc) {
290
- let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
291
- return applyFormat(dateTimeUtc, `h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
284
+ function getFormattedNumberedTime(dateTimeUtc, withTimeZone) {
285
+ if (withTimeZone === void 0) { withTimeZone = true; }
286
+ return applyFormat(dateTimeUtc, "h:mm\u00A0A" + (withTimeZone ? ' z' : ''));
292
287
  }
293
-
294
- /**
295
- * Returns a time string with possibly full time zone name, e.g. `4:05 PM EDT` or `4:05 PM CST (Asia/Taipei)`
296
- * @param dateTimeUtc A UTC date time string
297
- * @param showEasternZoneId (optional) Whether or not to include the timeZoneId in the result for EST/EDT. Defaults to `false`.
298
- * @param timeZoneId (optional) A time zone Id. Defaults to the current time zone id, using `guessTimeZoneId()`.
288
+ exports.getFormattedNumberedTime = getFormattedNumberedTime;
289
+ /**
290
+ * Returns a time string with possibly full time zone name, e.g. `4:05 PM EDT` or `4:05 PM CST (Asia/Taipei)`
291
+ * @param dateTimeUtc A UTC date time string
292
+ * @param showEasternZoneId (optional) Whether or not to include the timeZoneId in the result for EST/EDT. Defaults to `false`.
293
+ * @param timeZoneId (optional) A time zone Id. Defaults to the current time zone id, using `guessTimeZoneId()`.
299
294
  */
300
- function getFormattedNumberedTimeWithFullZone(dateTimeUtc) {
301
- let showEasternZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
302
- let timeZoneId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : (0, _timezone.guessTimeZoneId)();
303
- const zonedMoment = getZonedMomentFromUtc(dateTimeUtc, timeZoneId);
304
- const time = applyFormat(dateTimeUtc, 'h:mm\u00a0A', timeZoneId);
305
- const timezoneAbbreviation = zonedMoment.zoneAbbr();
306
- return (timezoneAbbreviation === 'EDT' || timezoneAbbreviation === 'EST') && !showEasternZoneId ?
307
- // Don't show the full zone name if in EDT or EST, unless told to
308
- `${time} ${timezoneAbbreviation}` :
309
- // If not EDT or EST, show the zone name, replacing underscores with spaces
310
- // Ex: "Asia/Taipei"
311
- `${time} ${timezoneAbbreviation} (${timeZoneId.replace('_', ' ')})`;
295
+ function getFormattedNumberedTimeWithFullZone(dateTimeUtc, showEasternZoneId, timeZoneId) {
296
+ if (showEasternZoneId === void 0) { showEasternZoneId = false; }
297
+ if (timeZoneId === void 0) { timeZoneId = timezone_1.guessTimeZoneId(); }
298
+ var zonedMoment = exports.getZonedMomentFromUtc(dateTimeUtc, timeZoneId);
299
+ var time = applyFormat(dateTimeUtc, 'h:mm\u00a0A', timeZoneId);
300
+ var timezoneAbbreviation = zonedMoment ? zonedMoment.zoneAbbr() : '';
301
+ return (timezoneAbbreviation === 'EDT' || timezoneAbbreviation === 'EST') && !showEasternZoneId
302
+ ? // Don't show the full zone name if in EDT or EST, unless told to
303
+ time + " " + timezoneAbbreviation
304
+ : // If not EDT or EST, show the zone name, replacing underscores with spaces
305
+ // Ex: "Asia/Taipei"
306
+ time + " " + timezoneAbbreviation + " (" + timeZoneId.replace('_', ' ') + ")";
312
307
  }
313
-
314
- /**
315
- * Returns a time string without time zone, e.g. `4:05 PM`
316
- * @param dateTimeUtc A UTC date time string
308
+ exports.getFormattedNumberedTimeWithFullZone = getFormattedNumberedTimeWithFullZone;
309
+ /**
310
+ * Returns a time string without time zone, e.g. `4:05 PM`
311
+ * @param dateTimeUtc A UTC date time string
317
312
  */
318
313
  function getFormattedNumberedTimeWithoutZone(dateTimeUtc) {
319
- return applyFormat(dateTimeUtc, 'h:mm\u00a0A');
314
+ return applyFormat(dateTimeUtc, 'h:mm\u00a0A');
320
315
  }
321
-
322
- /**
323
- * Returns a time string without time zone, in 24 hr time, e.g. `16:05`
324
- * @param dateTimeUtc A UTC date time string
316
+ exports.getFormattedNumberedTimeWithoutZone = getFormattedNumberedTimeWithoutZone;
317
+ /**
318
+ * Returns a time string without time zone, in 24 hr time, e.g. `16:05`
319
+ * @param dateTimeUtc A UTC date time string
325
320
  */
326
321
  function getFormattedNumberedTimeWithoutZoneOrMeridian(dateTimeUtc) {
327
- return applyFormat(dateTimeUtc, 'HH:mm');
322
+ return applyFormat(dateTimeUtc, 'HH:mm');
328
323
  }
329
-
330
- /**
331
- * Returns a full formatted time zone string for the given `timeZoneId`.
332
- *
333
- * Combines all possible abbreviations for the zone and the timeZoneId, e.g. `EST/EDT`, `PST/PDT (America/Los Angeles)` or `CST (Asia/Taipei)`
334
- *
335
- * If abbreviations are not alpha characters, e.g. `-04`, then only the timeZoneId is returned.
336
- *
337
- * @param timeZoneId (optional) A time zone Id. Defaults to the current time zone id, using `guessTimeZoneId()`.
338
- * @param showEasternZoneId (optional) Whether or not to include the timeZoneId in the result for EST/EDT. Defaults to `false`.
339
- * @param nowUtc (optional) The current time, "now", as an ISO date string.
324
+ exports.getFormattedNumberedTimeWithoutZoneOrMeridian = getFormattedNumberedTimeWithoutZoneOrMeridian;
325
+ /**
326
+ * Returns a full formatted time zone string for the given `timeZoneId`.
327
+ *
328
+ * Combines all possible abbreviations for the zone and the timeZoneId, e.g. `EST/EDT`, `PST/PDT (America/Los Angeles)` or `CST (Asia/Taipei)`
329
+ *
330
+ * If abbreviations are not alpha characters, e.g. `-04`, then only the timeZoneId is returned.
331
+ *
332
+ * @param timeZoneId (optional) A time zone Id. Defaults to the current time zone id, using `guessTimeZoneId()`.
333
+ * @param showEasternZoneId (optional) Whether or not to include the timeZoneId in the result for EST/EDT. Defaults to `false`.
334
+ * @param nowUtc (optional) The current time, "now", as an ISO date string.
340
335
  */
341
- function getFullFormattedTimeZone() {
342
- let timeZoneId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0, _timezone.guessTimeZoneId)();
343
- let showEasternZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
344
- let nowUtc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : getServerNowUtc().toISOString();
345
- const zone = _momentTimezone.default.tz.zone(timeZoneId);
346
- if (!zone) return '';
347
- const zonedMoment = getZonedMomentFromUtc(nowUtc, timeZoneId);
348
- // filter the zone data down to just recent years, instead of the default of 1900 to 2038
349
- const filteredZone = _momentTimezoneUtils.default.tz.filterYears(zone, zonedMoment.year() - 1, zonedMoment.year() + 1);
350
- // find all unique abbreviations for the zone, combined into a string
351
- const abbreviations = filteredZone.abbrs
352
- // filter out non-alpha abbreviations
353
- .filter(abbr => /[a-zA-Z]+/g.test(abbr)).reduce((uniqueAbbrs, abbr) => {
354
- if (!uniqueAbbrs.includes(abbr)) {
355
- uniqueAbbrs.push(abbr);
356
- }
357
- return uniqueAbbrs;
358
- }, []);
359
- const abbreviationsString = abbreviations.length > 0 ? abbreviations.join('/') : null;
360
- const readableZoneId = timeZoneId.replace('_', ' ');
361
- return !abbreviationsString ? readableZoneId : abbreviationsString === 'EST/EDT' && !showEasternZoneId ?
362
- // Don't show the zoneId if in Eastern, unless told to
363
- abbreviationsString :
364
- // Show the combined abbreviations plus the friendly zoneId
365
- `${abbreviationsString} (${readableZoneId})`;
336
+ function getFullFormattedTimeZone(timeZoneId, showEasternZoneId, nowUtc) {
337
+ if (timeZoneId === void 0) { timeZoneId = timezone_1.guessTimeZoneId(); }
338
+ if (showEasternZoneId === void 0) { showEasternZoneId = false; }
339
+ if (nowUtc === void 0) { nowUtc = exports.getServerNowUtc().toISOString(); }
340
+ var zone = moment_timezone_1.default.tz.zone(timeZoneId);
341
+ if (!zone)
342
+ return '';
343
+ var zonedMoment = exports.getZonedMomentFromUtc(nowUtc, timeZoneId);
344
+ // filter the zone data down to just recent years, instead of the default of 1900 to 2038
345
+ var filteredZone = moment_timezone_utils_1.default.tz.filterYears(zone, zonedMoment.year() - 1, zonedMoment.year() + 1);
346
+ // find all unique abbreviations for the zone, combined into a string
347
+ var abbreviations = filteredZone.abbrs
348
+ // filter out non-alpha abbreviations
349
+ .filter(function (abbr) { return /[a-zA-Z]+/g.test(abbr); })
350
+ .reduce(function (uniqueAbbrs, abbr) {
351
+ if (!uniqueAbbrs.includes(abbr)) {
352
+ uniqueAbbrs.push(abbr);
353
+ }
354
+ return uniqueAbbrs;
355
+ }, []);
356
+ var abbreviationsString = abbreviations.length > 0 ? abbreviations.join('/') : null;
357
+ var readableZoneId = timeZoneId.replace('_', ' ');
358
+ return !abbreviationsString
359
+ ? readableZoneId
360
+ : abbreviationsString === 'EST/EDT' && !showEasternZoneId
361
+ ? // Don't show the zoneId if in Eastern, unless told to
362
+ abbreviationsString
363
+ : // Show the combined abbreviations plus the friendly zoneId
364
+ abbreviationsString + " (" + readableZoneId + ")";
366
365
  }
367
-
368
- /**
369
- * Returns the basic time zone abbreviation for the given date, e.g. `EDT`.
370
- *
371
- * @param dateTimeUtc The date to format.
366
+ exports.getFullFormattedTimeZone = getFullFormattedTimeZone;
367
+ /**
368
+ * Returns the basic time zone abbreviation for the given date, e.g. `EDT`.
369
+ *
370
+ * @param dateTimeUtc The date to format.
372
371
  */
373
372
  function getFormattedTimeZone(dateTimeUtc) {
374
- return applyFormat(dateTimeUtc, 'z');
373
+ return applyFormat(dateTimeUtc, 'z');
375
374
  }
376
-
377
- /**
378
- * Formats a date using the given format. Parses the date as UTC, then converts to the current time zone, then formats.
379
- * @param {*} dateTimeUtc The date to format. Any valid input for `moment.utc(...)`
380
- * @param {*} format The format to use
375
+ exports.getFormattedTimeZone = getFormattedTimeZone;
376
+ /**
377
+ * Formats a date using the given format. Parses the date as UTC, then converts to the current time zone, then formats.
378
+ * @param {*} dateTimeUtc The date to format. Any valid input for `moment.utc(...)`
379
+ * @param {*} format The format to use
381
380
  */
382
- function applyFormat(dateTimeUtc, format) {
383
- let timeZoneId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : (0, _timezone.guessTimeZoneId)();
384
- return getZonedMomentFromUtc(dateTimeUtc, timeZoneId).format(format);
381
+ function applyFormat(dateTimeUtc, format, timeZoneId) {
382
+ if (timeZoneId === void 0) { timeZoneId = timezone_1.guessTimeZoneId(); }
383
+ return exports.getZonedMomentFromUtc(dateTimeUtc, timeZoneId).format(format);
385
384
  }
386
- const isInputTypeSupported = type => {
387
- try {
388
- const test = document.createElement('input');
389
- test.type = type;
390
- const isSupported = test.type === type;
391
- return isSupported;
392
- } catch {
393
- return false;
394
- }
385
+ var isInputTypeSupported = function (type) {
386
+ try {
387
+ var test_1 = document.createElement('input');
388
+ test_1.type = type;
389
+ var isSupported = test_1.type === type;
390
+ return isSupported;
391
+ }
392
+ catch (e) {
393
+ return false;
394
+ }
395
395
  };
396
- const isDateInputSupported = exports.isDateInputSupported = isInputTypeSupported('date');
397
- const isTimeInputSupported = exports.isTimeInputSupported = isInputTypeSupported('time');
396
+ exports.isDateInputSupported = isInputTypeSupported('date');
397
+ exports.isTimeInputSupported = isInputTypeSupported('time');
398
398
  function isDateTimeValid(dateTime) {
399
- return !!dateTime && (0, _momentTimezone.default)(dateTime).isValid();
399
+ return !!dateTime && moment_timezone_1.default(dateTime).isValid();
400
400
  }
401
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50VGltZXpvbmUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tb21lbnRUaW1lem9uZVV0aWxzIiwiX3RpbWV6b25lIiwiY2xvY2tPZmZzZXQiLCJzZXRDbG9ja09mZnNldCIsIm9mZnNldCIsImV4cG9ydHMiLCJnZXRTZXJ2ZXJOb3dVdGMiLCJEYXRlIiwibm93IiwiZ2V0T2Zmc2V0RGF0ZSIsImRhdGUiLCJnZXRUaW1lIiwiZ2V0Wm9uZWRNb21lbnRGcm9tVXRjIiwiZGF0ZVRpbWVVdGMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJ0b0lTT1N0cmluZyIsInRpbWVab25lSWQiLCJndWVzc1RpbWVab25lSWQiLCJtb21lbnQiLCJ1dGMiLCJ0eiIsImdldFpvbmVkTW9tZW50RnJvbVV0Y0luRGVmYXVsdFpvbmUiLCJnZXREZWZhdWx0VGltZVpvbmVJZCIsImdldFpvbmVkTW9tZW50RnJvbUxvY2FsRGF0ZVRpbWUiLCJsb2NhbERhdGVUaW1lIiwibG9jYWxNb21lbnQiLCJ6b25lZE1vbWVudCIsInllYXIiLCJtb250aCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCIsImdldExvY2FsTW9tZW50RnJvbVV0YyIsImdldExvY2FsRGF0ZVRpbWVGcm9tVXRjIiwidG9EYXRlIiwiZ2V0RGF0ZU1pbnVzVGltZSIsImRhdGVUaW1lIiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldERhdGUiLCJnZXRFbmRPZkRheSIsInN0YXJ0T2YiLCJhZGQiLCJzdWJ0cmFjdCIsImdldEVuZE9mTWludXRlIiwiaXNOb3dFcXVhbE9yQWZ0ZXJEYXRlIiwibm93VXRjIiwiYWRqdXN0ZWREYXRlVGltZU1vbWVudCIsImN1cnJlbnRNb21lbnQiLCJpc1NhbWVPckFmdGVyIiwiaXNOb3dFcXVhbE9yQmVmb3JlRGF0ZSIsImlzU2FtZU9yQmVmb3JlIiwiaXNOb3dBZnRlckRhdGUiLCJpc05vd0JlZm9yZURhdGUiLCJnZXRGb3JtYXR0ZWRGdWxsRGF0ZUFuZFRpbWUiLCJ3aXRoVGltZVpvbmUiLCJhcHBseUZvcm1hdCIsImdldEZvcm1hdHRlZEZ1bGxEYXRlV2l0aFdlZWsiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGVBbmRUaW1lIiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlQW5kVGltZVdpdGhvdXRZZWFyIiwiZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGUiLCJnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhvdXRZZWFyIiwiZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRoWWVhcklmTm90Q3VycmVudCIsIm5vd1V0Y01vbWVudCIsImRhdGVUaW1lTW9tZW50IiwiTWF0aCIsImFicyIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZSIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZVdpdGhGdWxsWWVhciIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZUZvcklucHV0IiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aG91dFllYXIiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWUiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWVXaXRoRnVsbFpvbmUiLCJzaG93RWFzdGVyblpvbmVJZCIsInRpbWUiLCJ0aW1lem9uZUFiYnJldmlhdGlvbiIsInpvbmVBYmJyIiwicmVwbGFjZSIsImdldEZvcm1hdHRlZE51bWJlcmVkVGltZVdpdGhvdXRab25lIiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmVPck1lcmlkaWFuIiwiZ2V0RnVsbEZvcm1hdHRlZFRpbWVab25lIiwiem9uZSIsImZpbHRlcmVkWm9uZSIsIm1vbWVudFV0aWxzIiwiZmlsdGVyWWVhcnMiLCJhYmJyZXZpYXRpb25zIiwiYWJicnMiLCJmaWx0ZXIiLCJhYmJyIiwidGVzdCIsInJlZHVjZSIsInVuaXF1ZUFiYnJzIiwiaW5jbHVkZXMiLCJwdXNoIiwiYWJicmV2aWF0aW9uc1N0cmluZyIsImpvaW4iLCJyZWFkYWJsZVpvbmVJZCIsImdldEZvcm1hdHRlZFRpbWVab25lIiwiZm9ybWF0IiwiaXNJbnB1dFR5cGVTdXBwb3J0ZWQiLCJ0eXBlIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaXNTdXBwb3J0ZWQiLCJpc0RhdGVJbnB1dFN1cHBvcnRlZCIsImlzVGltZUlucHV0U3VwcG9ydGVkIiwiaXNEYXRlVGltZVZhbGlkIiwiaXNWYWxpZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50LXRpbWV6b25lJ1xyXG5pbXBvcnQgbW9tZW50VXRpbHMgZnJvbSAnbW9tZW50LXRpbWV6b25lL21vbWVudC10aW1lem9uZS11dGlscydcclxuaW1wb3J0IHsgZ2V0RGVmYXVsdFRpbWVab25lSWQsIGd1ZXNzVGltZVpvbmVJZCB9IGZyb20gJy4vdGltZXpvbmUnXHJcblxyXG4vKipcclxuICogVGhpcyB2YWx1ZSBpcyB1c2VkIGJ5IHRpbWUtc2Vuc2l0aXZlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSBhbmQgb3RoZXIgZGF0ZS90aW1lIHV0aWxzLiBBbnkgdGltZVxyXG4gKiBhIG5ldyBEYXRlIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCwgaXQgd2lsbCB1c2UgdGhpcyB2YWx1ZSB0byBhZGp1c3QgdGhlIHRpbWUgYnkgdGhpcyBvZmZzZXQgKHRvXHJcbiAqIG1ha2UgaXQgY29uc2lzdGVudCB3aXRoIGEga25vd24gdGltZSlcclxuICovXHJcbmxldCBjbG9ja09mZnNldCA9IDBcclxuXHJcbi8qKlxyXG4gKiBXaGVuIGEgR3JvdXBBc3Nlc3NtZW50IGNvbWVzIGluIHRoZSBkb29yLCBpdCBpbmNsdWRlcyB0aGUgY3VycmVudCBVVEMgZGF0ZXRpbWUuIFRoaXMgbWV0aG9kIGlzXHJcbiAqIHVzZWQgdG8gdXBkYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIChhY2N1cmF0ZSkgc2VydmVyIHRpbWUgYW5kIHRoZSBicm93c2VyIHRpbWVcclxuICovXHJcbmV4cG9ydCBjb25zdCBzZXRDbG9ja09mZnNldCA9IGZ1bmN0aW9uIChvZmZzZXQ6IG51bWJlcikge1xyXG5cdGNsb2NrT2Zmc2V0ID0gb2Zmc2V0XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdGhlIGN1cnJlbnQgVVRDIHRpbWUsIGNhbGlicmF0ZWQgdG8gdGhlIEFQSSBzZXJ2ZXIncyBjbG9ja1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldFNlcnZlck5vd1V0YyA9IGZ1bmN0aW9uICgpIHtcclxuXHRyZXR1cm4gbmV3IERhdGUoRGF0ZS5ub3coKSArIGNsb2NrT2Zmc2V0KVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIHRoZSBwcm92aWRlZCBkYXRlLCBvZmZzZXQgYnkgdGhlIGNsb2NrT2Zmc2V0XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0T2Zmc2V0RGF0ZSA9IChkYXRlOiBEYXRlKSA9PiB7XHJcblx0cmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpICsgY2xvY2tPZmZzZXQpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRab25lZE1vbWVudEZyb21VdGMgPSAoXHJcblx0ZGF0ZVRpbWVVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpLFxyXG5cdHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKVxyXG4pID0+IHtcclxuXHRyZXR1cm4gbW9tZW50LnV0YyhkYXRlVGltZVV0YykudHoodGltZVpvbmVJZClcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldFpvbmVkTW9tZW50RnJvbVV0Y0luRGVmYXVsdFpvbmUgPSAoZGF0ZVRpbWVVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpKSA9PiB7XHJcblx0Y29uc3QgdGltZVpvbmVJZCA9IGdldERlZmF1bHRUaW1lWm9uZUlkKClcclxuXHRyZXR1cm4gZ2V0Wm9uZWRNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjLCB0aW1lWm9uZUlkKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0Wm9uZWRNb21lbnRGcm9tTG9jYWxEYXRlVGltZSA9IChsb2NhbERhdGVUaW1lOiBEYXRlIHwgc3RyaW5nLCB0aW1lWm9uZUlkID0gZ3Vlc3NUaW1lWm9uZUlkKCkpID0+IHtcclxuXHRjb25zdCBsb2NhbE1vbWVudCA9IG1vbWVudChsb2NhbERhdGVUaW1lKVxyXG5cdGNvbnN0IHpvbmVkTW9tZW50ID0gbW9tZW50LnR6KFxyXG5cdFx0W1xyXG5cdFx0XHRsb2NhbE1vbWVudC55ZWFyKCksXHJcblx0XHRcdGxvY2FsTW9tZW50Lm1vbnRoKCksXHJcblx0XHRcdGxvY2FsTW9tZW50LmRhdGUoKSxcclxuXHRcdFx0bG9jYWxNb21lbnQuaG91cigpLFxyXG5cdFx0XHRsb2NhbE1vbWVudC5taW51dGUoKSxcclxuXHRcdFx0bG9jYWxNb21lbnQuc2Vjb25kKCksXHJcblx0XHRcdGxvY2FsTW9tZW50Lm1pbGxpc2Vjb25kKClcclxuXHRcdF0sXHJcblx0XHR0aW1lWm9uZUlkXHJcblx0KVxyXG5cdHJldHVybiB6b25lZE1vbWVudFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0TG9jYWxNb21lbnRGcm9tVXRjID0gKFxyXG5cdGRhdGVUaW1lVXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSxcclxuXHR0aW1lWm9uZUlkID0gZ3Vlc3NUaW1lWm9uZUlkKClcclxuKSA9PiB7XHJcblx0Y29uc3Qgem9uZWRNb21lbnQgPSBnZXRab25lZE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMsIHRpbWVab25lSWQpXHJcblx0Y29uc3QgbG9jYWxNb21lbnQgPSBtb21lbnQoW1xyXG5cdFx0em9uZWRNb21lbnQueWVhcigpLFxyXG5cdFx0em9uZWRNb21lbnQubW9udGgoKSxcclxuXHRcdHpvbmVkTW9tZW50LmRhdGUoKSxcclxuXHRcdHpvbmVkTW9tZW50LmhvdXIoKSxcclxuXHRcdHpvbmVkTW9tZW50Lm1pbnV0ZSgpLFxyXG5cdFx0em9uZWRNb21lbnQuc2Vjb25kKCksXHJcblx0XHR6b25lZE1vbWVudC5taWxsaXNlY29uZCgpXHJcblx0XSlcclxuXHRyZXR1cm4gbG9jYWxNb21lbnRcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldExvY2FsRGF0ZVRpbWVGcm9tVXRjID0gKGRhdGVUaW1lVXRjOiBzdHJpbmcpID0+IHtcclxuXHRyZXR1cm4gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjKS50b0RhdGUoKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RGF0ZU1pbnVzVGltZSA9IChkYXRlVGltZTogRGF0ZSkgPT4ge1xyXG5cdHJldHVybiBuZXcgRGF0ZShkYXRlVGltZS5nZXRGdWxsWWVhcigpLCBkYXRlVGltZS5nZXRNb250aCgpLCBkYXRlVGltZS5nZXREYXRlKCkpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmRPZkRheShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XHJcblx0cmV0dXJuIG1vbWVudChkYXRlVGltZVV0YylcclxuXHRcdC5zdGFydE9mKCdkYXknKVxyXG5cdFx0LmFkZCgxLCAnZGF5cycpXHJcblx0XHQuc3VidHJhY3QoMywgJ21pbGxpc2Vjb25kcycpIC8vIG11c3QgYmUgbWludXMgMyBmb3IgU1FMIGRhdGVcclxuXHRcdC50b0RhdGUoKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW5kT2ZNaW51dGUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xyXG5cdHJldHVybiBtb21lbnQoZGF0ZVRpbWVVdGMpXHJcblx0XHQuc3RhcnRPZignbWludXRlJylcclxuXHRcdC5hZGQoMSwgJ21pbnV0ZScpXHJcblx0XHQuc3VidHJhY3QoMywgJ21pbGxpc2Vjb25kcycpIC8vIG11c3QgYmUgbWludXMgMyBmb3IgU1FMIGRhdGVcclxuXHRcdC50b0RhdGUoKVxyXG59XHJcblxyXG4vKipcclxuICogSXMgdGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgKiphZnRlciBvciBlcXVhbCB0byoqIHRoZSBnaXZlbiBkYXRlLlxyXG4gKlxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgVGhlIGRhdGUgdG8gY29tcGFyZSB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXHJcbiAqIEBwYXJhbSBub3dVdGMgT3B0aW9uYWwuIFRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cclxuICpcclxuICogQHJldHVybnMgV2hldGhlciBvciBub3QgXCJub3dcIiBpcyAqKmFmdGVyIG9yIGVxdWFsIHRvKiogYGRhdGVUaW1lVXRjYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTm93RXF1YWxPckFmdGVyRGF0ZShkYXRlVGltZVV0Yz86IHN0cmluZywgbm93VXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSkge1xyXG5cdGlmICghZGF0ZVRpbWVVdGMpIHtcclxuXHRcdHJldHVybiBmYWxzZVxyXG5cdH1cclxuXHRjb25zdCBhZGp1c3RlZERhdGVUaW1lTW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjKVxyXG5cdGNvbnN0IGN1cnJlbnRNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMobm93VXRjKVxyXG5cdHJldHVybiBjdXJyZW50TW9tZW50LmlzU2FtZU9yQWZ0ZXIoYWRqdXN0ZWREYXRlVGltZU1vbWVudClcclxufVxyXG5cclxuLyoqXHJcbiAqIElzIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsICoqYmVmb3JlIG9yIGVxdWFsIHRvKiogdGhlIGdpdmVuIGRhdGUuXHJcbiAqXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBUaGUgZGF0ZSB0byBjb21wYXJlIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cclxuICogQHBhcmFtIG5vd1V0YyBPcHRpb25hbC4gVGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBcIm5vd1wiIGlzICoqYmVmb3JlIG9yIGVxdWFsIHRvKiogYGRhdGVUaW1lVXRjYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc05vd0VxdWFsT3JCZWZvcmVEYXRlKGRhdGVUaW1lVXRjPzogc3RyaW5nLCBub3dVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpKSB7XHJcblx0aWYgKCFkYXRlVGltZVV0Yykge1xyXG5cdFx0cmV0dXJuIGZhbHNlXHJcblx0fVxyXG5cdGNvbnN0IGFkanVzdGVkRGF0ZVRpbWVNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMpXHJcblx0Y29uc3QgY3VycmVudE1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0Yyhub3dVdGMpXHJcblx0cmV0dXJuIGN1cnJlbnRNb21lbnQuaXNTYW1lT3JCZWZvcmUoYWRqdXN0ZWREYXRlVGltZU1vbWVudClcclxufVxyXG5cclxuLyoqXHJcbiAqIElzIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsICoqYWZ0ZXIqKiB0aGUgZ2l2ZW4gZGF0ZS5cclxuICpcclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGNvbXBhcmUgdGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxyXG4gKiBAcGFyYW0gbm93VXRjIE9wdGlvbmFsLiBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXHJcbiAqXHJcbiAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IFwibm93XCIgaXMgKiphZnRlcioqIGBkYXRlVGltZVV0Y2AuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNOb3dBZnRlckRhdGUoZGF0ZVRpbWVVdGM/OiBzdHJpbmcsIG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKCkpIHtcclxuXHRpZiAoIWRhdGVUaW1lVXRjKSB7XHJcblx0XHRyZXR1cm4gZmFsc2VcclxuXHR9XHJcblx0Y29uc3QgYWRqdXN0ZWREYXRlVGltZU1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0YylcclxuXHRjb25zdCBjdXJyZW50TW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKG5vd1V0YylcclxuXHRyZXR1cm4gY3VycmVudE1vbWVudCA+IGFkanVzdGVkRGF0ZVRpbWVNb21lbnRcclxufVxyXG5cclxuLyoqXHJcbiAqIElzIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsICoqYmVmb3JlKiogdGhlIGdpdmVuIGRhdGUuXHJcbiAqXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBUaGUgZGF0ZSB0byBjb21wYXJlIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cclxuICogQHBhcmFtIG5vd1V0YyBPcHRpb25hbC4gVGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBcIm5vd1wiIGlzICoqYmVmb3JlKiogYGRhdGVUaW1lVXRjYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc05vd0JlZm9yZURhdGUoZGF0ZVRpbWVVdGM/OiBzdHJpbmcsIG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKCkpIHtcclxuXHRpZiAoIWRhdGVUaW1lVXRjKSB7XHJcblx0XHRyZXR1cm4gZmFsc2VcclxuXHR9XHJcblx0Y29uc3QgYWRqdXN0ZWREYXRlVGltZU1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0YylcclxuXHRjb25zdCBjdXJyZW50TW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKG5vd1V0YylcclxuXHRyZXR1cm4gY3VycmVudE1vbWVudCA8IGFkanVzdGVkRGF0ZVRpbWVNb21lbnRcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBkYXRlIGFuZCB0aW1lIHN0cmluZyB3aXRoIGZ1bGwgZGF0ZSwgZS5nLiBgTWFyY2ggNSwgMjAxOCBAIDQ6MDUgUE0gRURUYFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkRnVsbERhdGVBbmRUaW1lKGRhdGVUaW1lVXRjOiBzdHJpbmcsIHdpdGhUaW1lWm9uZSA9IHRydWUpIHtcclxuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBNTU1NIEQsIFlZWVkgQCBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGRhdGUgYW5kIHRpbWUgc3RyaW5nIHdpdGggZGF5IG9mIHdlZWsgYW5kIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBlLmcuIGBNb24sIDMvNS8yMDE4IEAgNDowNSBQTSBFRFRgXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXHJcbiAqIEBwYXJhbSB3aXRoVGltZVpvbmUgKG9wdGlvbmFsKSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb24uIERlZmF1bHRzIHRvIGB0cnVlYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRGdWxsRGF0ZVdpdGhXZWVrKGRhdGVUaW1lVXRjOiBzdHJpbmcsIHdpdGhUaW1lWm9uZSA9IHRydWUpIHtcclxuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBkZGQsIE0vRC9ZWVlZIEAgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBkYXRlIGFuZCB0aW1lIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBhbmQgbm8gbGVhZGluZyB6ZXJvZXMsIGUuZy4gYDMvNS8xOCA0OjA1IFBNIEVEVGBcclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcclxuICogQHBhcmFtIHdpdGhUaW1lWm9uZSAob3B0aW9uYWwpIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGltZSB6b25lIGFiYnJldmlhdGlvbi4gRGVmYXVsdHMgdG8gYHRydWVgLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZUFuZFRpbWUoZGF0ZVRpbWVVdGM6IHN0cmluZywgd2l0aFRpbWVab25lID0gdHJ1ZSkge1xyXG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgYE0vRC9ZWSBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGRhdGUgYW5kIHRpbWUgc3RyaW5nIHdpdGggQW1lcmljYW4gc2xhc2ggZGF0ZXMsIG5vIGxlYWRpbmcgemVyb2VzLCBhbmQgbm8geWVhciwgZS5nLiBgMy81IDQ6MDUgUE0gRURUYFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlQW5kVGltZVdpdGhvdXRZZWFyKGRhdGVUaW1lVXRjOiBzdHJpbmcsIHdpdGhUaW1lWm9uZSA9IHRydWUpIHtcclxuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBNL0QgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyB3aXRoIHNob3J0IG1vbnRoIGFuZCBmdWxsIHllYXIsIGUuZy4gYE1hciA1LCAyMDE4YFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZFNpbXBsaWZpZWREYXRlKGRhdGVUaW1lVXRjOiBzdHJpbmcpIHtcclxuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdNTU0gRCwgWVlZWScpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgd2l0aCBzaG9ydCBtb250aCBhbmQgbm8geWVhciwgZS5nLiBgTWFyIDVgXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRob3V0WWVhcihkYXRlVGltZVV0Yzogc3RyaW5nKSB7XHJcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnTU1NIEQnKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGRhdGUgc3RyaW5nIGFzIGVpdGhlciAnTU1NIEQsIFlZWVknIG9yICdNTU0gRCcgaWYgdGhlIGRhdGUncyB5ZWFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHllYXJcclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcclxuICogQHBhcmFtIG5vd1V0YyAob3B0aW9uYWwpIEEgVVRDIGRhdGUgdGltZSBzdHJpbmcgb2YgXCJub3dcIi4gVXNlZCBmb3IgdGVzdGluZy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhZZWFySWZOb3RDdXJyZW50KFxyXG5cdGRhdGVUaW1lVXRjOiBzdHJpbmcsXHJcblx0bm93VXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKVxyXG4pIHtcclxuXHRjb25zdCBub3dVdGNNb21lbnQgPSBtb21lbnQobm93VXRjKVxyXG5cdGNvbnN0IGRhdGVUaW1lTW9tZW50ID0gbW9tZW50KGRhdGVUaW1lVXRjKVxyXG5cdHJldHVybiBNYXRoLmFicyhub3dVdGNNb21lbnQueWVhcigpIC0gZGF0ZVRpbWVNb21lbnQueWVhcigpKSA9PT0gMFxyXG5cdFx0PyBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhvdXRZZWFyKGRhdGVUaW1lVXRjKVxyXG5cdFx0OiBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZShkYXRlVGltZVV0YylcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBubyBsZWFkaW5nIHplcm9lcywgYW5kIHNob3J0IHllYXIsIGUuZy4gYDMvNS8xOGBcclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xyXG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ00vRC9ZWScpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgd2l0aCBBbWVyaWNhbiBzbGFzaCBkYXRlcywgbm8gbGVhZGluZyB6ZXJvZXMsIGFuZCBmdWxsIHllYXIsIGUuZy4gYDMvNS8yMDE4YFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZVdpdGhGdWxsWWVhcihkYXRlVGltZVV0Yzogc3RyaW5nKSB7XHJcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnTS9EL1lZWVknKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGRhdGUgc3RyaW5nIGZvciB1c2UgaW4gSFRNTCBpbnB1dHMsIGUuZy4gYDIwMTgtMDMtMDVgXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlRm9ySW5wdXQoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xyXG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ1lZWVktTU0tREQnKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGRhdGUgc3RyaW5nIHdpdGggQW1lcmljYW4gc2xhc2ggZGF0ZXMgYW5kIG5vIHllYXIgYW5kIG5vIGxlYWRpbmcgemVyb2VzLCBlLmcuIGAzLzVgXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aG91dFllYXIoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xyXG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ00vRCcpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcsIGUuZy4gYDQ6MDUgUE0gRURUYFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lKGRhdGVUaW1lVXRjOiBzdHJpbmcsIHdpdGhUaW1lWm9uZSA9IHRydWUpIHtcclxuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHRpbWUgc3RyaW5nIHdpdGggcG9zc2libHkgZnVsbCB0aW1lIHpvbmUgbmFtZSwgZS5nLiBgNDowNSBQTSBFRFRgIG9yIGA0OjA1IFBNIENTVCAoQXNpYS9UYWlwZWkpYFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKiBAcGFyYW0gc2hvd0Vhc3Rlcm5ab25lSWQgKG9wdGlvbmFsKSBXaGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSB0aW1lWm9uZUlkIGluIHRoZSByZXN1bHQgZm9yIEVTVC9FRFQuIERlZmF1bHRzIHRvIGBmYWxzZWAuXHJcbiAqIEBwYXJhbSB0aW1lWm9uZUlkIChvcHRpb25hbCkgQSB0aW1lIHpvbmUgSWQuIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHRpbWUgem9uZSBpZCwgdXNpbmcgYGd1ZXNzVGltZVpvbmVJZCgpYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWVXaXRoRnVsbFpvbmUoXHJcblx0ZGF0ZVRpbWVVdGM6IHN0cmluZyxcclxuXHRzaG93RWFzdGVyblpvbmVJZCA9IGZhbHNlLFxyXG5cdHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKVxyXG4pIHtcclxuXHRjb25zdCB6b25lZE1vbWVudCA9IGdldFpvbmVkTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0YywgdGltZVpvbmVJZClcclxuXHRjb25zdCB0aW1lID0gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdoOm1tXFx1MDBhMEEnLCB0aW1lWm9uZUlkKVxyXG5cdGNvbnN0IHRpbWV6b25lQWJicmV2aWF0aW9uID0gem9uZWRNb21lbnQuem9uZUFiYnIoKVxyXG5cdHJldHVybiAodGltZXpvbmVBYmJyZXZpYXRpb24gPT09ICdFRFQnIHx8IHRpbWV6b25lQWJicmV2aWF0aW9uID09PSAnRVNUJykgJiYgIXNob3dFYXN0ZXJuWm9uZUlkXHJcblx0XHQ/IC8vIERvbid0IHNob3cgdGhlIGZ1bGwgem9uZSBuYW1lIGlmIGluIEVEVCBvciBFU1QsIHVubGVzcyB0b2xkIHRvXHJcblx0XHRcdGAke3RpbWV9ICR7dGltZXpvbmVBYmJyZXZpYXRpb259YFxyXG5cdFx0OiAvLyBJZiBub3QgRURUIG9yIEVTVCwgc2hvdyB0aGUgem9uZSBuYW1lLCByZXBsYWNpbmcgdW5kZXJzY29yZXMgd2l0aCBzcGFjZXNcclxuXHRcdFx0Ly8gRXg6IFwiQXNpYS9UYWlwZWlcIlxyXG5cdFx0XHRgJHt0aW1lfSAke3RpbWV6b25lQWJicmV2aWF0aW9ufSAoJHt0aW1lWm9uZUlkLnJlcGxhY2UoJ18nLCAnICcpfSlgXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcgd2l0aG91dCB0aW1lIHpvbmUsIGUuZy4gYDQ6MDUgUE1gXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xyXG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ2g6bW1cXHUwMGEwQScpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcgd2l0aG91dCB0aW1lIHpvbmUsIGluIDI0IGhyIHRpbWUsIGUuZy4gYDE2OjA1YFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZE51bWJlcmVkVGltZVdpdGhvdXRab25lT3JNZXJpZGlhbihkYXRlVGltZVV0Yzogc3RyaW5nKSB7XHJcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnSEg6bW0nKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGZ1bGwgZm9ybWF0dGVkIHRpbWUgem9uZSBzdHJpbmcgZm9yIHRoZSBnaXZlbiBgdGltZVpvbmVJZGAuXHJcbiAqXHJcbiAqIENvbWJpbmVzIGFsbCBwb3NzaWJsZSBhYmJyZXZpYXRpb25zIGZvciB0aGUgem9uZSBhbmQgdGhlIHRpbWVab25lSWQsIGUuZy4gYEVTVC9FRFRgLCBgUFNUL1BEVCAoQW1lcmljYS9Mb3MgQW5nZWxlcylgIG9yIGBDU1QgKEFzaWEvVGFpcGVpKWBcclxuICpcclxuICogSWYgYWJicmV2aWF0aW9ucyBhcmUgbm90IGFscGhhIGNoYXJhY3RlcnMsIGUuZy4gYC0wNGAsIHRoZW4gb25seSB0aGUgdGltZVpvbmVJZCBpcyByZXR1cm5lZC5cclxuICpcclxuICogQHBhcmFtIHRpbWVab25lSWQgKG9wdGlvbmFsKSBBIHRpbWUgem9uZSBJZC4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdGltZSB6b25lIGlkLCB1c2luZyBgZ3Vlc3NUaW1lWm9uZUlkKClgLlxyXG4gKiBAcGFyYW0gc2hvd0Vhc3Rlcm5ab25lSWQgKG9wdGlvbmFsKSBXaGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSB0aW1lWm9uZUlkIGluIHRoZSByZXN1bHQgZm9yIEVTVC9FRFQuIERlZmF1bHRzIHRvIGBmYWxzZWAuXHJcbiAqIEBwYXJhbSBub3dVdGMgKG9wdGlvbmFsKSBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnVsbEZvcm1hdHRlZFRpbWVab25lKFxyXG5cdHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKSxcclxuXHRzaG93RWFzdGVyblpvbmVJZCA9IGZhbHNlLFxyXG5cdG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKClcclxuKSB7XHJcblx0Y29uc3Qgem9uZSA9IG1vbWVudC50ei56b25lKHRpbWVab25lSWQpXHJcblx0aWYgKCF6b25lKSByZXR1cm4gJydcclxuXHJcblx0Y29uc3Qgem9uZWRNb21lbnQgPSBnZXRab25lZE1vbWVudEZyb21VdGMobm93VXRjLCB0aW1lWm9uZUlkKVxyXG5cdC8vIGZpbHRlciB0aGUgem9uZSBkYXRhIGRvd24gdG8ganVzdCByZWNlbnQgeWVhcnMsIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb2YgMTkwMCB0byAyMDM4XHJcblx0Y29uc3QgZmlsdGVyZWRab25lID0gbW9tZW50VXRpbHMudHouZmlsdGVyWWVhcnMoem9uZSwgem9uZWRNb21lbnQueWVhcigpIC0gMSwgem9uZWRNb21lbnQueWVhcigpICsgMSlcclxuXHQvLyBmaW5kIGFsbCB1bmlxdWUgYWJicmV2aWF0aW9ucyBmb3IgdGhlIHpvbmUsIGNvbWJpbmVkIGludG8gYSBzdHJpbmdcclxuXHRjb25zdCBhYmJyZXZpYXRpb25zID0gZmlsdGVyZWRab25lLmFiYnJzXHJcblx0XHQvLyBmaWx0ZXIgb3V0IG5vbi1hbHBoYSBhYmJyZXZpYXRpb25zXHJcblx0XHQuZmlsdGVyKGFiYnIgPT4gL1thLXpBLVpdKy9nLnRlc3QoYWJicikpXHJcblx0XHQucmVkdWNlKCh1bmlxdWVBYmJyczogc3RyaW5nW10sIGFiYnIpID0+IHtcclxuXHRcdFx0aWYgKCF1bmlxdWVBYmJycy5pbmNsdWRlcyhhYmJyKSkge1xyXG5cdFx0XHRcdHVuaXF1ZUFiYnJzLnB1c2goYWJicilcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdW5pcXVlQWJicnNcclxuXHRcdH0sIFtdKVxyXG5cdGNvbnN0IGFiYnJldmlhdGlvbnNTdHJpbmcgPSBhYmJyZXZpYXRpb25zLmxlbmd0aCA+IDAgPyBhYmJyZXZpYXRpb25zLmpvaW4oJy8nKSA6IG51bGxcclxuXHRjb25zdCByZWFkYWJsZVpvbmVJZCA9IHRpbWVab25lSWQucmVwbGFjZSgnXycsICcgJylcclxuXHRyZXR1cm4gIWFiYnJldmlhdGlvbnNTdHJpbmdcclxuXHRcdD8gcmVhZGFibGVab25lSWRcclxuXHRcdDogYWJicmV2aWF0aW9uc1N0cmluZyA9PT0gJ0VTVC9FRFQnICYmICFzaG93RWFzdGVyblpvbmVJZFxyXG5cdFx0XHQ/IC8vIERvbid0IHNob3cgdGhlIHpvbmVJZCBpZiBpbiBFYXN0ZXJuLCB1bmxlc3MgdG9sZCB0b1xyXG5cdFx0XHRcdGFiYnJldmlhdGlvbnNTdHJpbmdcclxuXHRcdFx0OiAvLyBTaG93IHRoZSBjb21iaW5lZCBhYmJyZXZpYXRpb25zIHBsdXMgdGhlIGZyaWVuZGx5IHpvbmVJZFxyXG5cdFx0XHRcdGAke2FiYnJldmlhdGlvbnNTdHJpbmd9ICgke3JlYWRhYmxlWm9uZUlkfSlgXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBiYXNpYyB0aW1lIHpvbmUgYWJicmV2aWF0aW9uIGZvciB0aGUgZ2l2ZW4gZGF0ZSwgZS5nLiBgRURUYC5cclxuICpcclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGZvcm1hdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRUaW1lWm9uZShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XHJcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAneicpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGb3JtYXRzIGEgZGF0ZSB1c2luZyB0aGUgZ2l2ZW4gZm9ybWF0LiBQYXJzZXMgdGhlIGRhdGUgYXMgVVRDLCB0aGVuIGNvbnZlcnRzIHRvIHRoZSBjdXJyZW50IHRpbWUgem9uZSwgdGhlbiBmb3JtYXRzLlxyXG4gKiBAcGFyYW0geyp9IGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGZvcm1hdC4gQW55IHZhbGlkIGlucHV0IGZvciBgbW9tZW50LnV0YyguLi4pYFxyXG4gKiBAcGFyYW0geyp9IGZvcm1hdCBUaGUgZm9ybWF0IHRvIHVzZVxyXG4gKi9cclxuZnVuY3Rpb24gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGM6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcsIHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKSkge1xyXG5cdHJldHVybiBnZXRab25lZE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMsIHRpbWVab25lSWQpLmZvcm1hdChmb3JtYXQpXHJcbn1cclxuXHJcbmNvbnN0IGlzSW5wdXRUeXBlU3VwcG9ydGVkID0gKHR5cGU6IHN0cmluZykgPT4ge1xyXG5cdHRyeSB7XHJcblx0XHRjb25zdCB0ZXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG5cdFx0dGVzdC50eXBlID0gdHlwZVxyXG5cdFx0Y29uc3QgaXNTdXBwb3J0ZWQgPSB0ZXN0LnR5cGUgPT09IHR5cGVcclxuXHRcdHJldHVybiBpc1N1cHBvcnRlZFxyXG5cdH0gY2F0Y2gge1xyXG5cdFx0cmV0dXJuIGZhbHNlXHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNEYXRlSW5wdXRTdXBwb3J0ZWQgPSBpc0lucHV0VHlwZVN1cHBvcnRlZCgnZGF0ZScpXHJcblxyXG5leHBvcnQgY29uc3QgaXNUaW1lSW5wdXRTdXBwb3J0ZWQgPSBpc0lucHV0VHlwZVN1cHBvcnRlZCgndGltZScpXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlVGltZVZhbGlkKGRhdGVUaW1lOiBzdHJpbmcgfCBEYXRlKSB7XHJcblx0cmV0dXJuICEhZGF0ZVRpbWUgJiYgbW9tZW50KGRhdGVUaW1lKS5pc1ZhbGlkKClcclxufVxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLGVBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLG9CQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxTQUFBLEdBQUFGLE9BQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFB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QUFHLENBQUM7RUFDbkQsT0FBTyxDQUFDaUIsbUJBQW1CLEdBQ3hCRSxjQUFjLEdBQ2RGLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxDQUFDckIsaUJBQWlCO0VBQ3REO0VBQ0RxQixtQkFBbUI7RUFDbEI7RUFDRCxHQUFHQSxtQkFBbUIsS0FBS0UsY0FBYyxHQUFHO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxvQkFBb0JBLENBQUN2RixXQUFtQixFQUFFO0VBQ3pELE9BQU84QyxXQUFXLENBQUM5QyxXQUFXLEVBQUUsR0FBRyxDQUFDO0FBQ3JDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOEMsV0FBV0EsQ0FBQzlDLFdBQW1CLEVBQUV3RixNQUFjLEVBQWtDO0VBQUEsSUFBaENuRixVQUFVLEdBQUFKLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLElBQUFLLHlCQUFlLEVBQUMsQ0FBQztFQUN2RixPQUFPUCxxQkFBcUIsQ0FBQ0MsV0FBVyxFQUFFSyxVQUFVLENBQUMsQ0FBQ21GLE1BQU0sQ0FBQ0EsTUFBTSxDQUFDO0FBQ3JFO0FBRUEsTUFBTUMsb0JBQW9CLEdBQUlDLElBQVksSUFBSztFQUM5QyxJQUFJO0lBQ0gsTUFBTVgsSUFBSSxHQUFHWSxRQUFRLENBQUNDLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDNUNiLElBQUksQ0FBQ1csSUFBSSxHQUFHQSxJQUFJO0lBQ2hCLE1BQU1HLFdBQVcsR0FBR2QsSUFBSSxDQUFDVyxJQUFJLEtBQUtBLElBQUk7SUFDdEMsT0FBT0csV0FBVztFQUNuQixDQUFDLENBQUMsTUFBTTtJQUNQLE9BQU8sS0FBSztFQUNiO0FBQ0QsQ0FBQztBQUVNLE1BQU1DLG9CQUFvQixHQUFBdEcsT0FBQSxDQUFBc0csb0JBQUEsR0FBR0wsb0JBQW9CLENBQUMsTUFBTSxDQUFDO0FBRXpELE1BQU1NLG9CQUFvQixHQUFBdkcsT0FBQSxDQUFBdUcsb0JBQUEsR0FBR04sb0JBQW9CLENBQUMsTUFBTSxDQUFDO0FBRXpELFNBQVNPLGVBQWVBLENBQUN0RSxRQUF1QixFQUFFO0VBQ3hELE9BQU8sQ0FBQyxDQUFDQSxRQUFRLElBQUksSUFBQW5CLHVCQUFNLEVBQUNtQixRQUFRLENBQUMsQ0FBQ3VFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hEIiwiaWdub3JlTGlzdCI6W119
401
+ exports.isDateTimeValid = isDateTimeValid;