openstack-uicore-foundation 4.0.98 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/lib/components/ajaxloader.js +1 -184
  2. package/lib/components/attendance-tracker.js +1 -1992
  3. package/lib/components/bulk-actions-selector.js +1 -194
  4. package/lib/components/circle-button.js +1 -223
  5. package/lib/components/clock.js +1 -678
  6. package/lib/components/exclusive-wrapper.js +1 -151
  7. package/lib/components/extra-questions.js +1 -1902
  8. package/lib/components/form-validation.js +1 -190
  9. package/lib/components/forms/rsvp-form.js +1 -940
  10. package/lib/components/forms/simple-form.js +1 -708
  11. package/lib/components/free-text-search.js +1 -2042
  12. package/lib/components/google-map.js +1 -576
  13. package/lib/components/index.js +1 -12840
  14. package/lib/components/inputs/access-levels-input.js +1 -2306
  15. package/lib/components/inputs/action-dropdown.js +1 -219
  16. package/lib/components/inputs/checkbox-list.js +1 -339
  17. package/lib/components/inputs/company-input.js +1 -2341
  18. package/lib/components/inputs/country-dropdown.js +1 -2399
  19. package/lib/components/inputs/country-input.js +1 -2302
  20. package/lib/components/inputs/datetimepicker.js +1 -314
  21. package/lib/components/inputs/dropdown.js +1 -259
  22. package/lib/components/inputs/editor-input.js +1 -270
  23. package/lib/components/inputs/event-input.js +1 -2280
  24. package/lib/components/inputs/free-multi-text-input.js +1 -252
  25. package/lib/components/inputs/group-input.js +1 -2275
  26. package/lib/components/inputs/grouped-dropdown.js +1 -244
  27. package/lib/components/inputs/language-input.js +1 -2307
  28. package/lib/components/inputs/member-input.js +1 -2302
  29. package/lib/components/inputs/operator-input.js +1 -328
  30. package/lib/components/inputs/organization-input.js +1 -2325
  31. package/lib/components/inputs/promocode-input.js +1 -2310
  32. package/lib/components/inputs/radio-list.js +1 -297
  33. package/lib/components/inputs/registration-company-input.js +1 -2470
  34. package/lib/components/inputs/speaker-input.js +1 -2336
  35. package/lib/components/inputs/sponsor-input.js +1 -2284
  36. package/lib/components/inputs/stepped-select.js +1 -197
  37. package/lib/components/inputs/summit-days-select.js +1 -162
  38. package/lib/components/inputs/summit-input.js +1 -2282
  39. package/lib/components/inputs/summit-venues-select.js +1 -172
  40. package/lib/components/inputs/tag-input.js +1 -2352
  41. package/lib/components/inputs/text-input.js +1 -202
  42. package/lib/components/inputs/textarea-input.js +1 -181
  43. package/lib/components/inputs/ticket-types-input.js +1 -2338
  44. package/lib/components/inputs/upload-input-v2.js +1 -834
  45. package/lib/components/inputs/upload-input.js +1 -391
  46. package/lib/components/progressive-img.js +1 -289
  47. package/lib/components/raw-html.js +1 -125
  48. package/lib/components/schedule-builder-constants.js +1 -81
  49. package/lib/components/schedule-builder-view.js +1 -1684
  50. package/lib/components/sections/panel.js +1 -156
  51. package/lib/components/simple-link-list.js +1 -790
  52. package/lib/components/sponsored-project-input.js +1 -2281
  53. package/lib/components/summit-dropdown.js +1 -214
  54. package/lib/components/table-editable.js +1 -895
  55. package/lib/components/table-selectable.js +1 -552
  56. package/lib/components/table-sortable.js +1 -657
  57. package/lib/components/table.js +1 -510
  58. package/lib/components/video-stream.js +1 -226
  59. package/lib/css/components/bulk-actions-selector.css +1 -16
  60. package/lib/css/components/circle-button.css +1 -24
  61. package/lib/css/components/extra-questions.css +1 -29
  62. package/lib/css/components/form-validation.css +1 -29
  63. package/lib/css/components/free-text-search.css +1 -29
  64. package/lib/css/components/index.css +2 -1354
  65. package/lib/css/components/inputs/action-dropdown.css +1 -46
  66. package/lib/css/components/inputs/datetimepicker.css +1 -208
  67. package/lib/css/components/inputs/grouped-dropdown.css +1 -25
  68. package/lib/css/components/inputs/stepped-select.css +1 -12
  69. package/lib/css/components/inputs/upload-input-v2.css +1 -106
  70. package/lib/css/components/inputs/upload-input.css +1 -43
  71. package/lib/css/components/progressive-img.css +1 -16
  72. package/lib/css/components/schedule-builder-view.css +1 -230
  73. package/lib/css/components/simple-link-list.css +1 -189
  74. package/lib/css/components/summit-dropdown.css +1 -35
  75. package/lib/css/components/table-editable.css +1 -145
  76. package/lib/css/components/table-selectable.css +1 -147
  77. package/lib/css/components/table-sortable.css +1 -150
  78. package/lib/css/components/table.css +1 -147
  79. package/lib/i18n.js +1 -449
  80. package/lib/models/index.js +1 -238
  81. package/lib/models/summit-event.js +1 -210
  82. package/lib/security/abstract-auth-callback-route.js +1 -2114
  83. package/lib/security/actions.js +1 -1818
  84. package/lib/security/constants.js +1 -71
  85. package/lib/security/methods.js +1 -1818
  86. package/lib/security/reducers.js +1 -1961
  87. package/lib/security/session-checker.js +1 -2179
  88. package/lib/utils/actions.js +1 -1818
  89. package/lib/utils/fragment-parser.js +1 -207
  90. package/lib/utils/methods.js +1 -369
  91. package/lib/utils/query-actions.js +1 -2154
  92. package/lib/utils/questions-set.js +1 -609
  93. package/lib/utils/reducers.js +1 -1874
  94. package/lib/utils/use-fit-text.js +1 -178
  95. package/package.json +1 -1
@@ -1,2399 +1 @@
1
- (function webpackUniversalModuleDefinition(root, factory) {
2
- if(typeof exports === 'object' && typeof module === 'object')
3
- module.exports = factory();
4
- else if(typeof define === 'function' && define.amd)
5
- define("openstack-uicore-foundation", [], factory);
6
- else if(typeof exports === 'object')
7
- exports["openstack-uicore-foundation"] = factory();
8
- else
9
- root["openstack-uicore-foundation"] = factory();
10
- })(this, () => {
11
- return /******/ (() => { // webpackBootstrap
12
- /******/ "use strict";
13
- /******/ var __webpack_modules__ = ({
14
-
15
- /***/ "./src/components/inputs/dropdown.js":
16
- /*!*******************************************!*\
17
- !*** ./src/components/inputs/dropdown.js ***!
18
- \*******************************************/
19
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
20
-
21
- __webpack_require__.r(__webpack_exports__);
22
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
23
- /* harmony export */ "default": () => (/* binding */ Dropdown)
24
- /* harmony export */ });
25
- /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "@babel/runtime/helpers/extends");
26
- /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__);
27
- /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
28
- /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);
29
- /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "@babel/runtime/helpers/objectWithoutProperties");
30
- /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2__);
31
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "react");
32
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
33
- /* harmony import */ var react_select__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react-select */ "react-select");
34
- /* harmony import */ var react_select__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_select__WEBPACK_IMPORTED_MODULE_4__);
35
-
36
-
37
-
38
- const _excluded = ["onChange", "value", "className", "error", "clearable", "disabled", "overrideCSS", "ariaLabelledBy"];
39
-
40
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
41
-
42
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
43
-
44
- /**
45
- * Copyright 2017 OpenStack Foundation
46
- * Licensed under the Apache License, Version 2.0 (the "License");
47
- * you may not use this file except in compliance with the License.
48
- * You may obtain a copy of the License at
49
- * http://www.apache.org/licenses/LICENSE-2.0
50
- * Unless required by applicable law or agreed to in writing, software
51
- * distributed under the License is distributed on an "AS IS" BASIS,
52
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
53
- * See the License for the specific language governing permissions and
54
- * limitations under the License.
55
- **/
56
-
57
-
58
- class Dropdown extends (react__WEBPACK_IMPORTED_MODULE_3___default().Component) {
59
- constructor(props) {
60
- super(props);
61
- this.handleChange = this.handleChange.bind(this);
62
- }
63
-
64
- handleChange(selection) {
65
- let value = null;
66
-
67
- if (this.props.isMulti) {
68
- value = selection ? selection.map(val => val.value) : null;
69
- } else {
70
- value = selection ? selection.value : null;
71
- }
72
-
73
- let ev = {
74
- target: {
75
- id: this.props.id,
76
- value: value,
77
- type: 'dropdown'
78
- }
79
- };
80
- this.props.onChange(ev);
81
- }
82
-
83
- render() {
84
- let _this$props = this.props,
85
- {
86
- onChange,
87
- value,
88
- className,
89
- error,
90
- clearable,
91
- disabled,
92
- overrideCSS,
93
- ariaLabelledBy
94
- } = _this$props,
95
- rest = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_2___default()(_this$props, _excluded);
96
-
97
- let has_error = this.props.hasOwnProperty('error') && error != '';
98
- let isClearable = this.props.hasOwnProperty('clearable');
99
- let isDisabled = this.props.hasOwnProperty('disabled') && disabled == true;
100
- let theValue = null;
101
- let selectClassName = className;
102
-
103
- if (!this.props.hasOwnProperty('overrideCSS') || overrideCSS == false) {
104
- selectClassName = 'dropdown ' + className + ' ' + (has_error ? 'error' : '');
105
- }
106
-
107
- if (this.props.isMulti) {
108
- theValue = this.props.options.filter(op => value.includes(op.value));
109
- } else {
110
- theValue = value instanceof Object || value == null ? value : this.props.options.find(opt => opt.value == value);
111
- }
112
-
113
- const selectStyles = {
114
- menu: styles => _objectSpread(_objectSpread({}, styles), {}, {
115
- zIndex: 999
116
- })
117
- };
118
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement((react_select__WEBPACK_IMPORTED_MODULE_4___default()), _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({
119
- className: selectClassName,
120
- value: theValue,
121
- onChange: this.handleChange,
122
- isClearable: isClearable,
123
- isDisabled: isDisabled,
124
- styles: selectStyles,
125
- "aria-labelledby": ariaLabelledBy
126
- }, rest)), has_error && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default().createElement("p", {
127
- className: "error-label"
128
- }, error));
129
- }
130
-
131
- }
132
- Dropdown.defaultProps = {
133
- ariaLabelledBy: null
134
- };
135
-
136
- /***/ }),
137
-
138
- /***/ "./src/components/security/actions.js":
139
- /*!********************************************!*\
140
- !*** ./src/components/security/actions.js ***!
141
- \********************************************/
142
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
143
-
144
- __webpack_require__.r(__webpack_exports__);
145
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
146
- /* harmony export */ "CLEAR_SESSION_STATE": () => (/* binding */ CLEAR_SESSION_STATE),
147
- /* harmony export */ "LOGOUT_USER": () => (/* binding */ LOGOUT_USER),
148
- /* harmony export */ "RECEIVE_USER_INFO": () => (/* binding */ RECEIVE_USER_INFO),
149
- /* harmony export */ "REQUEST_USER_INFO": () => (/* binding */ REQUEST_USER_INFO),
150
- /* harmony export */ "SESSION_STATE_STATUS_CHANGED": () => (/* binding */ SESSION_STATE_STATUS_CHANGED),
151
- /* harmony export */ "SESSION_STATE_STATUS_ERROR": () => (/* binding */ SESSION_STATE_STATUS_ERROR),
152
- /* harmony export */ "SESSION_STATE_STATUS_UNCHANGED": () => (/* binding */ SESSION_STATE_STATUS_UNCHANGED),
153
- /* harmony export */ "SET_LOGGED_USER": () => (/* binding */ SET_LOGGED_USER),
154
- /* harmony export */ "UPDATE_SESSION_STATE_STATUS": () => (/* binding */ UPDATE_SESSION_STATE_STATUS),
155
- /* harmony export */ "UPDATE_USER_INFO": () => (/* binding */ UPDATE_USER_INFO),
156
- /* harmony export */ "doLogout": () => (/* binding */ doLogout),
157
- /* harmony export */ "getUserInfo": () => (/* binding */ getUserInfo),
158
- /* harmony export */ "onUserAuth": () => (/* binding */ onUserAuth),
159
- /* harmony export */ "updateSessionStateStatus": () => (/* binding */ updateSessionStateStatus),
160
- /* harmony export */ "updateUserInfo": () => (/* binding */ updateUserInfo)
161
- /* harmony export */ });
162
- /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "@babel/runtime/helpers/defineProperty");
163
- /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
164
- /* harmony import */ var i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! i18n-react/dist/i18n-react */ "i18n-react/dist/i18n-react");
165
- /* harmony import */ var i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_1__);
166
- /* harmony import */ var _utils_actions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/actions */ "./src/utils/actions.js");
167
- /* harmony import */ var _utils_methods__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/methods */ "./src/utils/methods.js");
168
- /* harmony import */ var _methods__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./methods */ "./src/components/security/methods.js");
169
-
170
-
171
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
172
-
173
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
174
-
175
- /**
176
- * Copyright 2018 OpenStack Foundation
177
- * Licensed under the Apache License, Version 2.0 (the "License");
178
- * you may not use this file except in compliance with the License.
179
- * You may obtain a copy of the License at
180
- * http://www.apache.org/licenses/LICENSE-2.0
181
- * Unless required by applicable law or agreed to in writing, software
182
- * distributed under the License is distributed on an "AS IS" BASIS,
183
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
184
- * See the License for the specific language governing permissions and
185
- * limitations under the License.
186
- **/
187
-
188
-
189
-
190
-
191
- /**
192
- * @ignore
193
- */
194
-
195
- const SET_LOGGED_USER = 'SET_LOGGED_USER';
196
- const LOGOUT_USER = 'LOGOUT_USER';
197
- const REQUEST_USER_INFO = 'REQUEST_USER_INFO';
198
- const RECEIVE_USER_INFO = 'RECEIVE_USER_INFO';
199
- const CLEAR_SESSION_STATE = 'CLEAR_SESSION_STATE';
200
- const UPDATE_SESSION_STATE_STATUS = 'UPDATE_SESSION_STATE_STATUS';
201
- const SESSION_STATE_STATUS_UNCHANGED = 'unchanged';
202
- const SESSION_STATE_STATUS_CHANGED = 'changed';
203
- const SESSION_STATE_STATUS_ERROR = 'error';
204
- const UPDATE_USER_INFO = 'UPDATE_USER_INFO';
205
- const onUserAuth = (accessToken, idToken, sessionState, expiresIn = 0, refreshToken = null) => dispatch => {
206
- (0,_methods__WEBPACK_IMPORTED_MODULE_4__.storeAuthInfo)(accessToken, expiresIn, refreshToken, idToken);
207
- dispatch({
208
- type: SET_LOGGED_USER,
209
- payload: {
210
- sessionState
211
- }
212
- });
213
- };
214
- const doLogout = backUrl => (dispatch, getState) => {
215
- dispatch({
216
- type: LOGOUT_USER,
217
- payload: {
218
- backUrl: backUrl
219
- }
220
- });
221
- };
222
- const getUserInfo = (expand = 'groups', fields = '', backUrl = null, history = null, errorHandler = null) => async (dispatch, getState) => {
223
- let AllowedUserGroups = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_3__.getAllowedUserGroups)();
224
- AllowedUserGroups = AllowedUserGroups !== '' ? AllowedUserGroups.split(' ') : [];
225
- let {
226
- loggedUserState
227
- } = getState();
228
- let {
229
- member
230
- } = loggedUserState;
231
- let accessToken = await (0,_methods__WEBPACK_IMPORTED_MODULE_4__.getAccessToken)();
232
-
233
- if (member != null) {
234
- if (history != null && backUrl != null) history.push(backUrl);
235
- return Promise.resolve();
236
- }
237
-
238
- if (errorHandler == null) errorHandler = _utils_actions__WEBPACK_IMPORTED_MODULE_2__.authErrorHandler;
239
- dispatch((0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.startLoading)());
240
- let params = {
241
- access_token: accessToken,
242
- expand: expand
243
- };
244
-
245
- if (fields) {
246
- params['fields'] = fields;
247
- }
248
-
249
- return (0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.getRequest)((0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.createAction)(REQUEST_USER_INFO), (0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.createAction)(RECEIVE_USER_INFO), (0,_utils_methods__WEBPACK_IMPORTED_MODULE_3__.buildAPIBaseUrl)(`/api/v1/members/me`), errorHandler)(params)(dispatch, getState).then(() => {
250
- dispatch((0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.stopLoading)());
251
- let {
252
- member
253
- } = getState().loggedUserState;
254
-
255
- if (member == null) {
256
- let error_message = {
257
- title: 'ERROR',
258
- html: i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_1___default().translate("errors.user_not_set"),
259
- type: 'error'
260
- };
261
- dispatch((0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.showMessage)(error_message, _methods__WEBPACK_IMPORTED_MODULE_4__.initLogOut));
262
- } // check user groups ( if defined )
263
-
264
-
265
- if (AllowedUserGroups.length > 0) {
266
- let allowedGroups = member.groups.filter((group, idx) => {
267
- return AllowedUserGroups.includes(group.code);
268
- });
269
-
270
- if (allowedGroups.length === 0) {
271
- let error_message = {
272
- title: 'ERROR',
273
- html: i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_1___default().translate("errors.user_not_authz"),
274
- type: 'error'
275
- };
276
- dispatch((0,_utils_actions__WEBPACK_IMPORTED_MODULE_2__.showMessage)(error_message, _methods__WEBPACK_IMPORTED_MODULE_4__.initLogOut));
277
- return;
278
- }
279
- }
280
-
281
- if (history != null && backUrl != null) history.push(backUrl);
282
- });
283
- };
284
- const updateUserInfo = updatedMember => (dispatch, getState) => {
285
- let {
286
- loggedUserState
287
- } = getState();
288
- let {
289
- member
290
- } = loggedUserState;
291
-
292
- if (member == null) {
293
- throw Error("Member is not set.");
294
- }
295
-
296
- if (updatedMember.id != member.id) {
297
- throw Error("Member is not the same.");
298
- }
299
-
300
- dispatch({
301
- type: UPDATE_USER_INFO,
302
- payload: _objectSpread({}, updatedMember)
303
- });
304
- };
305
- const updateSessionStateStatus = newStatus => (dispatch, getState) => {
306
- dispatch({
307
- type: UPDATE_SESSION_STATE_STATUS,
308
- payload: {
309
- sessionStateStatus: newStatus
310
- }
311
- });
312
- };
313
-
314
- /***/ }),
315
-
316
- /***/ "./src/components/security/constants.js":
317
- /*!**********************************************!*\
318
- !*** ./src/components/security/constants.js ***!
319
- \**********************************************/
320
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
321
-
322
- __webpack_require__.r(__webpack_exports__);
323
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
324
- /* harmony export */ "AUTH_ERROR_ACCESS_TOKEN_EXPIRED": () => (/* binding */ AUTH_ERROR_ACCESS_TOKEN_EXPIRED),
325
- /* harmony export */ "AUTH_ERROR_ID_TOKEN_INVALID": () => (/* binding */ AUTH_ERROR_ID_TOKEN_INVALID),
326
- /* harmony export */ "AUTH_ERROR_LOCK_ACQUIRE_ERROR": () => (/* binding */ AUTH_ERROR_LOCK_ACQUIRE_ERROR),
327
- /* harmony export */ "AUTH_ERROR_MISSING_AUTH_INFO": () => (/* binding */ AUTH_ERROR_MISSING_AUTH_INFO),
328
- /* harmony export */ "AUTH_ERROR_MISSING_OTP_PARAM": () => (/* binding */ AUTH_ERROR_MISSING_OTP_PARAM),
329
- /* harmony export */ "AUTH_ERROR_MISSING_REFRESH_TOKEN": () => (/* binding */ AUTH_ERROR_MISSING_REFRESH_TOKEN),
330
- /* harmony export */ "AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR": () => (/* binding */ AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR)
331
- /* harmony export */ });
332
- const AUTH_ERROR_MISSING_AUTH_INFO = 'AUTH_ERROR_MISSING_AUTH_INFO';
333
- const AUTH_ERROR_MISSING_REFRESH_TOKEN = 'AUTH_ERROR_MISSING_REFRESH_TOKEN';
334
- const AUTH_ERROR_ACCESS_TOKEN_EXPIRED = 'AUTH_ERROR_ACCESS_TOKEN_EXPIRED';
335
- const AUTH_ERROR_LOCK_ACQUIRE_ERROR = 'AUTH_ERROR_LOCK_ACQUIRE_ERROR';
336
- const AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR = 'AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR';
337
- const AUTH_ERROR_ID_TOKEN_INVALID = 'AUTH_ERROR_ID_TOKEN_INVALID';
338
- const AUTH_ERROR_MISSING_OTP_PARAM = 'AUTH_ERROR_MISSING_OTP_PARAM';
339
-
340
- /***/ }),
341
-
342
- /***/ "./src/components/security/methods.js":
343
- /*!********************************************!*\
344
- !*** ./src/components/security/methods.js ***!
345
- \********************************************/
346
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
347
-
348
- __webpack_require__.r(__webpack_exports__);
349
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
350
- /* harmony export */ "ACCESS_TOKEN_SKEW_TIME": () => (/* binding */ ACCESS_TOKEN_SKEW_TIME),
351
- /* harmony export */ "RESPONSE_TYPE_CODE": () => (/* binding */ RESPONSE_TYPE_CODE),
352
- /* harmony export */ "RESPONSE_TYPE_IMPLICIT": () => (/* binding */ RESPONSE_TYPE_IMPLICIT),
353
- /* harmony export */ "clearAccessToken": () => (/* binding */ clearAccessToken),
354
- /* harmony export */ "clearAuthInfo": () => (/* binding */ clearAuthInfo),
355
- /* harmony export */ "doLogin": () => (/* binding */ doLogin),
356
- /* harmony export */ "doLoginBasicLogin": () => (/* binding */ doLoginBasicLogin),
357
- /* harmony export */ "emitAccessToken": () => (/* binding */ emitAccessToken),
358
- /* harmony export */ "getAccessToken": () => (/* binding */ getAccessToken),
359
- /* harmony export */ "getAuthInfo": () => (/* binding */ getAuthInfo),
360
- /* harmony export */ "getAuthUrl": () => (/* binding */ getAuthUrl),
361
- /* harmony export */ "getIdToken": () => (/* binding */ getIdToken),
362
- /* harmony export */ "getLogoutUrl": () => (/* binding */ getLogoutUrl),
363
- /* harmony export */ "getOAuth2ClientId": () => (/* binding */ getOAuth2ClientId),
364
- /* harmony export */ "getOAuth2Flow": () => (/* binding */ getOAuth2Flow),
365
- /* harmony export */ "getOAuth2IDPBaseUrl": () => (/* binding */ getOAuth2IDPBaseUrl),
366
- /* harmony export */ "getOAuth2Scopes": () => (/* binding */ getOAuth2Scopes),
367
- /* harmony export */ "initLogOut": () => (/* binding */ initLogOut),
368
- /* harmony export */ "isIdTokenAlive": () => (/* binding */ isIdTokenAlive),
369
- /* harmony export */ "passwordlessLogin": () => (/* binding */ passwordlessLogin),
370
- /* harmony export */ "passwordlessStart": () => (/* binding */ passwordlessStart),
371
- /* harmony export */ "refreshAccessToken": () => (/* binding */ refreshAccessToken),
372
- /* harmony export */ "storeAuthInfo": () => (/* binding */ storeAuthInfo),
373
- /* harmony export */ "useOAuth2RefreshToken": () => (/* binding */ useOAuth2RefreshToken),
374
- /* harmony export */ "validateIdToken": () => (/* binding */ validateIdToken)
375
- /* harmony export */ });
376
- /* harmony import */ var _utils_methods__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/methods */ "./src/utils/methods.js");
377
- /* harmony import */ var superagent_lib_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! superagent/lib/client */ "superagent/lib/client");
378
- /* harmony import */ var superagent_lib_client__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(superagent_lib_client__WEBPACK_IMPORTED_MODULE_1__);
379
- /* harmony import */ var browser_tabs_lock__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! browser-tabs-lock */ "browser-tabs-lock");
380
- /* harmony import */ var browser_tabs_lock__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(browser_tabs_lock__WEBPACK_IMPORTED_MODULE_2__);
381
- /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! urijs */ "urijs");
382
- /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(urijs__WEBPACK_IMPORTED_MODULE_3__);
383
- /* harmony import */ var idtoken_verifier__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! idtoken-verifier */ "idtoken-verifier");
384
- /* harmony import */ var idtoken_verifier__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(idtoken_verifier__WEBPACK_IMPORTED_MODULE_4__);
385
- /* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./actions */ "./src/components/security/actions.js");
386
- /* harmony import */ var _utils_crypto__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../utils/crypto */ "./src/utils/crypto.js");
387
- /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./constants */ "./src/components/security/constants.js");
388
-
389
-
390
-
391
- let http = (superagent_lib_client__WEBPACK_IMPORTED_MODULE_1___default());
392
- /**
393
- * @ignore
394
- */
395
-
396
- const lock = new (browser_tabs_lock__WEBPACK_IMPORTED_MODULE_2___default())();
397
- const GET_TOKEN_SILENTLY_LOCK_KEY = 'openstackuicore.lock.getTokenSilently';
398
- const NONCE_LEN = 16;
399
- const ACCESS_TOKEN_SKEW_TIME = 20;
400
- const RESPONSE_TYPE_IMPLICIT = "token id_token";
401
- const RESPONSE_TYPE_CODE = 'code';
402
- const AUTH_INFO = 'authInfo';
403
- const NONCE = 'nonce';
404
- const PKCE = 'pkce';
405
-
406
-
407
-
408
-
409
-
410
- /**
411
- *
412
- * @param backUrl
413
- * @param prompt
414
- * @param tokenIdHint
415
- * @param provider
416
- * @param loginHint
417
- * @param otpLoginHint
418
- * @returns {*}
419
- */
420
-
421
- const getAuthUrl = (backUrl = null, prompt = null, tokenIdHint = null, provider = null, loginHint = null, otpLoginHint = null) => {
422
- let oauth2ClientId = getOAuth2ClientId();
423
- let redirectUri = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getAuthCallback)();
424
- let baseUrl = getOAuth2IDPBaseUrl();
425
- let scopes = getOAuth2Scopes();
426
- let flow = getOAuth2Flow();
427
- if (backUrl != null) redirectUri += `?BackUrl=${encodeURI(backUrl)}`;
428
- let nonce = createNonce(NONCE_LEN); // store nonce to check it later
429
-
430
- (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.putOnLocalStorage)(NONCE, nonce);
431
- let url = urijs__WEBPACK_IMPORTED_MODULE_3___default()(`${baseUrl}/oauth2/auth`);
432
- let query = {
433
- "response_type": encodeURI(flow),
434
- "scope": encodeURI(scopes),
435
- "nonce": nonce,
436
- "response_mode": 'fragment',
437
- "client_id": encodeURI(oauth2ClientId),
438
- "redirect_uri": encodeURI(redirectUri)
439
- };
440
-
441
- if (flow === RESPONSE_TYPE_CODE) {
442
- const pkce = createPKCECodes();
443
- (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.putOnLocalStorage)(PKCE, JSON.stringify(pkce));
444
- query['code_challenge'] = pkce.codeChallenge;
445
- query['code_challenge_method'] = 'S256';
446
- query['approval_prompt'] = 'force';
447
- }
448
-
449
- if (prompt) {
450
- query['prompt'] = prompt;
451
- }
452
-
453
- if (scopes && scopes.includes('offline_access')) {
454
- // then we need to force prompt=consent bc we are requesting an offline access
455
- // and we need to let the user know
456
- query['prompt'] = 'consent';
457
- }
458
-
459
- if (tokenIdHint) {
460
- query['id_token_hint'] = tokenIdHint;
461
- }
462
-
463
- if (provider) {
464
- query['provider'] = provider;
465
- }
466
-
467
- if (otpLoginHint) {
468
- query['otp_login_hint'] = otpLoginHint;
469
- }
470
-
471
- if (loginHint) {
472
- query['login_hint'] = encodeURI(loginHint);
473
- }
474
-
475
- url = url.query(query); //console.log(`getAuthUrl ${url.toString()}`);
476
-
477
- return url;
478
- };
479
- const getLogoutUrl = idToken => {
480
- let baseUrl = getOAuth2IDPBaseUrl();
481
- let oauth2ClientId = getOAuth2ClientId();
482
- let url = urijs__WEBPACK_IMPORTED_MODULE_3___default()(`${baseUrl}/oauth2/end-session`);
483
- let state = createNonce(NONCE_LEN);
484
- let postLogOutUri = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getOrigin)() + '/auth/logout'; // store nonce to check it later
485
-
486
- (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.putOnLocalStorage)('post_logout_state', state);
487
- /**
488
- * post_logout_redirect_uri should be listed on oauth2 client settings
489
- * on IDP
490
- * "Security Settings" Tab -> Logout Options -> Post Logout Uris
491
- */
492
-
493
- return url.query({
494
- "id_token_hint": idToken,
495
- "post_logout_redirect_uri": encodeURI(postLogOutUri),
496
- "client_id": encodeURI(oauth2ClientId),
497
- "state": state
498
- });
499
- };
500
-
501
- const createNonce = len => {
502
- let possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
503
- let nonce = '';
504
-
505
- for (let i = 0; i < len; i++) {
506
- nonce += possible.charAt(Math.floor(Math.random() * possible.length));
507
- }
508
-
509
- return nonce;
510
- };
511
- /**
512
- *
513
- * @param backUrl
514
- * @param provider
515
- * @param prompt
516
- * @param loginHint
517
- * @param otpLoginHint
518
- */
519
-
520
-
521
- const doLogin = (backUrl = null, provider = null, prompt = null, loginHint = null, otpLoginHint = null) => {
522
- let url = getAuthUrl(backUrl, prompt, null, provider, loginHint, otpLoginHint);
523
- let location = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getCurrentLocation)();
524
- location.replace(url.toString());
525
- };
526
- /**
527
- *
528
- * @param backUrl
529
- * @param loginHint
530
- * @param otpLoginHint
531
- */
532
-
533
- const doLoginBasicLogin = (backUrl = null, loginHint = null, otpLoginHint = null) => {
534
- doLogin(backUrl, null, null, loginHint, otpLoginHint);
535
- };
536
-
537
- const createPKCECodes = () => {
538
- const codeVerifier = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.base64URLEncode)((0,_utils_crypto__WEBPACK_IMPORTED_MODULE_6__.getRandomBytes)(64));
539
- const codeChallenge = (0,_utils_crypto__WEBPACK_IMPORTED_MODULE_6__.getSHA256)(codeVerifier, 'Base64url');
540
- const createdAt = new Date();
541
- const codePair = {
542
- codeVerifier,
543
- codeChallenge,
544
- createdAt
545
- };
546
- return codePair;
547
- };
548
-
549
- const emitAccessToken = async (code, backUrl = null) => {
550
- let baseUrl = getOAuth2IDPBaseUrl();
551
- let oauth2ClientId = getOAuth2ClientId();
552
- let redirectUri = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getAuthCallback)();
553
- let pkce = JSON.parse((0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getFromLocalStorage)(PKCE, true));
554
- if (backUrl != null) redirectUri += `?BackUrl=${encodeURI(backUrl)}`;
555
- const payload = {
556
- 'code': code,
557
- 'grant_type': 'authorization_code',
558
- 'code_verifier': pkce.codeVerifier,
559
- "client_id": encodeURI(oauth2ClientId),
560
- "redirect_uri": encodeURI(redirectUri)
561
- };
562
-
563
- try {
564
- //const response = await http.post(`${baseUrl}/oauth2/token`, payload);
565
- //const {body: {access_token, refresh_token, id_token, expires_in}} = response;
566
- const response = await fetch(`${baseUrl}/oauth2/token`, {
567
- method: 'POST',
568
- headers: {
569
- 'Accept': 'application/json',
570
- 'Content-Type': 'application/json'
571
- },
572
- body: JSON.stringify(payload)
573
- }).catch(function (error) {
574
- console.log('Request failed:', error.message);
575
- });
576
- const json = await response.json();
577
- let {
578
- access_token,
579
- refresh_token,
580
- id_token,
581
- expires_in,
582
- error,
583
- error_description
584
- } = json;
585
- return {
586
- access_token,
587
- refresh_token,
588
- id_token,
589
- expires_in,
590
- error,
591
- error_description
592
- };
593
- } catch (err) {
594
- console.log(err);
595
- }
596
- };
597
- const clearAccessToken = async () => {
598
- if (await (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.retryPromise)(() => lock.acquireLock(GET_TOKEN_SILENTLY_LOCK_KEY, 5000), 10)) {
599
- try {
600
- let authInfo = getAuthInfo();
601
-
602
- if (!authInfo) {
603
- throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_MISSING_AUTH_INFO);
604
- }
605
-
606
- let {
607
- accessToken,
608
- expiresIn,
609
- accessTokenUpdatedAt,
610
- refreshToken
611
- } = authInfo;
612
- storeAuthInfo(null, 0, refreshToken);
613
- } finally {
614
- await lock.releaseLock(GET_TOKEN_SILENTLY_LOCK_KEY);
615
- }
616
- }
617
- };
618
- const getAccessToken = async () => {
619
- if (await (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.retryPromise)(() => lock.acquireLock(GET_TOKEN_SILENTLY_LOCK_KEY, 5000), 10)) {
620
- try {
621
- let authInfo = getAuthInfo();
622
-
623
- if (!authInfo) {
624
- throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_MISSING_AUTH_INFO);
625
- }
626
-
627
- let {
628
- accessToken,
629
- expiresIn,
630
- accessTokenUpdatedAt,
631
- refreshToken
632
- } = authInfo;
633
- let flow = getOAuth2Flow(); // check life time
634
-
635
- let now = Math.floor(Date.now() / 1000);
636
- let timeElapsedSecs = now - accessTokenUpdatedAt;
637
- expiresIn = expiresIn - ACCESS_TOKEN_SKEW_TIME; //console.log(`getAccessToken now ${now} accessTokenUpdatedAt ${accessTokenUpdatedAt} timeElapsedSecs ${timeElapsedSecs} expiresIn ${expiresIn}.`);
638
-
639
- if (timeElapsedSecs > expiresIn || accessToken == null) {
640
- console.log(`getAccessToken access token expired`);
641
-
642
- if (flow === RESPONSE_TYPE_CODE && useOAuth2RefreshToken()) {
643
- //console.log('getAccessToken getting new access token, access token got void');
644
- if (!refreshToken) {
645
- clearAuthInfo();
646
- throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_MISSING_REFRESH_TOKEN);
647
- }
648
-
649
- let response = await refreshAccessToken(refreshToken);
650
- let {
651
- access_token,
652
- expires_in,
653
- refresh_token
654
- } = response; //console.log(`getAccessToken access_token ${access_token} expires_in ${expires_in} refresh_token ${refresh_token}`);
655
-
656
- if (typeof refresh_token === 'undefined') {
657
- refresh_token = null; // not using rotate policy
658
- }
659
-
660
- storeAuthInfo(access_token, expires_in, refresh_token); //console.log(`getAccessToken access_token ${access_token} [NEW]`);
661
-
662
- return access_token;
663
- }
664
-
665
- clearAuthInfo();
666
- throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_ACCESS_TOKEN_EXPIRED);
667
- } //console.log(`getAccessToken access_token ${accessToken} [CACHED]`);
668
-
669
-
670
- return accessToken;
671
- } finally {
672
- await lock.releaseLock(GET_TOKEN_SILENTLY_LOCK_KEY);
673
- }
674
- }
675
-
676
- throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_LOCK_ACQUIRE_ERROR);
677
- };
678
- const refreshAccessToken = async refresh_token => {
679
- let baseUrl = getOAuth2IDPBaseUrl();
680
- let oauth2ClientId = getOAuth2ClientId();
681
- const payload = {
682
- 'grant_type': 'refresh_token',
683
- "client_id": encodeURI(oauth2ClientId),
684
- "refresh_token": refresh_token
685
- };
686
-
687
- try {
688
- const response = await fetch(`${baseUrl}/oauth2/token`, {
689
- method: 'POST',
690
- headers: {
691
- 'Accept': 'application/json',
692
- 'Content-Type': 'application/json'
693
- },
694
- body: JSON.stringify(payload)
695
- }).then(response => {
696
- if (response.status === 400) {
697
- let currentLocation = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getCurrentPathName)();
698
- (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.setSessionClearingState)(true);
699
- throw Error(`${_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR}: ${response.status} - ${response.statusText}`);
700
- }
701
-
702
- return response;
703
- }).catch(function (error) {
704
- throw Error(`${_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR}: ${error.message}`);
705
- });
706
- const json = await response.json();
707
- let {
708
- access_token,
709
- refresh_token,
710
- expires_in
711
- } = json;
712
- return {
713
- access_token,
714
- refresh_token,
715
- expires_in
716
- };
717
- } catch (err) {
718
- console.log(err);
719
- throw err;
720
- }
721
- };
722
- const storeAuthInfo = (accessToken, expiresIn, refreshToken = null, idToken = null) => {
723
- let formerAuthInfo = getAuthInfo();
724
- let authInfo = {
725
- accessToken: accessToken,
726
- expiresIn: expiresIn,
727
- accessTokenUpdatedAt: Math.floor(Date.now() / 1000)
728
- };
729
-
730
- if (refreshToken === null && formerAuthInfo) {
731
- refreshToken = formerAuthInfo.refreshToken;
732
- }
733
-
734
- if (idToken === null && formerAuthInfo) {
735
- idToken = formerAuthInfo.idToken;
736
- }
737
-
738
- if (refreshToken) {
739
- authInfo['refreshToken'] = refreshToken;
740
- }
741
-
742
- if (idToken) {
743
- authInfo['idToken'] = idToken;
744
- }
745
-
746
- (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.putOnLocalStorage)(AUTH_INFO, JSON.stringify(authInfo));
747
- };
748
- const getAuthInfo = () => {
749
- try {
750
- let res = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getFromLocalStorage)(AUTH_INFO, false);
751
- if (!res) return null;
752
- return JSON.parse(res);
753
- } catch (err) {
754
- return null;
755
- }
756
- };
757
- const clearAuthInfo = () => {
758
- if (typeof window !== 'undefined') {
759
- (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.removeFromLocalStorage)(AUTH_INFO);
760
- (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.removeFromLocalStorage)(NONCE);
761
- (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.removeFromLocalStorage)(PKCE);
762
- return;
763
- }
764
- };
765
- const getIdToken = () => {
766
- if (typeof window !== 'undefined') {
767
- const authInfo = getAuthInfo();
768
-
769
- if (authInfo) {
770
- return authInfo.idToken;
771
- }
772
-
773
- return null;
774
- }
775
-
776
- return null;
777
- };
778
- const getOAuth2ClientId = () => {
779
- if (typeof window !== 'undefined') {
780
- return window.OAUTH2_CLIENT_ID;
781
- }
782
-
783
- return null;
784
- };
785
- const getOAuth2Flow = () => {
786
- if (typeof window !== 'undefined') {
787
- return window.OAUTH2_FLOW || "token id_token";
788
- }
789
-
790
- return "token id_token";
791
- };
792
- const useOAuth2RefreshToken = () => {
793
- if (typeof window !== 'undefined') {
794
- return new Boolean(window.OAUTH2_USE_REFRESH_TOKEN || true);
795
- }
796
-
797
- return true;
798
- };
799
- const getOAuth2IDPBaseUrl = () => {
800
- if (typeof window !== 'undefined') {
801
- return window.IDP_BASE_URL;
802
- }
803
-
804
- return null;
805
- };
806
- const getOAuth2Scopes = () => {
807
- if (typeof window !== 'undefined') {
808
- return window.SCOPES;
809
- }
810
-
811
- return null;
812
- };
813
- const initLogOut = () => {
814
- let location = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getCurrentLocation)();
815
- location.replace(getLogoutUrl(getIdToken()).toString());
816
- };
817
- const validateIdToken = (idToken, issuer, audience) => {
818
- let verifier = new (idtoken_verifier__WEBPACK_IMPORTED_MODULE_4___default())({
819
- issuer: issuer,
820
- audience: audience
821
- });
822
- let storedNonce = (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.getFromLocalStorage)(NONCE, true);
823
- let jwt = verifier.decode(idToken);
824
- let alg = jwt.header.alg;
825
- let kid = jwt.header.kid;
826
- let aud = jwt.payload.aud;
827
- let iss = jwt.payload.iss;
828
- let exp = jwt.payload.exp;
829
- let nbf = jwt.payload.nbf;
830
- let tnonce = jwt.payload.nonce || null;
831
- return tnonce == storedNonce && aud == audience && iss == issuer;
832
- };
833
- const passwordlessStart = params => {
834
- let oauth2ClientId = getOAuth2ClientId();
835
- let scopes = getOAuth2Scopes();
836
- let nonce = createNonce(NONCE_LEN); // store nonce to check it later
837
-
838
- (0,_utils_methods__WEBPACK_IMPORTED_MODULE_0__.putOnLocalStorage)(NONCE, nonce);
839
- let baseUrl = getOAuth2IDPBaseUrl();
840
- let url = urijs__WEBPACK_IMPORTED_MODULE_3___default()(`${baseUrl}/oauth2/auth`);
841
- let payload = {
842
- "response_type": "otp",
843
- "scope": encodeURI(scopes),
844
- "nonce": nonce,
845
- "client_id": encodeURI(oauth2ClientId),
846
- "connection": params.connection || "email",
847
- "send": params.send || "code"
848
- };
849
-
850
- if (params.hasOwnProperty('email')) {
851
- payload["email"] = encodeURIComponent(params.email);
852
- }
853
-
854
- if (params.hasOwnProperty('phone_number')) {
855
- payload["phone_number"] = encodeURIComponent(params.phone_number);
856
- }
857
-
858
- if (params.hasOwnProperty('redirect_uri')) {
859
- payload["redirect_uri"] = encodeURIComponent(params.redirect_uri);
860
- }
861
-
862
- let req = http.post(url.toString());
863
- return req.send(payload).then(res => {
864
- let json = res.body;
865
- return Promise.resolve({
866
- response: json
867
- });
868
- }).catch(err => {
869
- return Promise.reject(err);
870
- });
871
- };
872
- const passwordlessLogin = params => dispatch => {
873
- let oauth2ClientId = getOAuth2ClientId();
874
- let scopes = getOAuth2Scopes();
875
- let baseUrl = getOAuth2IDPBaseUrl();
876
- let url = urijs__WEBPACK_IMPORTED_MODULE_3___default()(`${baseUrl}/oauth2/token`);
877
-
878
- if (!params.hasOwnProperty("otp")) {
879
- throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_MISSING_OTP_PARAM);
880
- }
881
-
882
- let payload = {
883
- "grant_type": "passwordless",
884
- "connection": params.connection || "email",
885
- "scope": encodeURI(scopes),
886
- "client_id": encodeURI(oauth2ClientId),
887
- "otp": params.otp
888
- };
889
-
890
- if (params.hasOwnProperty('email')) {
891
- payload["email"] = encodeURIComponent(params.email);
892
- }
893
-
894
- if (params.hasOwnProperty('phone_number')) {
895
- payload["phone_number"] = encodeURIComponent(params.phone_number);
896
- }
897
-
898
- let req = http.post(url.toString());
899
- return req.send(payload).then(res => {
900
- try {
901
- // now we got token
902
- let json = res.body;
903
- let {
904
- access_token,
905
- expires_in,
906
- refresh_token,
907
- id_token
908
- } = json;
909
-
910
- if (typeof refresh_token === 'undefined') {
911
- refresh_token = null; // not using rotate policy
912
- }
913
-
914
- if (typeof id_token === 'undefined') {
915
- id_token = null; // not using rotate policy
916
- } // verify id token
917
-
918
-
919
- if (id_token) {
920
- if (!validateIdToken(id_token, baseUrl, oauth2ClientId)) {
921
- throw Error(_constants__WEBPACK_IMPORTED_MODULE_7__.AUTH_ERROR_ID_TOKEN_INVALID);
922
- }
923
- }
924
-
925
- storeAuthInfo(access_token, expires_in, refresh_token, id_token);
926
-
927
- if (dispatch) {
928
- dispatch({
929
- type: _actions__WEBPACK_IMPORTED_MODULE_5__.SET_LOGGED_USER,
930
- payload: {
931
- sessionState: null
932
- }
933
- });
934
- }
935
-
936
- return Promise.resolve({
937
- response: json
938
- });
939
- } catch (e) {
940
- console.log(e);
941
- return Promise.reject(e);
942
- }
943
- }).catch(err => {
944
- return Promise.reject(err);
945
- });
946
- };
947
- const isIdTokenAlive = (nowEpoch = null) => () => {
948
- if (!nowEpoch) {
949
- nowEpoch = Math.floor(Date.now() / 1000);
950
- }
951
-
952
- const idToken = getIdToken();
953
- if (!idToken) throw Error('Id Token not set.');
954
- const issuer = getOAuth2IDPBaseUrl();
955
- const audience = getOAuth2ClientId();
956
- let verifier = new (idtoken_verifier__WEBPACK_IMPORTED_MODULE_4___default())({
957
- issuer: issuer,
958
- audience: audience
959
- });
960
- const jwt = verifier.decode(idToken);
961
- const exp = jwt.payload.exp; // check life time
962
-
963
- return exp - (nowEpoch + ACCESS_TOKEN_SKEW_TIME) > 0;
964
- };
965
-
966
- /***/ }),
967
-
968
- /***/ "./src/utils/actions.js":
969
- /*!******************************!*\
970
- !*** ./src/utils/actions.js ***!
971
- \******************************/
972
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
973
-
974
- __webpack_require__.r(__webpack_exports__);
975
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
976
- /* harmony export */ "CLEAR_MESSAGE": () => (/* binding */ CLEAR_MESSAGE),
977
- /* harmony export */ "GENERIC_ERROR": () => (/* binding */ GENERIC_ERROR),
978
- /* harmony export */ "RESET_LOADING": () => (/* binding */ RESET_LOADING),
979
- /* harmony export */ "SHOW_MESSAGE": () => (/* binding */ SHOW_MESSAGE),
980
- /* harmony export */ "START_LOADING": () => (/* binding */ START_LOADING),
981
- /* harmony export */ "STOP_LOADING": () => (/* binding */ STOP_LOADING),
982
- /* harmony export */ "VALIDATE": () => (/* binding */ VALIDATE),
983
- /* harmony export */ "authErrorHandler": () => (/* binding */ authErrorHandler),
984
- /* harmony export */ "createAction": () => (/* binding */ createAction),
985
- /* harmony export */ "defaultErrorHandler": () => (/* binding */ defaultErrorHandler),
986
- /* harmony export */ "deleteRequest": () => (/* binding */ deleteRequest),
987
- /* harmony export */ "downloadFileByContent": () => (/* binding */ downloadFileByContent),
988
- /* harmony export */ "escapeFilterValue": () => (/* binding */ escapeFilterValue),
989
- /* harmony export */ "fetchErrorHandler": () => (/* binding */ fetchErrorHandler),
990
- /* harmony export */ "fetchResponseHandler": () => (/* binding */ fetchResponseHandler),
991
- /* harmony export */ "getCSV": () => (/* binding */ getCSV),
992
- /* harmony export */ "getHeaderCaseInsensitive": () => (/* binding */ getHeaderCaseInsensitive),
993
- /* harmony export */ "getRawCSV": () => (/* binding */ getRawCSV),
994
- /* harmony export */ "getRequest": () => (/* binding */ getRequest),
995
- /* harmony export */ "postFile": () => (/* binding */ postFile),
996
- /* harmony export */ "postRequest": () => (/* binding */ postRequest),
997
- /* harmony export */ "putFile": () => (/* binding */ putFile),
998
- /* harmony export */ "putRequest": () => (/* binding */ putRequest),
999
- /* harmony export */ "resetLoading": () => (/* binding */ resetLoading),
1000
- /* harmony export */ "responseHandler": () => (/* binding */ responseHandler),
1001
- /* harmony export */ "showMessage": () => (/* binding */ showMessage),
1002
- /* harmony export */ "showSuccessMessage": () => (/* binding */ showSuccessMessage),
1003
- /* harmony export */ "startLoading": () => (/* binding */ startLoading),
1004
- /* harmony export */ "stopLoading": () => (/* binding */ stopLoading)
1005
- /* harmony export */ });
1006
- /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ "@babel/runtime/helpers/objectWithoutProperties");
1007
- /* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__);
1008
- /* harmony import */ var superagent_lib_client__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! superagent/lib/client */ "superagent/lib/client");
1009
- /* harmony import */ var superagent_lib_client__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(superagent_lib_client__WEBPACK_IMPORTED_MODULE_1__);
1010
- /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! urijs */ "urijs");
1011
- /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(urijs__WEBPACK_IMPORTED_MODULE_2__);
1012
- /* harmony import */ var sweetalert2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! sweetalert2 */ "sweetalert2");
1013
- /* harmony import */ var sweetalert2__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(sweetalert2__WEBPACK_IMPORTED_MODULE_3__);
1014
- /* harmony import */ var i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! i18n-react/dist/i18n-react */ "i18n-react/dist/i18n-react");
1015
- /* harmony import */ var i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4__);
1016
- /* harmony import */ var _methods__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./methods */ "./src/utils/methods.js");
1017
- /* harmony import */ var _components_security_actions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../components/security/actions */ "./src/components/security/actions.js");
1018
- /* harmony import */ var _components_security_methods__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../components/security/methods */ "./src/components/security/methods.js");
1019
-
1020
- const _excluded = ["access_token"];
1021
-
1022
- /**
1023
- * Copyright 2017 OpenStack Foundation
1024
- * Licensed under the Apache License, Version 2.0 (the "License");
1025
- * you may not use this file except in compliance with the License.
1026
- * You may obtain a copy of the License at
1027
- * http://www.apache.org/licenses/LICENSE-2.0
1028
- * Unless required by applicable law or agreed to in writing, software
1029
- * distributed under the License is distributed on an "AS IS" BASIS,
1030
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1031
- * See the License for the specific flanguage governing permissions and
1032
- * limitations under the License.
1033
- **/
1034
-
1035
-
1036
- let http = (superagent_lib_client__WEBPACK_IMPORTED_MODULE_1___default());
1037
-
1038
-
1039
-
1040
-
1041
-
1042
- const GENERIC_ERROR = "Yikes. Something seems to be broken. Our web team has been notified, and we apologize for the inconvenience.";
1043
- const RESET_LOADING = 'RESET_LOADING';
1044
- const START_LOADING = 'START_LOADING';
1045
- const STOP_LOADING = 'STOP_LOADING';
1046
- const VALIDATE = 'VALIDATE';
1047
- const CLEAR_MESSAGE = 'CLEAR_MESSAGE';
1048
- const SHOW_MESSAGE = 'SHOW_MESSAGE';
1049
- const createAction = type => payload => ({
1050
- type,
1051
- payload
1052
- });
1053
- const resetLoading = createAction(RESET_LOADING);
1054
- const startLoading = createAction(START_LOADING);
1055
- const stopLoading = createAction(STOP_LOADING);
1056
- const xhrs = {};
1057
- const etagCache = {};
1058
-
1059
- const cancel = key => {
1060
- if (xhrs[key]) {
1061
- xhrs[key].abort();
1062
- console.log(`aborted request ${key}`);
1063
- delete xhrs[key];
1064
- }
1065
- };
1066
-
1067
- const schedule = (key, req) => {
1068
- // console.log(`scheduling ${key}`);
1069
- xhrs[key] = req;
1070
- };
1071
-
1072
- const isObjectEmpty = obj => {
1073
- return Object.keys(obj).length === 0 && obj.constructor === Object;
1074
- };
1075
-
1076
- const authErrorHandler = (err, res) => (dispatch, state) => {
1077
- let code = err.status;
1078
- let msg = '';
1079
- dispatch(stopLoading());
1080
-
1081
- switch (code) {
1082
- case 403:
1083
- let error_message = {
1084
- title: 'ERROR',
1085
- html: i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("errors.user_not_authz"),
1086
- type: 'error'
1087
- };
1088
- dispatch(showMessage(error_message, _components_security_methods__WEBPACK_IMPORTED_MODULE_7__.initLogOut));
1089
- break;
1090
-
1091
- case 401:
1092
- let currentLocation = (0,_methods__WEBPACK_IMPORTED_MODULE_5__.getCurrentPathName)();
1093
- let clearing_session_state = (0,_methods__WEBPACK_IMPORTED_MODULE_5__.isClearingSessionState)();
1094
- dispatch({
1095
- type: _components_security_actions__WEBPACK_IMPORTED_MODULE_6__.CLEAR_SESSION_STATE,
1096
- payload: {}
1097
- });
1098
-
1099
- if (!clearing_session_state) {
1100
- (0,_methods__WEBPACK_IMPORTED_MODULE_5__.setSessionClearingState)(true);
1101
- console.log('authErrorHandler 401 - re login');
1102
- (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_7__.doLogin)(currentLocation);
1103
- }
1104
-
1105
- break;
1106
-
1107
- case 404:
1108
- msg = "";
1109
- if (err.response.body && err.response.body.message) msg = err.response.body.message;else if (err.response.error && err.response.error.message) msg = err.response.error.message;else msg = err.message;
1110
- sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("Not Found", msg, "warning");
1111
- break;
1112
-
1113
- case 412:
1114
- for (var [key, value] of Object.entries(err.response.body.errors)) {
1115
- if (isNaN(key)) {
1116
- msg += key + ': ';
1117
- }
1118
-
1119
- msg += value + '<br>';
1120
- }
1121
-
1122
- sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("Validation error", msg, "warning");
1123
- dispatch({
1124
- type: VALIDATE,
1125
- payload: {
1126
- errors: err.response.body.errors
1127
- }
1128
- });
1129
- break;
1130
-
1131
- default:
1132
- sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("ERROR", i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("errors.server_error"), "error");
1133
- }
1134
- };
1135
- const getRequest = (requestActionCreator, receiveActionCreator, endpoint, errorHandler = defaultErrorHandler, requestActionPayload = {}, useEtag = false) => (params = {}) => (dispatch, state) => {
1136
- let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1137
- let key = url.toString();
1138
-
1139
- if (!isObjectEmpty(params)) {
1140
- // remove the access token
1141
- const {
1142
- access_token: _
1143
- } = params,
1144
- newParams = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(params, _excluded); // and generate new key
1145
-
1146
-
1147
- key = url.query(newParams).toString();
1148
- url = url.query(params);
1149
- }
1150
-
1151
- if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1152
- cancel(key);
1153
- return new Promise((resolve, reject) => {
1154
- let req = http.get(url.toString());
1155
-
1156
- if (useEtag && etagCache.hasOwnProperty(key)) {
1157
- const {
1158
- etag
1159
- } = etagCache[key];
1160
-
1161
- if (etag) {
1162
- req.set('If-None-Match', etag);
1163
- }
1164
- }
1165
-
1166
- req.timeout({
1167
- response: 60000,
1168
- deadline: 60000
1169
- }).end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject, key, useEtag));
1170
- schedule(key, req);
1171
- });
1172
- };
1173
- const putRequest = (requestActionCreator, receiveActionCreator, endpoint, payload, errorHandler = defaultErrorHandler, requestActionPayload = {}) => (params = {}) => (dispatch, state) => {
1174
- let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1175
- if (!isObjectEmpty(params)) url = url.query(params);
1176
- if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1177
- return new Promise((resolve, reject) => {
1178
- if (payload == null) payload = {};
1179
- http.put(url.toString()).send(payload).end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject));
1180
- });
1181
- };
1182
- const deleteRequest = (requestActionCreator, receiveActionCreator, endpoint, payload, errorHandler = defaultErrorHandler, requestActionPayload = {}) => params => (dispatch, state) => {
1183
- let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1184
- if (!isObjectEmpty(params)) url = url.query(params);
1185
- if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1186
- return new Promise((resolve, reject) => {
1187
- if (payload == null) payload = {};
1188
- http.delete(url).send(payload).end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject));
1189
- });
1190
- };
1191
- const postRequest = (requestActionCreator, receiveActionCreator, endpoint, payload, errorHandler = defaultErrorHandler, requestActionPayload = {}) => (params = {}) => (dispatch, state) => {
1192
- let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1193
- if (!isObjectEmpty(params)) url = url.query(params);
1194
- if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1195
- return new Promise((resolve, reject) => {
1196
- let request = http.post(url);
1197
- if (payload != null) request.send(payload);else // to be a simple CORS request
1198
- request.set('Content-Type', 'text/plain');
1199
- request.end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject));
1200
- });
1201
- };
1202
- const postFile = (requestActionCreator, receiveActionCreator, endpoint, file, fileMetadata = {}, errorHandler = defaultErrorHandler, requestActionPayload = {}) => (params = {}) => (dispatch, state) => {
1203
- let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1204
- if (!isObjectEmpty(params)) url = url.query(params);
1205
- if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1206
- return new Promise((resolve, reject) => {
1207
- const req = http.post(url).attach('file', file);
1208
-
1209
- if (!isObjectEmpty(fileMetadata)) {
1210
- Object.keys(fileMetadata).forEach(function (key) {
1211
- let value = fileMetadata[key];
1212
- req.field(key, value);
1213
- });
1214
- }
1215
-
1216
- req.end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject));
1217
- });
1218
- };
1219
- const putFile = (requestActionCreator, receiveActionCreator, endpoint, file = null, fileMetadata = {}, errorHandler = defaultErrorHandler, requestActionPayload = {}) => (params = {}) => (dispatch, state) => {
1220
- let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1221
- if (!isObjectEmpty(params)) url = url.query(params);
1222
- if (requestActionCreator && typeof requestActionCreator === 'function') dispatch(requestActionCreator(requestActionPayload));
1223
- return new Promise((resolve, reject) => {
1224
- const req = http.put(url);
1225
-
1226
- if (file != null) {
1227
- req.attach('file', file);
1228
- }
1229
-
1230
- if (!isObjectEmpty(fileMetadata)) {
1231
- Object.keys(fileMetadata).forEach(function (key) {
1232
- let value = fileMetadata[key];
1233
- req.field(key, value);
1234
- });
1235
- }
1236
-
1237
- req.end(responseHandler(dispatch, state, receiveActionCreator, errorHandler, resolve, reject));
1238
- });
1239
- };
1240
- const defaultErrorHandler = (err, res) => dispatch => {
1241
- let body = res.body;
1242
- let text = '';
1243
-
1244
- if (body instanceof Object) {
1245
- if (body.hasOwnProperty('message')) text = body.message;
1246
- }
1247
-
1248
- sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire(res.statusText, text, "error");
1249
- };
1250
-
1251
- const byLowerCase = toFind => value => toLowerCase(value) === toFind;
1252
-
1253
- const toLowerCase = value => value.toLowerCase();
1254
-
1255
- const getKeys = headers => Object.keys(headers);
1256
-
1257
- const getHeaderCaseInsensitive = (headerName, headers = {}) => {
1258
- const key = getKeys(headers).find(byLowerCase(headerName));
1259
- return key ? headers[key] : undefined;
1260
- };
1261
- const responseHandler = (dispatch, state, receiveActionCreator, errorHandler, resolve, reject, key = null, useEtag = false) => (err, res) => {
1262
- if (err || !res.ok) {
1263
- let code = err.status;
1264
-
1265
- if (code === 304 && etagCache.hasOwnProperty(key) && useEtag) {
1266
- const {
1267
- body
1268
- } = etagCache[key];
1269
-
1270
- if (typeof receiveActionCreator === 'function') {
1271
- dispatch(receiveActionCreator({
1272
- response: body
1273
- }));
1274
- return resolve({
1275
- response: body
1276
- });
1277
- }
1278
-
1279
- dispatch(receiveActionCreator);
1280
- return resolve({
1281
- response: body
1282
- });
1283
- }
1284
-
1285
- if (errorHandler) {
1286
- errorHandler(err, res)(dispatch, state);
1287
- }
1288
-
1289
- return reject({
1290
- err,
1291
- res,
1292
- dispatch,
1293
- state
1294
- });
1295
- }
1296
-
1297
- let json = res.body;
1298
-
1299
- if (useEtag) {
1300
- const responseETAG = getHeaderCaseInsensitive('etag', res.headers);
1301
-
1302
- if (responseETAG) {
1303
- etagCache[key] = {
1304
- etag: responseETAG,
1305
- body: json
1306
- };
1307
- }
1308
- }
1309
-
1310
- if (typeof receiveActionCreator === 'function') {
1311
- dispatch(receiveActionCreator({
1312
- response: json
1313
- }));
1314
- return resolve({
1315
- response: json
1316
- });
1317
- }
1318
-
1319
- dispatch(receiveActionCreator);
1320
- return resolve({
1321
- response: json
1322
- });
1323
- };
1324
- const fetchErrorHandler = response => {
1325
- let code = response.status;
1326
- let msg = response.statusText;
1327
-
1328
- switch (code) {
1329
- case 403:
1330
- sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("ERROR", i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("errors.user_not_authz"), "warning");
1331
- break;
1332
-
1333
- case 401:
1334
- sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("ERROR", i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("errors.session_expired"), "error");
1335
- break;
1336
-
1337
- case 412:
1338
- sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("ERROR", msg, "warning");
1339
-
1340
- case 500:
1341
- sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire("ERROR", i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("errors.server_error"), "error");
1342
- }
1343
- };
1344
- const fetchResponseHandler = response => {
1345
- if (!response.ok) {
1346
- throw response;
1347
- } else {
1348
- return response.json();
1349
- }
1350
- };
1351
- const showMessage = (settings, callback = {}) => dispatch => {
1352
- dispatch(stopLoading());
1353
- sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire(settings).then(result => {
1354
- if (result.value && typeof callback === 'function') {
1355
- callback();
1356
- }
1357
- });
1358
- };
1359
- const showSuccessMessage = html => dispatch => {
1360
- dispatch(stopLoading());
1361
- sweetalert2__WEBPACK_IMPORTED_MODULE_3___default().fire({
1362
- title: i18n_react_dist_i18n_react__WEBPACK_IMPORTED_MODULE_4___default().translate("general.done"),
1363
- html: html,
1364
- type: 'success'
1365
- });
1366
- };
1367
- const downloadFileByContent = (filename, content, mime) => {
1368
- let link = document.createElement('a');
1369
- link.textContent = 'download';
1370
- link.download = filename;
1371
- link.href = `data:${mime},${encodeURIComponent(content)}`;
1372
- document.body.appendChild(link); // Required for FF
1373
-
1374
- link.click();
1375
- document.body.removeChild(link);
1376
- };
1377
- const getCSV = (endpoint, params, filename, header = null) => dispatch => {
1378
- let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1379
- if (!isObjectEmpty(params)) url = url.query(params);
1380
- dispatch(startLoading());
1381
- return fetch(url.toString()).then(response => {
1382
- if (!response.ok) {
1383
- throw response;
1384
- } else {
1385
- return response.text();
1386
- }
1387
- }).then(csv => {
1388
- dispatch(stopLoading());
1389
-
1390
- if (header) {
1391
- csv = header + '\r\r' + csv;
1392
- }
1393
-
1394
- downloadFileByContent(filename, csv, 'text/csv;charset=utf-8');
1395
- }).catch(fetchErrorHandler);
1396
- };
1397
- const getRawCSV = (endpoint, params, header = null) => {
1398
- let url = urijs__WEBPACK_IMPORTED_MODULE_2___default()(endpoint);
1399
- if (!isObjectEmpty(params)) url = url.query(params);
1400
- return fetch(url.toString()).then(response => {
1401
- if (!response.ok) {
1402
- throw response;
1403
- } else {
1404
- return response.text();
1405
- }
1406
- }).then(csv => {
1407
- if (header) {
1408
- csv = header + '\r\r' + csv;
1409
- }
1410
-
1411
- return csv;
1412
- }).catch(fetchErrorHandler);
1413
- };
1414
- const escapeFilterValue = value => {
1415
- value = value.replace(/,/g, "\\,");
1416
- value = value.replace(/;/g, "\\;");
1417
- return value;
1418
- };
1419
-
1420
- /***/ }),
1421
-
1422
- /***/ "./src/utils/crypto.js":
1423
- /*!*****************************!*\
1424
- !*** ./src/utils/crypto.js ***!
1425
- \*****************************/
1426
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1427
-
1428
- __webpack_require__.r(__webpack_exports__);
1429
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1430
- /* harmony export */ "getRandomBytes": () => (/* binding */ getRandomBytes),
1431
- /* harmony export */ "getSHA256": () => (/* binding */ getSHA256)
1432
- /* harmony export */ });
1433
- /* harmony import */ var crypto_js_sha256__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! crypto-js/sha256 */ "crypto-js/sha256");
1434
- /* harmony import */ var crypto_js_sha256__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(crypto_js_sha256__WEBPACK_IMPORTED_MODULE_0__);
1435
- /* harmony import */ var crypto_js_enc_base64url__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! crypto-js/enc-base64url */ "crypto-js/enc-base64url");
1436
- /* harmony import */ var crypto_js_enc_base64url__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(crypto_js_enc_base64url__WEBPACK_IMPORTED_MODULE_1__);
1437
- /* harmony import */ var crypto_js_enc_hex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! crypto-js/enc-hex */ "crypto-js/enc-hex");
1438
- /* harmony import */ var crypto_js_enc_hex__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(crypto_js_enc_hex__WEBPACK_IMPORTED_MODULE_2__);
1439
- // limit of Crypto.getRandomValues()
1440
- // https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues
1441
- const MAX_BYTES = 65536; // Node supports requesting up to this number of bytes
1442
- // https://github.com/nodejs/node/blob/master/lib/internal/crypto/random.js#L48
1443
-
1444
- const MAX_UINT32 = 4294967295;
1445
- const crypto = typeof window !== 'undefined' ? window.crypto || window.msCrypto : null;
1446
-
1447
-
1448
-
1449
- const getRandomBytes = size => {
1450
- // phantomjs needs to throw
1451
- if (size > MAX_UINT32) throw new RangeError('requested too many random bytes');
1452
- const bytes = Buffer.allocUnsafe(size);
1453
- if (!crypto) return a;
1454
-
1455
- if (size > 0) {
1456
- // getRandomValues fails on IE if size == 0
1457
- if (size > MAX_BYTES) {
1458
- // this is the max bytes crypto.getRandomValues
1459
- // can do at once see https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues
1460
- for (let generated = 0; generated < size; generated += MAX_BYTES) {
1461
- // buffer.slice automatically checks if the end is past the end of
1462
- // the buffer so we don't have to here
1463
- crypto.getRandomValues(bytes.slice(generated, generated + MAX_BYTES));
1464
- }
1465
- } else {
1466
- crypto.getRandomValues(bytes);
1467
- }
1468
- }
1469
-
1470
- return bytes;
1471
- };
1472
- const getSHA256 = (message, format = 'hex') => {
1473
- let f = (crypto_js_enc_hex__WEBPACK_IMPORTED_MODULE_2___default());
1474
- if (format === 'Base64url') f = (crypto_js_enc_base64url__WEBPACK_IMPORTED_MODULE_1___default());
1475
- return crypto_js_sha256__WEBPACK_IMPORTED_MODULE_0___default()(message).toString(f);
1476
- };
1477
-
1478
- /***/ }),
1479
-
1480
- /***/ "./src/utils/methods.js":
1481
- /*!******************************!*\
1482
- !*** ./src/utils/methods.js ***!
1483
- \******************************/
1484
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1485
-
1486
- __webpack_require__.r(__webpack_exports__);
1487
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1488
- /* harmony export */ "arraysEqual": () => (/* binding */ arraysEqual),
1489
- /* harmony export */ "base64URLEncode": () => (/* binding */ base64URLEncode),
1490
- /* harmony export */ "buildAPIBaseUrl": () => (/* binding */ buildAPIBaseUrl),
1491
- /* harmony export */ "epochToMoment": () => (/* binding */ epochToMoment),
1492
- /* harmony export */ "epochToMomentTimeZone": () => (/* binding */ epochToMomentTimeZone),
1493
- /* harmony export */ "findElementPos": () => (/* binding */ findElementPos),
1494
- /* harmony export */ "formatEpoch": () => (/* binding */ formatEpoch),
1495
- /* harmony export */ "getAllowedUserGroups": () => (/* binding */ getAllowedUserGroups),
1496
- /* harmony export */ "getAuthCallback": () => (/* binding */ getAuthCallback),
1497
- /* harmony export */ "getBackURL": () => (/* binding */ getBackURL),
1498
- /* harmony export */ "getCurrentHref": () => (/* binding */ getCurrentHref),
1499
- /* harmony export */ "getCurrentLocation": () => (/* binding */ getCurrentLocation),
1500
- /* harmony export */ "getCurrentPathName": () => (/* binding */ getCurrentPathName),
1501
- /* harmony export */ "getCurrentUserLanguage": () => (/* binding */ getCurrentUserLanguage),
1502
- /* harmony export */ "getFromLocalStorage": () => (/* binding */ getFromLocalStorage),
1503
- /* harmony export */ "getOrigin": () => (/* binding */ getOrigin),
1504
- /* harmony export */ "getTimeServiceUrl": () => (/* binding */ getTimeServiceUrl),
1505
- /* harmony export */ "hasErrors": () => (/* binding */ hasErrors),
1506
- /* harmony export */ "isClearingSessionState": () => (/* binding */ isClearingSessionState),
1507
- /* harmony export */ "isEmpty": () => (/* binding */ isEmpty),
1508
- /* harmony export */ "objectToQueryString": () => (/* binding */ objectToQueryString),
1509
- /* harmony export */ "putOnLocalStorage": () => (/* binding */ putOnLocalStorage),
1510
- /* harmony export */ "removeFromLocalStorage": () => (/* binding */ removeFromLocalStorage),
1511
- /* harmony export */ "retryPromise": () => (/* binding */ retryPromise),
1512
- /* harmony export */ "scrollToError": () => (/* binding */ scrollToError),
1513
- /* harmony export */ "setSessionClearingState": () => (/* binding */ setSessionClearingState),
1514
- /* harmony export */ "shallowEqual": () => (/* binding */ shallowEqual),
1515
- /* harmony export */ "toSlug": () => (/* binding */ toSlug)
1516
- /* harmony export */ });
1517
- /* harmony import */ var moment_timezone__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! moment-timezone */ "moment-timezone");
1518
- /* harmony import */ var moment_timezone__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(moment_timezone__WEBPACK_IMPORTED_MODULE_0__);
1519
- /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! urijs */ "urijs");
1520
- /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(urijs__WEBPACK_IMPORTED_MODULE_1__);
1521
- /**
1522
- * Copyright 2018 OpenStack Foundation
1523
- * Licensed under the Apache License, Version 2.0 (the "License");
1524
- * you may not use this file except in compliance with the License.
1525
- * You may obtain a copy of the License at
1526
- * http://www.apache.org/licenses/LICENSE-2.0
1527
- * Unless required by applicable law or agreed to in writing, software
1528
- * distributed under the License is distributed on an "AS IS" BASIS,
1529
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1530
- * See the License for the specific language governing permissions and
1531
- * limitations under the License.
1532
- **/
1533
-
1534
-
1535
- const findElementPos = obj => {
1536
- var curtop = -70;
1537
-
1538
- if (obj.offsetParent) {
1539
- do {
1540
- curtop += obj.offsetTop;
1541
- } while (obj = obj.offsetParent);
1542
-
1543
- return [curtop];
1544
- }
1545
- };
1546
- const epochToMoment = atime => {
1547
- if (!atime) return atime;
1548
- atime = atime * 1000;
1549
- return moment_timezone__WEBPACK_IMPORTED_MODULE_0___default()(atime);
1550
- };
1551
- const epochToMomentTimeZone = (atime, time_zone) => {
1552
- if (!atime) return atime;
1553
- atime = atime * 1000;
1554
- return moment_timezone__WEBPACK_IMPORTED_MODULE_0___default()(atime).tz(time_zone);
1555
- };
1556
- const formatEpoch = (atime, format = 'M/D/YYYY h:mm a') => {
1557
- if (!atime) return atime;
1558
- return epochToMoment(atime).format(format);
1559
- };
1560
- const objectToQueryString = obj => {
1561
- var str = "";
1562
-
1563
- for (var key in obj) {
1564
- if (str != "") {
1565
- str += "&";
1566
- }
1567
-
1568
- str += key + "=" + encodeURIComponent(obj[key]);
1569
- }
1570
-
1571
- return str;
1572
- };
1573
- const getBackURL = () => {
1574
- let url = urijs__WEBPACK_IMPORTED_MODULE_1___default()(window.location.href);
1575
- let query = url.search(true);
1576
- let fragment = url.fragment();
1577
- let backUrl = query.hasOwnProperty('BackUrl') ? query['BackUrl'] : null;
1578
-
1579
- if (fragment != null && fragment != '') {
1580
- backUrl += `#${fragment}`;
1581
- }
1582
-
1583
- return backUrl;
1584
- };
1585
- const toSlug = text => {
1586
- text = text.toLowerCase();
1587
- return text.replace(/[^a-zA-Z0-9]+/g, '_');
1588
- };
1589
- const getAuthCallback = () => {
1590
- if (typeof window !== 'undefined') {
1591
- return `${window.location.origin}/auth/callback`;
1592
- }
1593
-
1594
- return null;
1595
- };
1596
- const getCurrentLocation = () => {
1597
- let location = '';
1598
-
1599
- if (typeof window !== 'undefined') {
1600
- location = window.location; // check if we are on iframe
1601
-
1602
- if (window.top) location = window.top.location;
1603
- }
1604
-
1605
- return location;
1606
- };
1607
- const getOrigin = () => {
1608
- if (typeof window !== 'undefined') {
1609
- return window.location.origin;
1610
- }
1611
-
1612
- return null;
1613
- };
1614
- const getCurrentPathName = () => {
1615
- if (typeof window !== 'undefined') {
1616
- return window.location.pathname;
1617
- }
1618
-
1619
- return null;
1620
- };
1621
- const getCurrentHref = () => {
1622
- if (typeof window !== 'undefined') {
1623
- return window.location.href;
1624
- }
1625
-
1626
- return null;
1627
- };
1628
- const getAllowedUserGroups = () => {
1629
- if (typeof window !== 'undefined') {
1630
- return window.ALLOWED_USER_GROUPS || '';
1631
- }
1632
-
1633
- return null;
1634
- };
1635
- const buildAPIBaseUrl = relativeUrl => {
1636
- if (typeof window !== 'undefined') {
1637
- return `${window.API_BASE_URL}${relativeUrl}`;
1638
- }
1639
-
1640
- return null``;
1641
- };
1642
- const putOnLocalStorage = (key, value) => {
1643
- if (typeof window !== 'undefined') {
1644
- window.localStorage.setItem(key, value);
1645
- }
1646
- };
1647
- const getFromLocalStorage = (key, removeIt) => {
1648
- if (typeof window !== 'undefined') {
1649
- let val = window.localStorage.getItem(key);
1650
-
1651
- if (removeIt) {
1652
- console.log(`getFromLocalStorage removing key ${key}`);
1653
- removeFromLocalStorage(key);
1654
- }
1655
-
1656
- return val;
1657
- }
1658
-
1659
- return null;
1660
- };
1661
- const removeFromLocalStorage = key => {
1662
- if (typeof window !== 'undefined') {
1663
- window.localStorage.removeItem(key);
1664
- }
1665
- };
1666
- const isClearingSessionState = () => {
1667
- if (typeof window !== 'undefined') {
1668
- return window.clearing_session_state;
1669
- }
1670
-
1671
- return false;
1672
- };
1673
- const setSessionClearingState = val => {
1674
- if (typeof window !== 'undefined') {
1675
- window.clearing_session_state = val;
1676
- }
1677
- };
1678
- const getCurrentUserLanguage = () => {
1679
- let language = 'en';
1680
-
1681
- if (typeof navigator !== 'undefined') {
1682
- language = navigator.languages && navigator.languages[0] || navigator.language || navigator.userLanguage;
1683
- }
1684
-
1685
- return language;
1686
- };
1687
- const scrollToError = errors => {
1688
- if (Object.keys(errors).length > 0) {
1689
- const firstError = Object.keys(errors)[0];
1690
- const firstNode = document.getElementById(firstError);
1691
- if (firstNode) window.scrollTo(0, findElementPos(firstNode));
1692
- }
1693
- };
1694
- const hasErrors = (field, errors) => {
1695
- if (field in errors) {
1696
- return errors[field];
1697
- }
1698
-
1699
- return '';
1700
- };
1701
- const shallowEqual = (object1, object2) => {
1702
- const keys1 = Object.keys(object1);
1703
- const keys2 = Object.keys(object2);
1704
-
1705
- if (keys1.length !== keys2.length) {
1706
- return false;
1707
- }
1708
-
1709
- for (let key of keys1) {
1710
- if (object1[key] !== object2[key]) {
1711
- return false;
1712
- }
1713
- }
1714
-
1715
- return true;
1716
- };
1717
- const arraysEqual = (a1, a2) => a1.length === a2.length && a1.every((o, idx) => shallowEqual(o, a2[idx]));
1718
- const isEmpty = obj => {
1719
- return Object.keys(obj).length === 0;
1720
- };
1721
- const base64URLEncode = str => {
1722
- return str.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
1723
- };
1724
- const retryPromise = async (cb, maxNumberOfRetries = 3) => {
1725
- for (let i = 0; i < maxNumberOfRetries; i++) {
1726
- if (await cb()) {
1727
- return true;
1728
- }
1729
- }
1730
-
1731
- return false;
1732
- };
1733
- const getTimeServiceUrl = () => {
1734
- if (typeof window !== 'undefined') {
1735
- return window.TIMEINTERVALSINCE1970_API_URL || process.env.TIMEINTERVALSINCE1970_API_URL;
1736
- }
1737
-
1738
- return null;
1739
- };
1740
-
1741
- /***/ }),
1742
-
1743
- /***/ "./src/utils/query-actions.js":
1744
- /*!************************************!*\
1745
- !*** ./src/utils/query-actions.js ***!
1746
- \************************************/
1747
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1748
-
1749
- __webpack_require__.r(__webpack_exports__);
1750
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1751
- /* harmony export */ "RECEIVE_COUNTRIES": () => (/* binding */ RECEIVE_COUNTRIES),
1752
- /* harmony export */ "geoCodeAddress": () => (/* binding */ geoCodeAddress),
1753
- /* harmony export */ "geoCodeLatLng": () => (/* binding */ geoCodeLatLng),
1754
- /* harmony export */ "getCountryList": () => (/* binding */ getCountryList),
1755
- /* harmony export */ "getLanguageList": () => (/* binding */ getLanguageList),
1756
- /* harmony export */ "queryAccessLevels": () => (/* binding */ queryAccessLevels),
1757
- /* harmony export */ "queryCompanies": () => (/* binding */ queryCompanies),
1758
- /* harmony export */ "queryEventTypes": () => (/* binding */ queryEventTypes),
1759
- /* harmony export */ "queryEvents": () => (/* binding */ queryEvents),
1760
- /* harmony export */ "queryGroups": () => (/* binding */ queryGroups),
1761
- /* harmony export */ "queryMembers": () => (/* binding */ queryMembers),
1762
- /* harmony export */ "queryOrganizations": () => (/* binding */ queryOrganizations),
1763
- /* harmony export */ "queryPromocodes": () => (/* binding */ queryPromocodes),
1764
- /* harmony export */ "queryRegistrationCompanies": () => (/* binding */ queryRegistrationCompanies),
1765
- /* harmony export */ "querySpeakers": () => (/* binding */ querySpeakers),
1766
- /* harmony export */ "querySponsoredProjects": () => (/* binding */ querySponsoredProjects),
1767
- /* harmony export */ "querySponsors": () => (/* binding */ querySponsors),
1768
- /* harmony export */ "querySummits": () => (/* binding */ querySummits),
1769
- /* harmony export */ "queryTags": () => (/* binding */ queryTags),
1770
- /* harmony export */ "queryTicketTypes": () => (/* binding */ queryTicketTypes),
1771
- /* harmony export */ "queryTrackGroups": () => (/* binding */ queryTrackGroups),
1772
- /* harmony export */ "queryTracks": () => (/* binding */ queryTracks)
1773
- /* harmony export */ });
1774
- /* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actions */ "./src/utils/actions.js");
1775
- /* harmony import */ var _components_security_methods__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../components/security/methods */ "./src/components/security/methods.js");
1776
- /* harmony import */ var _methods__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./methods */ "./src/utils/methods.js");
1777
- /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash */ "lodash");
1778
- /* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_3__);
1779
- /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! urijs */ "urijs");
1780
- /* harmony import */ var urijs__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(urijs__WEBPACK_IMPORTED_MODULE_4__);
1781
- /**
1782
- * Copyright 2018 OpenStack Foundation
1783
- * Licensed under the Apache License, Version 2.0 (the "License");
1784
- * you may not use this file except in compliance with the License.
1785
- * You may obtain a copy of the License at
1786
- * http://www.apache.org/licenses/LICENSE-2.0
1787
- * Unless required by applicable law or agreed to in writing, software
1788
- * distributed under the License is distributed on an "AS IS" BASIS,
1789
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1790
- * See the License for the specific language governing permissions and
1791
- * limitations under the License.
1792
- **/
1793
-
1794
-
1795
-
1796
-
1797
- const RECEIVE_COUNTRIES = 'RECEIVE_COUNTRIES';
1798
- const callDelay = 500; //miliseconds
1799
-
1800
-
1801
- const queryMembers = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
1802
- const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1803
- input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1804
- let filters = encodeURIComponent(`full_name=@${input},first_name=@${input},last_name=@${input},email=@${input}`);
1805
- let expand = `tickets,rsvp,schedule_summit_events,all_affiliations`;
1806
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/members?filter=${filters}&expand=${expand}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1807
- let options = [...json.data];
1808
- callback(options);
1809
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1810
- }, callDelay);
1811
- const querySummits = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
1812
- const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1813
- input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1814
- let filters = encodeURIComponent(`name=@${input}`);
1815
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/all?filter=${filters}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1816
- let options = [...json.data];
1817
- callback(options);
1818
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1819
- }, callDelay);
1820
- const querySpeakers = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1821
- const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1822
- input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1823
- let filters = encodeURIComponent(`full_name=@${input},first_name=@${input},last_name=@${input},email=@${input}`);
1824
- let apiUrl = `/api/v1`;
1825
-
1826
- if (summitId) {
1827
- apiUrl += `/summits/${summitId}`;
1828
- }
1829
-
1830
- apiUrl += `/speakers?filter=${filters}&access_token=${accessToken}&expand=member,registration_request`;
1831
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(apiUrl)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1832
- let options = [...json.data];
1833
- callback(options);
1834
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1835
- }, callDelay);
1836
- const queryTags = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1837
- const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1838
- input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1839
- let apiUrl = `/api/v1`;
1840
- let filter = encodeURIComponent(`tag=@${input}`);
1841
-
1842
- if (summitId) {
1843
- apiUrl += `/summits/${summitId}/track-tag-groups/all/allowed-tags?filter=${filter}&expand=tag,track_tag_group`;
1844
- } else {
1845
- apiUrl += `/tags?filter=${filter}`;
1846
- }
1847
-
1848
- apiUrl += `&order=tag&page=1&per_page=50&access_token=${accessToken}`;
1849
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(apiUrl)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1850
- let options = [...json.data];
1851
-
1852
- if (summitId) {
1853
- options = options.map(t => t.tag);
1854
- }
1855
-
1856
- callback(options);
1857
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1858
- }, callDelay);
1859
- const queryTracks = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1860
- const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1861
- input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1862
- let filter = encodeURIComponent(`name=@${input}`);
1863
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/${summitId}/tracks?filter=${filter}&order=name&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1864
- let options = [...json.data];
1865
- callback(options);
1866
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1867
- }, callDelay);
1868
- const queryTrackGroups = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1869
- const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1870
- input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1871
- let filter = input ? encodeURIComponent(`filter=name=@${input}`) : '';
1872
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/${summitId}/track-groups?order=name&access_token=${accessToken}&${filter}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1873
- let options = [...json.data];
1874
- callback(options);
1875
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1876
- }, callDelay);
1877
- const queryEvents = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, onlyPublished = false, callback) => {
1878
- const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1879
- input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1880
- let baseUrl = `/api/v1/summits/${summitId}/events` + (onlyPublished ? '/published' : '');
1881
- let filter = encodeURIComponent(`title=@${input}`);
1882
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`${baseUrl}?filter=${filter}&order=title&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1883
- let options = [...json.data];
1884
- callback(options);
1885
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1886
- }, callDelay);
1887
- const queryEventTypes = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback, eventTypeClassName = null) => {
1888
- const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1889
- input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1890
- let url = `/api/v1/summits/${summitId}/event-types?order=name&access_token=${accessToken}`;
1891
-
1892
- if (input) {
1893
- const filter = encodeURIComponent(`name=@${input}`);
1894
- url += `&filter[]=${filter}`;
1895
- }
1896
-
1897
- if (eventTypeClassName) {
1898
- const filter = encodeURIComponent(`class_name==${eventTypeClassName}`);
1899
- url += `&filter[]=${filter}`;
1900
- }
1901
-
1902
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(url)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1903
- let options = [...json.data];
1904
- callback(options);
1905
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1906
- }, callDelay);
1907
- const queryGroups = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
1908
- const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1909
- let filters = encodeURIComponent(`title=@${input},code=@${input}`);
1910
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/groups?filter=${filters}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1911
- let options = [...json.data];
1912
- callback(options);
1913
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1914
- }, callDelay);
1915
- const queryCompanies = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
1916
- const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1917
- input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1918
- let filters = encodeURIComponent(`name=@${input}`);
1919
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/companies?filter=${filters}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1920
- let options = [...json.data];
1921
- callback(options);
1922
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1923
- }, callDelay);
1924
- const queryRegistrationCompanies = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1925
- let accessToken;
1926
-
1927
- try {
1928
- accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1929
- } catch (e) {
1930
- callback(e);
1931
- return;
1932
- }
1933
-
1934
- let apiUrl = urijs__WEBPACK_IMPORTED_MODULE_4___default()(`/api/v1/summits/${summitId}/registration-companies`);
1935
- apiUrl.addQuery('access_token', accessToken);
1936
- apiUrl.addQuery('order', 'name');
1937
-
1938
- if (input) {
1939
- input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1940
- apiUrl.addQuery('filter[]', `name@@${input}`);
1941
- }
1942
-
1943
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(apiUrl.toString())).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1944
- let options = [...json.data];
1945
- callback(options);
1946
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1947
- }, callDelay);
1948
- const querySponsors = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1949
- const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1950
- input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1951
- let filters = encodeURIComponent(`company_name=@${input}`);
1952
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/${summitId}/sponsors?filter=${filters}&expand=company,sponsorship&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1953
- let options = [...json.data];
1954
- callback(options);
1955
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1956
- }, callDelay);
1957
- const queryAccessLevels = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
1958
- const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1959
- input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1960
- let filters = encodeURIComponent(`name=@${input}`);
1961
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/${summitId}/access-level-types?filter=${filters}&&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1962
- let options = [...json.data];
1963
- callback(options);
1964
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1965
- }, callDelay);
1966
- const queryOrganizations = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
1967
- const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
1968
- input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
1969
- let filters = encodeURIComponent(`name=@${input}`);
1970
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/organizations?filter=${filters}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
1971
- let options = [...json.data];
1972
- callback(options);
1973
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1974
- }, callDelay);
1975
- const getLanguageList = (callback, signal) => {
1976
- return fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/public/v1/languages`), {
1977
- signal
1978
- }).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(response => {
1979
- callback(response.data);
1980
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1981
- };
1982
- const getCountryList = (callback, signal) => {
1983
- return fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/public/v1/countries`), {
1984
- signal
1985
- }).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(response => {
1986
- callback(response.data);
1987
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
1988
- };
1989
- var geocoder;
1990
- const geoCodeAddress = address => {
1991
- if (!geocoder) geocoder = new google.maps.Geocoder(); // return a Promise
1992
-
1993
- return new Promise(function (resolve, reject) {
1994
- geocoder.geocode({
1995
- 'address': address
1996
- }, function (results, status) {
1997
- if (status == google.maps.GeocoderStatus.OK) {
1998
- // resolve results upon a successful status
1999
- resolve(results);
2000
- } else {
2001
- // reject status upon un-successful status
2002
- reject(status);
2003
- }
2004
- });
2005
- });
2006
- };
2007
- const geoCodeLatLng = (lat, lng) => {
2008
- if (!geocoder) geocoder = new google.maps.Geocoder();
2009
- var latlng = {
2010
- lat: parseFloat(lat),
2011
- lng: parseFloat(lng)
2012
- }; // return a Promise
2013
-
2014
- return new Promise(function (resolve, reject) {
2015
- geocoder.geocode({
2016
- 'location': latlng
2017
- }, function (results, status) {
2018
- if (status == google.maps.GeocoderStatus.OK) {
2019
- // resolve results upon a successful status
2020
- resolve(results);
2021
- } else {
2022
- // reject status upon un-successful status
2023
- reject(status);
2024
- }
2025
- });
2026
- });
2027
- };
2028
- const queryTicketTypes = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, filters = {}, callback, version = 'v1') => {
2029
- const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
2030
- let apiUrl = urijs__WEBPACK_IMPORTED_MODULE_4___default()(`/api/${version}/summits/${summitId}/ticket-types`);
2031
- apiUrl.addQuery('access_token', accessToken);
2032
- apiUrl.addQuery('order', 'name');
2033
-
2034
- if (filters.hasOwnProperty('name')) {
2035
- const name = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(filters.name);
2036
- apiUrl.addQuery('filter[]', `name@@${name}`);
2037
- }
2038
-
2039
- if (filters.hasOwnProperty('audience')) {
2040
- const audience = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(filters.audience);
2041
- apiUrl.addQuery('filter[]', `audience==${audience}`);
2042
- }
2043
-
2044
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(apiUrl.toString())).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
2045
- let options = [...json.data];
2046
- callback(options);
2047
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
2048
- }, callDelay);
2049
- const querySponsoredProjects = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (input, callback) => {
2050
- const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
2051
- const apiUrl = urijs__WEBPACK_IMPORTED_MODULE_4___default()(`/api/v1/sponsored-projects`);
2052
- apiUrl.addQuery('access_token', accessToken);
2053
-
2054
- if (input) {
2055
- input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
2056
- apiUrl.addQuery('filter[]', `name=@${input}`);
2057
- }
2058
-
2059
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(apiUrl.toString())).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
2060
- let options = [...json.data];
2061
- callback(options);
2062
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
2063
- }, callDelay);
2064
- const queryPromocodes = lodash__WEBPACK_IMPORTED_MODULE_3___default().debounce(async (summitId, input, callback) => {
2065
- const accessToken = await (0,_components_security_methods__WEBPACK_IMPORTED_MODULE_1__.getAccessToken)();
2066
- input = (0,_actions__WEBPACK_IMPORTED_MODULE_0__.escapeFilterValue)(input);
2067
- let filters = encodeURIComponent(`code=@${input}`);
2068
- fetch((0,_methods__WEBPACK_IMPORTED_MODULE_2__.buildAPIBaseUrl)(`/api/v1/summits/${summitId}/promo-codes?filter=${filters}&access_token=${accessToken}`)).then(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchResponseHandler).then(json => {
2069
- let options = [...json.data];
2070
- callback(options);
2071
- }).catch(_actions__WEBPACK_IMPORTED_MODULE_0__.fetchErrorHandler);
2072
- }, callDelay);
2073
-
2074
- /***/ }),
2075
-
2076
- /***/ "@babel/runtime/helpers/defineProperty":
2077
- /*!********************************************************!*\
2078
- !*** external "@babel/runtime/helpers/defineProperty" ***!
2079
- \********************************************************/
2080
- /***/ ((module) => {
2081
-
2082
- module.exports = require("@babel/runtime/helpers/defineProperty");
2083
-
2084
- /***/ }),
2085
-
2086
- /***/ "@babel/runtime/helpers/extends":
2087
- /*!*************************************************!*\
2088
- !*** external "@babel/runtime/helpers/extends" ***!
2089
- \*************************************************/
2090
- /***/ ((module) => {
2091
-
2092
- module.exports = require("@babel/runtime/helpers/extends");
2093
-
2094
- /***/ }),
2095
-
2096
- /***/ "@babel/runtime/helpers/objectWithoutProperties":
2097
- /*!*****************************************************************!*\
2098
- !*** external "@babel/runtime/helpers/objectWithoutProperties" ***!
2099
- \*****************************************************************/
2100
- /***/ ((module) => {
2101
-
2102
- module.exports = require("@babel/runtime/helpers/objectWithoutProperties");
2103
-
2104
- /***/ }),
2105
-
2106
- /***/ "browser-tabs-lock":
2107
- /*!************************************!*\
2108
- !*** external "browser-tabs-lock" ***!
2109
- \************************************/
2110
- /***/ ((module) => {
2111
-
2112
- module.exports = require("browser-tabs-lock");
2113
-
2114
- /***/ }),
2115
-
2116
- /***/ "crypto-js/enc-base64url":
2117
- /*!******************************************!*\
2118
- !*** external "crypto-js/enc-base64url" ***!
2119
- \******************************************/
2120
- /***/ ((module) => {
2121
-
2122
- module.exports = require("crypto-js/enc-base64url");
2123
-
2124
- /***/ }),
2125
-
2126
- /***/ "crypto-js/enc-hex":
2127
- /*!************************************!*\
2128
- !*** external "crypto-js/enc-hex" ***!
2129
- \************************************/
2130
- /***/ ((module) => {
2131
-
2132
- module.exports = require("crypto-js/enc-hex");
2133
-
2134
- /***/ }),
2135
-
2136
- /***/ "crypto-js/sha256":
2137
- /*!***********************************!*\
2138
- !*** external "crypto-js/sha256" ***!
2139
- \***********************************/
2140
- /***/ ((module) => {
2141
-
2142
- module.exports = require("crypto-js/sha256");
2143
-
2144
- /***/ }),
2145
-
2146
- /***/ "i18n-react/dist/i18n-react":
2147
- /*!*********************************************!*\
2148
- !*** external "i18n-react/dist/i18n-react" ***!
2149
- \*********************************************/
2150
- /***/ ((module) => {
2151
-
2152
- module.exports = require("i18n-react/dist/i18n-react");
2153
-
2154
- /***/ }),
2155
-
2156
- /***/ "idtoken-verifier":
2157
- /*!***********************************!*\
2158
- !*** external "idtoken-verifier" ***!
2159
- \***********************************/
2160
- /***/ ((module) => {
2161
-
2162
- module.exports = require("idtoken-verifier");
2163
-
2164
- /***/ }),
2165
-
2166
- /***/ "lodash":
2167
- /*!*************************!*\
2168
- !*** external "lodash" ***!
2169
- \*************************/
2170
- /***/ ((module) => {
2171
-
2172
- module.exports = require("lodash");
2173
-
2174
- /***/ }),
2175
-
2176
- /***/ "moment-timezone":
2177
- /*!**********************************!*\
2178
- !*** external "moment-timezone" ***!
2179
- \**********************************/
2180
- /***/ ((module) => {
2181
-
2182
- module.exports = require("moment-timezone");
2183
-
2184
- /***/ }),
2185
-
2186
- /***/ "react":
2187
- /*!************************!*\
2188
- !*** external "react" ***!
2189
- \************************/
2190
- /***/ ((module) => {
2191
-
2192
- module.exports = require("react");
2193
-
2194
- /***/ }),
2195
-
2196
- /***/ "react-select":
2197
- /*!*******************************!*\
2198
- !*** external "react-select" ***!
2199
- \*******************************/
2200
- /***/ ((module) => {
2201
-
2202
- module.exports = require("react-select");
2203
-
2204
- /***/ }),
2205
-
2206
- /***/ "superagent/lib/client":
2207
- /*!****************************************!*\
2208
- !*** external "superagent/lib/client" ***!
2209
- \****************************************/
2210
- /***/ ((module) => {
2211
-
2212
- module.exports = require("superagent/lib/client");
2213
-
2214
- /***/ }),
2215
-
2216
- /***/ "sweetalert2":
2217
- /*!******************************!*\
2218
- !*** external "sweetalert2" ***!
2219
- \******************************/
2220
- /***/ ((module) => {
2221
-
2222
- module.exports = require("sweetalert2");
2223
-
2224
- /***/ }),
2225
-
2226
- /***/ "urijs":
2227
- /*!************************!*\
2228
- !*** external "urijs" ***!
2229
- \************************/
2230
- /***/ ((module) => {
2231
-
2232
- module.exports = require("urijs");
2233
-
2234
- /***/ })
2235
-
2236
- /******/ });
2237
- /************************************************************************/
2238
- /******/ // The module cache
2239
- /******/ var __webpack_module_cache__ = {};
2240
- /******/
2241
- /******/ // The require function
2242
- /******/ function __webpack_require__(moduleId) {
2243
- /******/ // Check if module is in cache
2244
- /******/ var cachedModule = __webpack_module_cache__[moduleId];
2245
- /******/ if (cachedModule !== undefined) {
2246
- /******/ return cachedModule.exports;
2247
- /******/ }
2248
- /******/ // Create a new module (and put it into the cache)
2249
- /******/ var module = __webpack_module_cache__[moduleId] = {
2250
- /******/ // no module.id needed
2251
- /******/ // no module.loaded needed
2252
- /******/ exports: {}
2253
- /******/ };
2254
- /******/
2255
- /******/ // Execute the module function
2256
- /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
2257
- /******/
2258
- /******/ // Return the exports of the module
2259
- /******/ return module.exports;
2260
- /******/ }
2261
- /******/
2262
- /************************************************************************/
2263
- /******/ /* webpack/runtime/compat get default export */
2264
- /******/ (() => {
2265
- /******/ // getDefaultExport function for compatibility with non-harmony modules
2266
- /******/ __webpack_require__.n = (module) => {
2267
- /******/ var getter = module && module.__esModule ?
2268
- /******/ () => (module['default']) :
2269
- /******/ () => (module);
2270
- /******/ __webpack_require__.d(getter, { a: getter });
2271
- /******/ return getter;
2272
- /******/ };
2273
- /******/ })();
2274
- /******/
2275
- /******/ /* webpack/runtime/define property getters */
2276
- /******/ (() => {
2277
- /******/ // define getter functions for harmony exports
2278
- /******/ __webpack_require__.d = (exports, definition) => {
2279
- /******/ for(var key in definition) {
2280
- /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
2281
- /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
2282
- /******/ }
2283
- /******/ }
2284
- /******/ };
2285
- /******/ })();
2286
- /******/
2287
- /******/ /* webpack/runtime/hasOwnProperty shorthand */
2288
- /******/ (() => {
2289
- /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
2290
- /******/ })();
2291
- /******/
2292
- /******/ /* webpack/runtime/make namespace object */
2293
- /******/ (() => {
2294
- /******/ // define __esModule on exports
2295
- /******/ __webpack_require__.r = (exports) => {
2296
- /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
2297
- /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2298
- /******/ }
2299
- /******/ Object.defineProperty(exports, '__esModule', { value: true });
2300
- /******/ };
2301
- /******/ })();
2302
- /******/
2303
- /************************************************************************/
2304
- var __webpack_exports__ = {};
2305
- // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
2306
- (() => {
2307
- /*!***************************************************!*\
2308
- !*** ./src/components/inputs/country-dropdown.js ***!
2309
- \***************************************************/
2310
- __webpack_require__.r(__webpack_exports__);
2311
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2312
- /* harmony export */ "default": () => (/* binding */ CountryDropdown)
2313
- /* harmony export */ });
2314
- /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/extends */ "@babel/runtime/helpers/extends");
2315
- /* harmony import */ var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__);
2316
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react");
2317
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
2318
- /* harmony import */ var _dropdown__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dropdown */ "./src/components/inputs/dropdown.js");
2319
- /* harmony import */ var _utils_query_actions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils/query-actions */ "./src/utils/query-actions.js");
2320
-
2321
-
2322
- /**
2323
- * Copyright 2017 OpenStack Foundation
2324
- * Licensed under the Apache License, Version 2.0 (the "License");
2325
- * you may not use this file except in compliance with the License.
2326
- * You may obtain a copy of the License at
2327
- * http://www.apache.org/licenses/LICENSE-2.0
2328
- * Unless required by applicable law or agreed to in writing, software
2329
- * distributed under the License is distributed on an "AS IS" BASIS,
2330
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2331
- * See the License for the specific language governing permissions and
2332
- * limitations under the License.
2333
- **/
2334
-
2335
-
2336
-
2337
- class CountryDropdown extends (react__WEBPACK_IMPORTED_MODULE_1___default().Component) {
2338
- constructor(props) {
2339
- super(props);
2340
- this.state = {
2341
- options: []
2342
- };
2343
- this.handleChange = this.handleChange.bind(this);
2344
- this.setOptions = this.setOptions.bind(this);
2345
- this.abortController = new AbortController();
2346
- }
2347
-
2348
- componentDidMount() {
2349
- let {
2350
- options
2351
- } = this.state;
2352
-
2353
- if (options.length == 0) {
2354
- (0,_utils_query_actions__WEBPACK_IMPORTED_MODULE_3__.getCountryList)(this.setOptions, this.abortController.signal);
2355
- }
2356
- }
2357
-
2358
- componentWillUnmount() {
2359
- this.abortController.abort();
2360
- }
2361
-
2362
- handleChange(value) {
2363
- let ev = {
2364
- target: {
2365
- id: this.props.id,
2366
- value: value,
2367
- type: 'countryddl'
2368
- }
2369
- };
2370
- this.props.onChange(ev);
2371
- }
2372
-
2373
- setOptions(response) {
2374
- let countryList = response.map(c => ({
2375
- label: c.name,
2376
- value: c.iso_code
2377
- }));
2378
- this.setState({
2379
- options: countryList
2380
- });
2381
- }
2382
-
2383
- render() {
2384
- let {
2385
- options
2386
- } = this.state;
2387
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_dropdown__WEBPACK_IMPORTED_MODULE_2__["default"], _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({
2388
- options: options
2389
- }, this.props));
2390
- }
2391
-
2392
- }
2393
- })();
2394
-
2395
- /******/ return __webpack_exports__;
2396
- /******/ })()
2397
- ;
2398
- });
2399
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50cy9pbnB1dHMvY291bnRyeS1kcm9wZG93bi5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVlLE1BQU1FLFFBQU4sU0FBdUJGLHdEQUF2QixDQUF1QztFQUVsREksV0FBVyxDQUFDQyxLQUFELEVBQVE7SUFDZixNQUFNQSxLQUFOO0lBRUEsS0FBS0MsWUFBTCxHQUFvQixLQUFLQSxZQUFMLENBQWtCQyxJQUFsQixDQUF1QixJQUF2QixDQUFwQjtFQUNIOztFQUVERCxZQUFZLENBQUNFLFNBQUQsRUFBWTtJQUVwQixJQUFJQyxLQUFLLEdBQUcsSUFBWjs7SUFDQSxJQUFJLEtBQUtKLEtBQUwsQ0FBV0ssT0FBZixFQUF3QjtNQUNwQkQsS0FBSyxHQUFHRCxTQUFTLEdBQUdBLFNBQVMsQ0FBQ0csR0FBVixDQUFjQyxHQUFHLElBQUlBLEdBQUcsQ0FBQ0gsS0FBekIsQ0FBSCxHQUFxQyxJQUF0RDtJQUNILENBRkQsTUFFTztNQUNIQSxLQUFLLEdBQUdELFNBQVMsR0FBR0EsU0FBUyxDQUFDQyxLQUFiLEdBQXFCLElBQXRDO0lBQ0g7O0lBRUQsSUFBSUksRUFBRSxHQUFHO01BQUNDLE1BQU0sRUFBRTtRQUNWQyxFQUFFLEVBQUUsS0FBS1YsS0FBTCxDQUFXVSxFQURMO1FBRVZOLEtBQUssRUFBRUEsS0FGRztRQUdWTyxJQUFJLEVBQUU7TUFISTtJQUFULENBQVQ7SUFNQSxLQUFLWCxLQUFMLENBQVdZLFFBQVgsQ0FBb0JKLEVBQXBCO0VBQ0g7O0VBRURLLE1BQU0sR0FBRztJQUVMLGtCQUFxRyxLQUFLYixLQUExRztJQUFBLElBQUk7TUFBQ1ksUUFBRDtNQUFXUixLQUFYO01B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LEtBQUtDLFFBQUwsQ0FBYztNQUFDNWIsT0FBTyxFQUFFd2I7SUFBVixDQUFkO0VBQ0g7O0VBRUR0YyxNQUFNLEdBQUc7SUFFTCxJQUFJO01BQUNjO0lBQUQsSUFBWSxLQUFLdUksS0FBckI7SUFFQSxvQkFDSSwyREFBQyxpREFBRDtNQUFVLE9BQU8sRUFBRXZJO0lBQW5CLEdBQWdDLEtBQUszQixLQUFyQyxFQURKO0VBSUg7O0FBbER3RCxDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vLi9zcmMvY29tcG9uZW50cy9pbnB1dHMvZHJvcGRvd24uanMiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uLy4vc3JjL2NvbXBvbmVudHMvc2VjdXJpdHkvYWN0aW9ucy5qcyIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vLi9zcmMvY29tcG9uZW50cy9zZWN1cml0eS9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uLy4vc3JjL2NvbXBvbmVudHMvc2VjdXJpdHkvbWV0aG9kcy5qcyIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vLi9zcmMvdXRpbHMvYWN0aW9ucy5qcyIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vLi9zcmMvdXRpbHMvY3J5cHRvLmpzIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi8uL3NyYy91dGlscy9tZXRob2RzLmpzIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi8uL3NyYy91dGlscy9xdWVyeS1hY3Rpb25zLmpzIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vZXh0ZXJuYWwgY29tbW9uanMgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vZXh0ZXJuYWwgY29tbW9uanMgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwiYnJvd3Nlci10YWJzLWxvY2tcIiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vZXh0ZXJuYWwgY29tbW9uanMgXCJjcnlwdG8tanMvZW5jLWJhc2U2NHVybFwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcImNyeXB0by1qcy9lbmMtaGV4XCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwiY3J5cHRvLWpzL3NoYTI1NlwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcImkxOG4tcmVhY3QvZGlzdC9pMThuLXJlYWN0XCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwiaWR0b2tlbi12ZXJpZmllclwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcImxvZGFzaFwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcIm1vbWVudC10aW1lem9uZVwiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi9leHRlcm5hbCBjb21tb25qcyBcInJlYWN0XCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwicmVhY3Qtc2VsZWN0XCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwic3VwZXJhZ2VudC9saWIvY2xpZW50XCIiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL2V4dGVybmFsIGNvbW1vbmpzIFwic3dlZXRhbGVydDJcIiIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vZXh0ZXJuYWwgY29tbW9uanMgXCJ1cmlqc1wiIiwid2VicGFjazovL29wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvbi93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vb3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9vcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb24vLi9zcmMvY29tcG9uZW50cy9pbnB1dHMvY291bnRyeS1kcm9wZG93bi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShcIm9wZW5zdGFjay11aWNvcmUtZm91bmRhdGlvblwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJvcGVuc3RhY2stdWljb3JlLWZvdW5kYXRpb25cIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wib3BlbnN0YWNrLXVpY29yZS1mb3VuZGF0aW9uXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgKCkgPT4ge1xucmV0dXJuICIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTcgT3BlblN0YWNrIEZvdW5kYXRpb25cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBTZWxlY3QgZnJvbSAncmVhY3Qtc2VsZWN0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJvcGRvd24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlID0gdGhpcy5oYW5kbGVDaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBoYW5kbGVDaGFuZ2Uoc2VsZWN0aW9uKSB7XG5cbiAgICAgICAgbGV0IHZhbHVlID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuaXNNdWx0aSkge1xuICAgICAgICAgICAgdmFsdWUgPSBzZWxlY3Rpb24gPyBzZWxlY3Rpb24ubWFwKHZhbCA9PiB2YWwudmFsdWUpIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gc2VsZWN0aW9uID8gc2VsZWN0aW9uLnZhbHVlIDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBldiA9IHt0YXJnZXQ6IHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5wcm9wcy5pZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2Ryb3Bkb3duJ1xuICAgICAgICAgICAgfX07XG5cbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShldik7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuXG4gICAgICAgIGxldCB7b25DaGFuZ2UsIHZhbHVlLCBjbGFzc05hbWUsIGVycm9yLCBjbGVhcmFibGUsIGRpc2FibGVkLCBvdmVycmlkZUNTUywgYXJpYUxhYmVsbGVkQnksIC4uLnJlc3R9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgbGV0IGhhc19lcnJvciA9ICggdGhpcy5wcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZXJyb3InKSAmJiBlcnJvciAhPSAnJyApO1xuICAgICAgICBsZXQgaXNDbGVhcmFibGUgPSAodGhpcy5wcm9wcy5oYXNPd25Qcm9wZXJ0eSgnY2xlYXJhYmxlJykpO1xuICAgICAgICBsZXQgaXNEaXNhYmxlZCA9ICh0aGlzLnByb3BzLmhhc093blByb3BlcnR5KCdkaXNhYmxlZCcpICYmIGRpc2FibGVkID09IHRydWUpO1xuICAgICAgICBsZXQgdGhlVmFsdWUgPSBudWxsO1xuXG4gICAgICAgIGxldCBzZWxlY3RDbGFzc05hbWUgPSBjbGFzc05hbWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLmhhc093blByb3BlcnR5KCdvdmVycmlkZUNTUycpIHx8IG92ZXJyaWRlQ1NTID09IGZhbHNlKSB7XG4gICAgICAgICAgICBzZWxlY3RDbGFzc05hbWUgPSAnZHJvcGRvd24gJyArIGNsYXNzTmFtZSArICcgJyArIChoYXNfZXJyb3IgPyAnZXJyb3InIDogJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucHJvcHMuaXNNdWx0aSkge1xuICAgICAgICAgICAgdGhlVmFsdWUgPSB0aGlzLnByb3BzLm9wdGlvbnMuZmlsdGVyKG9wID0+IHZhbHVlLmluY2x1ZGVzKG9wLnZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGVWYWx1ZSA9ICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCB8fCB2YWx1ZSA9PSBudWxsKSA/IHZhbHVlIDogdGhpcy5wcm9wcy5vcHRpb25zLmZpbmQob3B0ID0+IG9wdC52YWx1ZSA9PSB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3RTdHlsZXMgPSB7IG1lbnU6IHN0eWxlcyA9PiAoeyAuLi5zdHlsZXMsIHpJbmRleDogOTk5IH0pIH07XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3NlbGVjdENsYXNzTmFtZX1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoZVZhbHVlfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5oYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgIGlzQ2xlYXJhYmxlPXtpc0NsZWFyYWJsZX1cbiAgICAgICAgICAgICAgICAgICAgaXNEaXNhYmxlZD17aXNEaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzPXtzZWxlY3RTdHlsZXN9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT17YXJpYUxhYmVsbGVkQnl9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5yZXN0fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAge2hhc19lcnJvciAmJlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cImVycm9yLWxhYmVsXCI+e2Vycm9yfTwvcD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcblxuICAgIH1cbn1cblxuRHJvcGRvd24uZGVmYXVsdFByb3BzID0ge1xuICAgIGFyaWFMYWJlbGxlZEJ5IDogbnVsbCxcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTggT3BlblN0YWNrIEZvdW5kYXRpb25cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKi9cblxuaW1wb3J0IFQgZnJvbSBcImkxOG4tcmVhY3QvZGlzdC9pMThuLXJlYWN0XCI7XG5pbXBvcnQge2F1dGhFcnJvckhhbmRsZXIsIGNyZWF0ZUFjdGlvbiwgZ2V0UmVxdWVzdCwgc2hvd01lc3NhZ2UsIHN0YXJ0TG9hZGluZywgc3RvcExvYWRpbmd9IGZyb20gXCIuLi8uLi91dGlscy9hY3Rpb25zXCI7XG5pbXBvcnQge2J1aWxkQVBJQmFzZVVybCwgZ2V0QWxsb3dlZFVzZXJHcm91cHN9IGZyb20gJy4uLy4uL3V0aWxzL21ldGhvZHMnO1xuaW1wb3J0IHsgZ2V0QWNjZXNzVG9rZW4sIHN0b3JlQXV0aEluZm8sIGluaXRMb2dPdXR9IGZyb20gJy4vbWV0aG9kcyc7XG5cbi8qKlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgY29uc3QgU0VUX0xPR0dFRF9VU0VSID0gJ1NFVF9MT0dHRURfVVNFUic7XG5leHBvcnQgY29uc3QgTE9HT1VUX1VTRVIgPSAnTE9HT1VUX1VTRVInO1xuZXhwb3J0IGNvbnN0IFJFUVVFU1RfVVNFUl9JTkZPID0gJ1JFUVVFU1RfVVNFUl9JTkZPJztcbmV4cG9ydCBjb25zdCBSRUNFSVZFX1VTRVJfSU5GTyA9ICdSRUNFSVZFX1VTRVJfSU5GTyc7XG5leHBvcnQgY29uc3QgQ0xFQVJfU0VTU0lPTl9TVEFURSA9ICdDTEVBUl9TRVNTSU9OX1NUQVRFJztcbmV4cG9ydCBjb25zdCBVUERBVEVfU0VTU0lPTl9TVEFURV9TVEFUVVMgPSAnVVBEQVRFX1NFU1NJT05fU1RBVEVfU1RBVFVTJztcbmV4cG9ydCBjb25zdCBTRVNTSU9OX1NUQVRFX1NUQVRVU19VTkNIQU5HRUQgPSAndW5jaGFuZ2VkJztcbmV4cG9ydCBjb25zdCBTRVNTSU9OX1NUQVRFX1NUQVRVU19DSEFOR0VEID0gJ2NoYW5nZWQnO1xuZXhwb3J0IGNvbnN0IFNFU1NJT05fU1RBVEVfU1RBVFVTX0VSUk9SID0gJ2Vycm9yJztcbmV4cG9ydCBjb25zdCBVUERBVEVfVVNFUl9JTkZPID0gJ1VQREFURV9VU0VSX0lORk8nO1xuXG5leHBvcnQgY29uc3Qgb25Vc2VyQXV0aCA9IChhY2Nlc3NUb2tlbiwgaWRUb2tlbiwgc2Vzc2lvblN0YXRlLCBleHBpcmVzSW4gPSAwLCByZWZyZXNoVG9rZW4gPSBudWxsKSA9PiAoZGlzcGF0Y2gpID0+IHtcblxuICAgIHN0b3JlQXV0aEluZm8oYWNjZXNzVG9rZW4sIGV4cGlyZXNJbiwgcmVmcmVzaFRva2VuLCBpZFRva2VuKTtcblxuICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogU0VUX0xPR0dFRF9VU0VSLFxuICAgICAgICBwYXlsb2FkOiB7IHNlc3Npb25TdGF0ZSB9XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBkb0xvZ291dCA9IChiYWNrVXJsKSA9PiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBMT0dPVVRfVVNFUixcbiAgICAgICAgcGF5bG9hZDoge2JhY2tVcmw6IGJhY2tVcmx9XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VySW5mbyA9IChleHBhbmQgPSAnZ3JvdXBzJywgZmllbGRzPScnLCBiYWNrVXJsID0gbnVsbCwgaGlzdG9yeSA9IG51bGwsIGVycm9ySGFuZGxlciA9IG51bGwgKSA9PlxuICAgIGFzeW5jIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcblxuICAgIGxldCBBbGxvd2VkVXNlckdyb3VwcyA9IGdldEFsbG93ZWRVc2VyR3JvdXBzKCk7XG4gICAgQWxsb3dlZFVzZXJHcm91cHMgPSBBbGxvd2VkVXNlckdyb3VwcyAhPT0gJycgPyBBbGxvd2VkVXNlckdyb3Vwcy5zcGxpdCgnICcpIDogW107XG4gICAgbGV0IHtsb2dnZWRVc2VyU3RhdGV9ID0gZ2V0U3RhdGUoKTtcbiAgICBsZXQge21lbWJlcn0gPSBsb2dnZWRVc2VyU3RhdGU7XG5cbiAgICBsZXQgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuXG4gICAgaWYgKG1lbWJlciAhPSBudWxsKSB7XG4gICAgICAgIGlmKGhpc3RvcnkgIT0gbnVsbCAmJiBiYWNrVXJsICE9IG51bGwpXG4gICAgICAgICAgICBoaXN0b3J5LnB1c2goYmFja1VybCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBpZihlcnJvckhhbmRsZXIgPT0gbnVsbClcbiAgICAgICAgZXJyb3JIYW5kbGVyID0gYXV0aEVycm9ySGFuZGxlcjtcblxuICAgIGRpc3BhdGNoKHN0YXJ0TG9hZGluZygpKTtcblxuICAgIGxldCBwYXJhbXMgPSB7XG4gICAgICAgIGFjY2Vzc190b2tlbjogYWNjZXNzVG9rZW4sXG4gICAgICAgIGV4cGFuZCA6IGV4cGFuZCxcbiAgICB9XG5cbiAgICBpZihmaWVsZHMpe1xuICAgICAgICBwYXJhbXNbJ2ZpZWxkcyddID0gZmllbGRzO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRSZXF1ZXN0KFxuICAgICAgICBjcmVhdGVBY3Rpb24oUkVRVUVTVF9VU0VSX0lORk8pLFxuICAgICAgICBjcmVhdGVBY3Rpb24oUkVDRUlWRV9VU0VSX0lORk8pLFxuICAgICAgICBidWlsZEFQSUJhc2VVcmwoYC9hcGkvdjEvbWVtYmVycy9tZWApLFxuICAgICAgICBlcnJvckhhbmRsZXJcbiAgICApKHBhcmFtcykoZGlzcGF0Y2gsIGdldFN0YXRlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0b3BMb2FkaW5nKCkpO1xuXG4gICAgICAgICAgICBsZXQge21lbWJlcn0gPSBnZXRTdGF0ZSgpLmxvZ2dlZFVzZXJTdGF0ZTtcbiAgICAgICAgICAgIGlmIChtZW1iZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBlcnJvcl9tZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0VSUk9SJyxcbiAgICAgICAgICAgICAgICAgICAgaHRtbDogVC50cmFuc2xhdGUoXCJlcnJvcnMudXNlcl9ub3Rfc2V0XCIpLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChzaG93TWVzc2FnZShlcnJvcl9tZXNzYWdlLCBpbml0TG9nT3V0KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIHVzZXIgZ3JvdXBzICggaWYgZGVmaW5lZCApXG4gICAgICAgICAgICBpZiAoQWxsb3dlZFVzZXJHcm91cHMubGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGFsbG93ZWRHcm91cHMgPSBtZW1iZXIuZ3JvdXBzLmZpbHRlcigoZ3JvdXAsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWxsb3dlZFVzZXJHcm91cHMuaW5jbHVkZXMoZ3JvdXAuY29kZSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZEdyb3Vwcy5sZW5ndGggPT09IDApIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JfbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnRVJST1InLFxuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbDogVC50cmFuc2xhdGUoXCJlcnJvcnMudXNlcl9ub3RfYXV0aHpcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goc2hvd01lc3NhZ2UoZXJyb3JfbWVzc2FnZSwgaW5pdExvZ091dCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihoaXN0b3J5ICE9IG51bGwgJiYgYmFja1VybCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIGhpc3RvcnkucHVzaChiYWNrVXJsKTtcbiAgICAgICAgfVxuICAgICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlVXNlckluZm8gPSAodXBkYXRlZE1lbWJlcikgPT4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGxldCB7bG9nZ2VkVXNlclN0YXRlfSA9IGdldFN0YXRlKCk7XG4gICAgbGV0IHttZW1iZXJ9ID0gbG9nZ2VkVXNlclN0YXRlO1xuICAgIGlmKG1lbWJlciA9PSBudWxsKXtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJNZW1iZXIgaXMgbm90IHNldC5cIik7XG4gICAgfVxuICAgIGlmKHVwZGF0ZWRNZW1iZXIuaWQgIT0gbWVtYmVyLmlkKXtcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJNZW1iZXIgaXMgbm90IHRoZSBzYW1lLlwiKTtcbiAgICB9XG4gICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBVUERBVEVfVVNFUl9JTkZPLFxuICAgICAgICBwYXlsb2FkOiB7Li4udXBkYXRlZE1lbWJlcn1cbiAgICB9KTtcblxufVxuXG5leHBvcnQgY29uc3QgdXBkYXRlU2Vzc2lvblN0YXRlU3RhdHVzID0gKG5ld1N0YXR1cykgPT4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVBEQVRFX1NFU1NJT05fU1RBVEVfU1RBVFVTLFxuICAgICAgICBwYXlsb2FkOiB7c2Vzc2lvblN0YXRlU3RhdHVzOiBuZXdTdGF0dXN9XG4gICAgfSk7XG59IiwiZXhwb3J0IGNvbnN0IEFVVEhfRVJST1JfTUlTU0lOR19BVVRIX0lORk8gPSAnQVVUSF9FUlJPUl9NSVNTSU5HX0FVVEhfSU5GTyc7XG5leHBvcnQgY29uc3QgQVVUSF9FUlJPUl9NSVNTSU5HX1JFRlJFU0hfVE9LRU4gPSAnQVVUSF9FUlJPUl9NSVNTSU5HX1JFRlJFU0hfVE9LRU4nO1xuZXhwb3J0IGNvbnN0IEFVVEhfRVJST1JfQUNDRVNTX1RPS0VOX0VYUElSRUQgPSAnQVVUSF9FUlJPUl9BQ0NFU1NfVE9LRU5fRVhQSVJFRCc7XG5leHBvcnQgY29uc3QgQVVUSF9FUlJPUl9MT0NLX0FDUVVJUkVfRVJST1IgPSAnQVVUSF9FUlJPUl9MT0NLX0FDUVVJUkVfRVJST1InXG5leHBvcnQgY29uc3QgQVVUSF9FUlJPUl9SRUZSRVNIX1RPS0VOX1JFUVVFU1RfRVJST1IgPSAnQVVUSF9FUlJPUl9SRUZSRVNIX1RPS0VOX1JFUVVFU1RfRVJST1InO1xuZXhwb3J0IGNvbnN0IEFVVEhfRVJST1JfSURfVE9LRU5fSU5WQUxJRCA9ICdBVVRIX0VSUk9SX0lEX1RPS0VOX0lOVkFMSUQnO1xuZXhwb3J0IGNvbnN0IEFVVEhfRVJST1JfTUlTU0lOR19PVFBfUEFSQU0gPSAnQVVUSF9FUlJPUl9NSVNTSU5HX09UUF9QQVJBTSc7XG4iLCJpbXBvcnQge1xuICAgIGJhc2U2NFVSTEVuY29kZSxcbiAgICBnZXRBdXRoQ2FsbGJhY2ssXG4gICAgZ2V0Q3VycmVudExvY2F0aW9uLFxuICAgIGdldEN1cnJlbnRQYXRoTmFtZSxcbiAgICBnZXRGcm9tTG9jYWxTdG9yYWdlLFxuICAgIHJlbW92ZUZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgZ2V0T3JpZ2luLFxuICAgIHB1dE9uTG9jYWxTdG9yYWdlLFxuICAgIHJldHJ5UHJvbWlzZSxcbiAgICBzZXRTZXNzaW9uQ2xlYXJpbmdTdGF0ZSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL21ldGhvZHNcIjtcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3N1cGVyYWdlbnQvbGliL2NsaWVudCc7XG5pbXBvcnQgTG9jayBmcm9tICdicm93c2VyLXRhYnMtbG9jayc7XG5cbmxldCBodHRwID0gcmVxdWVzdDtcblxuLyoqXG4gKiBAaWdub3JlXG4gKi9cbmNvbnN0IGxvY2sgPSBuZXcgTG9jaygpO1xuXG5jb25zdCBHRVRfVE9LRU5fU0lMRU5UTFlfTE9DS19LRVkgPSAnb3BlbnN0YWNrdWljb3JlLmxvY2suZ2V0VG9rZW5TaWxlbnRseSc7XG5jb25zdCBOT05DRV9MRU4gPSAxNjtcbmV4cG9ydCBjb25zdCBBQ0NFU1NfVE9LRU5fU0tFV19USU1FID0gMjA7XG5leHBvcnQgY29uc3QgUkVTUE9OU0VfVFlQRV9JTVBMSUNJVCA9IFwidG9rZW4gaWRfdG9rZW5cIjtcbmV4cG9ydCBjb25zdCBSRVNQT05TRV9UWVBFX0NPREUgPSAnY29kZSc7XG5jb25zdCBBVVRIX0lORk8gPSAnYXV0aEluZm8nO1xuY29uc3QgTk9OQ0UgPSAnbm9uY2UnO1xuY29uc3QgUEtDRSA9ICdwa2NlJztcblxuaW1wb3J0IFVSSSBmcm9tIFwidXJpanNcIjtcbmltcG9ydCBJZFRva2VuVmVyaWZpZXIgZnJvbSBcImlkdG9rZW4tdmVyaWZpZXJcIjtcbmltcG9ydCB7U0VUX0xPR0dFRF9VU0VSfSBmcm9tIFwiLi9hY3Rpb25zXCI7XG5pbXBvcnQge2dldFJhbmRvbUJ5dGVzLCBnZXRTSEEyNTZ9IGZyb20gXCIuLi8uLi91dGlscy9jcnlwdG9cIjtcblxuaW1wb3J0IHtcbiAgICBBVVRIX0VSUk9SX0FDQ0VTU19UT0tFTl9FWFBJUkVELFxuICAgIEFVVEhfRVJST1JfTUlTU0lOR19BVVRIX0lORk8sXG4gICAgQVVUSF9FUlJPUl9NSVNTSU5HX1JFRlJFU0hfVE9LRU4sXG4gICAgQVVUSF9FUlJPUl9MT0NLX0FDUVVJUkVfRVJST1IsXG4gICAgQVVUSF9FUlJPUl9SRUZSRVNIX1RPS0VOX1JFUVVFU1RfRVJST1IsIEFVVEhfRVJST1JfSURfVE9LRU5fSU5WQUxJRCwgQVVUSF9FUlJPUl9NSVNTSU5HX09UUF9QQVJBTSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBiYWNrVXJsXG4gKiBAcGFyYW0gcHJvbXB0XG4gKiBAcGFyYW0gdG9rZW5JZEhpbnRcbiAqIEBwYXJhbSBwcm92aWRlclxuICogQHBhcmFtIGxvZ2luSGludFxuICogQHBhcmFtIG90cExvZ2luSGludFxuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRBdXRoVXJsID0gKFxuICAgIGJhY2tVcmwgPSBudWxsLFxuICAgIHByb21wdCA9IG51bGwsXG4gICAgdG9rZW5JZEhpbnQgPSBudWxsLFxuICAgIHByb3ZpZGVyID0gbnVsbCxcbiAgICBsb2dpbkhpbnQgPSBudWxsLFxuICAgIG90cExvZ2luSGludCA9IG51bGwpID0+IHtcblxuICAgIGxldCBvYXV0aDJDbGllbnRJZCA9IGdldE9BdXRoMkNsaWVudElkKCk7XG4gICAgbGV0IHJlZGlyZWN0VXJpID0gZ2V0QXV0aENhbGxiYWNrKCk7XG4gICAgbGV0IGJhc2VVcmwgPSBnZXRPQXV0aDJJRFBCYXNlVXJsKCk7XG4gICAgbGV0IHNjb3BlcyA9IGdldE9BdXRoMlNjb3BlcygpO1xuICAgIGxldCBmbG93ID0gZ2V0T0F1dGgyRmxvdygpO1xuXG4gICAgaWYgKGJhY2tVcmwgIT0gbnVsbClcbiAgICAgICAgcmVkaXJlY3RVcmkgKz0gYD9CYWNrVXJsPSR7ZW5jb2RlVVJJKGJhY2tVcmwpfWA7XG5cbiAgICBsZXQgbm9uY2UgPSBjcmVhdGVOb25jZShOT05DRV9MRU4pO1xuXG4gICAgLy8gc3RvcmUgbm9uY2UgdG8gY2hlY2sgaXQgbGF0ZXJcbiAgICBwdXRPbkxvY2FsU3RvcmFnZShOT05DRSwgbm9uY2UpO1xuICAgIGxldCB1cmwgPSBVUkkoYCR7YmFzZVVybH0vb2F1dGgyL2F1dGhgKTtcblxuICAgIGxldCBxdWVyeSA9IHtcbiAgICAgICAgXCJyZXNwb25zZV90eXBlXCI6IGVuY29kZVVSSShmbG93KSxcbiAgICAgICAgXCJzY29wZVwiOiBlbmNvZGVVUkkoc2NvcGVzKSxcbiAgICAgICAgXCJub25jZVwiOiBub25jZSxcbiAgICAgICAgXCJyZXNwb25zZV9tb2RlXCI6ICdmcmFnbWVudCcsXG4gICAgICAgIFwiY2xpZW50X2lkXCI6IGVuY29kZVVSSShvYXV0aDJDbGllbnRJZCksXG4gICAgICAgIFwicmVkaXJlY3RfdXJpXCI6IGVuY29kZVVSSShyZWRpcmVjdFVyaSlcbiAgICB9O1xuXG4gICAgaWYgKGZsb3cgPT09IFJFU1BPTlNFX1RZUEVfQ09ERSkge1xuICAgICAgICBjb25zdCBwa2NlID0gY3JlYXRlUEtDRUNvZGVzKClcbiAgICAgICAgcHV0T25Mb2NhbFN0b3JhZ2UoUEtDRSwgSlNPTi5zdHJpbmdpZnkocGtjZSkpO1xuICAgICAgICBxdWVyeVsnY29kZV9jaGFsbGVuZ2UnXSA9IHBrY2UuY29kZUNoYWxsZW5nZTtcbiAgICAgICAgcXVlcnlbJ2NvZGVfY2hhbGxlbmdlX21ldGhvZCddID0gJ1MyNTYnO1xuICAgICAgICBxdWVyeVsnYXBwcm92YWxfcHJvbXB0J10gPSAnZm9yY2UnO1xuICAgIH1cblxuICAgIGlmIChwcm9tcHQpIHtcbiAgICAgICAgcXVlcnlbJ3Byb21wdCddID0gcHJvbXB0O1xuICAgIH1cblxuICAgIGlmIChzY29wZXMgJiYgc2NvcGVzLmluY2x1ZGVzKCdvZmZsaW5lX2FjY2VzcycpKSB7XG4gICAgICAgIC8vIHRoZW4gd2UgbmVlZCB0byBmb3JjZSBwcm9tcHQ9Y29uc2VudCBiYyB3ZSBhcmUgcmVxdWVzdGluZyBhbiBvZmZsaW5lIGFjY2Vzc1xuICAgICAgICAvLyBhbmQgd2UgbmVlZCB0byBsZXQgdGhlIHVzZXIga25vd1xuICAgICAgICBxdWVyeVsncHJvbXB0J10gPSAnY29uc2VudCc7XG4gICAgfVxuXG4gICAgaWYgKHRva2VuSWRIaW50KSB7XG4gICAgICAgIHF1ZXJ5WydpZF90b2tlbl9oaW50J10gPSB0b2tlbklkSGludDtcbiAgICB9XG5cbiAgICBpZiAocHJvdmlkZXIpIHtcbiAgICAgICAgcXVlcnlbJ3Byb3ZpZGVyJ10gPSBwcm92aWRlcjtcbiAgICB9XG5cbiAgICBpZiAob3RwTG9naW5IaW50KSB7XG4gICAgICAgIHF1ZXJ5WydvdHBfbG9naW5faGludCddID0gb3RwTG9naW5IaW50O1xuICAgIH1cblxuICAgIGlmIChsb2dpbkhpbnQpIHtcbiAgICAgICAgcXVlcnlbJ2xvZ2luX2hpbnQnXSA9IGVuY29kZVVSSShsb2dpbkhpbnQpO1xuICAgIH1cblxuICAgIHVybCA9IHVybC5xdWVyeShxdWVyeSk7XG4gICAgLy9jb25zb2xlLmxvZyhgZ2V0QXV0aFVybCAke3VybC50b1N0cmluZygpfWApO1xuICAgIHJldHVybiB1cmw7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2dvdXRVcmwgPSAoaWRUb2tlbikgPT4ge1xuICAgIGxldCBiYXNlVXJsID0gZ2V0T0F1dGgySURQQmFzZVVybCgpO1xuICAgIGxldCBvYXV0aDJDbGllbnRJZCA9IGdldE9BdXRoMkNsaWVudElkKCk7XG4gICAgbGV0IHVybCA9IFVSSShgJHtiYXNlVXJsfS9vYXV0aDIvZW5kLXNlc3Npb25gKTtcbiAgICBsZXQgc3RhdGUgPSBjcmVhdGVOb25jZShOT05DRV9MRU4pO1xuICAgIGxldCBwb3N0TG9nT3V0VXJpID0gZ2V0T3JpZ2luKCkgKyAnL2F1dGgvbG9nb3V0JztcbiAgICAvLyBzdG9yZSBub25jZSB0byBjaGVjayBpdCBsYXRlclxuICAgIHB1dE9uTG9jYWxTdG9yYWdlKCdwb3N0X2xvZ291dF9zdGF0ZScsIHN0YXRlKTtcbiAgICAvKipcbiAgICAgKiBwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkgc2hvdWxkIGJlIGxpc3RlZCBvbiBvYXV0aDIgY2xpZW50IHNldHRpbmdzXG4gICAgICogb24gSURQXG4gICAgICogXCJTZWN1cml0eSBTZXR0aW5nc1wiIFRhYiAtPiBMb2dvdXQgT3B0aW9ucyAtPiBQb3N0IExvZ291dCBVcmlzXG4gICAgICovXG4gICAgcmV0dXJuIHVybC5xdWVyeSh7XG4gICAgICAgIFwiaWRfdG9rZW5faGludFwiOiBpZFRva2VuLFxuICAgICAgICBcInBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaVwiOiBlbmNvZGVVUkkocG9zdExvZ091dFVyaSksXG4gICAgICAgIFwiY2xpZW50X2lkXCI6IGVuY29kZVVSSShvYXV0aDJDbGllbnRJZCksXG4gICAgICAgIFwic3RhdGVcIjogc3RhdGUsXG4gICAgfSk7XG59XG5cbmNvbnN0IGNyZWF0ZU5vbmNlID0gKGxlbikgPT4ge1xuICAgIGxldCBwb3NzaWJsZSA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlcIjtcbiAgICBsZXQgbm9uY2UgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIG5vbmNlICs9IHBvc3NpYmxlLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBwb3NzaWJsZS5sZW5ndGgpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vbmNlO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gYmFja1VybFxuICogQHBhcmFtIHByb3ZpZGVyXG4gKiBAcGFyYW0gcHJvbXB0XG4gKiBAcGFyYW0gbG9naW5IaW50XG4gKiBAcGFyYW0gb3RwTG9naW5IaW50XG4gKi9cbmV4cG9ydCBjb25zdCBkb0xvZ2luID0gKFxuICAgIGJhY2tVcmwgPSBudWxsLFxuICAgIHByb3ZpZGVyID0gbnVsbCxcbiAgICBwcm9tcHQgPSBudWxsLFxuICAgIGxvZ2luSGludCA9IG51bGwsXG4gICAgb3RwTG9naW5IaW50ID0gbnVsbFxuKSA9PiB7XG4gICAgbGV0IHVybCA9IGdldEF1dGhVcmwoYmFja1VybCwgcHJvbXB0LCBudWxsLCBwcm92aWRlciwgbG9naW5IaW50LCBvdHBMb2dpbkhpbnQpO1xuICAgIGxldCBsb2NhdGlvbiA9IGdldEN1cnJlbnRMb2NhdGlvbigpXG4gICAgbG9jYXRpb24ucmVwbGFjZSh1cmwudG9TdHJpbmcoKSk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBiYWNrVXJsXG4gKiBAcGFyYW0gbG9naW5IaW50XG4gKiBAcGFyYW0gb3RwTG9naW5IaW50XG4gKi9cbmV4cG9ydCBjb25zdCBkb0xvZ2luQmFzaWNMb2dpbiA9IChiYWNrVXJsID0gbnVsbCwgbG9naW5IaW50ID0gbnVsbCwgb3RwTG9naW5IaW50ID0gbnVsbCkgPT4ge1xuICAgIGRvTG9naW4oYmFja1VybCwgbnVsbCwgbnVsbCwgbG9naW5IaW50LCBvdHBMb2dpbkhpbnQpO1xufVxuXG5jb25zdCBjcmVhdGVQS0NFQ29kZXMgPSAoKSA9PiB7XG4gICAgY29uc3QgY29kZVZlcmlmaWVyID0gYmFzZTY0VVJMRW5jb2RlKGdldFJhbmRvbUJ5dGVzKDY0KSlcbiAgICBjb25zdCBjb2RlQ2hhbGxlbmdlID0gZ2V0U0hBMjU2KGNvZGVWZXJpZmllciwgJ0Jhc2U2NHVybCcpXG4gICAgY29uc3QgY3JlYXRlZEF0ID0gbmV3IERhdGUoKVxuICAgIGNvbnN0IGNvZGVQYWlyID0ge1xuICAgICAgICBjb2RlVmVyaWZpZXIsXG4gICAgICAgIGNvZGVDaGFsbGVuZ2UsXG4gICAgICAgIGNyZWF0ZWRBdFxuICAgIH1cbiAgICByZXR1cm4gY29kZVBhaXJcbn1cblxuZXhwb3J0IGNvbnN0IGVtaXRBY2Nlc3NUb2tlbiA9IGFzeW5jIChjb2RlLCBiYWNrVXJsID0gbnVsbCkgPT4ge1xuXG4gICAgbGV0IGJhc2VVcmwgPSBnZXRPQXV0aDJJRFBCYXNlVXJsKCk7XG4gICAgbGV0IG9hdXRoMkNsaWVudElkID0gZ2V0T0F1dGgyQ2xpZW50SWQoKTtcbiAgICBsZXQgcmVkaXJlY3RVcmkgPSBnZXRBdXRoQ2FsbGJhY2soKTtcbiAgICBsZXQgcGtjZSA9IEpTT04ucGFyc2UoZ2V0RnJvbUxvY2FsU3RvcmFnZShQS0NFLCB0cnVlKSk7XG5cbiAgICBpZiAoYmFja1VybCAhPSBudWxsKVxuICAgICAgICByZWRpcmVjdFVyaSArPSBgP0JhY2tVcmw9JHtlbmNvZGVVUkkoYmFja1VybCl9YDtcblxuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgICdjb2RlJzogY29kZSxcbiAgICAgICAgJ2dyYW50X3R5cGUnOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcbiAgICAgICAgJ2NvZGVfdmVyaWZpZXInOiBwa2NlLmNvZGVWZXJpZmllcixcbiAgICAgICAgXCJjbGllbnRfaWRcIjogZW5jb2RlVVJJKG9hdXRoMkNsaWVudElkKSxcbiAgICAgICAgXCJyZWRpcmVjdF91cmlcIjogZW5jb2RlVVJJKHJlZGlyZWN0VXJpKVxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgICAvL2NvbnN0IHJlc3BvbnNlID0gYXdhaXQgaHR0cC5wb3N0KGAke2Jhc2VVcmx9L29hdXRoMi90b2tlbmAsIHBheWxvYWQpO1xuICAgICAgICAvL2NvbnN0IHtib2R5OiB7YWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VuLCBpZF90b2tlbiwgZXhwaXJlc19pbn19ID0gcmVzcG9uc2U7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vb2F1dGgyL3Rva2VuYCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnUmVxdWVzdCBmYWlsZWQ6JywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBsZXQge2FjY2Vzc190b2tlbiwgcmVmcmVzaF90b2tlbiwgaWRfdG9rZW4sIGV4cGlyZXNfaW4sIGVycm9yLCBlcnJvcl9kZXNjcmlwdGlvbn0gPSBqc29uO1xuICAgICAgICByZXR1cm4ge2FjY2Vzc190b2tlbiwgcmVmcmVzaF90b2tlbiwgaWRfdG9rZW4sIGV4cGlyZXNfaW4sIGVycm9yLCBlcnJvcl9kZXNjcmlwdGlvbn1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgY2xlYXJBY2Nlc3NUb2tlbiA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoXG4gICAgICAgIGF3YWl0IHJldHJ5UHJvbWlzZShcbiAgICAgICAgICAgICgpID0+IGxvY2suYWNxdWlyZUxvY2soR0VUX1RPS0VOX1NJTEVOVExZX0xPQ0tfS0VZLCA1MDAwKSxcbiAgICAgICAgICAgIDEwXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgdHJ5IHtcblxuICAgICAgICAgICAgbGV0IGF1dGhJbmZvID0gZ2V0QXV0aEluZm8oKTtcblxuICAgICAgICAgICAgaWYgKCFhdXRoSW5mbykge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKEFVVEhfRVJST1JfTUlTU0lOR19BVVRIX0lORk8pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQge2FjY2Vzc1Rva2VuLCBleHBpcmVzSW4sIGFjY2Vzc1Rva2VuVXBkYXRlZEF0LCByZWZyZXNoVG9rZW59ID0gYXV0aEluZm87XG5cbiAgICAgICAgICAgIHN0b3JlQXV0aEluZm8obnVsbCwgMCwgcmVmcmVzaFRva2VuKVxuXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCBsb2NrLnJlbGVhc2VMb2NrKEdFVF9UT0tFTl9TSUxFTlRMWV9MT0NLX0tFWSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRBY2Nlc3NUb2tlbiA9IGFzeW5jICgpID0+IHtcblxuICAgIGlmIChcbiAgICAgICAgYXdhaXQgcmV0cnlQcm9taXNlKFxuICAgICAgICAgICAgKCkgPT4gbG9jay5hY3F1aXJlTG9jayhHRVRfVE9LRU5fU0lMRU5UTFlfTE9DS19LRVksIDUwMDApLFxuICAgICAgICAgICAgMTBcbiAgICAgICAgKVxuICAgICkge1xuICAgICAgICB0cnkge1xuXG4gICAgICAgICAgICBsZXQgYXV0aEluZm8gPSBnZXRBdXRoSW5mbygpO1xuXG4gICAgICAgICAgICBpZiAoIWF1dGhJbmZvKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoQVVUSF9FUlJPUl9NSVNTSU5HX0FVVEhfSU5GTyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB7YWNjZXNzVG9rZW4sIGV4cGlyZXNJbiwgYWNjZXNzVG9rZW5VcGRhdGVkQXQsIHJlZnJlc2hUb2tlbn0gPSBhdXRoSW5mbztcbiAgICAgICAgICAgIGxldCBmbG93ID0gZ2V0T0F1dGgyRmxvdygpO1xuICAgICAgICAgICAgLy8gY2hlY2sgbGlmZSB0aW1lXG4gICAgICAgICAgICBsZXQgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICAgICAgICBsZXQgdGltZUVsYXBzZWRTZWNzID0gKG5vdyAtIGFjY2Vzc1Rva2VuVXBkYXRlZEF0KTtcbiAgICAgICAgICAgIGV4cGlyZXNJbiA9IChleHBpcmVzSW4gLSBBQ0NFU1NfVE9LRU5fU0tFV19USU1FKTtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coYGdldEFjY2Vzc1Rva2VuIG5vdyAke25vd30gYWNjZXNzVG9rZW5VcGRhdGVkQXQgJHthY2Nlc3NUb2tlblVwZGF0ZWRBdH0gdGltZUVsYXBzZWRTZWNzICR7dGltZUVsYXBzZWRTZWNzfSBleHBpcmVzSW4gJHtleHBpcmVzSW59LmApO1xuXG4gICAgICAgICAgICBpZiAodGltZUVsYXBzZWRTZWNzID4gZXhwaXJlc0luIHx8IGFjY2Vzc1Rva2VuID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgZ2V0QWNjZXNzVG9rZW4gYWNjZXNzIHRva2VuIGV4cGlyZWRgKVxuICAgICAgICAgICAgICAgIGlmIChmbG93ID09PSBSRVNQT05TRV9UWVBFX0NPREUgJiYgdXNlT0F1dGgyUmVmcmVzaFRva2VuKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZ2V0QWNjZXNzVG9rZW4gZ2V0dGluZyBuZXcgYWNjZXNzIHRva2VuLCBhY2Nlc3MgdG9rZW4gZ290IHZvaWQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyQXV0aEluZm8oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKEFVVEhfRVJST1JfTUlTU0lOR19SRUZSRVNIX1RPS0VOKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByZWZyZXNoQWNjZXNzVG9rZW4ocmVmcmVzaFRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHthY2Nlc3NfdG9rZW4sIGV4cGlyZXNfaW4sIHJlZnJlc2hfdG9rZW59ID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coYGdldEFjY2Vzc1Rva2VuIGFjY2Vzc190b2tlbiAke2FjY2Vzc190b2tlbn0gZXhwaXJlc19pbiAke2V4cGlyZXNfaW59IHJlZnJlc2hfdG9rZW4gJHtyZWZyZXNoX3Rva2VufWApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlZnJlc2hfdG9rZW4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoX3Rva2VuID0gbnVsbDsgLy8gbm90IHVzaW5nIHJvdGF0ZSBwb2xpY3lcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdG9yZUF1dGhJbmZvKGFjY2Vzc190b2tlbiwgZXhwaXJlc19pbiwgcmVmcmVzaF90b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coYGdldEFjY2Vzc1Rva2VuIGFjY2Vzc190b2tlbiAke2FjY2Vzc190b2tlbn0gW05FV11gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc190b2tlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xlYXJBdXRoSW5mbygpO1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKEFVVEhfRVJST1JfQUNDRVNTX1RPS0VOX0VYUElSRUQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhgZ2V0QWNjZXNzVG9rZW4gYWNjZXNzX3Rva2VuICR7YWNjZXNzVG9rZW59IFtDQUNIRURdYCk7XG4gICAgICAgICAgICByZXR1cm4gYWNjZXNzVG9rZW47XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCBsb2NrLnJlbGVhc2VMb2NrKEdFVF9UT0tFTl9TSUxFTlRMWV9MT0NLX0tFWSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgRXJyb3IoQVVUSF9FUlJPUl9MT0NLX0FDUVVJUkVfRVJST1IpO1xufVxuXG5leHBvcnQgY29uc3QgcmVmcmVzaEFjY2Vzc1Rva2VuID0gYXN5bmMgKHJlZnJlc2hfdG9rZW4pID0+IHtcblxuICAgIGxldCBiYXNlVXJsID0gZ2V0T0F1dGgySURQQmFzZVVybCgpO1xuICAgIGxldCBvYXV0aDJDbGllbnRJZCA9IGdldE9BdXRoMkNsaWVudElkKCk7XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAnZ3JhbnRfdHlwZSc6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgXCJjbGllbnRfaWRcIjogZW5jb2RlVVJJKG9hdXRoMkNsaWVudElkKSxcbiAgICAgICAgXCJyZWZyZXNoX3Rva2VuXCI6IHJlZnJlc2hfdG9rZW5cbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsfS9vYXV0aDIvdG9rZW5gLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKVxuICAgICAgICB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRMb2NhdGlvbiA9IGdldEN1cnJlbnRQYXRoTmFtZSgpO1xuICAgICAgICAgICAgICAgIHNldFNlc3Npb25DbGVhcmluZ1N0YXRlKHRydWUpO1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGAke0FVVEhfRVJST1JfUkVGUkVTSF9UT0tFTl9SRVFVRVNUX0VSUk9SfTogJHtyZXNwb25zZS5zdGF0dXN9IC0gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYCR7QVVUSF9FUlJPUl9SRUZSRVNIX1RPS0VOX1JFUVVFU1RfRVJST1J9OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGxldCB7YWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VuLCBleHBpcmVzX2lufSA9IGpzb247XG4gICAgICAgIHJldHVybiB7YWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VuLCBleHBpcmVzX2lufVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3Qgc3RvcmVBdXRoSW5mbyA9IChhY2Nlc3NUb2tlbiwgZXhwaXJlc0luLCByZWZyZXNoVG9rZW4gPSBudWxsLCBpZFRva2VuID0gbnVsbCkgPT4ge1xuXG4gICAgbGV0IGZvcm1lckF1dGhJbmZvID0gZ2V0QXV0aEluZm8oKTtcblxuICAgIGxldCBhdXRoSW5mbyA9IHtcbiAgICAgICAgYWNjZXNzVG9rZW46IGFjY2Vzc1Rva2VuLFxuICAgICAgICBleHBpcmVzSW46IGV4cGlyZXNJbixcbiAgICAgICAgYWNjZXNzVG9rZW5VcGRhdGVkQXQ6IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApLFxuICAgIH07XG5cbiAgICBpZiAocmVmcmVzaFRva2VuID09PSBudWxsICYmIGZvcm1lckF1dGhJbmZvKSB7XG4gICAgICAgIHJlZnJlc2hUb2tlbiA9IGZvcm1lckF1dGhJbmZvLnJlZnJlc2hUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoaWRUb2tlbiA9PT0gbnVsbCAmJiBmb3JtZXJBdXRoSW5mbykge1xuICAgICAgICBpZFRva2VuID0gZm9ybWVyQXV0aEluZm8uaWRUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAocmVmcmVzaFRva2VuKSB7XG4gICAgICAgIGF1dGhJbmZvWydyZWZyZXNoVG9rZW4nXSA9IHJlZnJlc2hUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICBhdXRoSW5mb1snaWRUb2tlbiddID0gaWRUb2tlbjtcbiAgICB9XG5cbiAgICBwdXRPbkxvY2FsU3RvcmFnZShBVVRIX0lORk8sIEpTT04uc3RyaW5naWZ5KGF1dGhJbmZvKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRBdXRoSW5mbyA9ICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgICBsZXQgcmVzID0gZ2V0RnJvbUxvY2FsU3RvcmFnZShBVVRIX0lORk8sIGZhbHNlKVxuICAgICAgICBpZiAoIXJlcykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlcyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNsZWFyQXV0aEluZm8gPSAoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJlbW92ZUZyb21Mb2NhbFN0b3JhZ2UoQVVUSF9JTkZPKTtcbiAgICAgICAgcmVtb3ZlRnJvbUxvY2FsU3RvcmFnZShOT05DRSk7XG4gICAgICAgIHJlbW92ZUZyb21Mb2NhbFN0b3JhZ2UoUEtDRSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SWRUb2tlbiA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgYXV0aEluZm8gPSBnZXRBdXRoSW5mbygpO1xuICAgICAgICBpZiAoYXV0aEluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBhdXRoSW5mby5pZFRva2VuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRPQXV0aDJDbGllbnRJZCA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5PQVVUSDJfQ0xJRU5UX0lEO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRPQXV0aDJGbG93ID0gKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gd2luZG93Lk9BVVRIMl9GTE9XIHx8IFwidG9rZW4gaWRfdG9rZW5cIjtcbiAgICB9XG4gICAgcmV0dXJuIFwidG9rZW4gaWRfdG9rZW5cIjtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZU9BdXRoMlJlZnJlc2hUb2tlbiA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCb29sZWFuKHdpbmRvdy5PQVVUSDJfVVNFX1JFRlJFU0hfVE9LRU4gfHwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0T0F1dGgySURQQmFzZVVybCA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5JRFBfQkFTRV9VUkw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE9BdXRoMlNjb3BlcyA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5TQ09QRVM7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGluaXRMb2dPdXQgPSAoKSA9PiB7XG4gICAgbGV0IGxvY2F0aW9uID0gZ2V0Q3VycmVudExvY2F0aW9uKCk7XG4gICAgbG9jYXRpb24ucmVwbGFjZShnZXRMb2dvdXRVcmwoZ2V0SWRUb2tlbigpKS50b1N0cmluZygpKTtcbn1cblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlSWRUb2tlbiA9IChpZFRva2VuLCBpc3N1ZXIsIGF1ZGllbmNlKSA9PiB7XG5cbiAgICBsZXQgdmVyaWZpZXIgPSBuZXcgSWRUb2tlblZlcmlmaWVyKHtcbiAgICAgICAgaXNzdWVyOiBpc3N1ZXIsXG4gICAgICAgIGF1ZGllbmNlOiBhdWRpZW5jZVxuICAgIH0pO1xuXG4gICAgbGV0IHN0b3JlZE5vbmNlID0gZ2V0RnJvbUxvY2FsU3RvcmFnZShOT05DRSwgdHJ1ZSk7XG4gICAgbGV0IGp3dCA9IHZlcmlmaWVyLmRlY29kZShpZFRva2VuKTtcbiAgICBsZXQgYWxnID0gand0LmhlYWRlci5hbGc7XG4gICAgbGV0IGtpZCA9IGp3dC5oZWFkZXIua2lkO1xuICAgIGxldCBhdWQgPSBqd3QucGF5bG9hZC5hdWQ7XG4gICAgbGV0IGlzcyA9IGp3dC5wYXlsb2FkLmlzcztcbiAgICBsZXQgZXhwID0gand0LnBheWxvYWQuZXhwO1xuICAgIGxldCBuYmYgPSBqd3QucGF5bG9hZC5uYmY7XG4gICAgbGV0IHRub25jZSA9IGp3dC5wYXlsb2FkLm5vbmNlIHx8IG51bGw7XG5cbiAgICByZXR1cm4gdG5vbmNlID09IHN0b3JlZE5vbmNlICYmIGF1ZCA9PSBhdWRpZW5jZSAmJiBpc3MgPT0gaXNzdWVyO1xufVxuXG5leHBvcnQgY29uc3QgcGFzc3dvcmRsZXNzU3RhcnQgPSAocGFyYW1zKSA9PiB7XG5cbiAgICBsZXQgb2F1dGgyQ2xpZW50SWQgPSBnZXRPQXV0aDJDbGllbnRJZCgpO1xuICAgIGxldCBzY29wZXMgPSBnZXRPQXV0aDJTY29wZXMoKTtcbiAgICBsZXQgbm9uY2UgPSBjcmVhdGVOb25jZShOT05DRV9MRU4pO1xuICAgIC8vIHN0b3JlIG5vbmNlIHRvIGNoZWNrIGl0IGxhdGVyXG4gICAgcHV0T25Mb2NhbFN0b3JhZ2UoTk9OQ0UsIG5vbmNlKTtcbiAgICBsZXQgYmFzZVVybCA9IGdldE9BdXRoMklEUEJhc2VVcmwoKTtcbiAgICBsZXQgdXJsID0gVVJJKGAke2Jhc2VVcmx9L29hdXRoMi9hdXRoYCk7XG5cbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgICAgXCJyZXNwb25zZV90eXBlXCI6IFwib3RwXCIsXG4gICAgICAgIFwic2NvcGVcIjogZW5jb2RlVVJJKHNjb3BlcyksXG4gICAgICAgIFwibm9uY2VcIjogbm9uY2UsXG4gICAgICAgIFwiY2xpZW50X2lkXCI6IGVuY29kZVVSSShvYXV0aDJDbGllbnRJZCksXG4gICAgICAgIFwiY29ubmVjdGlvblwiOiBwYXJhbXMuY29ubmVjdGlvbiB8fCBcImVtYWlsXCIsXG4gICAgICAgIFwic2VuZFwiOiBwYXJhbXMuc2VuZCB8fCBcImNvZGVcIixcbiAgICB9O1xuXG4gICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnZW1haWwnKSkge1xuICAgICAgICBwYXlsb2FkW1wiZW1haWxcIl0gPSBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLmVtYWlsKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KCdwaG9uZV9udW1iZXInKSkge1xuICAgICAgICBwYXlsb2FkW1wicGhvbmVfbnVtYmVyXCJdID0gZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5waG9uZV9udW1iZXIpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaGFzT3duUHJvcGVydHkoJ3JlZGlyZWN0X3VyaScpKSB7XG4gICAgICAgIHBheWxvYWRbXCJyZWRpcmVjdF91cmlcIl0gPSBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnJlZGlyZWN0X3VyaSk7XG4gICAgfVxuXG4gICAgbGV0IHJlcSA9IGh0dHAucG9zdCh1cmwudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gcmVxLnNlbmQocGF5bG9hZCkudGhlbigocmVzKSA9PiB7XG4gICAgICAgIGxldCBqc29uID0gcmVzLmJvZHk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe3Jlc3BvbnNlOiBqc29ufSk7XG4gICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9KTtcblxufVxuXG5leHBvcnQgY29uc3QgcGFzc3dvcmRsZXNzTG9naW4gPSAocGFyYW1zKSA9PiAoZGlzcGF0Y2gpID0+IHtcblxuICAgIGxldCBvYXV0aDJDbGllbnRJZCA9IGdldE9BdXRoMkNsaWVudElkKCk7XG4gICAgbGV0IHNjb3BlcyA9IGdldE9BdXRoMlNjb3BlcygpO1xuICAgIGxldCBiYXNlVXJsID0gZ2V0T0F1dGgySURQQmFzZVVybCgpO1xuICAgIGxldCB1cmwgPSBVUkkoYCR7YmFzZVVybH0vb2F1dGgyL3Rva2VuYCk7XG5cbiAgICBpZiAoIXBhcmFtcy5oYXNPd25Qcm9wZXJ0eShcIm90cFwiKSkge1xuICAgICAgICB0aHJvdyBFcnJvcihBVVRIX0VSUk9SX01JU1NJTkdfT1RQX1BBUkFNKTtcbiAgICB9XG5cbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgICAgXCJncmFudF90eXBlXCI6IFwicGFzc3dvcmRsZXNzXCIsXG4gICAgICAgIFwiY29ubmVjdGlvblwiOiBwYXJhbXMuY29ubmVjdGlvbiB8fCBcImVtYWlsXCIsXG4gICAgICAgIFwic2NvcGVcIjogZW5jb2RlVVJJKHNjb3BlcyksXG4gICAgICAgIFwiY2xpZW50X2lkXCI6IGVuY29kZVVSSShvYXV0aDJDbGllbnRJZCksXG4gICAgICAgIFwib3RwXCI6IHBhcmFtcy5vdHBcbiAgICB9O1xuXG4gICAgaWYgKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnZW1haWwnKSkge1xuICAgICAgICBwYXlsb2FkW1wiZW1haWxcIl0gPSBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLmVtYWlsKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KCdwaG9uZV9udW1iZXInKSkge1xuICAgICAgICBwYXlsb2FkW1wicGhvbmVfbnVtYmVyXCJdID0gZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtcy5waG9uZV9udW1iZXIpO1xuICAgIH1cblxuICAgIGxldCByZXEgPSBodHRwLnBvc3QodXJsLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIHJlcS5zZW5kKHBheWxvYWQpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gbm93IHdlIGdvdCB0b2tlblxuICAgICAgICAgICAgbGV0IGpzb24gPSByZXMuYm9keTtcbiAgICAgICAgICAgIGxldCB7YWNjZXNzX3Rva2VuLCBleHBpcmVzX2luLCByZWZyZXNoX3Rva2VuLCBpZF90b2tlbn0gPSBqc29uO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlZnJlc2hfdG9rZW4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVmcmVzaF90b2tlbiA9IG51bGw7IC8vIG5vdCB1c2luZyByb3RhdGUgcG9saWN5XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWRfdG9rZW4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWRfdG9rZW4gPSBudWxsOyAvLyBub3QgdXNpbmcgcm90YXRlIHBvbGljeVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB2ZXJpZnkgaWQgdG9rZW5cblxuICAgICAgICAgICAgaWYgKGlkX3Rva2VuKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZUlkVG9rZW4oaWRfdG9rZW4sIGJhc2VVcmwsIG9hdXRoMkNsaWVudElkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihBVVRIX0VSUk9SX0lEX1RPS0VOX0lOVkFMSUQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RvcmVBdXRoSW5mbyhhY2Nlc3NfdG9rZW4sIGV4cGlyZXNfaW4sIHJlZnJlc2hfdG9rZW4sIGlkX3Rva2VuKTtcblxuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTRVRfTE9HR0VEX1VTRVIsXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtzZXNzaW9uU3RhdGU6IG51bGx9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe3Jlc3BvbnNlOiBqc29ufSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGlzSWRUb2tlbkFsaXZlID0gKG5vd0Vwb2NoID0gbnVsbCkgPT4gKCkgPT4ge1xuXG4gICAgaWYgKCFub3dFcG9jaCkge1xuICAgICAgICBub3dFcG9jaCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgIH1cblxuICAgIGNvbnN0IGlkVG9rZW4gPSBnZXRJZFRva2VuKCk7XG4gICAgaWYgKCFpZFRva2VuKVxuICAgICAgICB0aHJvdyBFcnJvcignSWQgVG9rZW4gbm90IHNldC4nKTtcblxuICAgIGNvbnN0IGlzc3VlciA9IGdldE9BdXRoMklEUEJhc2VVcmwoKTtcbiAgICBjb25zdCBhdWRpZW5jZSA9IGdldE9BdXRoMkNsaWVudElkKCk7XG5cbiAgICBsZXQgdmVyaWZpZXIgPSBuZXcgSWRUb2tlblZlcmlmaWVyKHtcbiAgICAgICAgaXNzdWVyOiBpc3N1ZXIsXG4gICAgICAgIGF1ZGllbmNlOiBhdWRpZW5jZVxuICAgIH0pO1xuXG4gICAgY29uc3Qgand0ID0gdmVyaWZpZXIuZGVjb2RlKGlkVG9rZW4pO1xuICAgIGNvbnN0IGV4cCA9IGp3dC5wYXlsb2FkLmV4cDtcblxuICAgIC8vIGNoZWNrIGxpZmUgdGltZVxuICAgIHJldHVybiBleHAgLSAobm93RXBvY2ggKyBBQ0NFU1NfVE9LRU5fU0tFV19USU1FKSA+IDA7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAyMDE3IE9wZW5TdGFjayBGb3VuZGF0aW9uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgZmxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqL1xuXG5pbXBvcnQgcmVxdWVzdCBmcm9tICdzdXBlcmFnZW50L2xpYi9jbGllbnQnO1xuaW1wb3J0IFVSSSBmcm9tIFwidXJpanNcIjtcbmxldCBodHRwID0gcmVxdWVzdDtcbmltcG9ydCBTd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcbmltcG9ydCBUIGZyb20gXCJpMThuLXJlYWN0L2Rpc3QvaTE4bi1yZWFjdFwiO1xuaW1wb3J0IHsgaXNDbGVhcmluZ1Nlc3Npb25TdGF0ZSwgc2V0U2Vzc2lvbkNsZWFyaW5nU3RhdGUsIGdldEN1cnJlbnRQYXRoTmFtZSB9IGZyb20gJy4vbWV0aG9kcyc7XG5pbXBvcnQgeyBDTEVBUl9TRVNTSU9OX1NUQVRFIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zZWN1cml0eS9hY3Rpb25zJztcbmltcG9ydCB7IGRvTG9naW4sIGluaXRMb2dPdXQgfSBmcm9tICcuLi9jb21wb25lbnRzL3NlY3VyaXR5L21ldGhvZHMnO1xuXG5leHBvcnQgY29uc3QgR0VORVJJQ19FUlJPUiAgPSBcIllpa2VzLiBTb21ldGhpbmcgc2VlbXMgdG8gYmUgYnJva2VuLiBPdXIgd2ViIHRlYW0gaGFzIGJlZW4gbm90aWZpZWQsIGFuZCB3ZSBhcG9sb2dpemUgZm9yIHRoZSBpbmNvbnZlbmllbmNlLlwiO1xuZXhwb3J0IGNvbnN0IFJFU0VUX0xPQURJTkcgID0gJ1JFU0VUX0xPQURJTkcnO1xuZXhwb3J0IGNvbnN0IFNUQVJUX0xPQURJTkcgID0gJ1NUQVJUX0xPQURJTkcnO1xuZXhwb3J0IGNvbnN0IFNUT1BfTE9BRElORyAgID0gJ1NUT1BfTE9BRElORyc7XG5leHBvcnQgY29uc3QgVkFMSURBVEUgICAgICAgPSAnVkFMSURBVEUnO1xuZXhwb3J0IGNvbnN0IENMRUFSX01FU1NBR0UgID0gJ0NMRUFSX01FU1NBR0UnO1xuZXhwb3J0IGNvbnN0IFNIT1dfTUVTU0FHRSAgID0gJ1NIT1dfTUVTU0FHRSc7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVBY3Rpb24gPSB0eXBlID0+IHBheWxvYWQgPT4gKHtcbiAgICB0eXBlLFxuICAgIHBheWxvYWRcbn0pO1xuXG5leHBvcnQgY29uc3QgcmVzZXRMb2FkaW5nID0gY3JlYXRlQWN0aW9uKFJFU0VUX0xPQURJTkcpO1xuZXhwb3J0IGNvbnN0IHN0YXJ0TG9hZGluZyA9IGNyZWF0ZUFjdGlvbihTVEFSVF9MT0FESU5HKTtcbmV4cG9ydCBjb25zdCBzdG9wTG9hZGluZyAgPSBjcmVhdGVBY3Rpb24oU1RPUF9MT0FESU5HKTtcblxuY29uc3QgeGhycyA9IHt9O1xuY29uc3QgZXRhZ0NhY2hlID0ge307XG5cbmNvbnN0IGNhbmNlbCA9IChrZXkpID0+IHtcbiAgICBpZih4aHJzW2tleV0pIHtcbiAgICAgICAgeGhyc1trZXldLmFib3J0KCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBhYm9ydGVkIHJlcXVlc3QgJHtrZXl9YCk7XG4gICAgICAgIGRlbGV0ZSB4aHJzW2tleV07XG4gICAgfVxufVxuXG5jb25zdCBzY2hlZHVsZSA9IChrZXksIHJlcSkgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKGBzY2hlZHVsaW5nICR7a2V5fWApO1xuICAgIHhocnNba2V5XSA9IHJlcTtcbn07XG5cbmNvbnN0IGlzT2JqZWN0RW1wdHkgPSAob2JqKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0IDtcbn1cblxuZXhwb3J0IGNvbnN0IGF1dGhFcnJvckhhbmRsZXIgPSAoZXJyLCByZXMpID0+IChkaXNwYXRjaCwgc3RhdGUpID0+IHtcbiAgICBsZXQgY29kZSA9IGVyci5zdGF0dXM7XG4gICAgbGV0IG1zZyA9ICcnO1xuXG4gICAgZGlzcGF0Y2goc3RvcExvYWRpbmcoKSk7XG5cbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgY2FzZSA0MDM6XG4gICAgICAgICAgICBsZXQgZXJyb3JfbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0VSUk9SJyxcbiAgICAgICAgICAgICAgICBodG1sOiBULnRyYW5zbGF0ZShcImVycm9ycy51c2VyX25vdF9hdXRoelwiKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBkaXNwYXRjaChzaG93TWVzc2FnZSggZXJyb3JfbWVzc2FnZSwgaW5pdExvZ091dCApKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwMTpcbiAgICAgICAgICAgIGxldCBjdXJyZW50TG9jYXRpb24gPSBnZXRDdXJyZW50UGF0aE5hbWUoKTtcbiAgICAgICAgICAgIGxldCBjbGVhcmluZ19zZXNzaW9uX3N0YXRlID0gaXNDbGVhcmluZ1Nlc3Npb25TdGF0ZSgpO1xuXG4gICAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogQ0xFQVJfU0VTU0lPTl9TVEFURSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB7fVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmKCFjbGVhcmluZ19zZXNzaW9uX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgc2V0U2Vzc2lvbkNsZWFyaW5nU3RhdGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2F1dGhFcnJvckhhbmRsZXIgNDAxIC0gcmUgbG9naW4nKTtcbiAgICAgICAgICAgICAgICBkb0xvZ2luKGN1cnJlbnRMb2NhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0MDQ6XG4gICAgICAgICAgICBtc2cgPSBcIlwiO1xuXG4gICAgICAgICAgICBpZiAoZXJyLnJlc3BvbnNlLmJvZHkgJiYgZXJyLnJlc3BvbnNlLmJvZHkubWVzc2FnZSkgbXNnID0gZXJyLnJlc3BvbnNlLmJvZHkubWVzc2FnZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGVyci5yZXNwb25zZS5lcnJvciAmJiBlcnIucmVzcG9uc2UuZXJyb3IubWVzc2FnZSkgbXNnID0gZXJyLnJlc3BvbnNlLmVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICBlbHNlIG1zZyA9IGVyci5tZXNzYWdlO1xuXG4gICAgICAgICAgICBTd2FsLmZpcmUoXCJOb3QgRm91bmRcIiwgbXNnLCBcIndhcm5pbmdcIik7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQxMjpcbiAgICAgICAgICAgIGZvciAodmFyIFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlcnIucmVzcG9uc2UuYm9keS5lcnJvcnMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbXNnICs9IGtleSArICc6ICc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbXNnICs9IHZhbHVlICsgJzxicj4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgU3dhbC5maXJlKFwiVmFsaWRhdGlvbiBlcnJvclwiLCBtc2csIFwid2FybmluZ1wiKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBWQUxJREFURSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiB7ZXJyb3JzOiBlcnIucmVzcG9uc2UuYm9keS5lcnJvcnN9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgU3dhbC5maXJlKFwiRVJST1JcIiwgVC50cmFuc2xhdGUoXCJlcnJvcnMuc2VydmVyX2Vycm9yXCIpLCBcImVycm9yXCIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldFJlcXVlc3QgPShcbiAgICByZXF1ZXN0QWN0aW9uQ3JlYXRvcixcbiAgICByZWNlaXZlQWN0aW9uQ3JlYXRvcixcbiAgICBlbmRwb2ludCxcbiAgICBlcnJvckhhbmRsZXIgPSBkZWZhdWx0RXJyb3JIYW5kbGVyLFxuICAgIHJlcXVlc3RBY3Rpb25QYXlsb2FkID0ge30sXG4gICAgdXNlRXRhZyA9IGZhbHNlXG4pID0+IChwYXJhbXMgPSB7fSkgPT4gKGRpc3BhdGNoLCBzdGF0ZSkgPT4ge1xuXG4gICAgbGV0IHVybCA9IFVSSShlbmRwb2ludCk7XG4gICAgbGV0IGtleSA9IHVybC50b1N0cmluZygpO1xuXG4gICAgaWYoIWlzT2JqZWN0RW1wdHkocGFyYW1zKSkge1xuICAgICAgICAvLyByZW1vdmUgdGhlIGFjY2VzcyB0b2tlblxuICAgICAgICBjb25zdCB7IGFjY2Vzc190b2tlbjogXywgLi4ubmV3UGFyYW1zfSA9IHBhcmFtcztcbiAgICAgICAgLy8gYW5kIGdlbmVyYXRlIG5ldyBrZXlcbiAgICAgICAga2V5ID0gdXJsLnF1ZXJ5KG5ld1BhcmFtcykudG9TdHJpbmcoKTtcbiAgICAgICAgdXJsID0gdXJsLnF1ZXJ5KHBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYocmVxdWVzdEFjdGlvbkNyZWF0b3IgJiYgdHlwZW9mIHJlcXVlc3RBY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBkaXNwYXRjaChyZXF1ZXN0QWN0aW9uQ3JlYXRvcihyZXF1ZXN0QWN0aW9uUGF5bG9hZCkpO1xuXG4gICAgY2FuY2VsKGtleSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgcmVxID0gaHR0cC5nZXQodXJsLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZih1c2VFdGFnICYmIGV0YWdDYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpKXtcbiAgICAgICAgICAgIGNvbnN0IHsgZXRhZyB9ID0gZXRhZ0NhY2hlW2tleV07XG4gICAgICAgICAgICBpZihldGFnKXtcbiAgICAgICAgICAgICAgICByZXEuc2V0KCdJZi1Ob25lLU1hdGNoJywgZXRhZylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlcS50aW1lb3V0KHtcbiAgICAgICAgICAgIHJlc3BvbnNlOiA2MDAwMCxcbiAgICAgICAgICAgIGRlYWRsaW5lOiA2MDAwMCxcbiAgICAgICAgfSlcbiAgICAgICAgLmVuZChyZXNwb25zZUhhbmRsZXIoZGlzcGF0Y2gsIHN0YXRlLCByZWNlaXZlQWN0aW9uQ3JlYXRvciwgZXJyb3JIYW5kbGVyLCByZXNvbHZlLCByZWplY3QsIGtleSwgdXNlRXRhZykpXG5cbiAgICAgICAgc2NoZWR1bGUoa2V5LCByZXEpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHB1dFJlcXVlc3QgPSAoXG4gICAgcmVxdWVzdEFjdGlvbkNyZWF0b3IsXG4gICAgcmVjZWl2ZUFjdGlvbkNyZWF0b3IsXG4gICAgZW5kcG9pbnQsXG4gICAgcGF5bG9hZCxcbiAgICBlcnJvckhhbmRsZXIgPSBkZWZhdWx0RXJyb3JIYW5kbGVyLFxuICAgIHJlcXVlc3RBY3Rpb25QYXlsb2FkID0ge31cbikgPT4gKHBhcmFtcyA9IHt9KSA9PiAoIGRpc3BhdGNoLCBzdGF0ZSkgPT4ge1xuXG4gICAgbGV0IHVybCA9IFVSSShlbmRwb2ludCk7XG5cbiAgICBpZighaXNPYmplY3RFbXB0eShwYXJhbXMpKVxuICAgICAgICB1cmwgPSB1cmwucXVlcnkocGFyYW1zKTtcblxuICAgIGlmKHJlcXVlc3RBY3Rpb25DcmVhdG9yICYmIHR5cGVvZiByZXF1ZXN0QWN0aW9uQ3JlYXRvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgZGlzcGF0Y2gocmVxdWVzdEFjdGlvbkNyZWF0b3IocmVxdWVzdEFjdGlvblBheWxvYWQpKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmKHBheWxvYWQgPT0gbnVsbClcbiAgICAgICAgICAgIHBheWxvYWQgPSB7fTtcbiAgICAgICAgaHR0cC5wdXQodXJsLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAuc2VuZChwYXlsb2FkKVxuICAgICAgICAgICAgLmVuZChyZXNwb25zZUhhbmRsZXIoZGlzcGF0Y2gsIHN0YXRlLCByZWNlaXZlQWN0aW9uQ3JlYXRvciwgZXJyb3JIYW5kbGVyLCByZXNvbHZlLCByZWplY3QpKVxuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVJlcXVlc3QgPSAoXG4gICAgcmVxdWVzdEFjdGlvbkNyZWF0b3IsXG4gICAgcmVjZWl2ZUFjdGlvbkNyZWF0b3IsXG4gICAgZW5kcG9pbnQsXG4gICAgcGF5bG9hZCxcbiAgICBlcnJvckhhbmRsZXIgID0gZGVmYXVsdEVycm9ySGFuZGxlcixcbiAgICByZXF1ZXN0QWN0aW9uUGF5bG9hZCA9IHt9XG4pID0+IChwYXJhbXMpID0+IChkaXNwYXRjaCwgc3RhdGUpID0+IHtcbiAgICBsZXQgdXJsID0gVVJJKGVuZHBvaW50KTtcblxuICAgIGlmKCFpc09iamVjdEVtcHR5KHBhcmFtcykpXG4gICAgICAgIHVybCA9IHVybC5xdWVyeShwYXJhbXMpO1xuXG4gICAgaWYocmVxdWVzdEFjdGlvbkNyZWF0b3IgJiYgdHlwZW9mIHJlcXVlc3RBY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBkaXNwYXRjaChyZXF1ZXN0QWN0aW9uQ3JlYXRvcihyZXF1ZXN0QWN0aW9uUGF5bG9hZCkpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYocGF5bG9hZCA9PSBudWxsKVxuICAgICAgICAgICAgcGF5bG9hZCA9IHt9O1xuXG4gICAgICAgIGh0dHAuZGVsZXRlKHVybClcbiAgICAgICAgICAgIC5zZW5kKHBheWxvYWQpXG4gICAgICAgICAgICAuZW5kKHJlc3BvbnNlSGFuZGxlcihkaXNwYXRjaCwgc3RhdGUsIHJlY2VpdmVBY3Rpb25DcmVhdG9yLCBlcnJvckhhbmRsZXIsIHJlc29sdmUsIHJlamVjdCkpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHBvc3RSZXF1ZXN0ID0gKFxuICAgICAgICByZXF1ZXN0QWN0aW9uQ3JlYXRvcixcbiAgICAgICAgcmVjZWl2ZUFjdGlvbkNyZWF0b3IsXG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBlcnJvckhhbmRsZXIgPSBkZWZhdWx0RXJyb3JIYW5kbGVyLFxuICAgICAgICByZXF1ZXN0QWN0aW9uUGF5bG9hZCA9IHt9XG4pID0+IChwYXJhbXMgPSB7fSkgPT4gKGRpc3BhdGNoLCBzdGF0ZSkgPT4ge1xuXG4gICAgbGV0IHVybCA9IFVSSShlbmRwb2ludCk7XG5cbiAgICBpZighaXNPYmplY3RFbXB0eShwYXJhbXMpKVxuICAgICAgICB1cmwgPSB1cmwucXVlcnkocGFyYW1zKTtcblxuICAgIGlmKHJlcXVlc3RBY3Rpb25DcmVhdG9yICYmIHR5cGVvZiByZXF1ZXN0QWN0aW9uQ3JlYXRvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgZGlzcGF0Y2gocmVxdWVzdEFjdGlvbkNyZWF0b3IocmVxdWVzdEFjdGlvblBheWxvYWQpKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgICAgbGV0IHJlcXVlc3QgPSBodHRwLnBvc3QodXJsKTtcblxuICAgICAgICBpZihwYXlsb2FkICE9IG51bGwpXG4gICAgICAgICAgICByZXF1ZXN0LnNlbmQocGF5bG9hZCk7XG4gICAgICAgIGVsc2UgLy8gdG8gYmUgYSBzaW1wbGUgQ09SUyByZXF1ZXN0XG4gICAgICAgICAgICByZXF1ZXN0LnNldCgnQ29udGVudC1UeXBlJywgJ3RleHQvcGxhaW4nKTtcblxuICAgICAgICByZXF1ZXN0LmVuZChyZXNwb25zZUhhbmRsZXIoZGlzcGF0Y2gsIHN0YXRlLCByZWNlaXZlQWN0aW9uQ3JlYXRvciwgZXJyb3JIYW5kbGVyLCByZXNvbHZlLCByZWplY3QpKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBwb3N0RmlsZSA9IChcbiAgICByZXF1ZXN0QWN0aW9uQ3JlYXRvcixcbiAgICByZWNlaXZlQWN0aW9uQ3JlYXRvcixcbiAgICBlbmRwb2ludCxcbiAgICBmaWxlLFxuICAgIGZpbGVNZXRhZGF0YSA9IHt9LFxuICAgIGVycm9ySGFuZGxlciA9IGRlZmF1bHRFcnJvckhhbmRsZXIsXG4gICAgcmVxdWVzdEFjdGlvblBheWxvYWQgPSB7fVxuKSA9PiAocGFyYW1zID0ge30pID0+IChkaXNwYXRjaCwgc3RhdGUpID0+IHtcblxuICAgIGxldCB1cmwgPSBVUkkoZW5kcG9pbnQpO1xuXG4gICAgaWYoIWlzT2JqZWN0RW1wdHkocGFyYW1zKSlcbiAgICAgICAgdXJsID0gdXJsLnF1ZXJ5KHBhcmFtcyk7XG5cbiAgICBpZihyZXF1ZXN0QWN0aW9uQ3JlYXRvciAmJiB0eXBlb2YgcmVxdWVzdEFjdGlvbkNyZWF0b3IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIGRpc3BhdGNoKHJlcXVlc3RBY3Rpb25DcmVhdG9yKHJlcXVlc3RBY3Rpb25QYXlsb2FkKSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHJlcSA9IGh0dHAucG9zdCh1cmwpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRhY2goJ2ZpbGUnLCBmaWxlKTtcblxuICAgICAgICBpZighaXNPYmplY3RFbXB0eShmaWxlTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhmaWxlTWV0YWRhdGEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGZpbGVNZXRhZGF0YVtrZXldO1xuICAgICAgICAgICAgICAgIHJlcS5maWVsZChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxLmVuZChyZXNwb25zZUhhbmRsZXIoZGlzcGF0Y2gsIHN0YXRlLCByZWNlaXZlQWN0aW9uQ3JlYXRvciwgZXJyb3JIYW5kbGVyLCByZXNvbHZlLCByZWplY3QpKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBwdXRGaWxlID0gKFxuICAgIHJlcXVlc3RBY3Rpb25DcmVhdG9yLFxuICAgIHJlY2VpdmVBY3Rpb25DcmVhdG9yLFxuICAgIGVuZHBvaW50LFxuICAgIGZpbGUgPSBudWxsLFxuICAgIGZpbGVNZXRhZGF0YSA9IHt9LFxuICAgIGVycm9ySGFuZGxlciA9IGRlZmF1bHRFcnJvckhhbmRsZXIsXG4gICAgcmVxdWVzdEFjdGlvblBheWxvYWQgPSB7fVxuKSA9PiAocGFyYW1zID0ge30pID0+IChkaXNwYXRjaCwgc3RhdGUpID0+IHtcblxuICAgIGxldCB1cmwgPSBVUkkoZW5kcG9pbnQpO1xuXG4gICAgaWYoIWlzT2JqZWN0RW1wdHkocGFyYW1zKSlcbiAgICAgICAgdXJsID0gdXJsLnF1ZXJ5KHBhcmFtcyk7XG5cbiAgICBpZihyZXF1ZXN0QWN0aW9uQ3JlYXRvciAmJiB0eXBlb2YgcmVxdWVzdEFjdGlvbkNyZWF0b3IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIGRpc3BhdGNoKHJlcXVlc3RBY3Rpb25DcmVhdG9yKHJlcXVlc3RBY3Rpb25QYXlsb2FkKSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHJlcSA9IGh0dHAucHV0KHVybCk7XG5cbiAgICAgICAgaWYoZmlsZSAhPSBudWxsKXtcbiAgICAgICAgICAgIHJlcS5hdHRhY2goJ2ZpbGUnLCBmaWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc09iamVjdEVtcHR5KGZpbGVNZXRhZGF0YSkpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZpbGVNZXRhZGF0YSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZmlsZU1ldGFkYXRhW2tleV07XG4gICAgICAgICAgICAgICAgcmVxLmZpZWxkKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXEuZW5kKHJlc3BvbnNlSGFuZGxlcihkaXNwYXRjaCwgc3RhdGUsIHJlY2VpdmVBY3Rpb25DcmVhdG9yLCBlcnJvckhhbmRsZXIsIHJlc29sdmUsIHJlamVjdCkpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRFcnJvckhhbmRsZXIgPSAoZXJyLCByZXMpID0+IChkaXNwYXRjaCkgPT4ge1xuICAgIGxldCBib2R5ID0gcmVzLmJvZHk7XG4gICAgbGV0IHRleHQgPSAnJztcbiAgICBpZihib2R5IGluc3RhbmNlb2YgT2JqZWN0KXtcbiAgICAgICAgaWYoYm9keS5oYXNPd25Qcm9wZXJ0eSgnbWVzc2FnZScpKVxuICAgICAgICAgICAgdGV4dCA9IGJvZHkubWVzc2FnZTtcbiAgICB9XG4gICAgU3dhbC5maXJlKHJlcy5zdGF0dXNUZXh0LCB0ZXh0LCBcImVycm9yXCIpO1xufVxuXG5jb25zdCBieUxvd2VyQ2FzZSA9IHRvRmluZCA9PiB2YWx1ZSA9PiB0b0xvd2VyQ2FzZSh2YWx1ZSkgPT09IHRvRmluZDtcbmNvbnN0IHRvTG93ZXJDYXNlID0gdmFsdWUgPT4gdmFsdWUudG9Mb3dlckNhc2UoKTtcbmNvbnN0IGdldEtleXMgPSBoZWFkZXJzID0+IE9iamVjdC5rZXlzKGhlYWRlcnMpO1xuXG5leHBvcnQgY29uc3QgZ2V0SGVhZGVyQ2FzZUluc2Vuc2l0aXZlID0gKGhlYWRlck5hbWUsIGhlYWRlcnMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGdldEtleXMoaGVhZGVycykuZmluZChieUxvd2VyQ2FzZShoZWFkZXJOYW1lKSk7XG4gICAgcmV0dXJuIGtleSA/IGhlYWRlcnNba2V5XSA6IHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNwb25zZUhhbmRsZXIgPSAoIGRpc3BhdGNoLCBzdGF0ZSwgcmVjZWl2ZUFjdGlvbkNyZWF0b3IsIGVycm9ySGFuZGxlciwgcmVzb2x2ZSwgcmVqZWN0LCBrZXkgPSBudWxsLCB1c2VFdGFnPSBmYWxzZSApID0+XG5cbiAgICAoZXJyLCByZXMpID0+IHtcblxuICAgIGlmIChlcnIgfHwgIXJlcy5vaykge1xuICAgICAgICBsZXQgY29kZSA9IGVyci5zdGF0dXM7XG5cbiAgICAgICAgaWYoY29kZSA9PT0gMzA0ICYmIGV0YWdDYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHVzZUV0YWcpe1xuICAgICAgICAgICAgY29uc3QgeyBib2R5IH0gPSBldGFnQ2FjaGVba2V5XTtcblxuICAgICAgICAgICAgaWYodHlwZW9mIHJlY2VpdmVBY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2gocmVjZWl2ZUFjdGlvbkNyZWF0b3Ioe3Jlc3BvbnNlOiBib2R5fSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHtyZXNwb25zZTogYm9keX0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkaXNwYXRjaChyZWNlaXZlQWN0aW9uQ3JlYXRvcik7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7cmVzcG9uc2U6IGJvZHl9KTtcbiAgICAgICAgfVxuICAgICAgICBpZihlcnJvckhhbmRsZXIpIHtcbiAgICAgICAgICAgIGVycm9ySGFuZGxlcihlcnIsIHJlcykoZGlzcGF0Y2gsIHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVqZWN0KHsgZXJyLCByZXMsIGRpc3BhdGNoLCBzdGF0ZSB9KVxuICAgIH1cblxuICAgIGxldCBqc29uID0gcmVzLmJvZHk7XG5cbiAgICBpZih1c2VFdGFnKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRVRBRyA9IGdldEhlYWRlckNhc2VJbnNlbnNpdGl2ZSgnZXRhZycsIHJlcy5oZWFkZXJzKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlRVRBRykge1xuICAgICAgICAgICAgZXRhZ0NhY2hlW2tleV0gPSB7IGV0YWc6IHJlc3BvbnNlRVRBRywgYm9keToganNvbn07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZih0eXBlb2YgcmVjZWl2ZUFjdGlvbkNyZWF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZGlzcGF0Y2gocmVjZWl2ZUFjdGlvbkNyZWF0b3Ioe3Jlc3BvbnNlOiBqc29ufSkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh7cmVzcG9uc2U6IGpzb259KTtcbiAgICB9XG4gICAgZGlzcGF0Y2gocmVjZWl2ZUFjdGlvbkNyZWF0b3IpO1xuICAgIHJldHVybiByZXNvbHZlKHtyZXNwb25zZToganNvbn0pO1xufVxuXG5cbmV4cG9ydCBjb25zdCBmZXRjaEVycm9ySGFuZGxlciA9IChyZXNwb25zZSkgPT4ge1xuICAgIGxldCBjb2RlID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgIGxldCBtc2cgPSByZXNwb25zZS5zdGF0dXNUZXh0O1xuXG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgICAgU3dhbC5maXJlKFwiRVJST1JcIiwgVC50cmFuc2xhdGUoXCJlcnJvcnMudXNlcl9ub3RfYXV0aHpcIiksIFwid2FybmluZ1wiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwMTpcbiAgICAgICAgICAgIFN3YWwuZmlyZShcIkVSUk9SXCIsIFQudHJhbnNsYXRlKFwiZXJyb3JzLnNlc3Npb25fZXhwaXJlZFwiKSwgXCJlcnJvclwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQxMjpcbiAgICAgICAgICAgIFN3YWwuZmlyZShcIkVSUk9SXCIsIG1zZywgXCJ3YXJuaW5nXCIpO1xuICAgICAgICBjYXNlIDUwMDpcbiAgICAgICAgICAgIFN3YWwuZmlyZShcIkVSUk9SXCIsIFQudHJhbnNsYXRlKFwiZXJyb3JzLnNlcnZlcl9lcnJvclwiKSwgXCJlcnJvclwiKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBmZXRjaFJlc3BvbnNlSGFuZGxlciA9IChyZXNwb25zZSkgPT4ge1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgcmVzcG9uc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG93TWVzc2FnZSA9IChzZXR0aW5ncywgY2FsbGJhY2sgPSB7fSkgPT4gKGRpc3BhdGNoKSA9PiB7XG4gICAgZGlzcGF0Y2goc3RvcExvYWRpbmcoKSk7XG5cbiAgICBTd2FsLmZpcmUoc2V0dGluZ3MpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LnZhbHVlICYmIHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3Qgc2hvd1N1Y2Nlc3NNZXNzYWdlID0gKGh0bWwpID0+IChkaXNwYXRjaCkgPT4ge1xuICAgIGRpc3BhdGNoKHN0b3BMb2FkaW5nKCkpO1xuICAgIFN3YWwuZmlyZSh7XG4gICAgICAgIHRpdGxlOiBULnRyYW5zbGF0ZShcImdlbmVyYWwuZG9uZVwiKSxcbiAgICAgICAgaHRtbDogaHRtbCxcbiAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnXG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBkb3dubG9hZEZpbGVCeUNvbnRlbnQgPSAoZmlsZW5hbWUsIGNvbnRlbnQsIG1pbWUpID0+IHtcbiAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBsaW5rLnRleHRDb250ZW50ID0gJ2Rvd25sb2FkJztcbiAgICBsaW5rLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgbGluay5ocmVmID0gYGRhdGE6JHttaW1lfSwke2VuY29kZVVSSUNvbXBvbmVudChjb250ZW50KX1gXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTsgLy8gUmVxdWlyZWQgZm9yIEZGXG4gICAgbGluay5jbGljaygpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRDU1YgPSAoZW5kcG9pbnQsIHBhcmFtcywgZmlsZW5hbWUsIGhlYWRlciA9IG51bGwpID0+IChkaXNwYXRjaCkgPT4ge1xuXG4gICAgbGV0IHVybCA9IFVSSShlbmRwb2ludCk7XG5cbiAgICBpZighaXNPYmplY3RFbXB0eShwYXJhbXMpKVxuICAgICAgICB1cmwgPSB1cmwucXVlcnkocGFyYW1zKTtcblxuICAgIGRpc3BhdGNoKHN0YXJ0TG9hZGluZygpKTtcblxuICAgIHJldHVybiBmZXRjaCh1cmwudG9TdHJpbmcoKSlcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzcG9uc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChjc3YpID0+IHtcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0b3BMb2FkaW5nKCkpO1xuXG4gICAgICAgICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgY3N2ID0gaGVhZGVyICsgJ1xcclxccicgKyBjc3Y7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb3dubG9hZEZpbGVCeUNvbnRlbnQoZmlsZW5hbWUsIGNzdiwgJ3RleHQvY3N2O2NoYXJzZXQ9dXRmLTgnKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSYXdDU1YgPSAoZW5kcG9pbnQsIHBhcmFtcywgaGVhZGVyID0gbnVsbCkgPT4ge1xuXG4gICAgbGV0IHVybCA9IFVSSShlbmRwb2ludCk7XG5cbiAgICBpZighaXNPYmplY3RFbXB0eShwYXJhbXMpKVxuICAgICAgICB1cmwgPSB1cmwucXVlcnkocGFyYW1zKTtcblxuICAgIHJldHVybiBmZXRjaCh1cmwudG9TdHJpbmcoKSlcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzcG9uc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChjc3YpID0+IHtcbiAgICAgICAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICBjc3YgPSBoZWFkZXIgKyAnXFxyXFxyJyArIGNzdjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjc3Y7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59O1xuXG5leHBvcnQgY29uc3QgZXNjYXBlRmlsdGVyVmFsdWUgPSAodmFsdWUpID0+IHtcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoLywvZywgXCJcXFxcLFwiKTtcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoLzsvZywgXCJcXFxcO1wiKTtcbiAgICByZXR1cm4gdmFsdWU7XG59O1xuIiwiLy8gbGltaXQgb2YgQ3J5cHRvLmdldFJhbmRvbVZhbHVlcygpXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ3J5cHRvL2dldFJhbmRvbVZhbHVlc1xuY29uc3QgTUFYX0JZVEVTID0gNjU1MzZcbi8vIE5vZGUgc3VwcG9ydHMgcmVxdWVzdGluZyB1cCB0byB0aGlzIG51bWJlciBvZiBieXRlc1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvbWFzdGVyL2xpYi9pbnRlcm5hbC9jcnlwdG8vcmFuZG9tLmpzI0w0OFxuY29uc3QgTUFYX1VJTlQzMiA9IDQyOTQ5NjcyOTVcbmNvbnN0IGNyeXB0byA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gKHdpbmRvdy5jcnlwdG8gfHwgd2luZG93Lm1zQ3J5cHRvKSA6IG51bGw7XG5pbXBvcnQgc2hhMjU2IGZyb20gJ2NyeXB0by1qcy9zaGEyNTYnO1xuaW1wb3J0IEJhc2U2NHVybCBmcm9tICdjcnlwdG8tanMvZW5jLWJhc2U2NHVybCdcbmltcG9ydCBIZXggZnJvbSAnY3J5cHRvLWpzL2VuYy1oZXgnXG5leHBvcnQgY29uc3QgZ2V0UmFuZG9tQnl0ZXMgPSAoc2l6ZSkgPT4ge1xuICAgIC8vIHBoYW50b21qcyBuZWVkcyB0byB0aHJvd1xuICAgIGlmIChzaXplID4gTUFYX1VJTlQzMikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3JlcXVlc3RlZCB0b28gbWFueSByYW5kb20gYnl0ZXMnKVxuICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmFsbG9jVW5zYWZlKHNpemUpXG4gICAgaWYoIWNyeXB0bykgcmV0dXJuIGE7XG4gICAgaWYgKHNpemUgPiAwKSB7ICAvLyBnZXRSYW5kb21WYWx1ZXMgZmFpbHMgb24gSUUgaWYgc2l6ZSA9PSAwXG4gICAgICAgIGlmIChzaXplID4gTUFYX0JZVEVTKSB7IC8vIHRoaXMgaXMgdGhlIG1heCBieXRlcyBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzXG4gICAgICAgICAgICAvLyBjYW4gZG8gYXQgb25jZSBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL3dpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzXG4gICAgICAgICAgICBmb3IgKGxldCBnZW5lcmF0ZWQgPSAwOyBnZW5lcmF0ZWQgPCBzaXplOyBnZW5lcmF0ZWQgKz0gTUFYX0JZVEVTKSB7XG4gICAgICAgICAgICAgICAgLy8gYnVmZmVyLnNsaWNlIGF1dG9tYXRpY2FsbHkgY2hlY2tzIGlmIHRoZSBlbmQgaXMgcGFzdCB0aGUgZW5kIG9mXG4gICAgICAgICAgICAgICAgLy8gdGhlIGJ1ZmZlciBzbyB3ZSBkb24ndCBoYXZlIHRvIGhlcmVcbiAgICAgICAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGJ5dGVzLnNsaWNlKGdlbmVyYXRlZCwgZ2VuZXJhdGVkICsgTUFYX0JZVEVTKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYnl0ZXMpXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzXG59XG5cbmV4cG9ydCBjb25zdCBnZXRTSEEyNTYgPSAobWVzc2FnZSwgZm9ybWF0ID0gJ2hleCcpID0+IHtcblxuICAgIGxldCBmID0gSGV4O1xuICAgIGlmKGZvcm1hdCA9PT0gJ0Jhc2U2NHVybCcpXG4gICAgICAgIGYgPSBCYXNlNjR1cmw7XG5cbiAgICByZXR1cm4gc2hhMjU2KG1lc3NhZ2UpLnRvU3RyaW5nKGYpO1xufSIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTggT3BlblN0YWNrIEZvdW5kYXRpb25cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKi9cblxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQtdGltZXpvbmUnO1xuaW1wb3J0IFVSSSBmcm9tIFwidXJpanNcIjtcblxuZXhwb3J0IGNvbnN0IGZpbmRFbGVtZW50UG9zID0gKG9iaikgPT4ge1xuICAgIHZhciBjdXJ0b3AgPSAtNzA7XG4gICAgaWYgKG9iai5vZmZzZXRQYXJlbnQpIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY3VydG9wICs9IG9iai5vZmZzZXRUb3A7XG4gICAgICAgIH0gd2hpbGUgKG9iaiA9IG9iai5vZmZzZXRQYXJlbnQpO1xuICAgICAgICByZXR1cm4gW2N1cnRvcF07XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGVwb2NoVG9Nb21lbnQgPSAoYXRpbWUpID0+IHtcbiAgICBpZighYXRpbWUpIHJldHVybiBhdGltZTtcbiAgICBhdGltZSA9IGF0aW1lICogMTAwMDtcbiAgICByZXR1cm4gbW9tZW50KGF0aW1lKTtcbn07XG5cbmV4cG9ydCBjb25zdCBlcG9jaFRvTW9tZW50VGltZVpvbmUgPSAoYXRpbWUsIHRpbWVfem9uZSkgPT4ge1xuICAgIGlmKCFhdGltZSkgcmV0dXJuIGF0aW1lO1xuICAgIGF0aW1lID0gYXRpbWUgKiAxMDAwO1xuICAgIHJldHVybiBtb21lbnQoYXRpbWUpLnR6KHRpbWVfem9uZSk7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0RXBvY2ggPSAoYXRpbWUsIGZvcm1hdCA9ICdNL0QvWVlZWSBoOm1tIGEnKSA9PiB7XG4gICAgaWYoIWF0aW1lKSByZXR1cm4gYXRpbWU7XG4gICAgcmV0dXJuIGVwb2NoVG9Nb21lbnQoYXRpbWUpLmZvcm1hdChmb3JtYXQpO1xufTtcblxuZXhwb3J0IGNvbnN0IG9iamVjdFRvUXVlcnlTdHJpbmcgPSAob2JqKSA9PiB7XG4gICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoc3RyICE9IFwiXCIpIHtcbiAgICAgICAgICAgIHN0ciArPSBcIiZcIjtcbiAgICAgICAgfVxuICAgICAgICBzdHIgKz0ga2V5ICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQob2JqW2tleV0pO1xuICAgIH1cblxuICAgIHJldHVybiBzdHI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QmFja1VSTCA9ICgpID0+IHtcbiAgICBsZXQgdXJsICAgICAgPSBVUkkod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIGxldCBxdWVyeSAgICA9IHVybC5zZWFyY2godHJ1ZSk7XG4gICAgbGV0IGZyYWdtZW50ID0gdXJsLmZyYWdtZW50KCk7XG4gICAgbGV0IGJhY2tVcmwgID0gcXVlcnkuaGFzT3duUHJvcGVydHkoJ0JhY2tVcmwnKSA/IHF1ZXJ5WydCYWNrVXJsJ10gOiBudWxsO1xuICAgIGlmKGZyYWdtZW50ICE9IG51bGwgJiYgZnJhZ21lbnQgIT0gJycpe1xuICAgICAgICBiYWNrVXJsICs9IGAjJHtmcmFnbWVudH1gO1xuICAgIH1cbiAgICByZXR1cm4gYmFja1VybDtcbn07XG5cbmV4cG9ydCBjb25zdCB0b1NsdWcgPSAodGV4dCkgPT57XG4gICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9bXmEtekEtWjAtOV0rL2csJ18nKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEF1dGhDYWxsYmFjayA9ICgpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYXV0aC9jYWxsYmFja2A7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRMb2NhdGlvbiA9ICgpID0+IHtcbiAgICBsZXQgbG9jYXRpb24gPSAnJztcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgICAgICAgLy8gY2hlY2sgaWYgd2UgYXJlIG9uIGlmcmFtZVxuICAgICAgICBpZiAod2luZG93LnRvcClcbiAgICAgICAgICAgIGxvY2F0aW9uID0gd2luZG93LnRvcC5sb2NhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2F0aW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE9yaWdpbiA9ICgpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFBhdGhOYW1lID0gKCkgPT4ge1xuICAgIGlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudEhyZWYgPSAoKSA9PiB7XG4gICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBbGxvd2VkVXNlckdyb3VwcyA9ICgpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gd2luZG93LkFMTE9XRURfVVNFUl9HUk9VUFMgfHwgJyc7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkQVBJQmFzZVVybCA9IChyZWxhdGl2ZVVybCkgPT4ge1xuICAgIGlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKXtcbiAgICAgICAgcmV0dXJuIGAke3dpbmRvdy5BUElfQkFTRV9VUkx9JHtyZWxhdGl2ZVVybH1gO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbGBgO1xufTtcblxuZXhwb3J0IGNvbnN0IHB1dE9uTG9jYWxTdG9yYWdlID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEZyb21Mb2NhbFN0b3JhZ2UgPSAoa2V5LCByZW1vdmVJdCkgPT4ge1xuICAgIGlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGxldCB2YWwgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICAgICAgaWYocmVtb3ZlSXQpe1xuICAgICAgICAgICAgY29uc29sZS5sb2coYGdldEZyb21Mb2NhbFN0b3JhZ2UgcmVtb3Zpbmcga2V5ICR7a2V5fWApO1xuICAgICAgICAgICAgcmVtb3ZlRnJvbUxvY2FsU3RvcmFnZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUZyb21Mb2NhbFN0b3JhZ2UgPSAoa2V5KSA9PiB7XG4gICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgaXNDbGVhcmluZ1Nlc3Npb25TdGF0ZSA9ICgpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gd2luZG93LmNsZWFyaW5nX3Nlc3Npb25fc3RhdGU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uQ2xlYXJpbmdTdGF0ZSA9ICh2YWwpID0+IHtcbiAgICBpZih0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3aW5kb3cuY2xlYXJpbmdfc2Vzc2lvbl9zdGF0ZSA9IHZhbDtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFVzZXJMYW5ndWFnZSA9ICgpID0+IHtcbiAgICBsZXQgbGFuZ3VhZ2UgPSAnZW4nO1xuICAgIGlmKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGxhbmd1YWdlID0gKG5hdmlnYXRvci5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yLmxhbmd1YWdlc1swXSkgfHwgbmF2aWdhdG9yLmxhbmd1YWdlIHx8IG5hdmlnYXRvci51c2VyTGFuZ3VhZ2U7XG4gICAgfVxuICAgIHJldHVybiBsYW5ndWFnZTtcbn07XG5cbmV4cG9ydCBjb25zdCBzY3JvbGxUb0Vycm9yID0gKGVycm9ycykgPT4ge1xuICAgIGlmKE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBmaXJzdEVycm9yID0gT2JqZWN0LmtleXMoZXJyb3JzKVswXTtcbiAgICAgICAgY29uc3QgZmlyc3ROb2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmlyc3RFcnJvcik7XG4gICAgICAgIGlmIChmaXJzdE5vZGUpIHdpbmRvdy5zY3JvbGxUbygwLCBmaW5kRWxlbWVudFBvcyhmaXJzdE5vZGUpKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgaGFzRXJyb3JzID0gKGZpZWxkLCBlcnJvcnMpID0+IHtcbiAgICBpZihmaWVsZCBpbiBlcnJvcnMpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yc1tmaWVsZF07XG4gICAgfVxuICAgIHJldHVybiAnJztcbn07XG5cbmV4cG9ydCBjb25zdCBzaGFsbG93RXF1YWwgPSAob2JqZWN0MSwgb2JqZWN0MikgPT4ge1xuICAgIGNvbnN0IGtleXMxID0gT2JqZWN0LmtleXMob2JqZWN0MSk7XG4gICAgY29uc3Qga2V5czIgPSBPYmplY3Qua2V5cyhvYmplY3QyKTtcblxuICAgIGlmIChrZXlzMS5sZW5ndGggIT09IGtleXMyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChsZXQga2V5IG9mIGtleXMxKSB7XG4gICAgICAgIGlmIChvYmplY3QxW2tleV0gIT09IG9iamVjdDJba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgYXJyYXlzRXF1YWwgPSAoYTEsIGEyKSA9PlxuICAgIGExLmxlbmd0aCA9PT0gYTIubGVuZ3RoICYmIGExLmV2ZXJ5KChvLCBpZHgpID0+IHNoYWxsb3dFcXVhbChvLCBhMltpZHhdKSk7XG5cbmV4cG9ydCBjb25zdCBpc0VtcHR5ID0gKG9iaikgPT4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbn07XG5cblxuZXhwb3J0IGNvbnN0IGJhc2U2NFVSTEVuY29kZSA9IChzdHIpID0+IHtcbiAgICByZXR1cm4gc3RyXG4gICAgICAgIC50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgLnJlcGxhY2UoL1xcKy9nLCAnLScpXG4gICAgICAgIC5yZXBsYWNlKC9cXC8vZywgJ18nKVxuICAgICAgICAucmVwbGFjZSgvPS9nLCAnJylcbn1cblxuZXhwb3J0IGNvbnN0IHJldHJ5UHJvbWlzZSA9IGFzeW5jIChcbiAgICBjYixcbiAgICBtYXhOdW1iZXJPZlJldHJpZXMgPSAzXG4pID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heE51bWJlck9mUmV0cmllczsgaSsrKSB7XG4gICAgICAgIGlmIChhd2FpdCBjYigpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRpbWVTZXJ2aWNlVXJsID0gKCkgPT4ge1xuICAgIGlmKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuVElNRUlOVEVSVkFMU0lOQ0UxOTcwX0FQSV9VUkwgfHwgcHJvY2Vzcy5lbnYuVElNRUlOVEVSVkFMU0lOQ0UxOTcwX0FQSV9VUkw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTggT3BlblN0YWNrIEZvdW5kYXRpb25cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKi9cblxuaW1wb3J0IHsgZmV0Y2hFcnJvckhhbmRsZXIsIGZldGNoUmVzcG9uc2VIYW5kbGVyLCBlc2NhcGVGaWx0ZXJWYWx1ZSB9IGZyb20gXCIuL2FjdGlvbnNcIjtcbmltcG9ydCB7IGdldEFjY2Vzc1Rva2VuIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zZWN1cml0eS9tZXRob2RzJztcbmltcG9ydCB7IGJ1aWxkQVBJQmFzZVVybCB9IGZyb20gXCIuL21ldGhvZHNcIjtcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5leHBvcnQgY29uc3QgUkVDRUlWRV9DT1VOVFJJRVMgID0gJ1JFQ0VJVkVfQ09VTlRSSUVTJztcbmNvbnN0IGNhbGxEZWxheSA9IDUwMDsgLy9taWxpc2Vjb25kc1xuaW1wb3J0IFVSSSBmcm9tIFwidXJpanNcIjtcblxuZXhwb3J0IGNvbnN0IHF1ZXJ5TWVtYmVycyA9IF8uZGVib3VuY2UoYXN5bmMgKGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXJzID0gZW5jb2RlVVJJQ29tcG9uZW50KGBmdWxsX25hbWU9QCR7aW5wdXR9LGZpcnN0X25hbWU9QCR7aW5wdXR9LGxhc3RfbmFtZT1AJHtpbnB1dH0sZW1haWw9QCR7aW5wdXR9YCk7XG4gICAgbGV0IGV4cGFuZCA9IGB0aWNrZXRzLHJzdnAsc2NoZWR1bGVfc3VtbWl0X2V2ZW50cyxhbGxfYWZmaWxpYXRpb25zYFxuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGAvYXBpL3YxL21lbWJlcnM/ZmlsdGVyPSR7ZmlsdGVyc30mZXhwYW5kPSR7ZXhwYW5kfSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn0sIGNhbGxEZWxheSk7XG5cblxuZXhwb3J0IGNvbnN0IHF1ZXJ5U3VtbWl0cyA9IF8uZGVib3VuY2UoYXN5bmMgKGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXJzID0gZW5jb2RlVVJJQ29tcG9uZW50KGBuYW1lPUAke2lucHV0fWApO1xuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGAvYXBpL3YxL3N1bW1pdHMvYWxsP2ZpbHRlcj0ke2ZpbHRlcnN9JmFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufWApKVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gWy4uLmpzb24uZGF0YV07XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZmV0Y2hFcnJvckhhbmRsZXIpO1xufSwgY2FsbERlbGF5KTtcblxuXG5leHBvcnQgY29uc3QgcXVlcnlTcGVha2VycyA9IF8uZGVib3VuY2UoYXN5bmMgKHN1bW1pdElkLCBpbnB1dCwgY2FsbGJhY2spID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICBpbnB1dCA9IGVzY2FwZUZpbHRlclZhbHVlKGlucHV0KTtcbiAgICBsZXQgZmlsdGVycyA9IGVuY29kZVVSSUNvbXBvbmVudChgZnVsbF9uYW1lPUAke2lucHV0fSxmaXJzdF9uYW1lPUAke2lucHV0fSxsYXN0X25hbWU9QCR7aW5wdXR9LGVtYWlsPUAke2lucHV0fWApO1xuICAgIGxldCBhcGlVcmwgPSBgL2FwaS92MWA7XG5cbiAgICBpZiAoc3VtbWl0SWQpIHtcbiAgICAgICAgYXBpVXJsICs9IGAvc3VtbWl0cy8ke3N1bW1pdElkfWA7XG4gICAgfVxuXG4gICAgYXBpVXJsICs9IGAvc3BlYWtlcnM/ZmlsdGVyPSR7ZmlsdGVyc30mYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59JmV4cGFuZD1tZW1iZXIscmVnaXN0cmF0aW9uX3JlcXVlc3RgO1xuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGFwaVVybCkpXG4gICAgICAgIC50aGVuKGZldGNoUmVzcG9uc2VIYW5kbGVyKVxuICAgICAgICAudGhlbigoanNvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBbLi4uanNvbi5kYXRhXTtcblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5cblxuZXhwb3J0IGNvbnN0IHF1ZXJ5VGFncyA9IF8uZGVib3VuY2UoYXN5bmMgKHN1bW1pdElkLCBpbnB1dCwgY2FsbGJhY2spID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICBpbnB1dCA9IGVzY2FwZUZpbHRlclZhbHVlKGlucHV0KTtcbiAgICBsZXQgYXBpVXJsID0gYC9hcGkvdjFgO1xuICAgIGxldCBmaWx0ZXIgPSBlbmNvZGVVUklDb21wb25lbnQoYHRhZz1AJHtpbnB1dH1gKTtcblxuICAgIGlmIChzdW1taXRJZCkge1xuICAgICAgICBhcGlVcmwgKz0gYC9zdW1taXRzLyR7c3VtbWl0SWR9L3RyYWNrLXRhZy1ncm91cHMvYWxsL2FsbG93ZWQtdGFncz9maWx0ZXI9JHtmaWx0ZXJ9JmV4cGFuZD10YWcsdHJhY2tfdGFnX2dyb3VwYDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcGlVcmwgKz0gYC90YWdzP2ZpbHRlcj0ke2ZpbHRlcn1gO1xuICAgIH1cblxuICAgIGFwaVVybCArPSBgJm9yZGVyPXRhZyZwYWdlPTEmcGVyX3BhZ2U9NTAmYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59YDtcblxuICAgIGZldGNoKGJ1aWxkQVBJQmFzZVVybChhcGlVcmwpKVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gWy4uLmpzb24uZGF0YV07XG5cbiAgICAgICAgICAgIGlmIChzdW1taXRJZCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zLm1hcCh0ID0+IHQudGFnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5cblxuZXhwb3J0IGNvbnN0IHF1ZXJ5VHJhY2tzID0gXy5kZWJvdW5jZShhc3luYyAoc3VtbWl0SWQsIGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXIgPSBlbmNvZGVVUklDb21wb25lbnQoYG5hbWU9QCR7aW5wdXR9YCk7XG5cbiAgICBmZXRjaChidWlsZEFQSUJhc2VVcmwoYC9hcGkvdjEvc3VtbWl0cy8ke3N1bW1pdElkfS90cmFja3M/ZmlsdGVyPSR7ZmlsdGVyfSZvcmRlcj1uYW1lJmFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufWApKVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gWy4uLmpzb24uZGF0YV07XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZmV0Y2hFcnJvckhhbmRsZXIpO1xufSwgY2FsbERlbGF5KTtcblxuXG5cbmV4cG9ydCBjb25zdCBxdWVyeVRyYWNrR3JvdXBzID0gXy5kZWJvdW5jZShhc3luYyAoc3VtbWl0SWQsIGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXIgPSBpbnB1dCA/IGVuY29kZVVSSUNvbXBvbmVudChgZmlsdGVyPW5hbWU9QCR7aW5wdXR9YCkgOiAnJztcblxuICAgIGZldGNoKGJ1aWxkQVBJQmFzZVVybChgL2FwaS92MS9zdW1taXRzLyR7c3VtbWl0SWR9L3RyYWNrLWdyb3Vwcz9vcmRlcj1uYW1lJmFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufSYke2ZpbHRlcn1gKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn0sIGNhbGxEZWxheSk7XG5cblxuXG5leHBvcnQgY29uc3QgcXVlcnlFdmVudHMgPSBfLmRlYm91bmNlKGFzeW5jIChzdW1taXRJZCwgaW5wdXQsIG9ubHlQdWJsaXNoZWQgPSBmYWxzZSwgY2FsbGJhY2spID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICBpbnB1dCA9IGVzY2FwZUZpbHRlclZhbHVlKGlucHV0KTtcbiAgICBsZXQgYmFzZVVybCA9IGAvYXBpL3YxL3N1bW1pdHMvJHtzdW1taXRJZH0vZXZlbnRzYCArIChvbmx5UHVibGlzaGVkID8gJy9wdWJsaXNoZWQnIDogJycpO1xuICAgIGxldCBmaWx0ZXIgPSBlbmNvZGVVUklDb21wb25lbnQoYHRpdGxlPUAke2lucHV0fWApO1xuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGAke2Jhc2VVcmx9P2ZpbHRlcj0ke2ZpbHRlcn0mb3JkZXI9dGl0bGUmYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59YCkpXG4gICAgICAgIC50aGVuKGZldGNoUmVzcG9uc2VIYW5kbGVyKVxuICAgICAgICAudGhlbigoanNvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBbLi4uanNvbi5kYXRhXTtcblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5leHBvcnQgY29uc3QgcXVlcnlFdmVudFR5cGVzID0gXy5kZWJvdW5jZShhc3luYyAoc3VtbWl0SWQsIGlucHV0LCBjYWxsYmFjaywgZXZlbnRUeXBlQ2xhc3NOYW1lID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcblxuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuXG4gICAgbGV0IHVybCA9IGAvYXBpL3YxL3N1bW1pdHMvJHtzdW1taXRJZH0vZXZlbnQtdHlwZXM/b3JkZXI9bmFtZSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gO1xuXG4gICAgaWYgKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IGVuY29kZVVSSUNvbXBvbmVudChgbmFtZT1AJHtpbnB1dH1gKTtcbiAgICAgICAgdXJsICs9IGAmZmlsdGVyW109JHtmaWx0ZXJ9YFxuICAgIH1cblxuICAgIGlmIChldmVudFR5cGVDbGFzc05hbWUpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gZW5jb2RlVVJJQ29tcG9uZW50KGBjbGFzc19uYW1lPT0ke2V2ZW50VHlwZUNsYXNzTmFtZX1gKTtcbiAgICAgICAgdXJsICs9IGAmZmlsdGVyW109JHtmaWx0ZXJ9YFxuICAgIH1cblxuICAgIGZldGNoKGJ1aWxkQVBJQmFzZVVybCh1cmwpKVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gWy4uLmpzb24uZGF0YV07XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZmV0Y2hFcnJvckhhbmRsZXIpO1xufSwgY2FsbERlbGF5KTtcblxuXG5leHBvcnQgY29uc3QgcXVlcnlHcm91cHMgPSBfLmRlYm91bmNlKGFzeW5jIChpbnB1dCwgY2FsbGJhY2spID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICBsZXQgZmlsdGVycyA9IGVuY29kZVVSSUNvbXBvbmVudChgdGl0bGU9QCR7aW5wdXR9LGNvZGU9QCR7aW5wdXR9YCk7XG5cbiAgICBmZXRjaChidWlsZEFQSUJhc2VVcmwoYC9hcGkvdjEvZ3JvdXBzP2ZpbHRlcj0ke2ZpbHRlcnN9JmFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufWApKVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKGpzb24pID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gWy4uLmpzb24uZGF0YV07XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZmV0Y2hFcnJvckhhbmRsZXIpO1xufSwgY2FsbERlbGF5KTtcblxuXG5cbmV4cG9ydCBjb25zdCBxdWVyeUNvbXBhbmllcyA9IF8uZGVib3VuY2UoYXN5bmMgKGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXJzID0gZW5jb2RlVVJJQ29tcG9uZW50KGBuYW1lPUAke2lucHV0fWApO1xuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGAvYXBpL3YxL2NvbXBhbmllcz9maWx0ZXI9JHtmaWx0ZXJzfSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn0sIGNhbGxEZWxheSk7XG5cbmV4cG9ydCBjb25zdCBxdWVyeVJlZ2lzdHJhdGlvbkNvbXBhbmllcyA9IF8uZGVib3VuY2UoYXN5bmMgKHN1bW1pdElkLCBpbnB1dCwgY2FsbGJhY2spID0+IHtcblxuICAgIGxldCBhY2Nlc3NUb2tlbjtcblxuICAgIHRyeSB7XG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFwaVVybCA9IFVSSShgL2FwaS92MS9zdW1taXRzLyR7c3VtbWl0SWR9L3JlZ2lzdHJhdGlvbi1jb21wYW5pZXNgKTtcbiAgICBhcGlVcmwuYWRkUXVlcnkoJ2FjY2Vzc190b2tlbicsIGFjY2Vzc1Rva2VuKTtcbiAgICBhcGlVcmwuYWRkUXVlcnkoJ29yZGVyJywnbmFtZScpXG5cbiAgICBpZihpbnB1dCkge1xuICAgICAgICBpbnB1dCA9IGVzY2FwZUZpbHRlclZhbHVlKGlucHV0KTtcbiAgICAgICAgYXBpVXJsLmFkZFF1ZXJ5KCdmaWx0ZXJbXScsIGBuYW1lQEAke2lucHV0fWApO1xuICAgIH1cblxuICAgIGZldGNoKGJ1aWxkQVBJQmFzZVVybChhcGlVcmwudG9TdHJpbmcoKSkpXG4gICAgICAgIC50aGVuKGZldGNoUmVzcG9uc2VIYW5kbGVyKVxuICAgICAgICAudGhlbigoanNvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBbLi4uanNvbi5kYXRhXTtcblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5cbmV4cG9ydCBjb25zdCBxdWVyeVNwb25zb3JzID0gXy5kZWJvdW5jZShhc3luYyAoc3VtbWl0SWQsIGlucHV0LCBjYWxsYmFjaykgPT4ge1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXJzID0gZW5jb2RlVVJJQ29tcG9uZW50KGBjb21wYW55X25hbWU9QCR7aW5wdXR9YCk7XG5cbiAgICBmZXRjaChidWlsZEFQSUJhc2VVcmwoYC9hcGkvdjEvc3VtbWl0cy8ke3N1bW1pdElkfS9zcG9uc29ycz9maWx0ZXI9JHtmaWx0ZXJzfSZleHBhbmQ9Y29tcGFueSxzcG9uc29yc2hpcCZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn0sIGNhbGxEZWxheSk7XG5cbmV4cG9ydCBjb25zdCBxdWVyeUFjY2Vzc0xldmVscyA9IF8uZGVib3VuY2UoYXN5bmMgKHN1bW1pdElkLCBpbnB1dCwgY2FsbGJhY2spID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICBpbnB1dCA9IGVzY2FwZUZpbHRlclZhbHVlKGlucHV0KTtcbiAgICBsZXQgZmlsdGVycyA9IGVuY29kZVVSSUNvbXBvbmVudChgbmFtZT1AJHtpbnB1dH1gKTtcblxuICAgIGZldGNoKGJ1aWxkQVBJQmFzZVVybChgL2FwaS92MS9zdW1taXRzLyR7c3VtbWl0SWR9L2FjY2Vzcy1sZXZlbC10eXBlcz9maWx0ZXI9JHtmaWx0ZXJzfSYmYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59YCkpXG4gICAgICAgIC50aGVuKGZldGNoUmVzcG9uc2VIYW5kbGVyKVxuICAgICAgICAudGhlbigoanNvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBbLi4uanNvbi5kYXRhXTtcblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5leHBvcnQgY29uc3QgcXVlcnlPcmdhbml6YXRpb25zID0gXy5kZWJvdW5jZShhc3luYyAoaW5wdXQsIGNhbGxiYWNrKSA9PiB7XG5cbiAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKCk7XG4gICAgaW5wdXQgPSBlc2NhcGVGaWx0ZXJWYWx1ZShpbnB1dCk7XG4gICAgbGV0IGZpbHRlcnMgPSBlbmNvZGVVUklDb21wb25lbnQoYG5hbWU9QCR7aW5wdXR9YCk7XG5cbiAgICBmZXRjaChidWlsZEFQSUJhc2VVcmwoYC9hcGkvdjEvb3JnYW5pemF0aW9ucz9maWx0ZXI9JHtmaWx0ZXJzfSZhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbn1gKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn0sIGNhbGxEZWxheSk7XG5cblxuZXhwb3J0IGNvbnN0IGdldExhbmd1YWdlTGlzdCA9IChjYWxsYmFjaywgc2lnbmFsKSA9PiB7XG4gICAgcmV0dXJuIGZldGNoKGJ1aWxkQVBJQmFzZVVybChgL2FwaS9wdWJsaWMvdjEvbGFuZ3VhZ2VzYCksIHtzaWduYWx9KVxuICAgICAgICAudGhlbihmZXRjaFJlc3BvbnNlSGFuZGxlcilcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZldGNoRXJyb3JIYW5kbGVyKTtcbn07XG5cblxuZXhwb3J0IGNvbnN0IGdldENvdW50cnlMaXN0ID0gKGNhbGxiYWNrLCBzaWduYWwpID0+IHtcblxuICAgIHJldHVybiBmZXRjaChidWlsZEFQSUJhc2VVcmwoYC9hcGkvcHVibGljL3YxL2NvdW50cmllc2ApLCB7c2lnbmFsfSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2socmVzcG9uc2UuZGF0YSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59O1xuXG52YXIgZ2VvY29kZXI7XG5cbmV4cG9ydCBjb25zdCBnZW9Db2RlQWRkcmVzcyA9IChhZGRyZXNzKSA9PiB7XG5cbiAgICBpZiAoIWdlb2NvZGVyKSBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xuXG4gICAgLy8gcmV0dXJuIGEgUHJvbWlzZVxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLHJlamVjdCkge1xuICAgICAgICBnZW9jb2Rlci5nZW9jb2RlKCB7ICdhZGRyZXNzJzogYWRkcmVzc30sIGZ1bmN0aW9uKHJlc3VsdHMsIHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSykge1xuICAgICAgICAgICAgICAgIC8vIHJlc29sdmUgcmVzdWx0cyB1cG9uIGEgc3VjY2Vzc2Z1bCBzdGF0dXNcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdHMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyByZWplY3Qgc3RhdHVzIHVwb24gdW4tc3VjY2Vzc2Z1bCBzdGF0dXNcbiAgICAgICAgICAgICAgICByZWplY3Qoc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2VvQ29kZUxhdExuZyA9IChsYXQsIGxuZykgPT4ge1xuXG4gICAgaWYgKCFnZW9jb2RlcikgZ2VvY29kZXIgPSBuZXcgZ29vZ2xlLm1hcHMuR2VvY29kZXIoKTtcblxuICAgIHZhciBsYXRsbmcgPSB7bGF0OiBwYXJzZUZsb2F0KGxhdCksIGxuZzogcGFyc2VGbG9hdChsbmcpfTtcbiAgICAvLyByZXR1cm4gYSBQcm9taXNlXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KSB7XG4gICAgICAgIGdlb2NvZGVyLmdlb2NvZGUoIHsgJ2xvY2F0aW9uJzogbGF0bG5nfSwgZnVuY3Rpb24ocmVzdWx0cywgc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoc3RhdHVzID09IGdvb2dsZS5tYXBzLkdlb2NvZGVyU3RhdHVzLk9LKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVzb2x2ZSByZXN1bHRzIHVwb24gYSBzdWNjZXNzZnVsIHN0YXR1c1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHJlamVjdCBzdGF0dXMgdXBvbiB1bi1zdWNjZXNzZnVsIHN0YXR1c1xuICAgICAgICAgICAgICAgIHJlamVjdChzdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cblxuZXhwb3J0IGNvbnN0IHF1ZXJ5VGlja2V0VHlwZXMgPSBfLmRlYm91bmNlKGFzeW5jIChzdW1taXRJZCwgZmlsdGVycyA9IHt9LCBjYWxsYmFjaywgdmVyc2lvbiA9ICd2MScpID0+IHtcblxuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcblxuICAgIGxldCBhcGlVcmwgPSBVUkkoYC9hcGkvJHt2ZXJzaW9ufS9zdW1taXRzLyR7c3VtbWl0SWR9L3RpY2tldC10eXBlc2ApO1xuICAgIGFwaVVybC5hZGRRdWVyeSgnYWNjZXNzX3Rva2VuJywgYWNjZXNzVG9rZW4pO1xuICAgIGFwaVVybC5hZGRRdWVyeSgnb3JkZXInLCduYW1lJylcblxuICAgIGlmKGZpbHRlcnMuaGFzT3duUHJvcGVydHkoJ25hbWUnKSkge1xuICAgICAgICBjb25zdCBuYW1lID0gZXNjYXBlRmlsdGVyVmFsdWUoZmlsdGVycy5uYW1lKTtcbiAgICAgICAgYXBpVXJsLmFkZFF1ZXJ5KCdmaWx0ZXJbXScsIGBuYW1lQEAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgaWYoZmlsdGVycy5oYXNPd25Qcm9wZXJ0eSgnYXVkaWVuY2UnKSl7XG4gICAgICAgIGNvbnN0IGF1ZGllbmNlID0gZXNjYXBlRmlsdGVyVmFsdWUoZmlsdGVycy5hdWRpZW5jZSk7XG4gICAgICAgIGFwaVVybC5hZGRRdWVyeSgnZmlsdGVyW10nLCBgYXVkaWVuY2U9PSR7YXVkaWVuY2V9YCk7XG4gICAgfVxuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGFwaVVybC50b1N0cmluZygpKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5cbmV4cG9ydCBjb25zdCBxdWVyeVNwb25zb3JlZFByb2plY3RzID0gXy5kZWJvdW5jZShhc3luYyAoaW5wdXQsIGNhbGxiYWNrKSA9PiB7XG5cbiAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKCk7XG4gICAgY29uc3QgYXBpVXJsID0gVVJJKGAvYXBpL3YxL3Nwb25zb3JlZC1wcm9qZWN0c2ApO1xuICAgIGFwaVVybC5hZGRRdWVyeSgnYWNjZXNzX3Rva2VuJywgYWNjZXNzVG9rZW4pO1xuICAgIGlmKGlucHV0KSB7XG4gICAgICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgICAgICBhcGlVcmwuYWRkUXVlcnkoJ2ZpbHRlcltdJywgYG5hbWU9QCR7aW5wdXR9YCk7XG4gICAgfVxuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGFwaVVybC50b1N0cmluZygpKSlcbiAgICAgICAgLnRoZW4oZmV0Y2hSZXNwb25zZUhhbmRsZXIpXG4gICAgICAgIC50aGVuKChqc29uKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IFsuLi5qc29uLmRhdGFdO1xuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuXG5cbmV4cG9ydCBjb25zdCBxdWVyeVByb21vY29kZXMgPSBfLmRlYm91bmNlKGFzeW5jIChzdW1taXRJZCwgaW5wdXQsIGNhbGxiYWNrKSA9PiB7XG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpO1xuICAgIGlucHV0ID0gZXNjYXBlRmlsdGVyVmFsdWUoaW5wdXQpO1xuICAgIGxldCBmaWx0ZXJzID0gZW5jb2RlVVJJQ29tcG9uZW50KGBjb2RlPUAke2lucHV0fWApO1xuXG4gICAgZmV0Y2goYnVpbGRBUElCYXNlVXJsKGAvYXBpL3YxL3N1bW1pdHMvJHtzdW1taXRJZH0vcHJvbW8tY29kZXM/ZmlsdGVyPSR7ZmlsdGVyc30mYWNjZXNzX3Rva2VuPSR7YWNjZXNzVG9rZW59YCkpXG4gICAgICAgIC50aGVuKGZldGNoUmVzcG9uc2VIYW5kbGVyKVxuICAgICAgICAudGhlbigoanNvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSBbLi4uanNvbi5kYXRhXTtcblxuICAgICAgICAgICAgY2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmZXRjaEVycm9ySGFuZGxlcik7XG59LCBjYWxsRGVsYXkpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2V4dGVuZHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJicm93c2VyLXRhYnMtbG9ja1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjcnlwdG8tanMvZW5jLWJhc2U2NHVybFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjcnlwdG8tanMvZW5jLWhleFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjcnlwdG8tanMvc2hhMjU2XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImkxOG4tcmVhY3QvZGlzdC9pMThuLXJlYWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImlkdG9rZW4tdmVyaWZpZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm1vbWVudC10aW1lem9uZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC1zZWxlY3RcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwic3VwZXJhZ2VudC9saWIvY2xpZW50XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInN3ZWV0YWxlcnQyXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInVyaWpzXCIpOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE3IE9wZW5TdGFjayBGb3VuZGF0aW9uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiovXG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgRHJvcGRvd24gZnJvbSAnLi9kcm9wZG93bic7XG5pbXBvcnQge2dldENvdW50cnlMaXN0fSBmcm9tICcuLi8uLi91dGlscy9xdWVyeS1hY3Rpb25zJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ291bnRyeURyb3Bkb3duIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgb3B0aW9uczogW11cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZSA9IHRoaXMuaGFuZGxlQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyA9IHRoaXMuc2V0T3B0aW9ucy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgICAgIGxldCB7b3B0aW9uc30gPSB0aGlzLnN0YXRlO1xuXG4gICAgICAgIGlmKG9wdGlvbnMubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgZ2V0Q291bnRyeUxpc3QodGhpcy5zZXRPcHRpb25zLCB0aGlzLmFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKXtcbiAgICAgICAgdGhpcy5hYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9XG5cbiAgICBoYW5kbGVDaGFuZ2UodmFsdWUpIHtcblxuICAgICAgICBsZXQgZXYgPSB7dGFyZ2V0OiB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMucHJvcHMuaWQsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdjb3VudHJ5ZGRsJ1xuICAgICAgICAgICAgfX07XG5cbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShldik7XG4gICAgfVxuXG4gICAgc2V0T3B0aW9ucyhyZXNwb25zZSkge1xuICAgICAgICBsZXQgY291bnRyeUxpc3QgPSByZXNwb25zZS5tYXAoYyA9PiAoe2xhYmVsOiBjLm5hbWUsIHZhbHVlOiBjLmlzb19jb2RlfSkpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtvcHRpb25zOiBjb3VudHJ5TGlzdH0pO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcblxuICAgICAgICBsZXQge29wdGlvbnN9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPERyb3Bkb3duIG9wdGlvbnM9e29wdGlvbnN9IHsuLi50aGlzLnByb3BzfSAvPlxuICAgICAgICApO1xuXG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIlJlYWN0IiwiU2VsZWN0IiwiRHJvcGRvd24iLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiaGFuZGxlQ2hhbmdlIiwiYmluZCIsInNlbGVjdGlvbiIsInZhbHVlIiwiaXNNdWx0aSIsIm1hcCIsInZhbCIsImV2IiwidGFyZ2V0IiwiaWQiLCJ0eXBlIiwib25DaGFuZ2UiLCJyZW5kZXIiLCJjbGFzc05hbWUiLCJlcnJvciIsImNsZWFyYWJsZSIsImRpc2FibGVkIiwib3ZlcnJpZGVDU1MiLCJhcmlhTGFiZWxsZWRCeSIsInJlc3QiLCJoYXNfZXJyb3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzQ2xlYXJhYmxlIiwiaXNEaXNhYmxlZCIsInRoZVZhbHVlIiwic2VsZWN0Q2xhc3NOYW1lIiwib3B0aW9ucyIsImZpbHRlciIsIm9wIiwiaW5jbHVkZXMiLCJPYmplY3QiLCJmaW5kIiwib3B0Iiwic2VsZWN0U3R5bGVzIiwibWVudSIsInN0eWxlcyIsInpJbmRleCIsImRlZmF1bHRQcm9wcyIsIlQiLCJhdXRoRXJyb3JIYW5kbGVyIiwiY3JlYXRlQWN0aW9uIiwiZ2V0UmVxdWVzdCIsInNob3dNZXNzYWdlIiwic3RhcnRMb2FkaW5nIiwic3RvcExvYWRpbmciLCJidWlsZEFQSUJhc2VVcmwiLCJnZXRBbGxvd2VkVXNlckdyb3VwcyIsImdldEFjY2Vzc1Rva2VuIiwic3RvcmVBdXRoSW5mbyIsImluaXRMb2dPdXQiLCJTRVRfTE9HR0VEX1VTRVIiLCJMT0dPVVRfVVNFUiIsIlJFUVVFU1RfVVNFUl9JTkZPIiwiUkVDRUlWRV9VU0VSX0lORk8iLCJDTEVBUl9TRVNTSU9OX1NUQVRFIiwiVVBEQVRFX1NFU1NJT05fU1RBVEVfU1RBVFVTIiwiU0VTU0lPTl9TVEFURV9TVEFUVVNfVU5DSEFOR0VEIiwiU0VTU0lPTl9TVEFURV9TVEFUVVNfQ0hBTkdFRCIsIlNFU1NJT05fU1RBVEVfU1RBVFVTX0VSUk9SIiwiVVBEQVRFX1VTRVJfSU5GTyIsIm9uVXNlckF1dGgiLCJhY2Nlc3NUb2tlbiIsImlkVG9rZW4iLCJzZXNzaW9uU3RhdGUiLCJleHBpcmVzSW4iLCJyZWZyZXNoVG9rZW4iLCJkaXNwYXRjaCIsInBheWxvYWQiLCJkb0xvZ291dCIsImJhY2tVcmwiLCJnZXRTdGF0ZSIsImdldFVzZXJJbmZvIiwiZXhwYW5kIiwiZmllbGRzIiwiaGlzdG9yeSIsImVycm9ySGFuZGxlciIsIkFsbG93ZWRVc2VyR3JvdXBzIiwic3BsaXQiLCJsb2dnZWRVc2VyU3RhdGUiLCJtZW1iZXIiLCJwdXNoIiwiUHJvbWlzZSIsInJlc29sdmUiLCJwYXJhbXMiLCJhY2Nlc3NfdG9rZW4iLCJ0aGVuIiwiZXJyb3JfbWVzc2FnZSIsInRpdGxlIiwiaHRtbCIsInRyYW5zbGF0ZSIsImxlbmd0aCIsImFsbG93ZWRHcm91cHMiLCJncm91cHMiLCJncm91cCIsImlkeCIsImNvZGUiLCJ1cGRhdGVVc2VySW5mbyIsInVwZGF0ZWRNZW1iZXIiLCJFcnJvciIsInVwZGF0ZVNlc3Npb25TdGF0ZVN0YXR1cyIsIm5ld1N0YXR1cyIsInNlc3Npb25TdGF0ZVN0YXR1cyIsIkFVVEhfRVJST1JfTUlTU0lOR19BVVRIX0lORk8iLCJBVVRIX0VSUk9SX01JU1NJTkdfUkVGUkVTSF9UT0tFTiIsIkFVVEhfRVJST1JfQUNDRVNTX1RPS0VOX0VYUElSRUQiLCJBVVRIX0VSUk9SX0xPQ0tfQUNRVUlSRV9FUlJPUiIsIkFVVEhfRVJST1JfUkVGUkVTSF9UT0tFTl9SRVFVRVNUX0VSUk9SIiwiQVVUSF9FUlJPUl9JRF9UT0tFTl9JTlZBTElEIiwiQVVUSF9FUlJPUl9NSVNTSU5HX09UUF9QQVJBTSIsImJhc2U2NFVSTEVuY29kZSIsImdldEF1dGhDYWxsYmFjayIsImdldEN1cnJlbnRMb2NhdGlvbiIsImdldEN1cnJlbnRQYXRoTmFtZSIsImdldEZyb21Mb2NhbFN0b3JhZ2UiLCJyZW1vdmVGcm9tTG9jYWxTdG9yYWdlIiwiZ2V0T3JpZ2luIiwicHV0T25Mb2NhbFN0b3JhZ2UiLCJyZXRyeVByb21pc2UiLCJzZXRTZXNzaW9uQ2xlYXJpbmdTdGF0ZSIsInJlcXVlc3QiLCJMb2NrIiwiaHR0cCIsImxvY2siLCJHRVRfVE9LRU5fU0lMRU5UTFlfTE9DS19LRVkiLCJOT05DRV9MRU4iLCJBQ0NFU1NfVE9LRU5fU0tFV19USU1FIiwiUkVTUE9OU0VfVFlQRV9JTVBMSUNJVCIsIlJFU1BPTlNFX1RZUEVfQ09ERSIsIkFVVEhfSU5GTyIsIk5PTkNFIiwiUEtDRSIsIlVSSSIsIklkVG9rZW5WZXJpZmllciIsImdldFJhbmRvbUJ5dGVzIiwiZ2V0U0hBMjU2IiwiZ2V0QXV0aFVybCIsInByb21wdCIsInRva2VuSWRIaW50IiwicHJvdmlkZXIiLCJsb2dpbkhpbnQiLCJvdHBMb2dpbkhpbnQiLCJvYXV0aDJDbGllbnRJZCIsImdldE9BdXRoMkNsaWVudElkIiwicmVkaXJlY3RVcmkiLCJiYXNlVXJsIiwiZ2V0T0F1dGgySURQQmFzZVVybCIsInNjb3BlcyIsImdldE9BdXRoMlNjb3BlcyIsImZsb3ciLCJnZXRPQXV0aDJGbG93IiwiZW5jb2RlVVJJIiwibm9uY2UiLCJjcmVhdGVOb25jZSIsInVybCIsInF1ZXJ5IiwicGtjZSIsImNyZWF0ZVBLQ0VDb2RlcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJjb2RlQ2hhbGxlbmdlIiwiZ2V0TG9nb3V0VXJsIiwic3RhdGUiLCJwb3N0TG9nT3V0VXJpIiwibGVuIiwicG9zc2libGUiLCJpIiwiY2hhckF0IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwiZG9Mb2dpbiIsImxvY2F0aW9uIiwicmVwbGFjZSIsInRvU3RyaW5nIiwiZG9Mb2dpbkJhc2ljTG9naW4iLCJjb2RlVmVyaWZpZXIiLCJjcmVhdGVkQXQiLCJEYXRlIiwiY29kZVBhaXIiLCJlbWl0QWNjZXNzVG9rZW4iLCJwYXJzZSIsInJlc3BvbnNlIiwiZmV0Y2giLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsImNhdGNoIiwiY29uc29sZSIsImxvZyIsIm1lc3NhZ2UiLCJqc29uIiwicmVmcmVzaF90b2tlbiIsImlkX3Rva2VuIiwiZXhwaXJlc19pbiIsImVycm9yX2Rlc2NyaXB0aW9uIiwiZXJyIiwiY2xlYXJBY2Nlc3NUb2tlbiIsImFjcXVpcmVMb2NrIiwiYXV0aEluZm8iLCJnZXRBdXRoSW5mbyIsImFjY2Vzc1Rva2VuVXBkYXRlZEF0IiwicmVsZWFzZUxvY2siLCJub3ciLCJ0aW1lRWxhcHNlZFNlY3MiLCJ1c2VPQXV0aDJSZWZyZXNoVG9rZW4iLCJjbGVhckF1dGhJbmZvIiwicmVmcmVzaEFjY2Vzc1Rva2VuIiwic3RhdHVzIiwiY3VycmVudExvY2F0aW9uIiwic3RhdHVzVGV4dCIsImZvcm1lckF1dGhJbmZvIiwicmVzIiwid2luZG93IiwiZ2V0SWRUb2tlbiIsIk9BVVRIMl9DTElFTlRfSUQiLCJPQVVUSDJfRkxPVyIsIkJvb2xlYW4iLCJPQVVUSDJfVVNFX1JFRlJFU0hfVE9LRU4iLCJJRFBfQkFTRV9VUkwiLCJTQ09QRVMiLCJ2YWxpZGF0ZUlkVG9rZW4iLCJpc3N1ZXIiLCJhdWRpZW5jZSIsInZlcmlmaWVyIiwic3RvcmVkTm9uY2UiLCJqd3QiLCJkZWNvZGUiLCJhbGciLCJoZWFkZXIiLCJraWQiLCJhdWQiLCJpc3MiLCJleHAiLCJuYmYiLCJ0bm9uY2UiLCJwYXNzd29yZGxlc3NTdGFydCIsImNvbm5lY3Rpb24iLCJzZW5kIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZW1haWwiLCJwaG9uZV9udW1iZXIiLCJyZWRpcmVjdF91cmkiLCJyZXEiLCJwb3N0IiwicmVqZWN0IiwicGFzc3dvcmRsZXNzTG9naW4iLCJvdHAiLCJlIiwiaXNJZFRva2VuQWxpdmUiLCJub3dFcG9jaCIsIlN3YWwiLCJpc0NsZWFyaW5nU2Vzc2lvblN0YXRlIiwiR0VORVJJQ19FUlJPUiIsIlJFU0VUX0xPQURJTkciLCJTVEFSVF9MT0FESU5HIiwiU1RPUF9MT0FESU5HIiwiVkFMSURBVEUiLCJDTEVBUl9NRVNTQUdFIiwiU0hPV19NRVNTQUdFIiwicmVzZXRMb2FkaW5nIiwieGhycyIsImV0YWdDYWNoZSIsImNhbmNlbCIsImtleSIsImFib3J0Iiwic2NoZWR1bGUiLCJpc09iamVjdEVtcHR5Iiwib2JqIiwia2V5cyIsIm1zZyIsImNsZWFyaW5nX3Nlc3Npb25fc3RhdGUiLCJmaXJlIiwiZW50cmllcyIsImVycm9ycyIsImlzTmFOIiwicmVxdWVzdEFjdGlvbkNyZWF0b3IiLCJyZWNlaXZlQWN0aW9uQ3JlYXRvciIsImVuZHBvaW50IiwiZGVmYXVsdEVycm9ySGFuZGxlciIsInJlcXVlc3RBY3Rpb25QYXlsb2FkIiwidXNlRXRhZyIsIl8iLCJuZXdQYXJhbXMiLCJnZXQiLCJldGFnIiwic2V0IiwidGltZW91dCIsImRlYWRsaW5lIiwiZW5kIiwicmVzcG9uc2VIYW5kbGVyIiwicHV0UmVxdWVzdCIsInB1dCIsImRlbGV0ZVJlcXVlc3QiLCJkZWxldGUiLCJwb3N0UmVxdWVzdCIsInBvc3RGaWxlIiwiZmlsZSIsImZpbGVNZXRhZGF0YSIsImF0dGFjaCIsImZvckVhY2giLCJmaWVsZCIsInB1dEZpbGUiLCJ0ZXh0IiwiYnlMb3dlckNhc2UiLCJ0b0ZpbmQiLCJ0b0xvd2VyQ2FzZSIsImdldEtleXMiLCJnZXRIZWFkZXJDYXNlSW5zZW5zaXRpdmUiLCJoZWFkZXJOYW1lIiwidW5kZWZpbmVkIiwib2siLCJyZXNwb25zZUVUQUciLCJmZXRjaEVycm9ySGFuZGxlciIsImZldGNoUmVzcG9uc2VIYW5kbGVyIiwic2V0dGluZ3MiLCJjYWxsYmFjayIsInJlc3VsdCIsInNob3dTdWNjZXNzTWVzc2FnZSIsImRvd25sb2FkRmlsZUJ5Q29udGVudCIsImZpbGVuYW1lIiwiY29udGVudCIsIm1pbWUiLCJsaW5rIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwidGV4dENvbnRlbnQiLCJkb3dubG9hZCIsImhyZWYiLCJhcHBlbmRDaGlsZCIsImNsaWNrIiwicmVtb3ZlQ2hpbGQiLCJnZXRDU1YiLCJjc3YiLCJnZXRSYXdDU1YiLCJlc2NhcGVGaWx0ZXJWYWx1ZSIsIk1BWF9CWVRFUyIsIk1BWF9VSU5UMzIiLCJjcnlwdG8iLCJtc0NyeXB0byIsInNoYTI1NiIsIkJhc2U2NHVybCIsIkhleCIsInNpemUiLCJSYW5nZUVycm9yIiwiYnl0ZXMiLCJCdWZmZXIiLCJhbGxvY1Vuc2FmZSIsImEiLCJnZW5lcmF0ZWQiLCJnZXRSYW5kb21WYWx1ZXMiLCJzbGljZSIsImZvcm1hdCIsImYiLCJtb21lbnQiLCJmaW5kRWxlbWVudFBvcyIsImN1cnRvcCIsIm9mZnNldFBhcmVudCIsIm9mZnNldFRvcCIsImVwb2NoVG9Nb21lbnQiLCJhdGltZSIsImVwb2NoVG9Nb21lbnRUaW1lWm9uZSIsInRpbWVfem9uZSIsInR6IiwiZm9ybWF0RXBvY2giLCJvYmplY3RUb1F1ZXJ5U3RyaW5nIiwic3RyIiwiZ2V0QmFja1VSTCIsInNlYXJjaCIsImZyYWdtZW50IiwidG9TbHVnIiwib3JpZ2luIiwidG9wIiwicGF0aG5hbWUiLCJnZXRDdXJyZW50SHJlZiIsIkFMTE9XRURfVVNFUl9HUk9VUFMiLCJyZWxhdGl2ZVVybCIsIkFQSV9CQVNFX1VSTCIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJyZW1vdmVJdCIsImdldEl0ZW0iLCJyZW1vdmVJdGVtIiwiZ2V0Q3VycmVudFVzZXJMYW5ndWFnZSIsImxhbmd1YWdlIiwibmF2aWdhdG9yIiwibGFuZ3VhZ2VzIiwidXNlckxhbmd1YWdlIiwic2Nyb2xsVG9FcnJvciIsImZpcnN0RXJyb3IiLCJmaXJzdE5vZGUiLCJnZXRFbGVtZW50QnlJZCIsInNjcm9sbFRvIiwiaGFzRXJyb3JzIiwic2hhbGxvd0VxdWFsIiwib2JqZWN0MSIsIm9iamVjdDIiLCJrZXlzMSIsImtleXMyIiwiYXJyYXlzRXF1YWwiLCJhMSIsImEyIiwiZXZlcnkiLCJvIiwiaXNFbXB0eSIsImNiIiwibWF4TnVtYmVyT2ZSZXRyaWVzIiwiZ2V0VGltZVNlcnZpY2VVcmwiLCJUSU1FSU5URVJWQUxTSU5DRTE5NzBfQVBJX1VSTCIsInByb2Nlc3MiLCJlbnYiLCJSRUNFSVZFX0NPVU5UUklFUyIsImNhbGxEZWxheSIsInF1ZXJ5TWVtYmVycyIsImRlYm91bmNlIiwiaW5wdXQiLCJmaWx0ZXJzIiwiZGF0YSIsInF1ZXJ5U3VtbWl0cyIsInF1ZXJ5U3BlYWtlcnMiLCJzdW1taXRJZCIsImFwaVVybCIsInF1ZXJ5VGFncyIsInQiLCJ0YWciLCJxdWVyeVRyYWNrcyIsInF1ZXJ5VHJhY2tHcm91cHMiLCJxdWVyeUV2ZW50cyIsIm9ubHlQdWJsaXNoZWQiLCJxdWVyeUV2ZW50VHlwZXMiLCJldmVudFR5cGVDbGFzc05hbWUiLCJxdWVyeUdyb3VwcyIsInF1ZXJ5Q29tcGFuaWVzIiwicXVlcnlSZWdpc3RyYXRpb25Db21wYW5pZXMiLCJhZGRRdWVyeSIsInF1ZXJ5U3BvbnNvcnMiLCJxdWVyeUFjY2Vzc0xldmVscyIsInF1ZXJ5T3JnYW5pemF0aW9ucyIsImdldExhbmd1YWdlTGlzdCIsInNpZ25hbCIsImdldENvdW50cnlMaXN0IiwiZ2VvY29kZXIiLCJnZW9Db2RlQWRkcmVzcyIsImFkZHJlc3MiLCJnb29nbGUiLCJtYXBzIiwiR2VvY29kZXIiLCJnZW9jb2RlIiwicmVzdWx0cyIsIkdlb2NvZGVyU3RhdHVzIiwiT0siLCJnZW9Db2RlTGF0TG5nIiwibGF0IiwibG5nIiwibGF0bG5nIiwicGFyc2VGbG9hdCIsInF1ZXJ5VGlja2V0VHlwZXMiLCJ2ZXJzaW9uIiwibmFtZSIsInF1ZXJ5U3BvbnNvcmVkUHJvamVjdHMiLCJxdWVyeVByb21vY29kZXMiLCJDb3VudHJ5RHJvcGRvd24iLCJzZXRPcHRpb25zIiwiYWJvcnRDb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwiY29tcG9uZW50RGlkTW91bnQiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsImNvdW50cnlMaXN0IiwiYyIsImxhYmVsIiwiaXNvX2NvZGUiLCJzZXRTdGF0ZSJdLCJzb3VyY2VSb290IjoiIn0=
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("openstack-uicore-foundation",[],t):"object"==typeof exports?exports["openstack-uicore-foundation"]=t():e["openstack-uicore-foundation"]=t()}(this,(()=>(()=>{"use strict";var e={401:(e,t,n)=>{n.d(t,{default:()=>_});var r=n(8213),a=n.n(r),o=n(8779),s=n.n(o),c=n(3838),l=n.n(c),i=n(6689),d=n.n(i),p=n(1929),u=n.n(p);const h=["onChange","value","className","error","clearable","disabled","overrideCSS","ariaLabelledBy"];function f(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function R(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?f(Object(n),!0).forEach((function(t){s()(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):f(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}class _ extends d().Component{constructor(e){super(e),this.handleChange=this.handleChange.bind(this)}handleChange(e){let t=null;t=this.props.isMulti?e?e.map((e=>e.value)):null:e?e.value:null;let n={target:{id:this.props.id,value:t,type:"dropdown"}};this.props.onChange(n)}render(){let e=this.props,{onChange:t,value:n,className:r,error:o,clearable:s,disabled:c,overrideCSS:i,ariaLabelledBy:p}=e,f=l()(e,h),_=this.props.hasOwnProperty("error")&&""!=o,m=this.props.hasOwnProperty("clearable"),E=this.props.hasOwnProperty("disabled")&&1==c,y=null,g=r;this.props.hasOwnProperty("overrideCSS")&&0!=i||(g="dropdown "+r+" "+(_?"error":"")),y=this.props.isMulti?this.props.options.filter((e=>n.includes(e.value))):n instanceof Object||null==n?n:this.props.options.find((e=>e.value==n));const w={menu:e=>R(R({},e),{},{zIndex:999})};return d().createElement("div",null,d().createElement(u(),a()({className:g,value:y,onChange:this.handleChange,isClearable:m,isDisabled:E,styles:w,"aria-labelledby":p},f)),_&&d().createElement("p",{className:"error-label"},o))}}_.defaultProps={ariaLabelledBy:null}},4341:(e,t,n)=>{n(8779),n(4656),n(4054),n(6793),n(8576)},1593:(e,t,n)=>{n.d(t,{AUTH_ERROR_ACCESS_TOKEN_EXPIRED:()=>o,AUTH_ERROR_LOCK_ACQUIRE_ERROR:()=>s,AUTH_ERROR_MISSING_AUTH_INFO:()=>r,AUTH_ERROR_MISSING_REFRESH_TOKEN:()=>a,AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR:()=>c});const r="AUTH_ERROR_MISSING_AUTH_INFO",a="AUTH_ERROR_MISSING_REFRESH_TOKEN",o="AUTH_ERROR_ACCESS_TOKEN_EXPIRED",s="AUTH_ERROR_LOCK_ACQUIRE_ERROR",c="AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR"},8576:(e,t,n)=>{n.d(t,{getAccessToken:()=>h});var r=n(6793);n(2691);const a=require("browser-tabs-lock");var o=n.n(a);n(6530),n(3856),n(4341);require("crypto-js/sha256"),require("crypto-js/enc-base64url"),require("crypto-js/enc-hex"),"undefined"!=typeof window&&(window.crypto||window.msCrypto);var s=n(1593);const c=new(o()),l="openstackuicore.lock.getTokenSilently",i="code",d="authInfo",p="nonce",u="pkce",h=async()=>{if(await(0,r.retryPromise)((()=>c.acquireLock(l,5e3)),10))try{let e=_();if(!e)throw Error(s.AUTH_ERROR_MISSING_AUTH_INFO);let{accessToken:t,expiresIn:n,accessTokenUpdatedAt:r,refreshToken:a}=e,o=y(),c=Math.floor(Date.now()/1e3);if(n-=20,c-r>n||null==t){if(console.log("getAccessToken access token expired"),o===i&&g()){if(!a)throw m(),Error(s.AUTH_ERROR_MISSING_REFRESH_TOKEN);let e=await f(a),{access_token:t,expires_in:n,refresh_token:r}=e;return void 0===r&&(r=null),R(t,n,r),t}throw m(),Error(s.AUTH_ERROR_ACCESS_TOKEN_EXPIRED)}return t}finally{await c.releaseLock(l)}throw Error(s.AUTH_ERROR_LOCK_ACQUIRE_ERROR)},f=async e=>{let t=w(),n=E();const a={grant_type:"refresh_token",client_id:encodeURI(n),refresh_token:e};try{const e=await fetch(`${t}/oauth2/token`,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(a)}).then((e=>{if(400===e.status){(0,r.getCurrentPathName)();throw(0,r.setSessionClearingState)(!0),Error(`${s.AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR}: ${e.status} - ${e.statusText}`)}return e})).catch((function(e){throw Error(`${s.AUTH_ERROR_REFRESH_TOKEN_REQUEST_ERROR}: ${e.message}`)})),n=await e.json();let{access_token:o,refresh_token:c,expires_in:l}=n;return{access_token:o,refresh_token:c,expires_in:l}}catch(e){throw console.log(e),e}},R=(e,t,n=null,a=null)=>{let o=_(),s={accessToken:e,expiresIn:t,accessTokenUpdatedAt:Math.floor(Date.now()/1e3)};null===n&&o&&(n=o.refreshToken),null===a&&o&&(a=o.idToken),n&&(s.refreshToken=n),a&&(s.idToken=a),(0,r.putOnLocalStorage)(d,JSON.stringify(s))},_=()=>{try{let e=(0,r.getFromLocalStorage)(d,!1);return e?JSON.parse(e):null}catch(e){return null}},m=()=>{if("undefined"!=typeof window)return(0,r.removeFromLocalStorage)(d),(0,r.removeFromLocalStorage)(p),void(0,r.removeFromLocalStorage)(u)},E=()=>"undefined"!=typeof window?window.OAUTH2_CLIENT_ID:null,y=()=>"undefined"!=typeof window&&window.OAUTH2_FLOW||"token id_token",g=()=>"undefined"==typeof window||new Boolean(window.OAUTH2_USE_REFRESH_TOKEN||!0),w=()=>"undefined"!=typeof window?window.IDP_BASE_URL:null},4054:(e,t,n)=>{n.d(t,{escapeFilterValue:()=>d,fetchErrorHandler:()=>l,fetchResponseHandler:()=>i});n(3838),n(2691),n(6530);var r=n(271),a=n.n(r),o=n(4656),s=n.n(o);n(6793),n(4341),n(8576);const c=e=>t=>({type:e,payload:t}),l=(c("RESET_LOADING"),c("START_LOADING"),c("STOP_LOADING"),e=>{let t=e.status,n=e.statusText;switch(t){case 403:a().fire("ERROR",s().translate("errors.user_not_authz"),"warning");break;case 401:a().fire("ERROR",s().translate("errors.session_expired"),"error");break;case 412:a().fire("ERROR",n,"warning");case 500:a().fire("ERROR",s().translate("errors.server_error"),"error")}}),i=e=>{if(e.ok)return e.json();throw e},d=e=>e=(e=e.replace(/,/g,"\\,")).replace(/;/g,"\\;")},6793:(e,t,n)=>{n.d(t,{buildAPIBaseUrl:()=>a,getCurrentPathName:()=>r,getFromLocalStorage:()=>s,putOnLocalStorage:()=>o,removeFromLocalStorage:()=>c,retryPromise:()=>i,setSessionClearingState:()=>l});n(8362),n(6530);const r=()=>"undefined"!=typeof window?window.location.pathname:null,a=e=>"undefined"!=typeof window?`${window.API_BASE_URL}${e}`:null``,o=(e,t)=>{"undefined"!=typeof window&&window.localStorage.setItem(e,t)},s=(e,t)=>{if("undefined"!=typeof window){let n=window.localStorage.getItem(e);return t&&(console.log(`getFromLocalStorage removing key ${e}`),c(e)),n}return null},c=e=>{"undefined"!=typeof window&&window.localStorage.removeItem(e)},l=e=>{"undefined"!=typeof window&&(window.clearing_session_state=e)},i=async(e,t=3)=>{for(let n=0;n<t;n++)if(await e())return!0;return!1}},7525:(e,t,n)=>{n.d(t,{getCountryList:()=>p});var r=n(4054),a=n(8576),o=n(6793);const s=require("lodash");var c=n.n(s),l=n(6530),i=n.n(l);const d=500,p=(c().debounce((async(e,t)=>{const n=await(0,a.getAccessToken)();e=(0,r.escapeFilterValue)(e);let s=encodeURIComponent(`full_name=@${e},first_name=@${e},last_name=@${e},email=@${e}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/members?filter=${s}&expand=tickets,rsvp,schedule_summit_events,all_affiliations&access_token=${n}`)).then(r.fetchResponseHandler).then((e=>{let n=[...e.data];t(n)})).catch(r.fetchErrorHandler)}),d),c().debounce((async(e,t)=>{const n=await(0,a.getAccessToken)();e=(0,r.escapeFilterValue)(e);let s=encodeURIComponent(`name=@${e}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/summits/all?filter=${s}&access_token=${n}`)).then(r.fetchResponseHandler).then((e=>{let n=[...e.data];t(n)})).catch(r.fetchErrorHandler)}),d),c().debounce((async(e,t,n)=>{const s=await(0,a.getAccessToken)();t=(0,r.escapeFilterValue)(t);let c="/api/v1";e&&(c+=`/summits/${e}`),c+=`/speakers?filter=${encodeURIComponent(`full_name=@${t},first_name=@${t},last_name=@${t},email=@${t}`)}&access_token=${s}&expand=member,registration_request`,fetch((0,o.buildAPIBaseUrl)(c)).then(r.fetchResponseHandler).then((e=>{let t=[...e.data];n(t)})).catch(r.fetchErrorHandler)}),d),c().debounce((async(e,t,n)=>{const s=await(0,a.getAccessToken)();t=(0,r.escapeFilterValue)(t);let c="/api/v1",l=encodeURIComponent(`tag=@${t}`);c+=e?`/summits/${e}/track-tag-groups/all/allowed-tags?filter=${l}&expand=tag,track_tag_group`:`/tags?filter=${l}`,c+=`&order=tag&page=1&per_page=50&access_token=${s}`,fetch((0,o.buildAPIBaseUrl)(c)).then(r.fetchResponseHandler).then((t=>{let r=[...t.data];e&&(r=r.map((e=>e.tag))),n(r)})).catch(r.fetchErrorHandler)}),d),c().debounce((async(e,t,n)=>{const s=await(0,a.getAccessToken)();t=(0,r.escapeFilterValue)(t);let c=encodeURIComponent(`name=@${t}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/summits/${e}/tracks?filter=${c}&order=name&access_token=${s}`)).then(r.fetchResponseHandler).then((e=>{let t=[...e.data];n(t)})).catch(r.fetchErrorHandler)}),d),c().debounce((async(e,t,n)=>{const s=await(0,a.getAccessToken)();let c=(t=(0,r.escapeFilterValue)(t))?encodeURIComponent(`filter=name=@${t}`):"";fetch((0,o.buildAPIBaseUrl)(`/api/v1/summits/${e}/track-groups?order=name&access_token=${s}&${c}`)).then(r.fetchResponseHandler).then((e=>{let t=[...e.data];n(t)})).catch(r.fetchErrorHandler)}),d),c().debounce((async(e,t,n=!1,s)=>{const c=await(0,a.getAccessToken)();t=(0,r.escapeFilterValue)(t);let l=`/api/v1/summits/${e}/events`+(n?"/published":""),i=encodeURIComponent(`title=@${t}`);fetch((0,o.buildAPIBaseUrl)(`${l}?filter=${i}&order=title&access_token=${c}`)).then(r.fetchResponseHandler).then((e=>{let t=[...e.data];s(t)})).catch(r.fetchErrorHandler)}),d),c().debounce((async(e,t,n,s=null)=>{let c=`/api/v1/summits/${e}/event-types?order=name&access_token=${await(0,a.getAccessToken)()}`;if(t=(0,r.escapeFilterValue)(t)){c+=`&filter[]=${encodeURIComponent(`name=@${t}`)}`}if(s){c+=`&filter[]=${encodeURIComponent(`class_name==${s}`)}`}fetch((0,o.buildAPIBaseUrl)(c)).then(r.fetchResponseHandler).then((e=>{let t=[...e.data];n(t)})).catch(r.fetchErrorHandler)}),d),c().debounce((async(e,t)=>{const n=await(0,a.getAccessToken)();let s=encodeURIComponent(`title=@${e},code=@${e}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/groups?filter=${s}&access_token=${n}`)).then(r.fetchResponseHandler).then((e=>{let n=[...e.data];t(n)})).catch(r.fetchErrorHandler)}),d),c().debounce((async(e,t)=>{const n=await(0,a.getAccessToken)();e=(0,r.escapeFilterValue)(e);let s=encodeURIComponent(`name=@${e}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/companies?filter=${s}&access_token=${n}`)).then(r.fetchResponseHandler).then((e=>{let n=[...e.data];t(n)})).catch(r.fetchErrorHandler)}),d),c().debounce((async(e,t,n)=>{let s;try{s=await(0,a.getAccessToken)()}catch(e){return void n(e)}let c=i()(`/api/v1/summits/${e}/registration-companies`);c.addQuery("access_token",s),c.addQuery("order","name"),t&&(t=(0,r.escapeFilterValue)(t),c.addQuery("filter[]",`name@@${t}`)),fetch((0,o.buildAPIBaseUrl)(c.toString())).then(r.fetchResponseHandler).then((e=>{let t=[...e.data];n(t)})).catch(r.fetchErrorHandler)}),d),c().debounce((async(e,t,n)=>{const s=await(0,a.getAccessToken)();t=(0,r.escapeFilterValue)(t);let c=encodeURIComponent(`company_name=@${t}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/summits/${e}/sponsors?filter=${c}&expand=company,sponsorship&access_token=${s}`)).then(r.fetchResponseHandler).then((e=>{let t=[...e.data];n(t)})).catch(r.fetchErrorHandler)}),d),c().debounce((async(e,t,n)=>{const s=await(0,a.getAccessToken)();t=(0,r.escapeFilterValue)(t);let c=encodeURIComponent(`name=@${t}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/summits/${e}/access-level-types?filter=${c}&&access_token=${s}`)).then(r.fetchResponseHandler).then((e=>{let t=[...e.data];n(t)})).catch(r.fetchErrorHandler)}),d),c().debounce((async(e,t)=>{const n=await(0,a.getAccessToken)();e=(0,r.escapeFilterValue)(e);let s=encodeURIComponent(`name=@${e}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/organizations?filter=${s}&access_token=${n}`)).then(r.fetchResponseHandler).then((e=>{let n=[...e.data];t(n)})).catch(r.fetchErrorHandler)}),d),(e,t)=>fetch((0,o.buildAPIBaseUrl)("/api/public/v1/countries"),{signal:t}).then(r.fetchResponseHandler).then((t=>{e(t.data)})).catch(r.fetchErrorHandler));c().debounce((async(e,t={},n,s="v1")=>{const c=await(0,a.getAccessToken)();let l=i()(`/api/${s}/summits/${e}/ticket-types`);if(l.addQuery("access_token",c),l.addQuery("order","name"),t.hasOwnProperty("name")){const e=(0,r.escapeFilterValue)(t.name);l.addQuery("filter[]",`name@@${e}`)}if(t.hasOwnProperty("audience")){const e=(0,r.escapeFilterValue)(t.audience);l.addQuery("filter[]",`audience==${e}`)}fetch((0,o.buildAPIBaseUrl)(l.toString())).then(r.fetchResponseHandler).then((e=>{let t=[...e.data];n(t)})).catch(r.fetchErrorHandler)}),d),c().debounce((async(e,t)=>{const n=await(0,a.getAccessToken)(),s=i()("/api/v1/sponsored-projects");s.addQuery("access_token",n),e&&(e=(0,r.escapeFilterValue)(e),s.addQuery("filter[]",`name=@${e}`)),fetch((0,o.buildAPIBaseUrl)(s.toString())).then(r.fetchResponseHandler).then((e=>{let n=[...e.data];t(n)})).catch(r.fetchErrorHandler)}),d),c().debounce((async(e,t,n)=>{const s=await(0,a.getAccessToken)();t=(0,r.escapeFilterValue)(t);let c=encodeURIComponent(`code=@${t}`);fetch((0,o.buildAPIBaseUrl)(`/api/v1/summits/${e}/promo-codes?filter=${c}&access_token=${s}`)).then(r.fetchResponseHandler).then((e=>{let t=[...e.data];n(t)})).catch(r.fetchErrorHandler)}),d)},8779:e=>{e.exports=require("@babel/runtime/helpers/defineProperty")},8213:e=>{e.exports=require("@babel/runtime/helpers/extends")},3838:e=>{e.exports=require("@babel/runtime/helpers/objectWithoutProperties")},4656:e=>{e.exports=require("i18n-react/dist/i18n-react")},3856:e=>{e.exports=require("idtoken-verifier")},8362:e=>{e.exports=require("moment-timezone")},6689:e=>{e.exports=require("react")},1929:e=>{e.exports=require("react-select")},2691:e=>{e.exports=require("superagent/lib/client")},271:e=>{e.exports=require("sweetalert2")},6530:e=>{e.exports=require("urijs")}},t={};function n(r){var a=t[r];if(void 0!==a)return a.exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}(()=>{n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t}})(),(()=>{n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}})(),(()=>{n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)})(),(()=>{n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}})();var r={};return(()=>{n.r(r),n.d(r,{default:()=>l});var e=n(8213),t=n.n(e),a=n(6689),o=n.n(a),s=n(401),c=n(7525);class l extends o().Component{constructor(e){super(e),this.state={options:[]},this.handleChange=this.handleChange.bind(this),this.setOptions=this.setOptions.bind(this),this.abortController=new AbortController}componentDidMount(){let{options:e}=this.state;0==e.length&&(0,c.getCountryList)(this.setOptions,this.abortController.signal)}componentWillUnmount(){this.abortController.abort()}handleChange(e){let t={target:{id:this.props.id,value:e,type:"countryddl"}};this.props.onChange(t)}setOptions(e){let t=e.map((e=>({label:e.name,value:e.iso_code})));this.setState({options:t})}render(){let{options:e}=this.state;return o().createElement(s.default,t()({options:e},this.props))}}})(),r})()));