single-scripture-rcl 3.3.3-beta → 3.3.3-beta.101

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.
@@ -1,16 +1,33 @@
1
1
  import "core-js/modules/es.array.concat.js";
2
+ import "core-js/modules/es.array.every.js";
2
3
  import "core-js/modules/es.array.find-index.js";
4
+ import "core-js/modules/es.array.for-each.js";
3
5
  import "core-js/modules/es.array.includes.js";
4
6
  import "core-js/modules/es.array.is-array.js";
7
+ import "core-js/modules/es.array.iterator.js";
5
8
  import "core-js/modules/es.array.join.js";
6
9
  import "core-js/modules/es.array.map.js";
10
+ import "core-js/modules/es.map.js";
7
11
  import "core-js/modules/es.object.keys.js";
12
+ import "core-js/modules/es.object.to-string.js";
13
+ import "core-js/modules/es.object.values.js";
8
14
  import "core-js/modules/es.parse-int.js";
9
15
  import "core-js/modules/es.regexp.exec.js";
10
16
  import "core-js/modules/es.string.includes.js";
17
+ import "core-js/modules/es.string.iterator.js";
11
18
  import "core-js/modules/es.string.split.js";
19
+ import "core-js/modules/web.dom-collections.for-each.js";
20
+ import "core-js/modules/web.dom-collections.iterator.js";
12
21
  import "regenerator-runtime/runtime.js";
13
22
 
23
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
24
+
25
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
26
+
27
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
28
+
29
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
30
+
14
31
  function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
15
32
 
16
33
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
@@ -39,86 +56,161 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
39
56
 
40
57
  import * as React from 'react';
41
58
  import * as PropTypes from 'prop-types';
42
- import { core } from 'scripture-resources-rcl';
59
+ import { core, SelectionsContextProvider } from 'scripture-resources-rcl';
43
60
  import usfmjs from 'usfm-js';
44
61
  import { useEdit } from 'gitea-react-toolkit';
45
- import { Card, useCardState, useUserBranch, ERROR_STATE, MANIFEST_NOT_LOADED_ERROR } from 'translation-helps-rcl';
62
+ import { IconButton } from '@mui/material';
63
+ import { RxLink2, RxLinkBreak2 } from 'react-icons/rx';
64
+ import { Card, ERROR_STATE, MANIFEST_NOT_LOADED_ERROR, useCardState, useUserBranch } from 'translation-helps-rcl'; // @ts-ignore
65
+
66
+ import { getQuoteMatchesInBookRef } from 'uw-quote-helpers';
46
67
  import { AlignmentHelpers, UsfmFileConversionHelpers } from 'word-aligner-rcl';
47
68
  import * as isEqual from 'deep-equal';
69
+ import { getVerses } from 'bible-reference-range';
48
70
  import { ScripturePane, ScriptureSelector } from '..';
49
71
  import { useScriptureSettings } from '../../hooks/useScriptureSettings';
50
- import { getResourceLink, getResourceMessage, getScriptureVersionSettings, isOriginalBible } from '../../utils/ScriptureSettings';
72
+ import { cleanupVerseObjects, fixOccurrence, getResourceLink, getResourceMessage, getScriptureVersionSettings, isOriginalBible } from '../../utils/ScriptureSettings';
73
+ import { delay } from '../../utils/delay';
74
+ import { areMapsTheSame } from '../../utils/maps';
51
75
  import { Title } from '../ScripturePane/styled';
52
76
  import { NT_ORIG_LANG, ORIGINAL_SOURCE, OT_ORIG_LANG } from '../../utils';
77
+ import { VerseSelectorPopup } from '../VerseSelectorPopup';
53
78
  var KEY_FONT_SIZE_BASE = 'scripturePaneFontSize_';
54
79
  var label = 'Version';
55
80
  var style = {
56
81
  marginTop: '16px',
57
82
  width: '500px'
58
83
  };
59
- export default function ScriptureCard(_ref) {
60
- var _scriptureConfig$reso, _scriptureConfig$reso2, _scriptureConfig$reso3, _scriptureConfig$reso4, _scriptureConfig$reso6, _scriptureConfig$reso7, _scriptureConfig$reso8, _httpConfig, _httpConfig2;
61
-
62
- var id = _ref.id,
63
- isNT = _ref.isNT,
64
- title = _ref.title,
65
- server = _ref.server,
66
- appRef = _ref.appRef,
67
- cardNum = _ref.cardNum,
68
- classes = _ref.classes,
69
- _ref$resource = _ref.resource,
70
- owner = _ref$resource.owner,
71
- languageId = _ref$resource.languageId,
72
- resourceId = _ref$resource.resourceId,
73
- originalLanguageOwner = _ref$resource.originalLanguageOwner,
74
- getLanguage = _ref.getLanguage,
75
- _ref$reference = _ref.reference,
76
- verse = _ref$reference.verse,
77
- chapter = _ref$reference.chapter,
78
- bookId = _ref$reference.projectId,
79
- resourceLink = _ref.resourceLink,
80
- useUserLocalStorage = _ref.useUserLocalStorage,
81
- disableWordPopover = _ref.disableWordPopover,
82
- onResourceError = _ref.onResourceError,
83
- httpConfig = _ref.httpConfig,
84
- greekRepoUrl = _ref.greekRepoUrl,
85
- hebrewRepoUrl = _ref.hebrewRepoUrl,
86
- getLexiconData = _ref.getLexiconData,
87
- fetchGlossesForVerse = _ref.fetchGlossesForVerse,
88
- translate = _ref.translate,
89
- onMinimize = _ref.onMinimize,
90
- loggedInUser = _ref.loggedInUser,
91
- authentication = _ref.authentication,
92
- setSavedChanges = _ref.setSavedChanges,
93
- bookIndex = _ref.bookIndex,
94
- addVerseRange = _ref.addVerseRange,
95
- setWordAlignerStatus = _ref.setWordAlignerStatus;
84
+ /**
85
+ * create a short comparison verse ref object without all the verseData
86
+ * @param verseRef
87
+ */
88
+
89
+ function compareObject(verseRef) {
90
+ var _verseData$verseObjec;
91
+
92
+ var _ref = verseRef || {},
93
+ chapter = _ref.chapter,
94
+ verse = _ref.verse,
95
+ verseData = _ref.verseData;
96
+
97
+ var verseObjects = (verseData === null || verseData === void 0 ? void 0 : (_verseData$verseObjec = verseData.verseObjects) === null || _verseData$verseObjec === void 0 ? void 0 : _verseData$verseObjec.length) || 0;
98
+ return {
99
+ chapter: chapter,
100
+ verse: verse,
101
+ verseObjects: verseObjects
102
+ };
103
+ }
104
+ /**
105
+ * compare two verse refs to see if they are substantially similar
106
+ * @param versesForRef1
107
+ * @param versesForRef2
108
+ */
109
+
110
+
111
+ function areVersesSame(versesForRef1, versesForRef2) {
112
+ versesForRef1 = versesForRef1 || [];
113
+ versesForRef2 = versesForRef2 || [];
114
+ var areSame = false;
115
+
116
+ if (versesForRef1.length === versesForRef2.length) {
117
+ areSame = true;
118
+
119
+ for (var i = 0, l = versesForRef1.length; i < l; i++) {
120
+ var verse1 = compareObject(versesForRef1[i]);
121
+ var verse2 = compareObject(versesForRef2[i]);
122
+ areSame = isEqual(verse1, verse2);
123
+
124
+ if (!areSame) {
125
+ break;
126
+ }
127
+ }
128
+ }
129
+
130
+ return areSame;
131
+ }
132
+
133
+ export default function ScriptureCard(_ref2) {
134
+ var _scriptureConfig$reso, _scriptureConfig$reso2, _scriptureConfig$reso3, _scriptureConfig$reso4, _scriptureConfig$reso6, _scriptureConfig$reso7, _scriptureConfig$reso8, _httpConfig, _httpConfig2, _versesForRef3, _versesForRef4;
135
+
136
+ var appRef = _ref2.appRef,
137
+ authentication = _ref2.authentication,
138
+ bookIndex = _ref2.bookIndex,
139
+ cardNum = _ref2.cardNum,
140
+ classes = _ref2.classes,
141
+ disableWordPopover = _ref2.disableWordPopover,
142
+ getLanguage = _ref2.getLanguage,
143
+ getLexiconData = _ref2.getLexiconData,
144
+ greekRepoUrl = _ref2.greekRepoUrl,
145
+ hebrewRepoUrl = _ref2.hebrewRepoUrl,
146
+ httpConfig = _ref2.httpConfig,
147
+ id = _ref2.id,
148
+ isNT = _ref2.isNT,
149
+ loggedInUser = _ref2.loggedInUser,
150
+ onMinimize = _ref2.onMinimize,
151
+ onResourceError = _ref2.onResourceError,
152
+ originalScriptureBookObjects = _ref2.originalScriptureBookObjects,
153
+ reference = _ref2.reference,
154
+ _ref2$resource = _ref2.resource,
155
+ owner = _ref2$resource.owner,
156
+ languageId = _ref2$resource.languageId,
157
+ resourceId = _ref2$resource.resourceId,
158
+ originalLanguageOwner = _ref2$resource.originalLanguageOwner,
159
+ resourceLink = _ref2.resourceLink,
160
+ selectedQuote = _ref2.selectedQuote,
161
+ server = _ref2.server,
162
+ setSavedChanges = _ref2.setSavedChanges,
163
+ setWordAlignerStatus = _ref2.setWordAlignerStatus,
164
+ translate = _ref2.translate,
165
+ title = _ref2.title,
166
+ useUserLocalStorage = _ref2.useUserLocalStorage;
167
+ var bookId = reference === null || reference === void 0 ? void 0 : reference.projectId;
96
168
 
97
169
  var _React$useState = React.useState({
170
+ checkForEditBranch: 0,
171
+ currentReference: null,
172
+ editBranchReady: false,
98
173
  haveUnsavedChanges: false,
174
+ lastSelectedQuote: null,
175
+ readyForFetch: false,
99
176
  ref: appRef,
100
177
  saveClicked: false,
101
178
  saveContent: null,
179
+ selections: new Map(),
102
180
  sha: null,
103
181
  startSave: false,
104
182
  urlError: null,
105
183
  usingUserBranch: false,
106
184
  unsavedChangesList: {},
107
- versesForRef: null
185
+ versesForRef: null,
186
+ showAlignmentPopup: false,
187
+ verseSelectedForAlignment: null,
188
+ versesAlignmentStatus: null,
189
+ verseObjectsMap: new Map()
108
190
  }),
109
191
  _React$useState2 = _slicedToArray(_React$useState, 2),
110
192
  state = _React$useState2[0],
111
193
  setState_ = _React$useState2[1];
112
194
 
113
- var ref = state.ref,
195
+ var checkForEditBranch = state.checkForEditBranch,
196
+ currentReference = state.currentReference,
197
+ editBranchReady = state.editBranchReady,
198
+ haveUnsavedChanges = state.haveUnsavedChanges,
199
+ lastSelectedQuote = state.lastSelectedQuote,
200
+ readyForFetch = state.readyForFetch,
201
+ ref = state.ref,
114
202
  saveClicked = state.saveClicked,
115
203
  saveContent = state.saveContent,
204
+ selections = state.selections,
116
205
  sha = state.sha,
206
+ showAlignmentPopup = state.showAlignmentPopup,
117
207
  startSave = state.startSave,
118
208
  urlError = state.urlError,
119
209
  usingUserBranch = state.usingUserBranch,
120
210
  unsavedChangesList = state.unsavedChangesList,
121
- haveUnsavedChanges = state.haveUnsavedChanges,
211
+ verseObjectsMap = state.verseObjectsMap,
212
+ verseSelectedForAlignment = state.verseSelectedForAlignment,
213
+ versesAlignmentStatus = state.versesAlignmentStatus,
122
214
  versesForRef = state.versesForRef;
123
215
 
124
216
  var _useUserLocalStorage = useUserLocalStorage(KEY_FONT_SIZE_BASE + cardNum, 100),
@@ -138,34 +230,34 @@ export default function ScriptureCard(_ref) {
138
230
  httpConfig = _objectSpread(_objectSpread({}, httpConfig), {}, {
139
231
  cache: {
140
232
  maxAge: 0
141
- }
233
+ },
234
+ noCache: true
142
235
  }); // disable http caching
143
236
  }
144
237
 
145
238
  var _useScriptureSettings = useScriptureSettings({
146
239
  isNT: isNT,
147
240
  title: title,
148
- verse: verse,
149
241
  owner: owner,
150
- bookId: bookId,
242
+ reference: currentReference || reference,
151
243
  appRef: ref,
152
244
  server: server,
153
245
  cardNum: cardNum,
154
- chapter: chapter,
246
+ disableWordPopover: disableWordPopover,
247
+ greekRepoUrl: greekRepoUrl,
248
+ hebrewRepoUrl: hebrewRepoUrl,
249
+ httpConfig: httpConfig,
155
250
  languageId: languageId,
251
+ originalLanguageOwner: originalLanguageOwner,
252
+ readyForFetch: readyForFetch,
156
253
  resourceId: resourceId,
157
254
  resourceLink: resourceLink,
158
- useUserLocalStorage: useUserLocalStorage,
159
- disableWordPopover: disableWordPopover,
160
- originalLanguageOwner: originalLanguageOwner,
161
255
  setUrlError: function setUrlError(error) {
162
256
  return setState({
163
257
  urlError: error
164
258
  });
165
259
  },
166
- httpConfig: httpConfig,
167
- greekRepoUrl: greekRepoUrl,
168
- hebrewRepoUrl: hebrewRepoUrl,
260
+ useUserLocalStorage: useUserLocalStorage,
169
261
  wholeBook: true
170
262
  }),
171
263
  isNewTestament = _useScriptureSettings.isNewTestament,
@@ -179,14 +271,23 @@ export default function ScriptureCard(_ref) {
179
271
  var repo = "".concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso = scriptureConfig.resource) === null || _scriptureConfig$reso === void 0 ? void 0 : _scriptureConfig$reso.languageId, "_").concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso2 = scriptureConfig.resource) === null || _scriptureConfig$reso2 === void 0 ? void 0 : _scriptureConfig$reso2.projectId);
180
272
  var reference_ = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reference) || null;
181
273
  React.useEffect(function () {
182
- var _fetchResp_$data;
274
+ var _fetchResp_$data, _fetchResp_$data2;
183
275
 
184
276
  // get the _sha from last scripture download
185
277
  var _sha = (fetchResp_ === null || fetchResp_ === void 0 ? void 0 : (_fetchResp_$data = fetchResp_.data) === null || _fetchResp_$data === void 0 ? void 0 : _fetchResp_$data.sha) || null;
186
278
 
187
- console.log("for ".concat(JSON.stringify(reference_), " new sha is ").concat(_sha));
279
+ var url = (fetchResp_ === null || fetchResp_ === void 0 ? void 0 : (_fetchResp_$data2 = fetchResp_.data) === null || _fetchResp_$data2 === void 0 ? void 0 : _fetchResp_$data2.download_url) || null;
280
+ var validBranch = true;
281
+
282
+ if (_sha) {
283
+ // TRICKY: since this fetch may be delayed - make sure it was for the current branch before using the sha
284
+ var parts = (url || '').split('/');
285
+ var fetchBranch = parts.length > 7 ? parts[7] : '';
286
+ validBranch = fetchBranch === ref;
287
+ }
188
288
 
189
- if (_sha !== sha) {
289
+ if (validBranch && _sha !== sha) {
290
+ console.log("ScriptureCard: for ".concat(url, " ").concat(JSON.stringify(reference_), " new sha is ").concat(_sha));
190
291
  setState({
191
292
  sha: _sha
192
293
  });
@@ -196,45 +297,83 @@ export default function ScriptureCard(_ref) {
196
297
  var cardResourceId = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso3 = scriptureConfig.resource) === null || _scriptureConfig$reso3 === void 0 ? void 0 : _scriptureConfig$reso3.projectId) || resourceId; // @ts-ignore
197
298
 
198
299
  var ref_ = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso4 = scriptureConfig.resource) === null || _scriptureConfig$reso4 === void 0 ? void 0 : _scriptureConfig$reso4.ref) || appRef;
199
- var canUseEditBranch = loggedInUser && authentication && resourceId !== ORIGINAL_SOURCE && (ref_ === 'master' || ref_.substring(0, loggedInUser.length) === loggedInUser); // not tag
300
+ var canUseEditBranch = !!(loggedInUser && authentication && resourceId !== ORIGINAL_SOURCE && ( // TRICKY if not original language and we have login data, then we can use the edit branch
301
+ ref_ === 'master' || ref_.includes(loggedInUser))); // also make sure not a version tag
200
302
 
201
303
  var _useUserBranch = useUserBranch({
202
- owner: owner,
203
- server: server,
204
304
  appRef: appRef,
205
- languageId: languageId,
206
- cardId: id,
207
- loggedInUser: canUseEditBranch ? loggedInUser : null,
208
305
  authentication: canUseEditBranch ? authentication : null,
306
+ bookId: bookId,
307
+ cardId: id,
209
308
  cardResourceId: cardResourceId,
309
+ checkForEditBranch: checkForEditBranch,
310
+ languageId: languageId,
311
+ loggedInUser: canUseEditBranch ? loggedInUser : null,
312
+ owner: owner,
210
313
  onResourceError: onResourceError,
314
+ server: server,
211
315
  useUserLocalStorage: useUserLocalStorage
212
316
  }),
213
317
  _useUserBranch$state = _useUserBranch.state,
318
+ branchDetermined = _useUserBranch$state.branchDetermined,
319
+ userEditBranchName = _useUserBranch$state.userEditBranchName,
320
+ _usingUserBranch = _useUserBranch$state.usingUserBranch,
214
321
  workingResourceBranch = _useUserBranch$state.workingResourceBranch,
215
- usingUserBranch_ = _useUserBranch$state.usingUserBranch,
216
322
  startEditBranch = _useUserBranch.actions.startEdit;
217
323
 
218
324
  var workingRef = canUseEditBranch ? workingResourceBranch : appRef;
219
325
  var scriptureTitle;
326
+
327
+ if (!canUseEditBranch && !readyForFetch) {
328
+ // if bible not eligible for user branch, make sure it's ready
329
+ setState({
330
+ readyForFetch: true
331
+ });
332
+ }
333
+
220
334
  React.useEffect(function () {
221
- // select correct working ref - could be master, user branch, or release
222
- if (usingUserBranch_ !== usingUserBranch) {
335
+ console.log("ScriptureCard book changed", {
336
+ bookId: bookId,
337
+ owner: owner,
338
+ languageId: languageId,
339
+ resourceId: resourceId
340
+ });
341
+
342
+ if (canUseEditBranch) {
343
+ // if bible eligible for user branch, refresh it
223
344
  setState({
224
- usingUserBranch: usingUserBranch_
345
+ readyForFetch: false,
346
+ checkForEditBranch: checkForEditBranch + 1
225
347
  });
226
348
  }
227
- }, [usingUserBranch_, usingUserBranch]);
349
+ }, [bookId, owner, languageId, resourceId]);
228
350
  React.useEffect(function () {
229
- // select correct working ref - could be master, user branch, or release
230
- var workingRef_ = workingRef || appRef;
351
+ if (!isEqual(reference, currentReference)) {
352
+ // console.log(`ScriptureCard reference changed`, reference)
353
+ setState({
354
+ currentReference: reference
355
+ });
356
+ }
357
+ }, [reference]);
358
+ React.useEffect(function () {
359
+ // waiting for branch fetch to complete
360
+ console.log("ScriptureCard branchDetermined is ".concat(branchDetermined, " and workingRef is ").concat(workingRef, " and readyForFetch is ").concat(readyForFetch));
231
361
 
232
- if (ref !== workingRef_) {
362
+ if (!readyForFetch && branchDetermined) {
233
363
  setState({
234
- ref: workingRef_
364
+ readyForFetch: true,
365
+ ref: workingRef
235
366
  });
236
367
  }
237
- }, [workingRef, ref, appRef]);
368
+ }, [branchDetermined]);
369
+ React.useEffect(function () {
370
+ // select correct working ref - could be master, user branch, or release
371
+ if (_usingUserBranch !== usingUserBranch) {
372
+ setState({
373
+ usingUserBranch: _usingUserBranch
374
+ });
375
+ }
376
+ }, [_usingUserBranch, usingUserBranch]);
238
377
  React.useEffect(function () {
239
378
  var _scriptureConfig$reso5;
240
379
 
@@ -289,7 +428,7 @@ export default function ScriptureCard(_ref) {
289
428
  });
290
429
  var direction = (language === null || language === void 0 ? void 0 : language.direction) || 'ltr';
291
430
 
292
- var reference = _objectSpread({}, scriptureConfig.reference);
431
+ var _reference = currentReference || reference;
293
432
 
294
433
  var isHebrew = languageId_ === 'hbo';
295
434
  var fontFactor = isHebrew ? 1.4 : 1; // we automatically scale up font size for Hebrew
@@ -331,66 +470,13 @@ export default function ScriptureCard(_ref) {
331
470
  disableWordPopover_ = !usingOriginalBible;
332
471
  }
333
472
 
334
- React.useEffect(function () {
335
- // pre-cache glosses on verse change
336
- var fetchGlossDataForVerse = /*#__PURE__*/function () {
337
- var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
338
- var _verseObjects2;
339
-
340
- var verseObjects, _iterator, _step, _verseRef$verseData, verseRef, _verseObjects;
341
-
342
- return regeneratorRuntime.wrap(function _callee$(_context) {
343
- while (1) {
344
- switch (_context.prev = _context.next) {
345
- case 0:
346
- verseObjects = []; // get verse objects of all the verses
347
-
348
- _iterator = _createForOfIteratorHelper((scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef) || []);
349
-
350
- try {
351
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
352
- verseRef = _step.value;
353
- _verseObjects = verseRef === null || verseRef === void 0 ? void 0 : (_verseRef$verseData = verseRef.verseData) === null || _verseRef$verseData === void 0 ? void 0 : _verseRef$verseData.verseObjects;
354
- verseObjects = verseObjects.concat(_verseObjects);
355
- }
356
- } catch (err) {
357
- _iterator.e(err);
358
- } finally {
359
- _iterator.f();
360
- }
361
-
362
- if (!(!disableWordPopover && (_verseObjects2 = verseObjects) !== null && _verseObjects2 !== void 0 && _verseObjects2.length && fetchGlossesForVerse)) {
363
- _context.next = 6;
364
- break;
365
- }
366
-
367
- _context.next = 6;
368
- return fetchGlossesForVerse(verseObjects, languageId_);
369
-
370
- case 6:
371
- case "end":
372
- return _context.stop();
373
- }
374
- }
375
- }, _callee);
376
- }));
377
-
378
- return function fetchGlossDataForVerse() {
379
- return _ref2.apply(this, arguments);
380
- };
381
- }();
382
-
383
- if (usingOriginalBible) {
384
- fetchGlossDataForVerse();
385
- }
386
- }, [versesForRef, languageId_]);
387
473
  var enableEdit = !usingOriginalBible;
388
474
  var enableAlignment = !usingOriginalBible;
389
475
  var originalRepoUrl = isNewTestament ? greekRepoUrl : hebrewRepoUrl;
390
476
  var scriptureAlignmentEditConfig = {
391
477
  authentication: canUseEditBranch ? authentication : null,
392
478
  bookIndex: bookIndex,
393
- currentVerseRef: reference,
479
+ currentVerseRef: _reference,
394
480
  enableEdit: enableEdit,
395
481
  enableAlignment: enableAlignment,
396
482
  httpConfig: httpConfig,
@@ -468,7 +554,7 @@ export default function ScriptureCard(_ref) {
468
554
  var index = chunks.findIndex(function (chunk, idx) {
469
555
  if (idx > 0) {
470
556
  if (chunk.substring(0, refLen) === ref_) {
471
- var nextChar = chunk[ref_];
557
+ var nextChar = chunk[refLen];
472
558
 
473
559
  if (nextChar > '9' || nextChar < '0') {
474
560
  return true;
@@ -484,6 +570,7 @@ export default function ScriptureCard(_ref) {
484
570
  function getBookName() {
485
571
  var _scriptureConfig$refe;
486
572
 
573
+ // @ts-ignore
487
574
  var bookCaps = scriptureConfig !== null && scriptureConfig !== void 0 && (_scriptureConfig$refe = scriptureConfig.reference) !== null && _scriptureConfig$refe !== void 0 && _scriptureConfig$refe.projectId ? scriptureConfig.reference.projectId.toUpperCase() : '';
488
575
  return "".concat(bookIndex, "-").concat(bookCaps, ".usfm");
489
576
  }
@@ -501,7 +588,9 @@ export default function ScriptureCard(_ref) {
501
588
  }, authentication === null || authentication === void 0 ? void 0 : authentication.config), {}, {
502
589
  token: authentication === null || authentication === void 0 ? void 0 : authentication.token,
503
590
  // @ts-ignore
504
- timeout: ((_httpConfig = httpConfig) === null || _httpConfig === void 0 ? void 0 : _httpConfig.serverTimeOut) || ((_httpConfig2 = httpConfig) === null || _httpConfig2 === void 0 ? void 0 : _httpConfig2.timeout) || 5000
591
+ timeout: ((_httpConfig = httpConfig) === null || _httpConfig === void 0 ? void 0 : _httpConfig.serverTimeOut) || ((_httpConfig2 = httpConfig) === null || _httpConfig2 === void 0 ? void 0 : _httpConfig2.timeout) || 10000,
592
+ server: server,
593
+ dontCreateBranch: true
505
594
  }),
506
595
  author: loggedInUser,
507
596
  token: authentication === null || authentication === void 0 ? void 0 : authentication.token,
@@ -509,61 +598,60 @@ export default function ScriptureCard(_ref) {
509
598
  filepath: filepath,
510
599
  repo: repo
511
600
  }),
601
+ saveError = _useEdit.error,
602
+ isSaveError = _useEdit.isError,
512
603
  onSaveEdit = _useEdit.onSaveEdit;
513
604
 
605
+ React.useEffect(function () {
606
+ // when we get a save saveError
607
+ if (saveError && isSaveError) {
608
+ console.log("save error", saveError);
609
+ onResourceError && onResourceError(null, false, null, "Error saving ".concat(languageId_, "_").concat(resourceId, " ").concat(saveError), true);
610
+ }
611
+ }, [saveError, isSaveError]);
514
612
  React.useEffect(function () {
515
613
  // when startSave goes true, save edits to user branch and then clear startSave
516
614
  var _saveEdit = /*#__PURE__*/function () {
517
- var _ref4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
518
- var branch;
519
- return regeneratorRuntime.wrap(function _callee2$(_context2) {
615
+ var _ref4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
616
+ return regeneratorRuntime.wrap(function _callee$(_context) {
520
617
  while (1) {
521
- switch (_context2.prev = _context2.next) {
618
+ switch (_context.prev = _context.next) {
522
619
  case 0:
523
620
  // begin uploading new USFM
524
- branch = workingResourceBranch !== 'master' ? workingResourceBranch : undefined;
525
-
526
- if (branch) {
527
- _context2.next = 5;
528
- break;
529
- }
530
-
531
- _context2.next = 4;
532
- return startEditBranch();
533
-
534
- case 4:
535
- branch = _context2.sent;
536
-
537
- case 5:
538
- _context2.next = 7;
539
- return onSaveEdit(branch).then(function (success) {
621
+ console.info("saveChangesToCloud() - Using sha: ".concat(sha));
622
+ _context.next = 3;
623
+ return onSaveEdit(userEditBranchName).then(function (success) {
540
624
  // push changed to server
541
625
  if (success) {
542
626
  console.log("saveChangesToCloud() - save scripture edits success");
543
- setState({
544
- startSave: false
545
- });
546
627
  var unsavedCardIndices = Object.keys(unsavedChangesList);
547
628
 
548
629
  if (unsavedCardIndices !== null && unsavedCardIndices !== void 0 && unsavedCardIndices.length) {
549
- var _iterator2 = _createForOfIteratorHelper(unsavedCardIndices),
550
- _step2;
630
+ var _iterator = _createForOfIteratorHelper(unsavedCardIndices),
631
+ _step;
551
632
 
552
633
  try {
553
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
554
- var cardIndex = _step2.value;
634
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
635
+ var cardIndex = _step.value;
555
636
  var clearChanges = unsavedChangesList[cardIndex].clearChanges;
556
637
  clearChanges && clearChanges();
557
638
  }
558
639
  } catch (err) {
559
- _iterator2.e(err);
640
+ _iterator.e(err);
560
641
  } finally {
561
- _iterator2.f();
642
+ _iterator.f();
562
643
  }
563
644
  }
564
645
 
565
646
  console.info('saveChangesToCloud() - Reloading resource');
566
- scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reloadResource();
647
+ setState({
648
+ startSave: false,
649
+ readyForFetch: true,
650
+ ref: userEditBranchName
651
+ });
652
+ delay(500).then(function () {
653
+ scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reloadResource(sha);
654
+ });
567
655
  } else {
568
656
  console.error('saveChangesToCloud() - saving changed scripture failed');
569
657
  setState({
@@ -572,12 +660,12 @@ export default function ScriptureCard(_ref) {
572
660
  }
573
661
  });
574
662
 
575
- case 7:
663
+ case 3:
576
664
  case "end":
577
- return _context2.stop();
665
+ return _context.stop();
578
666
  }
579
667
  }
580
- }, _callee2);
668
+ }, _callee);
581
669
  }));
582
670
 
583
671
  return function _saveEdit() {
@@ -586,169 +674,489 @@ export default function ScriptureCard(_ref) {
586
674
  }();
587
675
 
588
676
  if (startSave) {
589
- console.log("saveChangesToCloud - calling _saveEdit()");
677
+ if (!editBranchReady) {// console.log(`saveChangesToCloud - edit branch not yet created`)
678
+ } else if (!sha) {// console.log(`saveChangesToCloud - save sha not yet ready`)
679
+ } else {
680
+ // console.log(`saveChangesToCloud - calling _saveEdit()`)
681
+ _saveEdit();
682
+ }
683
+ }
684
+ }, [startSave, editBranchReady, sha]);
685
+ /**
686
+ * convert updatedVerseObjects to USFM and merge into the bibleUsfm
687
+ * @param {string} bibleUsfm - USFM of bible
688
+ * @param {object} ref - reference of verse to merge in
689
+ * @param {object[]} updatedVerseObjects - new verse in verseObject format
690
+ * @param {number} cardNum
691
+ */
590
692
 
591
- _saveEdit();
693
+ function mergeVerseObjectsIntoBibleUsfm(bibleUsfm, ref, updatedVerseObjects, cardNum) {
694
+ var newUsfm;
695
+ var chapterChunks = bibleUsfm === null || bibleUsfm === void 0 ? void 0 : bibleUsfm.split('\\c ');
696
+ var chapterIndex = findRefInArray(ref === null || ref === void 0 ? void 0 : ref.chapter, chapterChunks);
697
+
698
+ if (chapterIndex >= 0) {
699
+ var currentChapter = chapterChunks[chapterIndex];
700
+ var verseChunks = currentChapter.split('\\v ');
701
+ var verseIndex = findRefInArray(ref === null || ref === void 0 ? void 0 : ref.verse, verseChunks);
702
+
703
+ if (verseIndex >= 0) {
704
+ var newVerseUsfm = UsfmFileConversionHelpers.convertVerseDataToUSFM(updatedVerseObjects);
705
+ console.log("saveChangesToCloud(".concat(cardNum, ") - new USFM for card:} - ").concat(newVerseUsfm.substring(0, 100)));
706
+ var oldVerse = verseChunks[verseIndex];
707
+ var verseNumLen = ((ref === null || ref === void 0 ? void 0 : ref.verse) + '').length;
708
+ verseChunks[verseIndex] = oldVerse.substring(0, verseNumLen + 1) + newVerseUsfm;
709
+ var newChapter = verseChunks.join('\\v ');
710
+ chapterChunks[chapterIndex] = newChapter;
711
+ newUsfm = chapterChunks.join('\\c ');
712
+ }
592
713
  }
593
- }, [startSave]);
714
+
715
+ return newUsfm;
716
+ }
717
+
594
718
  React.useEffect(function () {
595
- // for each unsaved change, call into versePane to get latest changes for verse to save
596
- if (saveClicked) {
597
- var unsavedCardIndices = Object.keys(unsavedChangesList);
598
-
599
- if (unsavedCardIndices !== null && unsavedCardIndices !== void 0 && unsavedCardIndices.length) {
600
- var originalUsfm = core.getResponseData(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.fetchResponse);
601
- var updatedBibleUsfm = originalUsfm;
602
-
603
- var _iterator3 = _createForOfIteratorHelper(unsavedCardIndices),
604
- _step3;
605
-
606
- try {
607
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
608
- var cardIndex = _step3.value;
609
-
610
- var _cardNum = parseInt(cardIndex);
611
-
612
- var _unsavedChangesList$_ = unsavedChangesList[_cardNum],
613
- getChanges = _unsavedChangesList$_.getChanges,
614
- _state = _unsavedChangesList$_.state;
615
-
616
- if (getChanges) {
617
- var newUsfm = void 0;
618
-
619
- var _getChanges = getChanges(_state),
620
- newVerseText = _getChanges.newVerseText,
621
- _ref5 = _getChanges.ref,
622
- updatedVerseObjects = _getChanges.updatedVerseObjects;
623
-
624
- if (updatedVerseObjects && updatedBibleUsfm) {
625
- var _updatedBibleUsfm;
626
-
627
- // just replace verse
628
- var chapterChunks = (_updatedBibleUsfm = updatedBibleUsfm) === null || _updatedBibleUsfm === void 0 ? void 0 : _updatedBibleUsfm.split('\\c ');
629
- var chapterIndex = findRefInArray(_ref5 === null || _ref5 === void 0 ? void 0 : _ref5.chapter, chapterChunks);
630
-
631
- if (chapterIndex >= 0) {
632
- var currentChapter = chapterChunks[chapterIndex];
633
- var verseChunks = currentChapter.split('\\v ');
634
- var verseIndex = findRefInArray(_ref5 === null || _ref5 === void 0 ? void 0 : _ref5.verse, verseChunks);
635
-
636
- if (verseIndex >= 0) {
637
- var newVerseUsfm = UsfmFileConversionHelpers.convertVerseDataToUSFM(updatedVerseObjects);
638
- var oldVerse = verseChunks[verseIndex];
639
- var verseNumLen = ((_ref5 === null || _ref5 === void 0 ? void 0 : _ref5.verse) + '').length;
640
- verseChunks[verseIndex] = oldVerse.substring(0, verseNumLen + 1) + newVerseUsfm;
641
- var newChapter = verseChunks.join('\\v ');
642
- chapterChunks[chapterIndex] = newChapter;
643
- newUsfm = chapterChunks.join('\\c ');
719
+ // for each unsaved change, call into scripturePane to get latest changes for verse to save
720
+ function getReadyForSave() {
721
+ return _getReadyForSave.apply(this, arguments);
722
+ }
723
+
724
+ function _getReadyForSave() {
725
+ _getReadyForSave = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
726
+ var createEditBranch, branch, unsavedCardIndices, bibleUsfm, mergeFail, _cardNum, _iterator2, _step2, _cardIndex, _unsavedChangesList$_2, _getChanges2, _state2, _newUsfm, _getChanges3, _ref6, _updatedVerseObjects, newBookJson, _iterator3, _step3, cardIndex, _cardNum2, _unsavedChangesList$_, getChanges, _state, newUsfm, _getChanges, newVerseText, _ref5, updatedVerseObjects, targetVerseObjects_, _AlignmentHelpers$upd, targetVerseObjects;
727
+
728
+ return regeneratorRuntime.wrap(function _callee2$(_context2) {
729
+ while (1) {
730
+ switch (_context2.prev = _context2.next) {
731
+ case 0:
732
+ if (!saveClicked) {
733
+ _context2.next = 53;
734
+ break;
735
+ }
736
+
737
+ createEditBranch = !_usingUserBranch;
738
+
739
+ if (!createEditBranch) {
740
+ // if already using the user branch
741
+ if (workingResourceBranch !== userEditBranchName) {
742
+ console.warn("saveChangesToCloud - state conflict - should be in user branch ".concat(userEditBranchName, ", but actually using ").concat(workingResourceBranch));
743
+ createEditBranch = true;
744
+ } else {
745
+ console.log("saveChangesToCloud - already using edit branch: ".concat(workingResourceBranch));
746
+ setState({
747
+ editBranchReady: true
748
+ });
644
749
  }
645
750
  }
646
- }
647
751
 
648
- if (updatedVerseObjects && !newUsfm) {
649
- var targetVerseObjects_ = null;
752
+ if (!createEditBranch) {
753
+ _context2.next = 17;
754
+ break;
755
+ }
650
756
 
651
- if (_ref5) {
652
- if (newVerseText) {
653
- var _AlignmentHelpers$upd = AlignmentHelpers.updateAlignmentsToTargetVerse(updatedVerseObjects, newVerseText),
654
- targetVerseObjects = _AlignmentHelpers$upd.targetVerseObjects;
757
+ // if not yet using the user branch, create it
758
+ console.log("saveChangesToCloud - creating edit branch");
759
+ setState({
760
+ editBranchReady: false,
761
+ readyForFetch: false,
762
+ sha: null
763
+ }); // we will need a new sha for book/branch
655
764
 
656
- targetVerseObjects_ = targetVerseObjects;
657
- } else {
658
- targetVerseObjects_ = updatedVerseObjects;
765
+ _context2.next = 8;
766
+ return startEditBranch();
767
+
768
+ case 8:
769
+ branch = _context2.sent;
770
+
771
+ if (!branch) {
772
+ _context2.next = 14;
773
+ break;
774
+ }
775
+
776
+ console.log("saveChangesToCloud - edit branch created");
777
+ setState({
778
+ editBranchReady: true,
779
+ readyForFetch: true,
780
+ ref: branch
781
+ });
782
+ _context2.next = 17;
783
+ break;
784
+
785
+ case 14:
786
+ console.error('saveChangesToCloud() - error creating edit branch');
787
+ onResourceError && onResourceError(null, false, null, "Error creating edit branch ".concat(languageId_, "_").concat(resourceId), true);
788
+ return _context2.abrupt("return");
789
+
790
+ case 17:
791
+ console.log("saveChangesToCloud - getting verse changes");
792
+ unsavedCardIndices = Object.keys(unsavedChangesList);
793
+
794
+ if (!(unsavedCardIndices !== null && unsavedCardIndices !== void 0 && unsavedCardIndices.length)) {
795
+ _context2.next = 53;
796
+ break;
797
+ }
798
+
799
+ bibleUsfm = core.getResponseData(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.fetchResponse);
800
+ mergeFail = false;
801
+ _cardNum = 0;
802
+ _iterator2 = _createForOfIteratorHelper(unsavedCardIndices);
803
+ _context2.prev = 24;
804
+
805
+ _iterator2.s();
806
+
807
+ case 26:
808
+ if ((_step2 = _iterator2.n()).done) {
809
+ _context2.next = 42;
810
+ break;
811
+ }
812
+
813
+ _cardIndex = _step2.value;
814
+ _cardNum = parseInt(_cardIndex);
815
+ _unsavedChangesList$_2 = unsavedChangesList[_cardNum], _getChanges2 = _unsavedChangesList$_2.getChanges, _state2 = _unsavedChangesList$_2.state;
816
+
817
+ if (!_getChanges2) {
818
+ _context2.next = 40;
819
+ break;
820
+ }
821
+
822
+ _newUsfm = void 0;
823
+ _getChanges3 = _getChanges2(_state2), _ref6 = _getChanges3.ref, _updatedVerseObjects = _getChanges3.updatedVerseObjects;
824
+
825
+ if (_updatedVerseObjects && bibleUsfm) {
826
+ // just replace verse
827
+ _newUsfm = mergeVerseObjectsIntoBibleUsfm(bibleUsfm, _ref6, _updatedVerseObjects, _cardNum);
828
+ }
829
+
830
+ if (!_newUsfm) {
831
+ _context2.next = 38;
832
+ break;
833
+ }
834
+
835
+ bibleUsfm = _newUsfm;
836
+ _context2.next = 40;
837
+ break;
838
+
839
+ case 38:
840
+ mergeFail = true;
841
+ return _context2.abrupt("break", 42);
842
+
843
+ case 40:
844
+ _context2.next = 26;
845
+ break;
846
+
847
+ case 42:
848
+ _context2.next = 47;
849
+ break;
850
+
851
+ case 44:
852
+ _context2.prev = 44;
853
+ _context2.t0 = _context2["catch"](24);
854
+
855
+ _iterator2.e(_context2.t0);
856
+
857
+ case 47:
858
+ _context2.prev = 47;
859
+
860
+ _iterator2.f();
861
+
862
+ return _context2.finish(47);
863
+
864
+ case 50:
865
+ if (mergeFail) {
866
+ // if we failed to merge, fallback to brute force verse objects to USFM
867
+ console.log("saveChangesToCloud(".concat(_cardNum, ") - verse not found, falling back to inserting verse object"));
868
+ _iterator3 = _createForOfIteratorHelper(unsavedCardIndices);
869
+
870
+ try {
871
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
872
+ cardIndex = _step3.value;
873
+ _cardNum2 = parseInt(cardIndex);
874
+ _unsavedChangesList$_ = unsavedChangesList[_cardNum2], getChanges = _unsavedChangesList$_.getChanges, _state = _unsavedChangesList$_.state;
875
+
876
+ if (getChanges) {
877
+ newUsfm = void 0;
878
+ _getChanges = getChanges(_state), newVerseText = _getChanges.newVerseText, _ref5 = _getChanges.ref, updatedVerseObjects = _getChanges.updatedVerseObjects;
879
+
880
+ if (updatedVerseObjects && !newUsfm) {
881
+ targetVerseObjects_ = null;
882
+
883
+ if (_ref5) {
884
+ if (newVerseText) {
885
+ _AlignmentHelpers$upd = AlignmentHelpers.updateAlignmentsToTargetVerse(updatedVerseObjects, newVerseText), targetVerseObjects = _AlignmentHelpers$upd.targetVerseObjects;
886
+ targetVerseObjects_ = targetVerseObjects;
887
+ } else {
888
+ targetVerseObjects_ = updatedVerseObjects;
889
+ }
890
+
891
+ newBookJson = targetVerseObjects_ && (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.updateVerse(_ref5.chapter, _ref5.verse, {
892
+ verseObjects: targetVerseObjects_
893
+ }));
894
+ }
895
+ }
896
+ }
897
+ }
898
+ } catch (err) {
899
+ _iterator3.e(err);
900
+ } finally {
901
+ _iterator3.f();
659
902
  }
903
+
904
+ bibleUsfm = usfmjs.toUSFM(newBookJson, {
905
+ forcedNewLines: true
906
+ });
660
907
  }
661
908
 
662
- var newBookJson = targetVerseObjects_ && (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.updateVerse(_ref5.chapter, _ref5.verse, {
663
- verseObjects: targetVerseObjects_
664
- }));
665
- updatedBibleUsfm = usfmjs.toUSFM(newBookJson, {
666
- forcedNewLines: true
909
+ console.log("saveChangesToCloud() - saving new USFM: ".concat(bibleUsfm.substring(0, 100), "..."));
910
+ setState({
911
+ saveContent: bibleUsfm,
912
+ startSave: true,
913
+ saveClicked: false
667
914
  });
668
- }
669
915
 
670
- if (newUsfm) {
671
- updatedBibleUsfm = newUsfm;
916
+ case 53:
917
+ case "end":
918
+ return _context2.stop();
919
+ }
920
+ }
921
+ }, _callee2, null, [[24, 44, 47, 50]]);
922
+ }));
923
+ return _getReadyForSave.apply(this, arguments);
924
+ }
925
+
926
+ getReadyForSave();
927
+ }, [saveClicked]); // @ts-ignore
928
+
929
+ var _ref7 = _reference || {},
930
+ chapter = _ref7.chapter;
931
+
932
+ React.useEffect(function () {
933
+ var _versesForRef = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef;
934
+
935
+ var newSelections = new Map();
936
+ var updateSelections = false;
937
+ var _map = newSelections;
938
+ var originalBookId = originalScriptureBookObjects === null || originalScriptureBookObjects === void 0 ? void 0 : originalScriptureBookObjects.bookId;
939
+ var bookVerseObject = originalScriptureBookObjects === null || originalScriptureBookObjects === void 0 ? void 0 : originalScriptureBookObjects.chapters;
940
+ var newSelectedQuote = null; // if we have everything we need to calculate selections
941
+
942
+ if (_versesForRef !== null && _versesForRef !== void 0 && _versesForRef.length && bookVerseObject && bookId === originalBookId && bookVerseObject[chapter] && // we need to have data for chapter
943
+ selectedQuote !== null && selectedQuote !== void 0 && selectedQuote.quote) {
944
+ // if quote is different than last
945
+ if (!isEqual(lastSelectedQuote, selectedQuote) || !isEqual(versesForRef, _versesForRef)) {
946
+ var _selectedQuote$refere3;
947
+
948
+ var originalVerses = {};
949
+ var substitute = {}; // keep track of verse substitutions
950
+
951
+ var startVerse = _versesForRef[0].verse;
952
+
953
+ if (typeof startVerse === 'string') {
954
+ startVerse = parseInt(startVerse);
955
+ }
956
+
957
+ var lastVerse = startVerse;
958
+
959
+ for (var i = 0, l = _versesForRef.length; i < l; i++) {
960
+ var verseRef = _versesForRef[i];
961
+ var _chapter2 = verseRef.chapter,
962
+ verse = verseRef.verse; // TRICKY - we remap verses in reference range to a linear series of verses so verse spans don't choke getQuoteMatchesInBookRef
963
+
964
+ var _verse = startVerse + i;
965
+
966
+ lastVerse = _verse;
967
+ substitute["".concat(_chapter2, ":").concat(_verse)] = "".concat(_chapter2, ":").concat(verse);
968
+
969
+ if (!originalVerses[_chapter2]) {
970
+ originalVerses[_chapter2] = {};
971
+ }
972
+
973
+ var verseObjects = [];
974
+
975
+ if (typeof verse === 'string' && verse.includes('-')) {
976
+ var verses = getVerses(bookVerseObject, "".concat(_chapter2, ":").concat(verse));
977
+
978
+ var _iterator4 = _createForOfIteratorHelper(verses),
979
+ _step4;
980
+
981
+ try {
982
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
983
+ var verseItem = _step4.value;
984
+ var vo = verseItem.verseData.verseObjects;
985
+ verseObjects = verseObjects.concat(vo);
672
986
  }
987
+ } catch (err) {
988
+ _iterator4.e(err);
989
+ } finally {
990
+ _iterator4.f();
673
991
  }
992
+ } else {
993
+ var _bookVerseObject$_cha;
994
+
995
+ verseObjects = (_bookVerseObject$_cha = bookVerseObject[_chapter2][verse]) === null || _bookVerseObject$_cha === void 0 ? void 0 : _bookVerseObject$_cha.verseObjects;
674
996
  }
675
- } catch (err) {
676
- _iterator3.e(err);
677
- } finally {
678
- _iterator3.f();
997
+
998
+ if (verseObjects) {
999
+ verseObjects = cleanupVerseObjects(verseObjects);
1000
+ originalVerses[_chapter2][_verse] = {
1001
+ verseObjects: verseObjects
1002
+ };
1003
+
1004
+ _map.set("".concat(_chapter2, ":").concat(verse), verseObjects);
1005
+ }
1006
+ } // create new reference range for new linear verse range
1007
+
1008
+
1009
+ var _selectedQuote$refere = selectedQuote === null || selectedQuote === void 0 ? void 0 : (_selectedQuote$refere3 = selectedQuote.reference) === null || _selectedQuote$refere3 === void 0 ? void 0 : _selectedQuote$refere3.split(':'),
1010
+ _selectedQuote$refere2 = _slicedToArray(_selectedQuote$refere, 1),
1011
+ _chapter = _selectedQuote$refere2[0];
1012
+
1013
+ var subRef = "".concat(_chapter, ":").concat(startVerse);
1014
+
1015
+ if (lastVerse != startVerse) {
1016
+ subRef += "-".concat(lastVerse);
679
1017
  }
680
1018
 
681
- console.log("saveChangesToCloud() - saving new USFM: ".concat(updatedBibleUsfm.substring(0, 100), "..."));
682
- setState({
683
- saveContent: updatedBibleUsfm,
684
- startSave: true,
685
- saveClicked: false
1019
+ var quoteMatches = getQuoteMatchesInBookRef({
1020
+ bookObject: originalVerses,
1021
+ ref: subRef,
1022
+ quote: selectedQuote === null || selectedQuote === void 0 ? void 0 : selectedQuote.quote,
1023
+ occurrence: selectedQuote === null || selectedQuote === void 0 ? void 0 : selectedQuote.occurrence
686
1024
  });
1025
+
1026
+ var _selections = new Map();
1027
+
1028
+ if (quoteMatches !== null && quoteMatches !== void 0 && quoteMatches.size) {
1029
+ quoteMatches.forEach(function (words, key) {
1030
+ var _key = substitute[key];
1031
+
1032
+ _selections.set(_key, words.map(function (word) {
1033
+ return _objectSpread(_objectSpread({}, word), {}, {
1034
+ text: core.normalizeString(word.text)
1035
+ });
1036
+ }));
1037
+ });
1038
+ }
1039
+
1040
+ newSelections = _selections;
1041
+ newSelectedQuote = selectedQuote;
1042
+ updateSelections = true;
687
1043
  }
688
1044
  }
689
- }, [saveClicked]);
1045
+
1046
+ var newState = {}; // update states that have changed
1047
+
1048
+ if (!areMapsTheSame(verseObjectsMap, _map)) {
1049
+ newState.verseObjectsMap = _map;
1050
+ }
1051
+
1052
+ var booksNotSame = (reference === null || reference === void 0 ? void 0 : reference.projectId) !== (currentReference === null || currentReference === void 0 ? void 0 : currentReference.projectId);
1053
+
1054
+ if (booksNotSame || !areVersesSame(versesForRef, _versesForRef)) {
1055
+ newState.versesForRef = _versesForRef;
1056
+ newState.lastSelectedQuote = newSelectedQuote;
1057
+ newState.selections = newSelections;
1058
+ }
1059
+
1060
+ if (newSelectedQuote) {
1061
+ newState.lastSelectedQuote = newSelectedQuote;
1062
+ }
1063
+
1064
+ if (updateSelections) {
1065
+ if (!areMapsTheSame(selections || new Map(), newSelections)) {
1066
+ newState.selections = newSelections;
1067
+ }
1068
+ }
1069
+
1070
+ if (Object.keys(newState).length) {
1071
+ setState(newState);
1072
+ }
1073
+ }, [owner, resourceId, bookId, languageId_, scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef, originalScriptureBookObjects, selectedQuote]);
690
1074
  React.useEffect(function () {
691
- if (!isEqual(versesForRef, scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef)) {
692
- var _versesForRef = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef;
1075
+ // clear settings on verse change
1076
+ setState({
1077
+ versesAlignmentStatus: null,
1078
+ unsavedChangesList: {},
1079
+ haveUnsavedChanges: false
1080
+ });
1081
+ }, [_reference]);
693
1082
 
694
- setState({
695
- versesForRef: _versesForRef
1083
+ var updateVersesAlignmentStatus = function updateVersesAlignmentStatus(reference, aligned) {
1084
+ setState_(function (prevState) {
1085
+ return _objectSpread(_objectSpread({}, prevState), {}, {
1086
+ versesAlignmentStatus: _objectSpread(_objectSpread({}, prevState.versesAlignmentStatus), {}, _defineProperty({}, "".concat(reference.chapter, ":").concat(reference.verse), aligned))
696
1087
  });
1088
+ });
1089
+ };
697
1090
 
698
- var _iterator4 = _createForOfIteratorHelper(_versesForRef || []),
699
- _step4;
1091
+ var _versesForRef = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef;
700
1092
 
701
- try {
702
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
703
- var verseRef = _step4.value;
704
- // check for verse range
705
- var _verse = verseRef.verse;
1093
+ React.useEffect(function () {
1094
+ var _versesForRef2;
706
1095
 
707
- if (addVerseRange && typeof _verse === 'string') {
708
- // @ts-ignore
709
- if (_verse.includes('-')) {
710
- var _scriptureConfig$refe2;
1096
+ if ((_versesForRef2 = _versesForRef) !== null && _versesForRef2 !== void 0 && _versesForRef2.length) {
1097
+ var _ref8 = scriptureConfig || {},
1098
+ _reference2 = _ref8.reference,
1099
+ _resourceLink2 = _ref8.resourceLink;
711
1100
 
712
- addVerseRange("".concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$refe2 = scriptureConfig.reference) === null || _scriptureConfig$refe2 === void 0 ? void 0 : _scriptureConfig$refe2.chapter, ":").concat(_verse));
713
- }
714
- }
715
- }
716
- } catch (err) {
717
- _iterator4.e(err);
718
- } finally {
719
- _iterator4.f();
720
- }
1101
+ console.log("ScriptureCard._versesForRef changed", {
1102
+ reference: _reference2,
1103
+ resourceLink: _resourceLink2
1104
+ });
721
1105
  }
722
- }, [scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.versesForRef]);
723
- var renderedScripturePanes = versesForRef === null || versesForRef === void 0 ? void 0 : versesForRef.map(function (_currentVerseData, index) {
1106
+ }, [_versesForRef]);
1107
+
1108
+ if (!((_versesForRef3 = _versesForRef) !== null && _versesForRef3 !== void 0 && _versesForRef3.length)) {
1109
+ // if empty of references, create single empty reference
1110
+ _versesForRef = [_objectSpread({}, reference)];
1111
+ }
1112
+
1113
+ var renderedScripturePanes = (_versesForRef4 = _versesForRef) === null || _versesForRef4 === void 0 ? void 0 : _versesForRef4.map(function (_currentVerseData, index) {
724
1114
  var _currentVerseData$ver;
725
1115
 
726
- var initialVerseObjects = (_currentVerseData === null || _currentVerseData === void 0 ? void 0 : (_currentVerseData$ver = _currentVerseData.verseData) === null || _currentVerseData$ver === void 0 ? void 0 : _currentVerseData$ver.verseObjects) || null; // @ts-ignore
1116
+ var initialVerseObjects = (_currentVerseData === null || _currentVerseData === void 0 ? void 0 : (_currentVerseData$ver = _currentVerseData.verseData) === null || _currentVerseData$ver === void 0 ? void 0 : _currentVerseData$ver.verseObjects) || []; // @ts-ignore
727
1117
 
728
- var _ref6 = _currentVerseData || {},
729
- chapter = _ref6.chapter,
730
- verse = _ref6.verse;
1118
+ var _ref9 = _currentVerseData || {},
1119
+ chapter = _ref9.chapter,
1120
+ verse = _ref9.verse;
731
1121
 
732
- var _reference = _objectSpread(_objectSpread({}, reference), {}, {
1122
+ var projectId = (currentReference === null || currentReference === void 0 ? void 0 : currentReference.projectId) || (reference === null || reference === void 0 ? void 0 : reference.projectId);
1123
+
1124
+ var _reference = _objectSpread(_objectSpread({}, _versesForRef), {}, {
733
1125
  chapter: chapter,
734
- verse: verse
1126
+ verse: verse,
1127
+ projectId: projectId
735
1128
  });
736
1129
 
737
1130
  var _scriptureAlignmentEditConfig = _objectSpread(_objectSpread({}, scriptureAlignmentEditConfig), {}, {
738
1131
  currentIndex: index,
739
1132
  initialVerseObjects: initialVerseObjects,
740
- reference: _reference
1133
+ reference: _reference,
1134
+ isNewTestament: isNewTestament
741
1135
  });
742
1136
 
1137
+ var isVerseSelectedForAlignment = false;
1138
+
1139
+ if (verseSelectedForAlignment) {
1140
+ isVerseSelectedForAlignment = verseSelectedForAlignment.chapter == chapter && verseSelectedForAlignment.verse == verse;
1141
+ }
1142
+
743
1143
  return /*#__PURE__*/React.createElement(ScripturePane, _extends({}, scriptureConfig, {
744
1144
  contentStyle: contentStyle,
745
1145
  currentIndex: index,
1146
+ determiningBranch: !readyForFetch,
746
1147
  direction: direction,
747
1148
  disableWordPopover: disableWordPopover_,
748
1149
  fontSize: fontSize,
749
1150
  getLexiconData: getLexiconData,
750
1151
  isNT: isNT_,
1152
+ isVerseSelectedForAlignment: isVerseSelectedForAlignment,
751
1153
  key: index,
1154
+ onAlignmentFinish: function onAlignmentFinish() {
1155
+ return setState({
1156
+ verseSelectedForAlignment: null
1157
+ });
1158
+ },
1159
+ originalScriptureBookObjects: originalScriptureBookObjects,
752
1160
  refStyle: refStyle,
753
1161
  reference: _reference,
754
1162
  saving: startSave // @ts-ignore
@@ -756,10 +1164,77 @@ export default function ScriptureCard(_ref) {
756
1164
  scriptureAlignmentEditConfig: _scriptureAlignmentEditConfig,
757
1165
  setWordAlignerStatus: setWordAlignerStatus,
758
1166
  server: server,
759
- translate: translate
1167
+ translate: translate,
1168
+ updateVersesAlignmentStatus: updateVersesAlignmentStatus
760
1169
  }));
761
1170
  });
762
- return /*#__PURE__*/React.createElement(Card, {
1171
+
1172
+ var handleAlignButtonClick = function handleAlignButtonClick() {
1173
+ if ((versesForRef === null || versesForRef === void 0 ? void 0 : versesForRef.length) > 1) {
1174
+ setState({
1175
+ showAlignmentPopup: true
1176
+ });
1177
+ } else if ((versesForRef === null || versesForRef === void 0 ? void 0 : versesForRef.length) === 1) {
1178
+ setState({
1179
+ verseSelectedForAlignment: versesForRef[0]
1180
+ });
1181
+ }
1182
+ };
1183
+
1184
+ var onRenderToolbar = function onRenderToolbar(_ref10) {
1185
+ var items = _ref10.items;
1186
+
1187
+ var newItems = _toConsumableArray(items);
1188
+
1189
+ var allVersesAligned = false; // Check if all values in versesAlignmentStatus are true
1190
+
1191
+ if (versesAlignmentStatus) {
1192
+ allVersesAligned = Object.values(versesAlignmentStatus).every(function (alignStatus) {
1193
+ return alignStatus === true;
1194
+ });
1195
+ }
1196
+
1197
+ var alignIcon = null;
1198
+ var alignButtonText = '';
1199
+
1200
+ if (allVersesAligned) {
1201
+ alignIcon = /*#__PURE__*/React.createElement(RxLink2, {
1202
+ id: "valid_icon_".concat(resourceId),
1203
+ color: "#BBB"
1204
+ });
1205
+ alignButtonText = 'Alignment is Valid';
1206
+ } else {
1207
+ alignIcon = /*#__PURE__*/React.createElement(RxLinkBreak2, {
1208
+ id: "invalid_alignment_icon_".concat(resourceId),
1209
+ color: "#000"
1210
+ });
1211
+ alignButtonText = 'Alignment is Invalid';
1212
+ }
1213
+
1214
+ if (setWordAlignerStatus && resourceId !== 'ORIGINAL_SOURCE') {
1215
+ newItems.push( /*#__PURE__*/React.createElement(IconButton, {
1216
+ id: "alignment_icon_".concat(resourceId),
1217
+ key: "checking-button",
1218
+ onClick: handleAlignButtonClick,
1219
+ title: alignButtonText,
1220
+ "aria-label": alignButtonText,
1221
+ style: {
1222
+ cursor: 'pointer'
1223
+ }
1224
+ }, alignIcon));
1225
+ }
1226
+
1227
+ return newItems;
1228
+ };
1229
+
1230
+ return /*#__PURE__*/React.createElement(SelectionsContextProvider, {
1231
+ selections: selections,
1232
+ onSelections: function onSelections(newSelections) {// console.log('onSelections', newSelections)
1233
+ },
1234
+ quote: selectedQuote === null || selectedQuote === void 0 ? void 0 : selectedQuote.quote,
1235
+ occurrence: fixOccurrence(selectedQuote === null || selectedQuote === void 0 ? void 0 : selectedQuote.occurrence),
1236
+ verseObjectsMap: verseObjectsMap
1237
+ }, /*#__PURE__*/React.createElement(Card, {
763
1238
  id: "scripture_card_".concat(cardNum),
764
1239
  title: scriptureLabel,
765
1240
  settingsTitle: scriptureTitle + ' Settings',
@@ -786,69 +1261,73 @@ export default function ScriptureCard(_ref) {
786
1261
  return setState({
787
1262
  saveClicked: true
788
1263
  });
789
- }
1264
+ },
1265
+ onRenderToolbar: onRenderToolbar
790
1266
  }, /*#__PURE__*/React.createElement("div", {
791
1267
  id: "scripture-pane-list"
792
- }, renderedScripturePanes));
1268
+ }, renderedScripturePanes)), /*#__PURE__*/React.createElement(VerseSelectorPopup, {
1269
+ resourceId: resourceId,
1270
+ open: showAlignmentPopup,
1271
+ onClose: function onClose() {
1272
+ return setState({
1273
+ showAlignmentPopup: false
1274
+ });
1275
+ },
1276
+ versesForRef: versesForRef,
1277
+ versesAlignmentStatus: versesAlignmentStatus,
1278
+ onVerseSelect: function onVerseSelect(verse) {
1279
+ return setState({
1280
+ verseSelectedForAlignment: verse,
1281
+ showAlignmentPopup: false
1282
+ });
1283
+ }
1284
+ }));
793
1285
  }
794
1286
  ScriptureCard.propTypes = {
795
- /** html identifier to use for card */
796
- id: PropTypes.string,
797
-
798
- /** method to determine if NT or OT */
799
- isNT: PropTypes.func.isRequired,
1287
+ /** repo branch or tag such as master */
1288
+ appRef: PropTypes.string.isRequired,
800
1289
 
801
- /** title for scripture card */
802
- title: PropTypes.string.isRequired,
1290
+ /** authentication info */
1291
+ authentication: PropTypes.object,
803
1292
 
804
- /** get language details */
805
- getLanguage: PropTypes.func.isRequired,
1293
+ /** index for current book (e.g. '01' for 'gen')*/
1294
+ bookIndex: PropTypes.string,
806
1295
 
807
1296
  /** scripture card number (0 to 2 for example) */
808
1297
  cardNum: PropTypes.number.isRequired,
809
1298
 
810
- /** resource object */
811
- resource: PropTypes.shape({
812
- /** resource language to use */
813
- languageId: PropTypes.string.isRequired,
814
-
815
- /** repo owner such as unfoldingWord */
816
- owner: PropTypes.string.isRequired,
1299
+ /** CSS classes */
1300
+ classes: PropTypes.object,
817
1301
 
818
- /** resourceId to use (e.g. ugnt) */
819
- resourceId: PropTypes.string.isRequired,
1302
+ /** if true then word data hover is shown */
1303
+ disableWordPopover: PropTypes.bool,
820
1304
 
821
- /** repo owner for original languages such as unfoldingWord */
822
- originalLanguageOwner: PropTypes.string.isRequired
823
- }),
824
- reference: PropTypes.shape({
825
- /** projectId (bookID) to use */
826
- projectId: PropTypes.string.isRequired,
1305
+ /** get language details */
1306
+ getLanguage: PropTypes.func.isRequired,
827
1307
 
828
- /** current chapter number */
829
- chapter: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
1308
+ /** function to get latest lexicon data */
1309
+ getLexiconData: PropTypes.func,
830
1310
 
831
- /** current verse number */
832
- verse: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired
833
- }),
1311
+ /** optional url for greek repo */
1312
+ greekRepoUrl: PropTypes.string,
834
1313
 
835
- /** server (e.g. 'https://git.door43.org') */
836
- server: PropTypes.string.isRequired,
1314
+ /** optional url for hebrew repo */
1315
+ hebrewRepoUrl: PropTypes.string,
837
1316
 
838
- /** repo branch or tag such as master */
839
- appRef: PropTypes.string.isRequired,
1317
+ /** optional http timeout in milliseconds for fetching resources, default is 0 (very long wait) */
1318
+ httpConfig: PropTypes.object,
840
1319
 
841
- /** if true then word data hover is shown */
842
- disableWordPopover: PropTypes.bool,
1320
+ /** html identifier to use for card */
1321
+ id: PropTypes.string,
843
1322
 
844
- /** CSS classes */
845
- classes: PropTypes.object,
1323
+ /** method to determine if NT or OT */
1324
+ isNT: PropTypes.func.isRequired,
846
1325
 
847
- /** resourceLink */
848
- resourceLink: PropTypes.any,
1326
+ /** user-name */
1327
+ loggedInUser: PropTypes.string,
849
1328
 
850
- /** use method for using local storage specific for user */
851
- useUserLocalStorage: PropTypes.func.isRequired,
1329
+ /** function to minimize the card (optional) */
1330
+ onMinimize: PropTypes.func,
852
1331
 
853
1332
  /** optional callback if error loading resource, parameter returned are:
854
1333
  * ({string} errorMessage, {boolean} isAccessError, {object} resourceStatus)
@@ -856,43 +1335,56 @@ ScriptureCard.propTypes = {
856
1335
  * - resourceStatus - is object containing details about problems fetching resource */
857
1336
  onResourceError: PropTypes.func,
858
1337
 
859
- /** optional http timeout in milliseconds for fetching resources, default is 0 (very long wait) */
860
- httpConfig: PropTypes.object,
1338
+ /** the original scripture bookObjects for current book */
1339
+ originalScriptureBookObjects: PropTypes.object,
1340
+ reference: PropTypes.shape({
1341
+ /** projectId (bookID) to use */
1342
+ projectId: PropTypes.string.isRequired,
861
1343
 
862
- /** optional url for greek repo */
863
- greekRepoUrl: PropTypes.string,
1344
+ /** current chapter number */
1345
+ chapter: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
864
1346
 
865
- /** optional url for hebrew repo */
866
- hebrewRepoUrl: PropTypes.string,
1347
+ /** current verse number */
1348
+ verse: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired
1349
+ }),
867
1350
 
868
- /** function to get latest lexicon data */
869
- getLexiconData: PropTypes.func,
1351
+ /** resource object */
1352
+ resource: PropTypes.shape({
1353
+ /** resource language to use */
1354
+ languageId: PropTypes.string.isRequired,
870
1355
 
871
- /** function to pre-load lexicon data for verse */
872
- fetchGlossesForVerse: PropTypes.func,
1356
+ /** repo owner such as unfoldingWord */
1357
+ owner: PropTypes.string.isRequired,
873
1358
 
874
- /** optional function for localization */
875
- translate: PropTypes.func,
1359
+ /** resourceId to use (e.g. ugnt) */
1360
+ resourceId: PropTypes.string.isRequired,
876
1361
 
877
- /** function to minimize the card (optional) */
878
- onMinimize: PropTypes.func,
1362
+ /** repo owner for original languages such as unfoldingWord */
1363
+ originalLanguageOwner: PropTypes.string.isRequired
1364
+ }),
879
1365
 
880
- /** user-name */
881
- loggedInUser: PropTypes.string,
1366
+ /** resourceLink */
1367
+ resourceLink: PropTypes.any,
882
1368
 
883
- /** authentication info */
884
- authentication: PropTypes.object,
1369
+ /**This is currently selected quote */
1370
+ selectedQuote: PropTypes.object,
1371
+
1372
+ /** server (e.g. 'https://git.door43.org') */
1373
+ server: PropTypes.string.isRequired,
885
1374
 
886
1375
  /** function to set state in app that there are unsaved changes */
887
1376
  setSavedChanges: PropTypes.func,
888
1377
 
889
- /** index for current book (e.g. '01' for 'gen')*/
890
- bookIndex: PropTypes.string,
1378
+ /** callback to update word aligner state */
1379
+ setWordAlignerStatus: PropTypes.func,
891
1380
 
892
- /** callback to indicate that we are using a verse range here */
893
- addVerseRange: PropTypes.func,
1381
+ /** title for scripture card */
1382
+ title: PropTypes.string.isRequired,
894
1383
 
895
- /** callback to update word aligner state */
896
- setWordAlignerStatus: PropTypes.func
1384
+ /** optional function for localization */
1385
+ translate: PropTypes.func,
1386
+
1387
+ /** use method for using local storage specific for user */
1388
+ useUserLocalStorage: PropTypes.func.isRequired
897
1389
  };
898
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1NjcmlwdHVyZUNhcmQvU2NyaXB0dXJlQ2FyZC50c3giXSwibmFtZXMiOlsiUmVhY3QiLCJQcm9wVHlwZXMiLCJjb3JlIiwidXNmbWpzIiwidXNlRWRpdCIsIkNhcmQiLCJ1c2VDYXJkU3RhdGUiLCJ1c2VVc2VyQnJhbmNoIiwiRVJST1JfU1RBVEUiLCJNQU5JRkVTVF9OT1RfTE9BREVEX0VSUk9SIiwiQWxpZ25tZW50SGVscGVycyIsIlVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMiLCJpc0VxdWFsIiwiU2NyaXB0dXJlUGFuZSIsIlNjcmlwdHVyZVNlbGVjdG9yIiwidXNlU2NyaXB0dXJlU2V0dGluZ3MiLCJnZXRSZXNvdXJjZUxpbmsiLCJnZXRSZXNvdXJjZU1lc3NhZ2UiLCJnZXRTY3JpcHR1cmVWZXJzaW9uU2V0dGluZ3MiLCJpc09yaWdpbmFsQmlibGUiLCJUaXRsZSIsIk5UX09SSUdfTEFORyIsIk9SSUdJTkFMX1NPVVJDRSIsIk9UX09SSUdfTEFORyIsIktFWV9GT05UX1NJWkVfQkFTRSIsImxhYmVsIiwic3R5bGUiLCJtYXJnaW5Ub3AiLCJ3aWR0aCIsIlNjcmlwdHVyZUNhcmQiLCJpZCIsImlzTlQiLCJ0aXRsZSIsInNlcnZlciIsImFwcFJlZiIsImNhcmROdW0iLCJjbGFzc2VzIiwicmVzb3VyY2UiLCJvd25lciIsImxhbmd1YWdlSWQiLCJyZXNvdXJjZUlkIiwib3JpZ2luYWxMYW5ndWFnZU93bmVyIiwiZ2V0TGFuZ3VhZ2UiLCJyZWZlcmVuY2UiLCJ2ZXJzZSIsImNoYXB0ZXIiLCJib29rSWQiLCJwcm9qZWN0SWQiLCJyZXNvdXJjZUxpbmsiLCJ1c2VVc2VyTG9jYWxTdG9yYWdlIiwiZGlzYWJsZVdvcmRQb3BvdmVyIiwib25SZXNvdXJjZUVycm9yIiwiaHR0cENvbmZpZyIsImdyZWVrUmVwb1VybCIsImhlYnJld1JlcG9VcmwiLCJnZXRMZXhpY29uRGF0YSIsImZldGNoR2xvc3Nlc0ZvclZlcnNlIiwidHJhbnNsYXRlIiwib25NaW5pbWl6ZSIsImxvZ2dlZEluVXNlciIsImF1dGhlbnRpY2F0aW9uIiwic2V0U2F2ZWRDaGFuZ2VzIiwiYm9va0luZGV4IiwiYWRkVmVyc2VSYW5nZSIsInNldFdvcmRBbGlnbmVyU3RhdHVzIiwidXNlU3RhdGUiLCJoYXZlVW5zYXZlZENoYW5nZXMiLCJyZWYiLCJzYXZlQ2xpY2tlZCIsInNhdmVDb250ZW50Iiwic2hhIiwic3RhcnRTYXZlIiwidXJsRXJyb3IiLCJ1c2luZ1VzZXJCcmFuY2giLCJ1bnNhdmVkQ2hhbmdlc0xpc3QiLCJ2ZXJzZXNGb3JSZWYiLCJzdGF0ZSIsInNldFN0YXRlXyIsImZvbnRTaXplIiwic2V0Rm9udFNpemUiLCJpc05UXyIsInNldFN0YXRlIiwibmV3U3RhdGUiLCJwcmV2U3RhdGUiLCJjYWNoZSIsIm1heEFnZSIsInNldFVybEVycm9yIiwiZXJyb3IiLCJ3aG9sZUJvb2siLCJpc05ld1Rlc3RhbWVudCIsInNjcmlwdHVyZUNvbmZpZyIsInNldFNjcmlwdHVyZSIsInNjcmlwdHVyZVNldHRpbmdzIiwic2NyaXB0dXJlVmVyc2lvbkhpc3QiLCJmZXRjaFJlc3BfIiwiZmV0Y2hSZXNwb25zZSIsInJlcG8iLCJyZWZlcmVuY2VfIiwidXNlRWZmZWN0IiwiX3NoYSIsImRhdGEiLCJjb25zb2xlIiwibG9nIiwiSlNPTiIsInN0cmluZ2lmeSIsImNhcmRSZXNvdXJjZUlkIiwicmVmXyIsImNhblVzZUVkaXRCcmFuY2giLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJjYXJkSWQiLCJ3b3JraW5nUmVzb3VyY2VCcmFuY2giLCJ1c2luZ1VzZXJCcmFuY2hfIiwic3RhcnRFZGl0QnJhbmNoIiwiYWN0aW9ucyIsInN0YXJ0RWRpdCIsIndvcmtpbmdSZWYiLCJzY3JpcHR1cmVUaXRsZSIsIndvcmtpbmdSZWZfIiwicmVzb3VyY2VTdGF0dXMiLCJtZXNzYWdlIiwiaXNBY2Nlc3NFcnJvciIsInZlcnNpb24iLCJ1cGRhdGVUaXRsZSIsImdldFNjcmlwdHVyZVNlbGVjdG9yIiwic2NyaXB0dXJlU2VsZWN0aW9uQ29uZmlnIiwib25NZW51Q2xvc2UiLCJsYW5ndWFnZUlkXyIsImxhbmd1YWdlIiwiZGlyZWN0aW9uIiwiaXNIZWJyZXciLCJmb250RmFjdG9yIiwic2NhbGVkRm9udFNpemUiLCJpdGVtcyIsImhlYWRlcnMiLCJmaWx0ZXJzIiwiaXRlbUluZGV4IiwibWFya2Rvd25WaWV3Iiwic2V0RmlsdGVycyIsInNldEl0ZW1JbmRleCIsInNldE1hcmtkb3duVmlldyIsInJlZlN0eWxlIiwidXNlTWVtbyIsImZvbnRGYW1pbHkiLCJNYXRoIiwicm91bmQiLCJjb250ZW50U3R5bGUiLCJzY3JpcHR1cmVMYWJlbCIsImRpc2FibGVXb3JkUG9wb3Zlcl8iLCJ1c2luZ09yaWdpbmFsQmlibGUiLCJ1bmRlZmluZWQiLCJmZXRjaEdsb3NzRGF0YUZvclZlcnNlIiwidmVyc2VPYmplY3RzIiwidmVyc2VSZWYiLCJfdmVyc2VPYmplY3RzIiwidmVyc2VEYXRhIiwiY29uY2F0IiwiZW5hYmxlRWRpdCIsImVuYWJsZUFsaWdubWVudCIsIm9yaWdpbmFsUmVwb1VybCIsInNjcmlwdHVyZUFsaWdubWVudEVkaXRDb25maWciLCJjdXJyZW50VmVyc2VSZWYiLCJfc2V0U2F2ZWRDaGFuZ2VzIiwic291cmNlTGFuZ3VhZ2UiLCJ0YXJnZXRMYW5ndWFnZSIsImN1cnJlbnRJbmRleCIsInNhdmVkIiwiZ2V0Q2hhbmdlcyIsImNsZWFyQ2hhbmdlcyIsIl91bnNhdmVkQ2hhbmdlc0xpc3QiLCJoYXNPd25Qcm9wZXJ0eSIsIl9oYXZlVW5zYXZlZENoYW5nZXMiLCJPYmplY3QiLCJrZXlzIiwiZmluZFJlZkluQXJyYXkiLCJmaW5kSXRlbSIsImNodW5rcyIsInJlZkxlbiIsImluZGV4IiwiZmluZEluZGV4IiwiY2h1bmsiLCJpZHgiLCJuZXh0Q2hhciIsImdldEJvb2tOYW1lIiwiYm9va0NhcHMiLCJ0b1VwcGVyQ2FzZSIsImZpbGVwYXRoIiwiY29udGVudCIsImNvbmZpZyIsInRva2VuIiwidGltZW91dCIsInNlcnZlclRpbWVPdXQiLCJhdXRob3IiLCJicmFuY2giLCJvblNhdmVFZGl0IiwiX3NhdmVFZGl0IiwidGhlbiIsInN1Y2Nlc3MiLCJ1bnNhdmVkQ2FyZEluZGljZXMiLCJjYXJkSW5kZXgiLCJpbmZvIiwicmVsb2FkUmVzb3VyY2UiLCJvcmlnaW5hbFVzZm0iLCJnZXRSZXNwb25zZURhdGEiLCJ1cGRhdGVkQmlibGVVc2ZtIiwicGFyc2VJbnQiLCJuZXdVc2ZtIiwibmV3VmVyc2VUZXh0IiwidXBkYXRlZFZlcnNlT2JqZWN0cyIsImNoYXB0ZXJDaHVua3MiLCJzcGxpdCIsImNoYXB0ZXJJbmRleCIsImN1cnJlbnRDaGFwdGVyIiwidmVyc2VDaHVua3MiLCJ2ZXJzZUluZGV4IiwibmV3VmVyc2VVc2ZtIiwiY29udmVydFZlcnNlRGF0YVRvVVNGTSIsIm9sZFZlcnNlIiwidmVyc2VOdW1MZW4iLCJuZXdDaGFwdGVyIiwiam9pbiIsInRhcmdldFZlcnNlT2JqZWN0c18iLCJ1cGRhdGVBbGlnbm1lbnRzVG9UYXJnZXRWZXJzZSIsInRhcmdldFZlcnNlT2JqZWN0cyIsIm5ld0Jvb2tKc29uIiwidXBkYXRlVmVyc2UiLCJ0b1VTRk0iLCJmb3JjZWROZXdMaW5lcyIsIl92ZXJzZSIsImluY2x1ZGVzIiwicmVuZGVyZWRTY3JpcHR1cmVQYW5lcyIsIm1hcCIsIl9jdXJyZW50VmVyc2VEYXRhIiwiaW5pdGlhbFZlcnNlT2JqZWN0cyIsIl9yZWZlcmVuY2UiLCJfc2NyaXB0dXJlQWxpZ25tZW50RWRpdENvbmZpZyIsInByb3BUeXBlcyIsInN0cmluZyIsImZ1bmMiLCJpc1JlcXVpcmVkIiwibnVtYmVyIiwic2hhcGUiLCJvbmVPZlR5cGUiLCJib29sIiwib2JqZWN0IiwiYW55Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUtBLEtBQVosTUFBdUIsT0FBdkI7QUFDQSxPQUFPLEtBQUtDLFNBQVosTUFBMkIsWUFBM0I7QUFD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TyxNQXBERDs7QUFxRHhCO0FBQ0F0TCxFQUFBQSxjQUFjLEVBQUV0RCxTQUFTLENBQUM2TyxJQXRERjs7QUF1RHhCO0FBQ0F0TCxFQUFBQSxvQkFBb0IsRUFBRXZELFNBQVMsQ0FBQzZPLElBeERSOztBQXlEeEI7QUFDQXJMLEVBQUFBLFNBQVMsRUFBRXhELFNBQVMsQ0FBQzZPLElBMURHOztBQTJEeEI7QUFDQXBMLEVBQUFBLFVBQVUsRUFBRXpELFNBQVMsQ0FBQzZPLElBNURFOztBQTZEeEI7QUFDQW5MLEVBQUFBLFlBQVksRUFBRTFELFNBQVMsQ0FBQzRPLE1BOURBOztBQStEeEI7QUFDQWpMLEVBQUFBLGNBQWMsRUFBRTNELFNBQVMsQ0FBQ21QLE1BaEVGOztBQWlFeEI7QUFDQXZMLEVBQUFBLGVBQWUsRUFBRTVELFNBQVMsQ0FBQzZPLElBbEVIOztBQW1FeEI7QUFDQWhMLEVBQUFBLFNBQVMsRUFBRTdELFNBQVMsQ0FBQzRPLE1BcEVHOztBQXFFeEI7QUFDQTlLLEVBQUFBLGFBQWEsRUFBRTlELFNBQVMsQ0FBQzZPLElBdEVEOztBQXVFeEI7QUFDQTlLLEVBQUFBLG9CQUFvQixFQUFFL0QsU0FBUyxDQUFDNk87QUF4RVIsQ0FBMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJ1xuaW1wb3J0IHsgY29yZSB9IGZyb20gJ3NjcmlwdHVyZS1yZXNvdXJjZXMtcmNsJ1xuaW1wb3J0IHVzZm1qcyBmcm9tICd1c2ZtLWpzJ1xuaW1wb3J0IHsgdXNlRWRpdCB9IGZyb20gJ2dpdGVhLXJlYWN0LXRvb2xraXQnXG5pbXBvcnQge1xuICBDYXJkLFxuICB1c2VDYXJkU3RhdGUsXG4gIHVzZVVzZXJCcmFuY2gsXG4gIEVSUk9SX1NUQVRFLFxuICBNQU5JRkVTVF9OT1RfTE9BREVEX0VSUk9SLFxufSBmcm9tICd0cmFuc2xhdGlvbi1oZWxwcy1yY2wnXG5pbXBvcnQgeyBBbGlnbm1lbnRIZWxwZXJzLCBVc2ZtRmlsZUNvbnZlcnNpb25IZWxwZXJzIH0gZnJvbSAnd29yZC1hbGlnbmVyLXJjbCdcbmltcG9ydCAqIGFzIGlzRXF1YWwgZnJvbSAnZGVlcC1lcXVhbCdcbmltcG9ydCB7IFNjcmlwdHVyZVBhbmUsIFNjcmlwdHVyZVNlbGVjdG9yIH0gZnJvbSAnLi4nXG5pbXBvcnQgeyB1c2VTY3JpcHR1cmVTZXR0aW5ncyB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVNjcmlwdHVyZVNldHRpbmdzJ1xuaW1wb3J0IHtcbiAgZ2V0UmVzb3VyY2VMaW5rLFxuICBnZXRSZXNvdXJjZU1lc3NhZ2UsXG4gIGdldFNjcmlwdHVyZVZlcnNpb25TZXR0aW5ncyxcbiAgaXNPcmlnaW5hbEJpYmxlLFxufSBmcm9tICcuLi8uLi91dGlscy9TY3JpcHR1cmVTZXR0aW5ncydcbmltcG9ydCB7IFRpdGxlIH0gZnJvbSAnLi4vU2NyaXB0dXJlUGFuZS9zdHlsZWQnXG5pbXBvcnQge1xuICBOVF9PUklHX0xBTkcsXG4gIE9SSUdJTkFMX1NPVVJDRSxcbiAgT1RfT1JJR19MQU5HLFxufSBmcm9tICcuLi8uLi91dGlscydcblxuY29uc3QgS0VZX0ZPTlRfU0laRV9CQVNFID0gJ3NjcmlwdHVyZVBhbmVGb250U2l6ZV8nXG5jb25zdCBsYWJlbCA9ICdWZXJzaW9uJ1xuY29uc3Qgc3R5bGUgPSB7IG1hcmdpblRvcDogJzE2cHgnLCB3aWR0aDogJzUwMHB4JyB9XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNjcmlwdHVyZUNhcmQoe1xuICBpZCxcbiAgaXNOVCxcbiAgdGl0bGUsXG4gIHNlcnZlcixcbiAgYXBwUmVmLFxuICBjYXJkTnVtLFxuICBjbGFzc2VzLFxuICByZXNvdXJjZToge1xuICAgIG93bmVyLFxuICAgIGxhbmd1YWdlSWQsXG4gICAgcmVzb3VyY2VJZCxcbiAgICBvcmlnaW5hbExhbmd1YWdlT3duZXIsXG4gIH0sXG4gIGdldExhbmd1YWdlLFxuICByZWZlcmVuY2U6IHtcbiAgICB2ZXJzZSxcbiAgICBjaGFwdGVyLFxuICAgIHByb2plY3RJZDogYm9va0lkLFxuICB9LFxuICByZXNvdXJjZUxpbmssXG4gIHVzZVVzZXJMb2NhbFN0b3JhZ2UsXG4gIGRpc2FibGVXb3JkUG9wb3ZlcixcbiAgb25SZXNvdXJjZUVycm9yLFxuICBodHRwQ29uZmlnLFxuICBncmVla1JlcG9VcmwsXG4gIGhlYnJld1JlcG9VcmwsXG4gIGdldExleGljb25EYXRhLFxuICBmZXRjaEdsb3NzZXNGb3JWZXJzZSxcbiAgdHJhbnNsYXRlLFxuICBvbk1pbmltaXplLFxuICBsb2dnZWRJblVzZXIsXG4gIGF1dGhlbnRpY2F0aW9uLFxuICBzZXRTYXZlZENoYW5nZXMsXG4gIGJvb2tJbmRleCxcbiAgYWRkVmVyc2VSYW5nZSxcbiAgc2V0V29yZEFsaWduZXJTdGF0dXMsXG59KSB7XG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVfXSA9IFJlYWN0LnVzZVN0YXRlKHtcbiAgICBoYXZlVW5zYXZlZENoYW5nZXM6IGZhbHNlLFxuICAgIHJlZjogYXBwUmVmLFxuICAgIHNhdmVDbGlja2VkOiBmYWxzZSxcbiAgICBzYXZlQ29udGVudDogbnVsbCxcbiAgICBzaGE6IG51bGwsXG4gICAgc3RhcnRTYXZlOiBmYWxzZSxcbiAgICB1cmxFcnJvcjogbnVsbCxcbiAgICB1c2luZ1VzZXJCcmFuY2g6IGZhbHNlLFxuICAgIHVuc2F2ZWRDaGFuZ2VzTGlzdDoge30sXG4gICAgdmVyc2VzRm9yUmVmOiBudWxsLFxuICB9KVxuICBjb25zdCB7XG4gICAgcmVmLFxuICAgIHNhdmVDbGlja2VkLFxuICAgIHNhdmVDb250ZW50LFxuICAgIHNoYSxcbiAgICBzdGFydFNhdmUsXG4gICAgdXJsRXJyb3IsXG4gICAgdXNpbmdVc2VyQnJhbmNoLFxuICAgIHVuc2F2ZWRDaGFuZ2VzTGlzdCxcbiAgICBoYXZlVW5zYXZlZENoYW5nZXMsXG4gICAgdmVyc2VzRm9yUmVmLFxuICB9ID0gc3RhdGVcblxuICBjb25zdCBbZm9udFNpemUsIHNldEZvbnRTaXplXSA9IHVzZVVzZXJMb2NhbFN0b3JhZ2UoS0VZX0ZPTlRfU0laRV9CQVNFICsgY2FyZE51bSwgMTAwKVxuICBjb25zdCBpc05UXyA9IGlzTlQoYm9va0lkKVxuXG4gIGZ1bmN0aW9uIHNldFN0YXRlKG5ld1N0YXRlKSB7XG4gICAgc2V0U3RhdGVfKHByZXZTdGF0ZSA9PiAoeyAuLi5wcmV2U3RhdGUsIC4uLm5ld1N0YXRlIH0pKVxuICB9XG5cbiAgaWYgKHVzaW5nVXNlckJyYW5jaCkge1xuICAgIGh0dHBDb25maWcgPSB7IC4uLmh0dHBDb25maWcsIGNhY2hlOiB7IG1heEFnZTogMCB9IH0gLy8gZGlzYWJsZSBodHRwIGNhY2hpbmdcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBpc05ld1Rlc3RhbWVudCxcbiAgICBzY3JpcHR1cmVDb25maWcsXG4gICAgc2V0U2NyaXB0dXJlLFxuICAgIHNjcmlwdHVyZVNldHRpbmdzLFxuICAgIHNjcmlwdHVyZVZlcnNpb25IaXN0LFxuICB9ID0gdXNlU2NyaXB0dXJlU2V0dGluZ3Moe1xuICAgIGlzTlQsXG4gICAgdGl0bGUsXG4gICAgdmVyc2UsXG4gICAgb3duZXIsXG4gICAgYm9va0lkLFxuICAgIGFwcFJlZjogcmVmLFxuICAgIHNlcnZlcixcbiAgICBjYXJkTnVtLFxuICAgIGNoYXB0ZXIsXG4gICAgbGFuZ3VhZ2VJZCxcbiAgICByZXNvdXJjZUlkLFxuICAgIHJlc291cmNlTGluayxcbiAgICB1c2VVc2VyTG9jYWxTdG9yYWdlLFxuICAgIGRpc2FibGVXb3JkUG9wb3ZlcixcbiAgICBvcmlnaW5hbExhbmd1YWdlT3duZXIsXG4gICAgc2V0VXJsRXJyb3I6IChlcnJvcikgPT4gc2V0U3RhdGUoeyB1cmxFcnJvcjogZXJyb3IgfSksXG4gICAgaHR0cENvbmZpZyxcbiAgICBncmVla1JlcG9VcmwsXG4gICAgaGVicmV3UmVwb1VybCxcbiAgICB3aG9sZUJvb2s6IHRydWUsXG4gIH0pXG5cbiAgY29uc3QgZmV0Y2hSZXNwXyA9IHNjcmlwdHVyZUNvbmZpZz8uZmV0Y2hSZXNwb25zZVxuICAvLyBAdHMtaWdub3JlXG4gIGNvbnN0IHJlcG8gPSBgJHtzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5sYW5ndWFnZUlkfV8ke3NjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/LnByb2plY3RJZH1gXG4gIGNvbnN0IHJlZmVyZW5jZV8gPSBzY3JpcHR1cmVDb25maWc/LnJlZmVyZW5jZSB8fCBudWxsXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gZ2V0IHRoZSBfc2hhIGZyb20gbGFzdCBzY3JpcHR1cmUgZG93bmxvYWRcbiAgICBjb25zdCBfc2hhID0gZmV0Y2hSZXNwXz8uZGF0YT8uc2hhIHx8IG51bGxcbiAgICBjb25zb2xlLmxvZyhgZm9yICR7SlNPTi5zdHJpbmdpZnkocmVmZXJlbmNlXyl9IG5ldyBzaGEgaXMgJHtfc2hhfWApXG5cbiAgICBpZiAoX3NoYSAhPT0gc2hhKSB7XG4gICAgICBzZXRTdGF0ZSh7IHNoYTogX3NoYSB9KVxuICAgIH1cbiAgfSwgW2ZldGNoUmVzcF9dKVxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgY29uc3QgY2FyZFJlc291cmNlSWQgPSBzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5wcm9qZWN0SWQgfHwgcmVzb3VyY2VJZFxuICAvLyBAdHMtaWdub3JlXG4gIGxldCByZWZfID0gc2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZT8ucmVmIHx8IGFwcFJlZlxuICBjb25zdCBjYW5Vc2VFZGl0QnJhbmNoID0gbG9nZ2VkSW5Vc2VyICYmIGF1dGhlbnRpY2F0aW9uICYmXG4gICAgKHJlc291cmNlSWQgIT09IE9SSUdJTkFMX1NPVVJDRSkgJiZcbiAgICAoKHJlZl8gPT09ICdtYXN0ZXInKSB8fCAocmVmXy5zdWJzdHJpbmcoMCwgbG9nZ2VkSW5Vc2VyLmxlbmd0aCkgPT09IGxvZ2dlZEluVXNlcikgKSAvLyBub3QgdGFnXG5cbiAgY29uc3Qge1xuICAgIHN0YXRlOiB7IHdvcmtpbmdSZXNvdXJjZUJyYW5jaCwgdXNpbmdVc2VyQnJhbmNoOiB1c2luZ1VzZXJCcmFuY2hfIH0sXG4gICAgYWN0aW9uczogeyBzdGFydEVkaXQ6IHN0YXJ0RWRpdEJyYW5jaCB9LFxuICB9ID0gdXNlVXNlckJyYW5jaCh7XG4gICAgb3duZXIsXG4gICAgc2VydmVyLFxuICAgIGFwcFJlZixcbiAgICBsYW5ndWFnZUlkLFxuICAgIGNhcmRJZDogaWQsXG4gICAgbG9nZ2VkSW5Vc2VyOiBjYW5Vc2VFZGl0QnJhbmNoID8gbG9nZ2VkSW5Vc2VyIDogbnVsbCxcbiAgICBhdXRoZW50aWNhdGlvbjogY2FuVXNlRWRpdEJyYW5jaCA/IGF1dGhlbnRpY2F0aW9uIDogbnVsbCxcbiAgICBjYXJkUmVzb3VyY2VJZCxcbiAgICBvblJlc291cmNlRXJyb3IsXG4gICAgdXNlVXNlckxvY2FsU3RvcmFnZSxcbiAgfSlcblxuICBjb25zdCB3b3JraW5nUmVmID0gY2FuVXNlRWRpdEJyYW5jaCA/IHdvcmtpbmdSZXNvdXJjZUJyYW5jaCA6IGFwcFJlZlxuICBsZXQgc2NyaXB0dXJlVGl0bGVcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyBzZWxlY3QgY29ycmVjdCB3b3JraW5nIHJlZiAtIGNvdWxkIGJlIG1hc3RlciwgdXNlciBicmFuY2gsIG9yIHJlbGVhc2VcbiAgICBpZiAodXNpbmdVc2VyQnJhbmNoXyAhPT0gdXNpbmdVc2VyQnJhbmNoKSB7XG4gICAgICBzZXRTdGF0ZSh7IHVzaW5nVXNlckJyYW5jaDogdXNpbmdVc2VyQnJhbmNoXyB9KVxuICAgIH1cbiAgfSwgW3VzaW5nVXNlckJyYW5jaF8sIHVzaW5nVXNlckJyYW5jaF0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gc2VsZWN0IGNvcnJlY3Qgd29ya2luZyByZWYgLSBjb3VsZCBiZSBtYXN0ZXIsIHVzZXIgYnJhbmNoLCBvciByZWxlYXNlXG4gICAgbGV0IHdvcmtpbmdSZWZfID0gd29ya2luZ1JlZiB8fCBhcHBSZWZcblxuICAgIGlmIChyZWYgIT09IHdvcmtpbmdSZWZfKSB7XG4gICAgICBzZXRTdGF0ZSh7IHJlZjogd29ya2luZ1JlZl8gfSlcbiAgICB9XG4gIH0sIFt3b3JraW5nUmVmLCByZWYsIGFwcFJlZl0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gdXBkYXRlIGRpc3BsYXkgc3RhdHVzIGlmIGVycm9yXG4gICAgY29uc3QgZXJyb3IgPSBzY3JpcHR1cmVDb25maWc/LnJlc291cmNlU3RhdHVzPy5bRVJST1JfU1RBVEVdXG5cbiAgICBpZiAoZXJyb3IpIHsgLy8gaWYgZXJyb3Igd2FzIGZvdW5kIGRvIGNhbGxiYWNrXG4gICAgICBjb25zdCByZXNvdXJjZVN0YXR1cyA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2VTdGF0dXNcbiAgICAgIGNvbnN0IHJlc291cmNlTGluayA9IGdldFJlc291cmNlTGluayhzY3JpcHR1cmVDb25maWcpXG4gICAgICBjb25zdCBtZXNzYWdlID0gZ2V0UmVzb3VyY2VNZXNzYWdlKHJlc291cmNlU3RhdHVzLCBzZXJ2ZXIsIHJlc291cmNlTGluaywgaXNOVF8pXG4gICAgICBjb25zdCBpc0FjY2Vzc0Vycm9yID0gcmVzb3VyY2VTdGF0dXNbTUFOSUZFU1RfTk9UX0xPQURFRF9FUlJPUl1cbiAgICAgIG9uUmVzb3VyY2VFcnJvciAmJiBvblJlc291cmNlRXJyb3IobWVzc2FnZSwgaXNBY2Nlc3NFcnJvciwgcmVzb3VyY2VTdGF0dXMpXG4gICAgfVxuICB9LCBbc2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZVN0YXR1cz8uW0VSUk9SX1NUQVRFXV0pXG5cbiAgaWYgKHNjcmlwdHVyZUNvbmZpZy50aXRsZSAmJiBzY3JpcHR1cmVDb25maWcudmVyc2lvbikge1xuICAgIHNjcmlwdHVyZVRpdGxlID0gYCR7c2NyaXB0dXJlQ29uZmlnLnRpdGxlfSB2JHtzY3JpcHR1cmVDb25maWcudmVyc2lvbn1gXG4gICAgc2NyaXB0dXJlVmVyc2lvbkhpc3QudXBkYXRlVGl0bGUoc2NyaXB0dXJlQ29uZmlnLnJlc291cmNlTGluaywgc2NyaXB0dXJlVGl0bGUpXG4gIH0gZWxzZSB7XG4gICAgc2NyaXB0dXJlVGl0bGUgPSBgVGl0bGUgbWlzc2luZyBmcm9tIHByb2plY3QgbWFuaWZlc3RgXG4gIH1cblxuICAvKiogRHluYW1pY2FsbHkgY3JlYXRlcyB0aGUgc2NyaXB0dXJlIHNlbGVjdGlvbiBkcm9wZG93biB0byBiZSBpbnNlcnRlZCBpbnRvIGNhcmQgc2V0dGluZ3MgKi9cbiAgZnVuY3Rpb24gZ2V0U2NyaXB0dXJlU2VsZWN0b3IoKSB7XG4gICAgY29uc3Qgc2NyaXB0dXJlU2VsZWN0aW9uQ29uZmlnID0gZ2V0U2NyaXB0dXJlVmVyc2lvblNldHRpbmdzKHtcbiAgICAgIGxhYmVsLFxuICAgICAgcmVzb3VyY2VMaW5rOiBzY3JpcHR1cmVDb25maWcucmVzb3VyY2VMaW5rLFxuICAgICAgc2V0U2NyaXB0dXJlLFxuICAgICAgc2NyaXB0dXJlVmVyc2lvbkhpc3QsXG4gICAgfSlcblxuICAgIHJldHVybiA8U2NyaXB0dXJlU2VsZWN0b3Igey4uLnNjcmlwdHVyZVNlbGVjdGlvbkNvbmZpZ30gc3R5bGU9e3N0eWxlfSBlcnJvck1lc3NhZ2U9e3VybEVycm9yfSAvPlxuICB9XG5cbiAgZnVuY3Rpb24gb25NZW51Q2xvc2UoKSB7XG4gICAgLy8gY29uc29sZS5sb2coYG9uTWVudUNsb3NlKClgKVxuICAgIHNldFN0YXRlKHsgdXJsRXJyb3I6IG51bGwgfSlcbiAgfVxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgY29uc3QgbGFuZ3VhZ2VJZF8gPSBzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5sYW5ndWFnZUlkXG4gIGNvbnN0IGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UoeyBsYW5ndWFnZUlkOiBsYW5ndWFnZUlkXyB9KVxuICBjb25zdCBkaXJlY3Rpb24gPSAobGFuZ3VhZ2U/LmRpcmVjdGlvbikgfHwgJ2x0cidcbiAgY29uc3QgcmVmZXJlbmNlID0geyAuLi5zY3JpcHR1cmVDb25maWcucmVmZXJlbmNlIH1cblxuICBjb25zdCBpc0hlYnJldyA9IChsYW5ndWFnZUlkXyA9PT0gJ2hibycpXG4gIGNvbnN0IGZvbnRGYWN0b3IgPSBpc0hlYnJldyA/IDEuNCA6IDEgLy8gd2UgYXV0b21hdGljYWxseSBzY2FsZSB1cCBmb250IHNpemUgZm9yIEhlYnJld1xuICBjb25zdCBzY2FsZWRGb250U2l6ZSA9IGZvbnRTaXplICogZm9udEZhY3RvclxuXG4gIGNvbnN0IGl0ZW1zID0gbnVsbFxuICBjb25zdCB7XG4gICAgc3RhdGU6IHtcbiAgICAgIGhlYWRlcnMsIGZpbHRlcnMsIGl0ZW1JbmRleCwgbWFya2Rvd25WaWV3LFxuICAgIH0sXG4gICAgYWN0aW9uczoge1xuICAgICAgc2V0RmlsdGVycywgc2V0SXRlbUluZGV4LCBzZXRNYXJrZG93blZpZXcsXG4gICAgfSxcbiAgfSA9IHVzZUNhcmRTdGF0ZSh7IGl0ZW1zIH0pXG5cbiAgY29uc3QgcmVmU3R5bGUgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgZm9udEZhbWlseTogJ05vdG8gU2FucycsXG4gICAgZm9udFNpemU6IGAke01hdGgucm91bmQoc2NhbGVkRm9udFNpemUgKiAwLjkpfSVgLFxuICB9KSwgW3NjYWxlZEZvbnRTaXplXSlcblxuICBjb25zdCBjb250ZW50U3R5bGUgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgZm9udEZhbWlseTogJ05vdG8gU2FucycsXG4gICAgZm9udFNpemU6IGAke3NjYWxlZEZvbnRTaXplfSVgLFxuICB9KSwgW3NjYWxlZEZvbnRTaXplXSlcblxuICBjb25zdCBzY3JpcHR1cmVMYWJlbCA9IDxUaXRsZT57c2NyaXB0dXJlVGl0bGV9PC9UaXRsZT5cbiAgbGV0IGRpc2FibGVXb3JkUG9wb3Zlcl8gPSBkaXNhYmxlV29yZFBvcG92ZXJcbiAgY29uc3QgdXNpbmdPcmlnaW5hbEJpYmxlID0gaXNPcmlnaW5hbEJpYmxlKHNjcmlwdHVyZUNvbmZpZ1sncmVzb3VyY2UnXT8ucHJvamVjdElkKVxuXG4gIGlmIChkaXNhYmxlV29yZFBvcG92ZXIgPT09IHVuZGVmaW5lZCkgeyAvLyBpZiBub3Qgc3BlY2lmaWVkLCB0aGVuIGRldGVybWluZSBpZiBvcmlnaW5hbCBsYW5ndWFnZSByZXNvdXJjZVxuICAgIGRpc2FibGVXb3JkUG9wb3Zlcl8gPSAhdXNpbmdPcmlnaW5hbEJpYmxlXG4gIH1cblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyBwcmUtY2FjaGUgZ2xvc3NlcyBvbiB2ZXJzZSBjaGFuZ2VcbiAgICBjb25zdCBmZXRjaEdsb3NzRGF0YUZvclZlcnNlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHZlcnNlT2JqZWN0cyA9IFtdXG5cbiAgICAgIC8vIGdldCB2ZXJzZSBvYmplY3RzIG9mIGFsbCB0aGUgdmVyc2VzXG4gICAgICBmb3IgKGNvbnN0IHZlcnNlUmVmIG9mIHNjcmlwdHVyZUNvbmZpZz8udmVyc2VzRm9yUmVmIHx8IFtdKSB7XG4gICAgICAgIGNvbnN0IF92ZXJzZU9iamVjdHMgPSB2ZXJzZVJlZj8udmVyc2VEYXRhPy52ZXJzZU9iamVjdHNcbiAgICAgICAgdmVyc2VPYmplY3RzID0gdmVyc2VPYmplY3RzLmNvbmNhdChfdmVyc2VPYmplY3RzKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWRpc2FibGVXb3JkUG9wb3ZlciAmJiB2ZXJzZU9iamVjdHM/Lmxlbmd0aCAmJiBmZXRjaEdsb3NzZXNGb3JWZXJzZSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICBhd2FpdCBmZXRjaEdsb3NzZXNGb3JWZXJzZSh2ZXJzZU9iamVjdHMsIGxhbmd1YWdlSWRfKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1c2luZ09yaWdpbmFsQmlibGUpIHtcbiAgICAgIGZldGNoR2xvc3NEYXRhRm9yVmVyc2UoKVxuICAgIH1cbiAgfSwgWyB2ZXJzZXNGb3JSZWYsIGxhbmd1YWdlSWRfIF0pXG5cbiAgY29uc3QgZW5hYmxlRWRpdCA9ICF1c2luZ09yaWdpbmFsQmlibGVcbiAgY29uc3QgZW5hYmxlQWxpZ25tZW50ID0gIXVzaW5nT3JpZ2luYWxCaWJsZVxuICBjb25zdCBvcmlnaW5hbFJlcG9VcmwgPSBpc05ld1Rlc3RhbWVudCA/IGdyZWVrUmVwb1VybCA6IGhlYnJld1JlcG9VcmxcbiAgY29uc3Qgc2NyaXB0dXJlQWxpZ25tZW50RWRpdENvbmZpZyA9IHtcbiAgICBhdXRoZW50aWNhdGlvbjogY2FuVXNlRWRpdEJyYW5jaCA/IGF1dGhlbnRpY2F0aW9uIDogbnVsbCxcbiAgICBib29rSW5kZXgsXG4gICAgY3VycmVudFZlcnNlUmVmOiByZWZlcmVuY2UsXG4gICAgZW5hYmxlRWRpdCxcbiAgICBlbmFibGVBbGlnbm1lbnQsXG4gICAgaHR0cENvbmZpZyxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaXNOZXdUZXN0YW1lbnQsXG4gICAgbG9nZ2VkSW5Vc2VyOiBjYW5Vc2VFZGl0QnJhbmNoID8gbG9nZ2VkSW5Vc2VyIDogbnVsbCxcbiAgICBvcmlnaW5hbExhbmd1YWdlT3duZXIsXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9yaWdpbmFsUmVwb1VybCxcbiAgICBzY3JpcHR1cmVDb25maWcsXG4gICAgc2NyaXB0dXJlU2V0dGluZ3MsXG4gICAgc3RhcnRFZGl0QnJhbmNoLFxuICAgIHNldFNhdmVkQ2hhbmdlczogX3NldFNhdmVkQ2hhbmdlcyxcbiAgICBzb3VyY2VMYW5ndWFnZTogaXNOVF8gPyBOVF9PUklHX0xBTkcgOiBPVF9PUklHX0xBTkcsXG4gICAgdGFyZ2V0TGFuZ3VhZ2U6IGxhbmd1YWdlLFxuICAgIHRpdGxlOiBzY3JpcHR1cmVUaXRsZSxcbiAgICB3b3JraW5nUmVzb3VyY2VCcmFuY2g6IHJlZixcbiAgfVxuXG4gIC8qKlxuICAgKiB0aGlzIGdldHMgY2FsbGVkIHdoZW5ldmVyIGEgc2NyaXB0dXJlIHBhbmUgaGFzIGEgY2hhbmdlIGluIHNhdmUgc3RhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGN1cnJlbnRJbmRleFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNhdmVkXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGdldENoYW5nZXMgLSB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciB1c2VyIGNsaWNrcyBzYXZlIGJ1dHRvblxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjbGVhckNoYW5nZXMgLSB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBzYXZlIGhhcyBjb21wbGV0ZWRcbiAgICogQHBhcmFtIHtvYmplY3R9IHN0YXRlIC0gY3VycmVudCBzdGF0ZSBvZiB3b3JkIGFsaWdubWVudC9lZGl0XG4gICAqL1xuICBmdW5jdGlvbiBfc2V0U2F2ZWRDaGFuZ2VzKGN1cnJlbnRJbmRleCwgc2F2ZWQsIHsgZ2V0Q2hhbmdlcyA9IG51bGwsIGNsZWFyQ2hhbmdlcyA9IG51bGwsIHN0YXRlID0gbnVsbCB9KSB7XG4gICAgY29uc3QgX3Vuc2F2ZWRDaGFuZ2VzTGlzdCA9IHsgLi4udW5zYXZlZENoYW5nZXNMaXN0IH1cblxuICAgIGlmIChzYXZlZCkge1xuICAgICAgaWYgKF91bnNhdmVkQ2hhbmdlc0xpc3QuaGFzT3duUHJvcGVydHkoY3VycmVudEluZGV4KSkge1xuICAgICAgICBkZWxldGUgX3Vuc2F2ZWRDaGFuZ2VzTGlzdFtjdXJyZW50SW5kZXhdXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIF91bnNhdmVkQ2hhbmdlc0xpc3RbY3VycmVudEluZGV4XSA9IHsgZ2V0Q2hhbmdlcywgY2xlYXJDaGFuZ2VzLCBzdGF0ZSB9IC8vIHVwZGF0ZSB3aXRoIGxhdGVzdFxuICAgIH1cblxuICAgIGNvbnN0IF9oYXZlVW5zYXZlZENoYW5nZXMgPSAhIU9iamVjdC5rZXlzKF91bnNhdmVkQ2hhbmdlc0xpc3QpLmxlbmd0aFxuXG4gICAgaWYgKGhhdmVVbnNhdmVkQ2hhbmdlcyAhPSBfaGF2ZVVuc2F2ZWRDaGFuZ2VzKSB7XG4gICAgICBzZXRTYXZlZENoYW5nZXMgJiYgc2V0U2F2ZWRDaGFuZ2VzKHJlc291cmNlSWQsICFfaGF2ZVVuc2F2ZWRDaGFuZ2VzKVxuICAgICAgc2V0U3RhdGUoeyBoYXZlVW5zYXZlZENoYW5nZXM6IF9oYXZlVW5zYXZlZENoYW5nZXMgfSlcbiAgICB9XG5cbiAgICBpZiAoIWlzRXF1YWwoX3Vuc2F2ZWRDaGFuZ2VzTGlzdCwgdW5zYXZlZENoYW5nZXNMaXN0KSkge1xuICAgICAgc2V0U3RhdGUoeyB1bnNhdmVkQ2hhbmdlc0xpc3Q6IF91bnNhdmVkQ2hhbmdlc0xpc3QgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc2VhcmNoIGNoYXB0ZXIgb3IgdmVyc2UgY2h1bmsgdG8gbGluZSB0aGF0IHN0YXJ0cyB3aXRoIGZpbmRJdGVtXG4gICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gZmluZEl0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gY2h1bmtzXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kUmVmSW5BcnJheShmaW5kSXRlbSwgY2h1bmtzKSB7XG4gICAgY29uc3QgcmVmXyA9IGZpbmRJdGVtICsgJydcbiAgICBjb25zdCByZWZMZW4gPSByZWZfLmxlbmd0aFxuICAgIGNvbnN0IGluZGV4ID0gY2h1bmtzLmZpbmRJbmRleCgoY2h1bmssIGlkeCkgPT4ge1xuICAgICAgaWYgKGlkeCA+IDApIHtcbiAgICAgICAgaWYgKGNodW5rLnN1YnN0cmluZygwLCByZWZMZW4pID09PSByZWZfKSB7XG4gICAgICAgICAgY29uc3QgbmV4dENoYXIgPSBjaHVua1tyZWZfXVxuXG4gICAgICAgICAgaWYgKChuZXh0Q2hhciA+ICc5JykgfHwgKG5leHRDaGFyIDwgJzAnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGV4XG4gIH1cblxuICBmdW5jdGlvbiBnZXRCb29rTmFtZSgpIHtcbiAgICBjb25zdCBib29rQ2FwcyA9IHNjcmlwdHVyZUNvbmZpZz8ucmVmZXJlbmNlPy5wcm9qZWN0SWQgPyBzY3JpcHR1cmVDb25maWcucmVmZXJlbmNlLnByb2plY3RJZC50b1VwcGVyQ2FzZSgpIDogJydcbiAgICByZXR1cm4gYCR7Ym9va0luZGV4fS0ke2Jvb2tDYXBzfS51c2ZtYFxuICB9XG5cbiAgY29uc3QgZmlsZXBhdGggPSBnZXRCb29rTmFtZSgpXG5cbiAgLy8ga2VlcCB0cmFjayBvZiB2ZXJzZSBlZGl0IHN0YXRlXG4gIGNvbnN0IHsgb25TYXZlRWRpdCB9ID0gdXNlRWRpdCh7XG4gICAgc2hhLFxuICAgIG93bmVyLFxuICAgIGNvbnRlbnQ6IHNhdmVDb250ZW50LFxuICAgIGNvbmZpZzoge1xuICAgICAgY2FjaGU6IHsgbWF4QWdlOiAwIH0sXG4gICAgICAuLi5hdXRoZW50aWNhdGlvbj8uY29uZmlnLFxuICAgICAgdG9rZW46IGF1dGhlbnRpY2F0aW9uPy50b2tlbixcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRpbWVvdXQ6IGh0dHBDb25maWc/LnNlcnZlclRpbWVPdXQgfHwgaHR0cENvbmZpZz8udGltZW91dCB8fCA1MDAwLFxuICAgIH0sXG4gICAgYXV0aG9yOiBsb2dnZWRJblVzZXIsXG4gICAgdG9rZW46IGF1dGhlbnRpY2F0aW9uPy50b2tlbixcbiAgICBicmFuY2g6IHdvcmtpbmdSZXNvdXJjZUJyYW5jaCxcbiAgICBmaWxlcGF0aCxcbiAgICByZXBvLFxuICB9KVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIHdoZW4gc3RhcnRTYXZlIGdvZXMgdHJ1ZSwgc2F2ZSBlZGl0cyB0byB1c2VyIGJyYW5jaCBhbmQgdGhlbiBjbGVhciBzdGFydFNhdmVcbiAgICBjb25zdCBfc2F2ZUVkaXQgPSBhc3luYyAoKSA9PiB7IC8vIGJlZ2luIHVwbG9hZGluZyBuZXcgVVNGTVxuICAgICAgbGV0IGJyYW5jaCA9ICh3b3JraW5nUmVzb3VyY2VCcmFuY2ggIT09ICdtYXN0ZXInKSA/IHdvcmtpbmdSZXNvdXJjZUJyYW5jaCA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAoIWJyYW5jaCkge1xuICAgICAgICBicmFuY2ggPSBhd2FpdCBzdGFydEVkaXRCcmFuY2goKSAvLyBtYWtlIHN1cmUgdXNlciBicmFuY2ggZXhpc3RzIGFuZCBnZXQgbmFtZVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBvblNhdmVFZGl0KGJyYW5jaCkudGhlbigoc3VjY2VzcykgPT4geyAvLyBwdXNoIGNoYW5nZWQgdG8gc2VydmVyXG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gc2F2ZSBzY3JpcHR1cmUgZWRpdHMgc3VjY2Vzc2ApXG4gICAgICAgICAgc2V0U3RhdGUoe1xuICAgICAgICAgICAgc3RhcnRTYXZlOiBmYWxzZSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgY29uc3QgdW5zYXZlZENhcmRJbmRpY2VzID0gT2JqZWN0LmtleXModW5zYXZlZENoYW5nZXNMaXN0KVxuXG4gICAgICAgICAgaWYgKHVuc2F2ZWRDYXJkSW5kaWNlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhcmRJbmRleCBvZiB1bnNhdmVkQ2FyZEluZGljZXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyBjbGVhckNoYW5nZXMgfSA9IHVuc2F2ZWRDaGFuZ2VzTGlzdFtjYXJkSW5kZXhdXG4gICAgICAgICAgICAgIGNsZWFyQ2hhbmdlcyAmJiBjbGVhckNoYW5nZXMoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnc2F2ZUNoYW5nZXNUb0Nsb3VkKCkgLSBSZWxvYWRpbmcgcmVzb3VyY2UnKVxuICAgICAgICAgIHNjcmlwdHVyZUNvbmZpZz8ucmVsb2FkUmVzb3VyY2UoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3NhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gc2F2aW5nIGNoYW5nZWQgc2NyaXB0dXJlIGZhaWxlZCcpXG4gICAgICAgICAgc2V0U3RhdGUoeyBzdGFydFNhdmU6IGZhbHNlIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0U2F2ZSkge1xuICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCAtIGNhbGxpbmcgX3NhdmVFZGl0KClgKVxuICAgICAgX3NhdmVFZGl0KClcbiAgICB9XG4gIH0sIFtzdGFydFNhdmVdKVxuXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gZm9yIGVhY2ggdW5zYXZlZCBjaGFuZ2UsIGNhbGwgaW50byB2ZXJzZVBhbmUgdG8gZ2V0IGxhdGVzdCBjaGFuZ2VzIGZvciB2ZXJzZSB0byBzYXZlXG4gICAgaWYgKHNhdmVDbGlja2VkKSB7XG4gICAgICBjb25zdCB1bnNhdmVkQ2FyZEluZGljZXMgPSBPYmplY3Qua2V5cyh1bnNhdmVkQ2hhbmdlc0xpc3QpXG5cbiAgICAgIGlmICh1bnNhdmVkQ2FyZEluZGljZXM/Lmxlbmd0aCkge1xuICAgICAgICBjb25zdCBvcmlnaW5hbFVzZm0gPSBjb3JlLmdldFJlc3BvbnNlRGF0YShzY3JpcHR1cmVDb25maWc/LmZldGNoUmVzcG9uc2UpXG4gICAgICAgIGxldCB1cGRhdGVkQmlibGVVc2ZtID0gb3JpZ2luYWxVc2ZtXG5cbiAgICAgICAgZm9yIChjb25zdCBjYXJkSW5kZXggb2YgdW5zYXZlZENhcmRJbmRpY2VzKSB7XG4gICAgICAgICAgY29uc3QgY2FyZE51bSA9IHBhcnNlSW50KGNhcmRJbmRleClcbiAgICAgICAgICBjb25zdCB7IGdldENoYW5nZXMsIHN0YXRlIH0gPSB1bnNhdmVkQ2hhbmdlc0xpc3RbY2FyZE51bV1cblxuICAgICAgICAgIGlmIChnZXRDaGFuZ2VzKSB7XG4gICAgICAgICAgICBsZXQgbmV3VXNmbVxuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBuZXdWZXJzZVRleHQsXG4gICAgICAgICAgICAgIHJlZixcbiAgICAgICAgICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0cyxcbiAgICAgICAgICAgIH0gPSBnZXRDaGFuZ2VzKHN0YXRlKVxuXG4gICAgICAgICAgICBpZiAodXBkYXRlZFZlcnNlT2JqZWN0cyAmJiB1cGRhdGVkQmlibGVVc2ZtKSB7IC8vIGp1c3QgcmVwbGFjZSB2ZXJzZVxuICAgICAgICAgICAgICBjb25zdCBjaGFwdGVyQ2h1bmtzID0gdXBkYXRlZEJpYmxlVXNmbT8uc3BsaXQoJ1xcXFxjICcpXG4gICAgICAgICAgICAgIGNvbnN0IGNoYXB0ZXJJbmRleCA9IGZpbmRSZWZJbkFycmF5KHJlZj8uY2hhcHRlciwgY2hhcHRlckNodW5rcylcblxuICAgICAgICAgICAgICBpZiAoY2hhcHRlckluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q2hhcHRlciA9IGNoYXB0ZXJDaHVua3NbY2hhcHRlckluZGV4XVxuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNlQ2h1bmtzID0gY3VycmVudENoYXB0ZXIuc3BsaXQoJ1xcXFx2ICcpXG4gICAgICAgICAgICAgICAgY29uc3QgdmVyc2VJbmRleCA9IGZpbmRSZWZJbkFycmF5KHJlZj8udmVyc2UsIHZlcnNlQ2h1bmtzKVxuXG4gICAgICAgICAgICAgICAgaWYgKHZlcnNlSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbmV3VmVyc2VVc2ZtID0gVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKHVwZGF0ZWRWZXJzZU9iamVjdHMpXG4gICAgICAgICAgICAgICAgICBjb25zdCBvbGRWZXJzZSA9IHZlcnNlQ2h1bmtzW3ZlcnNlSW5kZXhdXG4gICAgICAgICAgICAgICAgICBjb25zdCB2ZXJzZU51bUxlbiA9IChyZWY/LnZlcnNlICsgJycpLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgdmVyc2VDaHVua3NbdmVyc2VJbmRleF0gPSBvbGRWZXJzZS5zdWJzdHJpbmcoMCwgdmVyc2VOdW1MZW4gKyAxKSArIG5ld1ZlcnNlVXNmbVxuICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q2hhcHRlciA9IHZlcnNlQ2h1bmtzLmpvaW4oJ1xcXFx2ICcpXG4gICAgICAgICAgICAgICAgICBjaGFwdGVyQ2h1bmtzW2NoYXB0ZXJJbmRleF0gPSBuZXdDaGFwdGVyXG4gICAgICAgICAgICAgICAgICBuZXdVc2ZtID0gY2hhcHRlckNodW5rcy5qb2luKCdcXFxcYyAnKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodXBkYXRlZFZlcnNlT2JqZWN0cyAmJiAhbmV3VXNmbSkge1xuICAgICAgICAgICAgICBsZXQgdGFyZ2V0VmVyc2VPYmplY3RzXyA9IG51bGxcblxuICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1ZlcnNlVGV4dCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qge3RhcmdldFZlcnNlT2JqZWN0c30gPSBBbGlnbm1lbnRIZWxwZXJzLnVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlKHVwZGF0ZWRWZXJzZU9iamVjdHMsIG5ld1ZlcnNlVGV4dClcbiAgICAgICAgICAgICAgICAgIHRhcmdldFZlcnNlT2JqZWN0c18gPSB0YXJnZXRWZXJzZU9iamVjdHNcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdGFyZ2V0VmVyc2VPYmplY3RzXyA9IHVwZGF0ZWRWZXJzZU9iamVjdHNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBuZXdCb29rSnNvbiA9IHRhcmdldFZlcnNlT2JqZWN0c18gJiYgc2NyaXB0dXJlQ29uZmlnPy51cGRhdGVWZXJzZShyZWYuY2hhcHRlciwgcmVmLnZlcnNlLCB7IHZlcnNlT2JqZWN0czogdGFyZ2V0VmVyc2VPYmplY3RzXyB9KVxuICAgICAgICAgICAgICB1cGRhdGVkQmlibGVVc2ZtID0gdXNmbWpzLnRvVVNGTShuZXdCb29rSnNvbiwgeyBmb3JjZWROZXdMaW5lczogdHJ1ZSB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobmV3VXNmbSkge1xuICAgICAgICAgICAgICB1cGRhdGVkQmlibGVVc2ZtID0gbmV3VXNmbVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQoKSAtIHNhdmluZyBuZXcgVVNGTTogJHt1cGRhdGVkQmlibGVVc2ZtLnN1YnN0cmluZygwLCAxMDApfS4uLmApXG4gICAgICAgIHNldFN0YXRlKHsgc2F2ZUNvbnRlbnQ6IHVwZGF0ZWRCaWJsZVVzZm0sIHN0YXJ0U2F2ZTogdHJ1ZSwgc2F2ZUNsaWNrZWQ6IGZhbHNlIH0pXG4gICAgICB9XG4gICAgfVxuICB9LCBbc2F2ZUNsaWNrZWRdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpc0VxdWFsKHZlcnNlc0ZvclJlZiwgc2NyaXB0dXJlQ29uZmlnPy52ZXJzZXNGb3JSZWYpKSB7XG4gICAgICBjb25zdCB2ZXJzZXNGb3JSZWYgPSBzY3JpcHR1cmVDb25maWc/LnZlcnNlc0ZvclJlZlxuICAgICAgc2V0U3RhdGUoeyB2ZXJzZXNGb3JSZWYgfSlcblxuICAgICAgZm9yIChjb25zdCB2ZXJzZVJlZiBvZiB2ZXJzZXNGb3JSZWYgfHwgW10pIHtcbiAgICAgICAgLy8gY2hlY2sgZm9yIHZlcnNlIHJhbmdlXG4gICAgICAgIGNvbnN0IF92ZXJzZSA9IHZlcnNlUmVmLnZlcnNlXG5cbiAgICAgICAgaWYgKGFkZFZlcnNlUmFuZ2UgJiYgKHR5cGVvZiBfdmVyc2UgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBpZiAoX3ZlcnNlLmluY2x1ZGVzKCctJykpIHtcbiAgICAgICAgICAgIGFkZFZlcnNlUmFuZ2UoYCR7c2NyaXB0dXJlQ29uZmlnPy5yZWZlcmVuY2U/LmNoYXB0ZXJ9OiR7X3ZlcnNlfWApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCBbc2NyaXB0dXJlQ29uZmlnPy52ZXJzZXNGb3JSZWZdKVxuXG4gIGNvbnN0IHJlbmRlcmVkU2NyaXB0dXJlUGFuZXMgPSB2ZXJzZXNGb3JSZWY/Lm1hcCgoX2N1cnJlbnRWZXJzZURhdGEsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgaW5pdGlhbFZlcnNlT2JqZWN0cyA9IF9jdXJyZW50VmVyc2VEYXRhPy52ZXJzZURhdGE/LnZlcnNlT2JqZWN0cyB8fCBudWxsXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHsgY2hhcHRlciwgdmVyc2UgfSA9IF9jdXJyZW50VmVyc2VEYXRhIHx8IHt9XG4gICAgY29uc3QgX3JlZmVyZW5jZSA9IHtcbiAgICAgIC4uLnJlZmVyZW5jZSxcbiAgICAgIGNoYXB0ZXIsXG4gICAgICB2ZXJzZSxcbiAgICB9XG4gICAgY29uc3QgX3NjcmlwdHVyZUFsaWdubWVudEVkaXRDb25maWcgPSB7XG4gICAgICAuLi5zY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnLFxuICAgICAgY3VycmVudEluZGV4OiBpbmRleCxcbiAgICAgIGluaXRpYWxWZXJzZU9iamVjdHMsXG4gICAgICByZWZlcmVuY2U6IF9yZWZlcmVuY2UsXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTY3JpcHR1cmVQYW5lXG4gICAgICAgIHsuLi5zY3JpcHR1cmVDb25maWd9XG4gICAgICAgIGNvbnRlbnRTdHlsZT17Y29udGVudFN0eWxlfVxuICAgICAgICBjdXJyZW50SW5kZXg9e2luZGV4fVxuICAgICAgICBkaXJlY3Rpb249e2RpcmVjdGlvbn1cbiAgICAgICAgZGlzYWJsZVdvcmRQb3BvdmVyPXtkaXNhYmxlV29yZFBvcG92ZXJffVxuICAgICAgICBmb250U2l6ZT17Zm9udFNpemV9XG4gICAgICAgIGdldExleGljb25EYXRhPXtnZXRMZXhpY29uRGF0YX1cbiAgICAgICAgaXNOVD17aXNOVF99XG4gICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgIHJlZlN0eWxlPXtyZWZTdHlsZX1cbiAgICAgICAgcmVmZXJlbmNlPXtfcmVmZXJlbmNlfVxuICAgICAgICBzYXZpbmc9e3N0YXJ0U2F2ZX1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnPXtfc2NyaXB0dXJlQWxpZ25tZW50RWRpdENvbmZpZ31cbiAgICAgICAgc2V0V29yZEFsaWduZXJTdGF0dXM9e3NldFdvcmRBbGlnbmVyU3RhdHVzfVxuICAgICAgICBzZXJ2ZXI9e3NlcnZlcn1cbiAgICAgICAgdHJhbnNsYXRlPXt0cmFuc2xhdGV9XG4gICAgICAvPlxuICAgIClcbiAgfSlcblxuICByZXR1cm4gKFxuICAgIDxDYXJkXG4gICAgICBpZD17YHNjcmlwdHVyZV9jYXJkXyR7Y2FyZE51bX1gfVxuICAgICAgdGl0bGU9e3NjcmlwdHVyZUxhYmVsfVxuICAgICAgc2V0dGluZ3NUaXRsZT17c2NyaXB0dXJlVGl0bGUgKyAnIFNldHRpbmdzJ31cbiAgICAgIGl0ZW1zPXtpdGVtc31cbiAgICAgIGNsYXNzZXM9e2NsYXNzZXN9XG4gICAgICBoZWFkZXJzPXtoZWFkZXJzfVxuICAgICAgZmlsdGVycz17ZmlsdGVyc31cbiAgICAgIGZvbnRTaXplPXtmb250U2l6ZX1cbiAgICAgIGl0ZW1JbmRleD17aXRlbUluZGV4fVxuICAgICAgc2V0RmlsdGVycz17c2V0RmlsdGVyc31cbiAgICAgIHNldEZvbnRTaXplPXtzZXRGb250U2l6ZX1cbiAgICAgIHNldEl0ZW1JbmRleD17c2V0SXRlbUluZGV4fVxuICAgICAgbWFya2Rvd25WaWV3PXttYXJrZG93blZpZXd9XG4gICAgICBzZXRNYXJrZG93blZpZXc9e3NldE1hcmtkb3duVmlld31cbiAgICAgIGdldEN1c3RvbUNvbXBvbmVudD17Z2V0U2NyaXB0dXJlU2VsZWN0b3J9XG4gICAgICBoaWRlTWFya2Rvd25Ub2dnbGVcbiAgICAgIG9uTWVudUNsb3NlPXtvbk1lbnVDbG9zZX1cbiAgICAgIG9uTWluaW1pemU9e29uTWluaW1pemUgPyAoKSA9PiBvbk1pbmltaXplKGlkKSA6IG51bGx9XG4gICAgICBlZGl0YWJsZT17ZW5hYmxlRWRpdCB8fCBlbmFibGVBbGlnbm1lbnR9XG4gICAgICBzYXZlZD17c3RhcnRTYXZlIHx8ICFoYXZlVW5zYXZlZENoYW5nZXN9XG4gICAgICBvblNhdmVFZGl0PXsoKSA9PiBzZXRTdGF0ZSh7IHNhdmVDbGlja2VkOiB0cnVlIH0pfVxuICAgID5cbiAgICAgIDxkaXYgaWQ9XCJzY3JpcHR1cmUtcGFuZS1saXN0XCI+XG4gICAgICAgIHtyZW5kZXJlZFNjcmlwdHVyZVBhbmVzfVxuICAgICAgPC9kaXY+XG4gICAgPC9DYXJkPlxuICApXG59XG5cblNjcmlwdHVyZUNhcmQucHJvcFR5cGVzID0ge1xuICAvKiogaHRtbCBpZGVudGlmaWVyIHRvIHVzZSBmb3IgY2FyZCAqL1xuICBpZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgTlQgb3IgT1QgKi9cbiAgaXNOVDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgLyoqIHRpdGxlIGZvciBzY3JpcHR1cmUgY2FyZCAqL1xuICB0aXRsZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAvKiogZ2V0IGxhbmd1YWdlIGRldGFpbHMgKi9cbiAgZ2V0TGFuZ3VhZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIC8qKiBzY3JpcHR1cmUgY2FyZCBudW1iZXIgKDAgdG8gMiBmb3IgZXhhbXBsZSkgKi9cbiAgY2FyZE51bTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAvKiogcmVzb3VyY2Ugb2JqZWN0ICovXG4gIHJlc291cmNlOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIC8qKiByZXNvdXJjZSBsYW5ndWFnZSB0byB1c2UgKi9cbiAgICBsYW5ndWFnZUlkOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgLyoqIHJlcG8gb3duZXIgc3VjaCBhcyB1bmZvbGRpbmdXb3JkICovXG4gICAgb3duZXI6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgICAvKiogcmVzb3VyY2VJZCB0byB1c2UgKGUuZy4gdWdudCkgKi9cbiAgICByZXNvdXJjZUlkOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgLyoqIHJlcG8gb3duZXIgZm9yIG9yaWdpbmFsIGxhbmd1YWdlcyBzdWNoIGFzIHVuZm9sZGluZ1dvcmQgKi9cbiAgICBvcmlnaW5hbExhbmd1YWdlT3duZXI6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgfSksXG4gIHJlZmVyZW5jZTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAvKiogcHJvamVjdElkIChib29rSUQpIHRvIHVzZSAqL1xuICAgIHByb2plY3RJZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIC8qKiBjdXJyZW50IGNoYXB0ZXIgbnVtYmVyICovXG4gICAgY2hhcHRlcjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLmlzUmVxdWlyZWQsXG4gICAgLyoqIGN1cnJlbnQgdmVyc2UgbnVtYmVyICovXG4gICAgdmVyc2U6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKS5pc1JlcXVpcmVkLFxuICB9KSxcbiAgLyoqIHNlcnZlciAoZS5nLiAnaHR0cHM6Ly9naXQuZG9vcjQzLm9yZycpICovXG4gIHNlcnZlcjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAvKiogcmVwbyBicmFuY2ggb3IgdGFnIHN1Y2ggYXMgbWFzdGVyICovXG4gIGFwcFJlZjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAvKiogaWYgdHJ1ZSB0aGVuIHdvcmQgZGF0YSBob3ZlciBpcyBzaG93biAqL1xuICBkaXNhYmxlV29yZFBvcG92ZXI6IFByb3BUeXBlcy5ib29sLFxuICAvKiogQ1NTIGNsYXNzZXMgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqIHJlc291cmNlTGluayAqL1xuICByZXNvdXJjZUxpbms6IFByb3BUeXBlcy5hbnksXG4gIC8qKiB1c2UgbWV0aG9kIGZvciB1c2luZyBsb2NhbCBzdG9yYWdlIHNwZWNpZmljIGZvciB1c2VyICovXG4gIHVzZVVzZXJMb2NhbFN0b3JhZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIC8qKiBvcHRpb25hbCBjYWxsYmFjayBpZiBlcnJvciBsb2FkaW5nIHJlc291cmNlLCBwYXJhbWV0ZXIgcmV0dXJuZWQgYXJlOlxuICAgKiAgICAoe3N0cmluZ30gZXJyb3JNZXNzYWdlLCB7Ym9vbGVhbn0gaXNBY2Nlc3NFcnJvciwge29iamVjdH0gcmVzb3VyY2VTdGF0dXMpXG4gICAqICAgICAgLSBpc0FjY2Vzc0Vycm9yIC0gaXMgdHJ1ZSBpZiB0aGlzIHdhcyBhbiBlcnJvciB0cnlpbmcgdG8gYWNjZXNzIGZpbGVcbiAgICogICAgICAtIHJlc291cmNlU3RhdHVzIC0gaXMgb2JqZWN0IGNvbnRhaW5pbmcgZGV0YWlscyBhYm91dCBwcm9ibGVtcyBmZXRjaGluZyByZXNvdXJjZSAqL1xuICBvblJlc291cmNlRXJyb3I6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogb3B0aW9uYWwgaHR0cCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgZmV0Y2hpbmcgcmVzb3VyY2VzLCBkZWZhdWx0IGlzIDAgKHZlcnkgbG9uZyB3YWl0KSAqL1xuICBodHRwQ29uZmlnOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKiogb3B0aW9uYWwgdXJsIGZvciBncmVlayByZXBvICovXG4gIGdyZWVrUmVwb1VybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqIG9wdGlvbmFsIHVybCBmb3IgaGVicmV3IHJlcG8gKi9cbiAgaGVicmV3UmVwb1VybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqIGZ1bmN0aW9uIHRvIGdldCBsYXRlc3QgbGV4aWNvbiBkYXRhICovXG4gIGdldExleGljb25EYXRhOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIGZ1bmN0aW9uIHRvIHByZS1sb2FkIGxleGljb24gZGF0YSBmb3IgdmVyc2UgKi9cbiAgZmV0Y2hHbG9zc2VzRm9yVmVyc2U6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogb3B0aW9uYWwgZnVuY3Rpb24gZm9yIGxvY2FsaXphdGlvbiAqL1xuICB0cmFuc2xhdGU6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogZnVuY3Rpb24gdG8gbWluaW1pemUgdGhlIGNhcmQgKG9wdGlvbmFsKSAqL1xuICBvbk1pbmltaXplOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIHVzZXItbmFtZSAqL1xuICBsb2dnZWRJblVzZXI6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKiBhdXRoZW50aWNhdGlvbiBpbmZvICovXG4gIGF1dGhlbnRpY2F0aW9uOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKiogZnVuY3Rpb24gdG8gc2V0IHN0YXRlIGluIGFwcCB0aGF0IHRoZXJlIGFyZSB1bnNhdmVkIGNoYW5nZXMgKi9cbiAgc2V0U2F2ZWRDaGFuZ2VzOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIGluZGV4IGZvciBjdXJyZW50IGJvb2sgKGUuZy4gJzAxJyBmb3IgJ2dlbicpKi9cbiAgYm9va0luZGV4OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKiogY2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUgdXNpbmcgYSB2ZXJzZSByYW5nZSBoZXJlICovXG4gIGFkZFZlcnNlUmFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogY2FsbGJhY2sgdG8gdXBkYXRlIHdvcmQgYWxpZ25lciBzdGF0ZSAqL1xuICBzZXRXb3JkQWxpZ25lclN0YXR1czogUHJvcFR5cGVzLmZ1bmMsXG59XG4iXX0=
1390
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1NjcmlwdHVyZUNhcmQvU2NyaXB0dXJlQ2FyZC50c3giXSwibmFtZXMiOlsiUmVhY3QiLCJQcm9wVHlwZXMiLCJjb3JlIiwiU2VsZWN0aW9uc0NvbnRleHRQcm92aWRlciIsInVzZm1qcyIsInVzZUVkaXQiLCJJY29uQnV0dG9uIiwiUnhMaW5rMiIsIlJ4TGlua0JyZWFrMiIsIkNhcmQiLCJFUlJPUl9TVEFURSIsIk1BTklGRVNUX05PVF9MT0FERURfRVJST1IiLCJ1c2VDYXJkU3RhdGUiLCJ1c2VVc2VyQnJhbmNoIiwiZ2V0UXVvdGVNYXRjaGVzSW5Cb29rUmVmIiwiQWxpZ25tZW50SGVscGVycyIsIlVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMiLCJpc0VxdWFsIiwiZ2V0VmVyc2VzIiwiU2NyaXB0dXJlUGFuZSIsIlNjcmlwdHVyZVNlbGVjdG9yIiwidXNlU2NyaXB0dXJlU2V0dGluZ3MiLCJjbGVhbnVwVmVyc2VPYmplY3RzIiwiZml4T2NjdXJyZW5jZSIsImdldFJlc291cmNlTGluayIsImdldFJlc291cmNlTWVzc2FnZSIsImdldFNjcmlwdHVyZVZlcnNpb25TZXR0aW5ncyIsImlzT3JpZ2luYWxCaWJsZSIsImRlbGF5IiwiYXJlTWFwc1RoZVNhbWUiLCJUaXRsZSIsIk5UX09SSUdfTEFORyIsIk9SSUdJTkFMX1NPVVJDRSIsIk9UX09SSUdfTEFORyIsIlZlcnNlU2VsZWN0b3JQb3B1cCIsIktFWV9GT05UX1NJWkVfQkFTRSIsImxhYmVsIiwic3R5bGUiLCJtYXJnaW5Ub3AiLCJ3aWR0aCIsImNvbXBhcmVPYmplY3QiLCJ2ZXJzZVJlZiIsImNoYXB0ZXIiLCJ2ZXJzZSIsInZlcnNlRGF0YSIsInZlcnNlT2JqZWN0cyIsImxlbmd0aCIsImFyZVZlcnNlc1NhbWUiLCJ2ZXJzZXNGb3JSZWYxIiwidmVyc2VzRm9yUmVmMiIsImFyZVNhbWUiLCJpIiwibCIsInZlcnNlMSIsInZlcnNlMiIsIlNjcmlwdHVyZUNhcmQiLCJhcHBSZWYiLCJhdXRoZW50aWNhdGlvbiIsImJvb2tJbmRleCIsImNhcmROdW0iLCJjbGFzc2VzIiwiZGlzYWJsZVdvcmRQb3BvdmVyIiwiZ2V0TGFuZ3VhZ2UiLCJnZXRMZXhpY29uRGF0YSIsImdyZWVrUmVwb1VybCIsImhlYnJld1JlcG9VcmwiLCJodHRwQ29uZmlnIiwiaWQiLCJpc05UIiwibG9nZ2VkSW5Vc2VyIiwib25NaW5pbWl6ZSIsIm9uUmVzb3VyY2VFcnJvciIsIm9yaWdpbmFsU2NyaXB0dXJlQm9va09iamVjdHMiLCJyZWZlcmVuY2UiLCJyZXNvdXJjZSIsIm93bmVyIiwibGFuZ3VhZ2VJZCIsInJlc291cmNlSWQiLCJvcmlnaW5hbExhbmd1YWdlT3duZXIiLCJyZXNvdXJjZUxpbmsiLCJzZWxlY3RlZFF1b3RlIiwic2VydmVyIiwic2V0U2F2ZWRDaGFuZ2VzIiwic2V0V29yZEFsaWduZXJTdGF0dXMiLCJ0cmFuc2xhdGUiLCJ0aXRsZSIsInVzZVVzZXJMb2NhbFN0b3JhZ2UiLCJib29rSWQiLCJwcm9qZWN0SWQiLCJ1c2VTdGF0ZSIsImNoZWNrRm9yRWRpdEJyYW5jaCIsImN1cnJlbnRSZWZlcmVuY2UiLCJlZGl0QnJhbmNoUmVhZHkiLCJoYXZlVW5zYXZlZENoYW5nZXMiLCJsYXN0U2VsZWN0ZWRRdW90ZSIsInJlYWR5Rm9yRmV0Y2giLCJyZWYiLCJzYXZlQ2xpY2tlZCIsInNhdmVDb250ZW50Iiwic2VsZWN0aW9ucyIsIk1hcCIsInNoYSIsInN0YXJ0U2F2ZSIsInVybEVycm9yIiwidXNpbmdVc2VyQnJhbmNoIiwidW5zYXZlZENoYW5nZXNMaXN0IiwidmVyc2VzRm9yUmVmIiwic2hvd0FsaWdubWVudFBvcHVwIiwidmVyc2VTZWxlY3RlZEZvckFsaWdubWVudCIsInZlcnNlc0FsaWdubWVudFN0YXR1cyIsInZlcnNlT2JqZWN0c01hcCIsInN0YXRlIiwic2V0U3RhdGVfIiwiZm9udFNpemUiLCJzZXRGb250U2l6ZSIsImlzTlRfIiwic2V0U3RhdGUiLCJuZXdTdGF0ZSIsInByZXZTdGF0ZSIsImNhY2hlIiwibWF4QWdlIiwibm9DYWNoZSIsInNldFVybEVycm9yIiwiZXJyb3IiLCJ3aG9sZUJvb2siLCJpc05ld1Rlc3RhbWVudCIsInNjcmlwdHVyZUNvbmZpZyIsInNldFNjcmlwdHVyZSIsInNjcmlwdHVyZVNldHRpbmdzIiwic2NyaXB0dXJlVmVyc2lvbkhpc3QiLCJmZXRjaFJlc3BfIiwiZmV0Y2hSZXNwb25zZSIsInJlcG8iLCJyZWZlcmVuY2VfIiwidXNlRWZmZWN0IiwiX3NoYSIsImRhdGEiLCJ1cmwiLCJkb3dubG9hZF91cmwiLCJ2YWxpZEJyYW5jaCIsInBhcnRzIiwic3BsaXQiLCJmZXRjaEJyYW5jaCIsImNvbnNvbGUiLCJsb2ciLCJKU09OIiwic3RyaW5naWZ5IiwiY2FyZFJlc291cmNlSWQiLCJyZWZfIiwiY2FuVXNlRWRpdEJyYW5jaCIsImluY2x1ZGVzIiwiY2FyZElkIiwiYnJhbmNoRGV0ZXJtaW5lZCIsInVzZXJFZGl0QnJhbmNoTmFtZSIsIl91c2luZ1VzZXJCcmFuY2giLCJ3b3JraW5nUmVzb3VyY2VCcmFuY2giLCJzdGFydEVkaXRCcmFuY2giLCJhY3Rpb25zIiwic3RhcnRFZGl0Iiwid29ya2luZ1JlZiIsInNjcmlwdHVyZVRpdGxlIiwicmVzb3VyY2VTdGF0dXMiLCJtZXNzYWdlIiwiaXNBY2Nlc3NFcnJvciIsInZlcnNpb24iLCJ1cGRhdGVUaXRsZSIsImdldFNjcmlwdHVyZVNlbGVjdG9yIiwic2NyaXB0dXJlU2VsZWN0aW9uQ29uZmlnIiwib25NZW51Q2xvc2UiLCJsYW5ndWFnZUlkXyIsImxhbmd1YWdlIiwiZGlyZWN0aW9uIiwiX3JlZmVyZW5jZSIsImlzSGVicmV3IiwiZm9udEZhY3RvciIsInNjYWxlZEZvbnRTaXplIiwiaXRlbXMiLCJoZWFkZXJzIiwiZmlsdGVycyIsIml0ZW1JbmRleCIsIm1hcmtkb3duVmlldyIsInNldEZpbHRlcnMiLCJzZXRJdGVtSW5kZXgiLCJzZXRNYXJrZG93blZpZXciLCJyZWZTdHlsZSIsInVzZU1lbW8iLCJmb250RmFtaWx5IiwiTWF0aCIsInJvdW5kIiwiY29udGVudFN0eWxlIiwic2NyaXB0dXJlTGFiZWwiLCJkaXNhYmxlV29yZFBvcG92ZXJfIiwidXNpbmdPcmlnaW5hbEJpYmxlIiwidW5kZWZpbmVkIiwiZW5hYmxlRWRpdCIsImVuYWJsZUFsaWdubWVudCIsIm9yaWdpbmFsUmVwb1VybCIsInNjcmlwdHVyZUFsaWdubWVudEVkaXRDb25maWciLCJjdXJyZW50VmVyc2VSZWYiLCJfc2V0U2F2ZWRDaGFuZ2VzIiwic291cmNlTGFuZ3VhZ2UiLCJ0YXJnZXRMYW5ndWFnZSIsImN1cnJlbnRJbmRleCIsInNhdmVkIiwiZ2V0Q2hhbmdlcyIsImNsZWFyQ2hhbmdlcyIsIl91bnNhdmVkQ2hhbmdlc0xpc3QiLCJoYXNPd25Qcm9wZXJ0eSIsIl9oYXZlVW5zYXZlZENoYW5nZXMiLCJPYmplY3QiLCJrZXlzIiwiZmluZFJlZkluQXJyYXkiLCJmaW5kSXRlbSIsImNodW5rcyIsInJlZkxlbiIsImluZGV4IiwiZmluZEluZGV4IiwiY2h1bmsiLCJpZHgiLCJzdWJzdHJpbmciLCJuZXh0Q2hhciIsImdldEJvb2tOYW1lIiwiYm9va0NhcHMiLCJ0b1VwcGVyQ2FzZSIsImZpbGVwYXRoIiwiY29udGVudCIsImNvbmZpZyIsInRva2VuIiwidGltZW91dCIsInNlcnZlclRpbWVPdXQiLCJkb250Q3JlYXRlQnJhbmNoIiwiYXV0aG9yIiwiYnJhbmNoIiwic2F2ZUVycm9yIiwiaXNTYXZlRXJyb3IiLCJpc0Vycm9yIiwib25TYXZlRWRpdCIsIl9zYXZlRWRpdCIsImluZm8iLCJ0aGVuIiwic3VjY2VzcyIsInVuc2F2ZWRDYXJkSW5kaWNlcyIsImNhcmRJbmRleCIsInJlbG9hZFJlc291cmNlIiwibWVyZ2VWZXJzZU9iamVjdHNJbnRvQmlibGVVc2ZtIiwiYmlibGVVc2ZtIiwidXBkYXRlZFZlcnNlT2JqZWN0cyIsIm5ld1VzZm0iLCJjaGFwdGVyQ2h1bmtzIiwiY2hhcHRlckluZGV4IiwiY3VycmVudENoYXB0ZXIiLCJ2ZXJzZUNodW5rcyIsInZlcnNlSW5kZXgiLCJuZXdWZXJzZVVzZm0iLCJjb252ZXJ0VmVyc2VEYXRhVG9VU0ZNIiwib2xkVmVyc2UiLCJ2ZXJzZU51bUxlbiIsIm5ld0NoYXB0ZXIiLCJqb2luIiwiZ2V0UmVhZHlGb3JTYXZlIiwiY3JlYXRlRWRpdEJyYW5jaCIsIndhcm4iLCJnZXRSZXNwb25zZURhdGEiLCJtZXJnZUZhaWwiLCJwYXJzZUludCIsIm5ld1ZlcnNlVGV4dCIsInRhcmdldFZlcnNlT2JqZWN0c18iLCJ1cGRhdGVBbGlnbm1lbnRzVG9UYXJnZXRWZXJzZSIsInRhcmdldFZlcnNlT2JqZWN0cyIsIm5ld0Jvb2tKc29uIiwidXBkYXRlVmVyc2UiLCJ0b1VTRk0iLCJmb3JjZWROZXdMaW5lcyIsIl92ZXJzZXNGb3JSZWYiLCJuZXdTZWxlY3Rpb25zIiwidXBkYXRlU2VsZWN0aW9ucyIsIl9tYXAiLCJvcmlnaW5hbEJvb2tJZCIsImJvb2tWZXJzZU9iamVjdCIsImNoYXB0ZXJzIiwibmV3U2VsZWN0ZWRRdW90ZSIsInF1b3RlIiwib3JpZ2luYWxWZXJzZXMiLCJzdWJzdGl0dXRlIiwic3RhcnRWZXJzZSIsImxhc3RWZXJzZSIsIl92ZXJzZSIsInZlcnNlcyIsInZlcnNlSXRlbSIsInZvIiwiY29uY2F0Iiwic2V0Iiwic3ViUmVmIiwicXVvdGVNYXRjaGVzIiwiYm9va09iamVjdCIsIm9jY3VycmVuY2UiLCJzaXplIiwiZm9yRWFjaCIsIndvcmRzIiwia2V5IiwiX2tleSIsIm1hcCIsIndvcmQiLCJ0ZXh0Iiwibm9ybWFsaXplU3RyaW5nIiwiYm9va3NOb3RTYW1lIiwidXBkYXRlVmVyc2VzQWxpZ25tZW50U3RhdHVzIiwiYWxpZ25lZCIsInJlbmRlcmVkU2NyaXB0dXJlUGFuZXMiLCJfY3VycmVudFZlcnNlRGF0YSIsImluaXRpYWxWZXJzZU9iamVjdHMiLCJfc2NyaXB0dXJlQWxpZ25tZW50RWRpdENvbmZpZyIsImlzVmVyc2VTZWxlY3RlZEZvckFsaWdubWVudCIsImhhbmRsZUFsaWduQnV0dG9uQ2xpY2siLCJvblJlbmRlclRvb2xiYXIiLCJuZXdJdGVtcyIsImFsbFZlcnNlc0FsaWduZWQiLCJ2YWx1ZXMiLCJldmVyeSIsImFsaWduU3RhdHVzIiwiYWxpZ25JY29uIiwiYWxpZ25CdXR0b25UZXh0IiwicHVzaCIsImN1cnNvciIsInByb3BUeXBlcyIsInN0cmluZyIsImlzUmVxdWlyZWQiLCJvYmplY3QiLCJudW1iZXIiLCJib29sIiwiZnVuYyIsInNoYXBlIiwib25lT2ZUeXBlIiwiYW55Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBS0EsS0FBWixNQUF1QixPQUF2QjtBQUNBLE9BQU8sS0FBS0MsU0FBWixNQUEyQixZQUEzQjtBQUNBLFNBQVNDLElBQVQsRUFBZUMseUJBQWYsUUFBZ0QseUJBQWhEO0FBQ0EsT0FBT0MsTUFBUCxNQUFtQixTQUFuQjtBQUNBLFNBQVNDLE9BQVQsUUFBd0IscUJBQXhCO0FBQ0EsU0FBU0MsVUFBVCxRQUEyQixlQUEzQjtBQUNBLFNBQVNDLE9BQVQsRUFBa0JDLFlBQWxCLFFBQXNDLGdCQUF0QztBQUNBLFNBQ0VDLElBREYsRUFFRUMsV0FGRixFQUdFQyx5QkFIRixFQUlFQyxZQUpGLEVBS0VDLGFBTEYsUUFNTyx1QkFOUCxDLENBT0E7O0FBQ0EsU0FBU0Msd0JBQVQsUUFBeUMsa0JBQXpDO0FBQ0EsU0FBU0MsZ0JBQVQsRUFBMkJDLHlCQUEzQixRQUE0RCxrQkFBNUQ7QUFDQSxPQUFPLEtBQUtDLE9BQVosTUFBeUIsWUFBekI7QUFDQSxTQUFTQyxTQUFULFFBQTBCLHVCQUExQjtBQUNBLFNBQVNDLGFBQVQsRUFBd0JDLGlCQUF4QixRQUFpRCxJQUFqRDtBQUNBLFNBQVNDLG9CQUFULFFBQXFDLGtDQUFyQztBQUNBLFNBQ0VDLG1CQURGLEVBRUVDLGFBRkYsRUFHRUMsZUFIRixFQUlFQyxrQkFKRixFQUtFQywyQkFMRixFQU1FQyxlQU5GLFFBT08sK0JB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VSxLQUFWLENBQWdCO0FBQ3hCO0FBQ0EvUCxJQUFBQSxVQUFVLEVBQUUzRSxTQUFTLENBQUNvVSxNQUFWLENBQWlCQyxVQUZMOztBQUd4QjtBQUNBM1AsSUFBQUEsS0FBSyxFQUFFMUUsU0FBUyxDQUFDb1UsTUFBVixDQUFpQkMsVUFKQTs7QUFLeEI7QUFDQXpQLElBQUFBLFVBQVUsRUFBRTVFLFNBQVMsQ0FBQ29VLE1BQVYsQ0FBaUJDLFVBTkw7O0FBT3hCO0FBQ0F4UCxJQUFBQSxxQkFBcUIsRUFBRTdFLFNBQVMsQ0FBQ29VLE1BQVYsQ0FBaUJDO0FBUmhCLEdBQWhCLENBL0NjOztBQXlEeEI7QUFDQXZQLEVBQUFBLFlBQVksRUFBRTlFLFNBQVMsQ0FBQzRVLEdBMURBOztBQTJEeEI7QUFDQTdQLEVBQUFBLGFBQWEsRUFBRS9FLFNBQVMsQ0FBQ3NVLE1BNUREOztBQTZEeEI7QUFDQXRQLEVBQUFBLE1BQU0sRUFBRWhGLFNBQVMsQ0FBQ29VLE1BQVYsQ0FBaUJDLFVBOUREOztBQStEeEI7QUFDQXBQLEVBQUFBLGVBQWUsRUFBRWpGLFNBQVMsQ0FBQ3lVLElBaEVIOztBQWlFeEI7QUFDQXZQLEVBQUFBLG9CQUFvQixFQUFFbEYsU0FBUyxDQUFDeVUsSUFsRVI7O0FBbUV4QjtBQUNBclAsRUFBQUEsS0FBSyxFQUFFcEYsU0FBUyxDQUFDb1UsTUFBVixDQUFpQkMsVUFwRUE7O0FBcUV4QjtBQUNBbFAsRUFBQUEsU0FBUyxFQUFFbkYsU0FBUyxDQUFDeVUsSUF0RUc7O0FBdUV4QjtBQUNBcFAsRUFBQUEsbUJBQW1CLEVBQUVyRixTQUFTLENBQUN5VSxJQUFWLENBQWVKO0FBeEVaLENBQTFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgKiBhcyBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcydcbmltcG9ydCB7IGNvcmUsIFNlbGVjdGlvbnNDb250ZXh0UHJvdmlkZXIgfSBmcm9tICdzY3JpcHR1cmUtcmVzb3VyY2VzLXJjbCdcbmltcG9ydCB1c2ZtanMgZnJvbSAndXNmbS1qcydcbmltcG9ydCB7IHVzZUVkaXQgfSBmcm9tICdnaXRlYS1yZWFjdC10b29sa2l0J1xuaW1wb3J0IHsgSWNvbkJ1dHRvbiB9IGZyb20gJ0BtdWkvbWF0ZXJpYWwnXG5pbXBvcnQgeyBSeExpbmsyLCBSeExpbmtCcmVhazIgfSBmcm9tICdyZWFjdC1pY29ucy9yeCdcbmltcG9ydCB7XG4gIENhcmQsXG4gIEVSUk9SX1NUQVRFLFxuICBNQU5JRkVTVF9OT1RfTE9BREVEX0VSUk9SLFxuICB1c2VDYXJkU3RhdGUsXG4gIHVzZVVzZXJCcmFuY2gsXG59IGZyb20gJ3RyYW5zbGF0aW9uLWhlbHBzLXJjbCdcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IGdldFF1b3RlTWF0Y2hlc0luQm9va1JlZiB9IGZyb20gJ3V3LXF1b3RlLWhlbHBlcnMnXG5pbXBvcnQgeyBBbGlnbm1lbnRIZWxwZXJzLCBVc2ZtRmlsZUNvbnZlcnNpb25IZWxwZXJzIH0gZnJvbSAnd29yZC1hbGlnbmVyLXJjbCdcbmltcG9ydCAqIGFzIGlzRXF1YWwgZnJvbSAnZGVlcC1lcXVhbCdcbmltcG9ydCB7IGdldFZlcnNlcyB9IGZyb20gJ2JpYmxlLXJlZmVyZW5jZS1yYW5nZSdcbmltcG9ydCB7IFNjcmlwdHVyZVBhbmUsIFNjcmlwdHVyZVNlbGVjdG9yIH0gZnJvbSAnLi4nXG5pbXBvcnQgeyB1c2VTY3JpcHR1cmVTZXR0aW5ncyB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVNjcmlwdHVyZVNldHRpbmdzJ1xuaW1wb3J0IHtcbiAgY2xlYW51cFZlcnNlT2JqZWN0cyxcbiAgZml4T2NjdXJyZW5jZSxcbiAgZ2V0UmVzb3VyY2VMaW5rLFxuICBnZXRSZXNvdXJjZU1lc3NhZ2UsXG4gIGdldFNjcmlwdHVyZVZlcnNpb25TZXR0aW5ncyxcbiAgaXNPcmlnaW5hbEJpYmxlLFxufSBmcm9tICcuLi8uLi91dGlscy9TY3JpcHR1cmVTZXR0aW5ncydcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSAnLi4vLi4vdXRpbHMvZGVsYXknXG5pbXBvcnQgeyBhcmVNYXBzVGhlU2FtZSB9IGZyb20gJy4uLy4uL3V0aWxzL21hcHMnXG5pbXBvcnQgeyBUaXRsZSB9IGZyb20gJy4uL1NjcmlwdHVyZVBhbmUvc3R5bGVkJ1xuaW1wb3J0IHtcbiAgTlRfT1JJR19MQU5HLFxuICBPUklHSU5BTF9TT1VSQ0UsXG4gIE9UX09SSUdfTEFORyxcbn0gZnJvbSAnLi4vLi4vdXRpbHMnXG5pbXBvcnQgeyBWZXJzZVNlbGVjdG9yUG9wdXAgfSBmcm9tICcuLi9WZXJzZVNlbGVjdG9yUG9wdXAnXG5cbmNvbnN0IEtFWV9GT05UX1NJWkVfQkFTRSA9ICdzY3JpcHR1cmVQYW5lRm9udFNpemVfJ1xuY29uc3QgbGFiZWwgPSAnVmVyc2lvbidcbmNvbnN0IHN0eWxlID0geyBtYXJnaW5Ub3A6ICcxNnB4Jywgd2lkdGg6ICc1MDBweCcgfVxuXG4vKipcbiAqIGNyZWF0ZSBhIHNob3J0IGNvbXBhcmlzb24gdmVyc2UgcmVmIG9iamVjdCB3aXRob3V0IGFsbCB0aGUgdmVyc2VEYXRhXG4gKiBAcGFyYW0gdmVyc2VSZWZcbiAqL1xuZnVuY3Rpb24gY29tcGFyZU9iamVjdCh2ZXJzZVJlZikge1xuICBjb25zdCB7XG4gICAgY2hhcHRlcixcbiAgICB2ZXJzZSxcbiAgICB2ZXJzZURhdGEsXG4gIH0gPSB2ZXJzZVJlZiB8fCB7fVxuICBjb25zdCB2ZXJzZU9iamVjdHMgPSB2ZXJzZURhdGE/LnZlcnNlT2JqZWN0cz8ubGVuZ3RoIHx8IDBcbiAgcmV0dXJuIHtcbiAgICBjaGFwdGVyLFxuICAgIHZlcnNlLFxuICAgIHZlcnNlT2JqZWN0cyxcbiAgfVxufVxuXG4vKipcbiAqIGNvbXBhcmUgdHdvIHZlcnNlIHJlZnMgdG8gc2VlIGlmIHRoZXkgYXJlIHN1YnN0YW50aWFsbHkgc2ltaWxhclxuICogQHBhcmFtIHZlcnNlc0ZvclJlZjFcbiAqIEBwYXJhbSB2ZXJzZXNGb3JSZWYyXG4gKi9cbmZ1bmN0aW9uIGFyZVZlcnNlc1NhbWUodmVyc2VzRm9yUmVmMTogYW55W10sIHZlcnNlc0ZvclJlZjI6IGFueVtdKSB7XG4gIHZlcnNlc0ZvclJlZjEgPSB2ZXJzZXNGb3JSZWYxIHx8IFtdXG4gIHZlcnNlc0ZvclJlZjIgPSB2ZXJzZXNGb3JSZWYyIHx8IFtdXG4gIGxldCBhcmVTYW1lID0gZmFsc2VcblxuICBpZiAodmVyc2VzRm9yUmVmMS5sZW5ndGggPT09IHZlcnNlc0ZvclJlZjIubGVuZ3RoKSB7XG4gICAgYXJlU2FtZSA9IHRydWVcblxuICAgIGZvciAobGV0IGkgPSAwLCBsPSB2ZXJzZXNGb3JSZWYxLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgY29uc3QgdmVyc2UxID0gY29tcGFyZU9iamVjdCh2ZXJzZXNGb3JSZWYxW2ldKVxuICAgICAgY29uc3QgdmVyc2UyID0gY29tcGFyZU9iamVjdCh2ZXJzZXNGb3JSZWYyW2ldKVxuICAgICAgYXJlU2FtZSA9IGlzRXF1YWwodmVyc2UxLCB2ZXJzZTIpXG5cbiAgICAgIGlmICghYXJlU2FtZSkge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhcmVTYW1lXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNjcmlwdHVyZUNhcmQoe1xuICBhcHBSZWYsXG4gIGF1dGhlbnRpY2F0aW9uLFxuICBib29rSW5kZXgsXG4gIGNhcmROdW0sXG4gIGNsYXNzZXMsXG4gIGRpc2FibGVXb3JkUG9wb3ZlcixcbiAgZ2V0TGFuZ3VhZ2UsXG4gIGdldExleGljb25EYXRhLFxuICBncmVla1JlcG9VcmwsXG4gIGhlYnJld1JlcG9VcmwsXG4gIGh0dHBDb25maWcsXG4gIGlkLFxuICBpc05ULFxuICBsb2dnZWRJblVzZXIsXG4gIG9uTWluaW1pemUsXG4gIG9uUmVzb3VyY2VFcnJvcixcbiAgb3JpZ2luYWxTY3JpcHR1cmVCb29rT2JqZWN0cyxcbiAgcmVmZXJlbmNlLFxuICByZXNvdXJjZToge1xuICAgIG93bmVyLFxuICAgIGxhbmd1YWdlSWQsXG4gICAgcmVzb3VyY2VJZCxcbiAgICBvcmlnaW5hbExhbmd1YWdlT3duZXIsXG4gIH0sXG4gIHJlc291cmNlTGluayxcbiAgc2VsZWN0ZWRRdW90ZSxcbiAgc2VydmVyLFxuICBzZXRTYXZlZENoYW5nZXMsXG4gIHNldFdvcmRBbGlnbmVyU3RhdHVzLFxuICB0cmFuc2xhdGUsXG4gIHRpdGxlLFxuICB1c2VVc2VyTG9jYWxTdG9yYWdlLFxufSkge1xuICBjb25zdCBib29rSWQgPSByZWZlcmVuY2U/LnByb2plY3RJZFxuICBjb25zdCBbc3RhdGUsIHNldFN0YXRlX10gPSBSZWFjdC51c2VTdGF0ZSh7XG4gICAgY2hlY2tGb3JFZGl0QnJhbmNoOiAwLFxuICAgIGN1cnJlbnRSZWZlcmVuY2U6IG51bGwsXG4gICAgZWRpdEJyYW5jaFJlYWR5OiBmYWxzZSxcbiAgICBoYXZlVW5zYXZlZENoYW5nZXM6IGZhbHNlLFxuICAgIGxhc3RTZWxlY3RlZFF1b3RlOiBudWxsLFxuICAgIHJlYWR5Rm9yRmV0Y2g6IGZhbHNlLFxuICAgIHJlZjogYXBwUmVmLFxuICAgIHNhdmVDbGlja2VkOiBmYWxzZSxcbiAgICBzYXZlQ29udGVudDogbnVsbCxcbiAgICBzZWxlY3Rpb25zOiBuZXcgTWFwKCksXG4gICAgc2hhOiBudWxsLFxuICAgIHN0YXJ0U2F2ZTogZmFsc2UsXG4gICAgdXJsRXJyb3I6IG51bGwsXG4gICAgdXNpbmdVc2VyQnJhbmNoOiBmYWxzZSxcbiAgICB1bnNhdmVkQ2hhbmdlc0xpc3Q6IHt9LFxuICAgIHZlcnNlc0ZvclJlZjogbnVsbCxcbiAgICBzaG93QWxpZ25tZW50UG9wdXA6IGZhbHNlLFxuICAgIHZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnQ6IG51bGwsXG4gICAgdmVyc2VzQWxpZ25tZW50U3RhdHVzOiBudWxsLFxuICAgIHZlcnNlT2JqZWN0c01hcDogbmV3IE1hcCgpLFxuICB9KVxuICBjb25zdCB7XG4gICAgY2hlY2tGb3JFZGl0QnJhbmNoLFxuICAgIGN1cnJlbnRSZWZlcmVuY2UsXG4gICAgZWRpdEJyYW5jaFJlYWR5LFxuICAgIGhhdmVVbnNhdmVkQ2hhbmdlcyxcbiAgICBsYXN0U2VsZWN0ZWRRdW90ZSxcbiAgICByZWFkeUZvckZldGNoLFxuICAgIHJlZixcbiAgICBzYXZlQ2xpY2tlZCxcbiAgICBzYXZlQ29udGVudCxcbiAgICBzZWxlY3Rpb25zLFxuICAgIHNoYSxcbiAgICBzaG93QWxpZ25tZW50UG9wdXAsXG4gICAgc3RhcnRTYXZlLFxuICAgIHVybEVycm9yLFxuICAgIHVzaW5nVXNlckJyYW5jaCxcbiAgICB1bnNhdmVkQ2hhbmdlc0xpc3QsXG4gICAgdmVyc2VPYmplY3RzTWFwLFxuICAgIHZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnQsXG4gICAgdmVyc2VzQWxpZ25tZW50U3RhdHVzLFxuICAgIHZlcnNlc0ZvclJlZixcbiAgfSA9IHN0YXRlXG5cbiAgY29uc3QgW2ZvbnRTaXplLCBzZXRGb250U2l6ZV0gPSB1c2VVc2VyTG9jYWxTdG9yYWdlKEtFWV9GT05UX1NJWkVfQkFTRSArIGNhcmROdW0sIDEwMClcbiAgY29uc3QgaXNOVF8gPSBpc05UKGJvb2tJZClcblxuICBmdW5jdGlvbiBzZXRTdGF0ZShuZXdTdGF0ZSkge1xuICAgIHNldFN0YXRlXyhwcmV2U3RhdGUgPT4gKHsgLi4ucHJldlN0YXRlLCAuLi5uZXdTdGF0ZSB9KSlcbiAgfVxuXG4gIGlmICh1c2luZ1VzZXJCcmFuY2gpIHtcbiAgICBodHRwQ29uZmlnID0ge1xuICAgICAgLi4uaHR0cENvbmZpZyxcbiAgICAgIGNhY2hlOiB7IG1heEFnZTogMCB9LFxuICAgICAgbm9DYWNoZTogdHJ1ZSxcbiAgICB9IC8vIGRpc2FibGUgaHR0cCBjYWNoaW5nXG4gIH1cblxuICBjb25zdCB7XG4gICAgaXNOZXdUZXN0YW1lbnQsXG4gICAgc2NyaXB0dXJlQ29uZmlnLFxuICAgIHNldFNjcmlwdHVyZSxcbiAgICBzY3JpcHR1cmVTZXR0aW5ncyxcbiAgICBzY3JpcHR1cmVWZXJzaW9uSGlzdCxcbiAgfSA9IHVzZVNjcmlwdHVyZVNldHRpbmdzKHtcbiAgICBpc05ULFxuICAgIHRpdGxlLFxuICAgIG93bmVyLFxuICAgIHJlZmVyZW5jZTogY3VycmVudFJlZmVyZW5jZSB8fCByZWZlcmVuY2UsXG4gICAgYXBwUmVmOiByZWYsXG4gICAgc2VydmVyLFxuICAgIGNhcmROdW0sXG4gICAgZGlzYWJsZVdvcmRQb3BvdmVyLFxuICAgIGdyZWVrUmVwb1VybCxcbiAgICBoZWJyZXdSZXBvVXJsLFxuICAgIGh0dHBDb25maWcsXG4gICAgbGFuZ3VhZ2VJZCxcbiAgICBvcmlnaW5hbExhbmd1YWdlT3duZXIsXG4gICAgcmVhZHlGb3JGZXRjaCxcbiAgICByZXNvdXJjZUlkLFxuICAgIHJlc291cmNlTGluayxcbiAgICBzZXRVcmxFcnJvcjogKGVycm9yKSA9PiBzZXRTdGF0ZSh7IHVybEVycm9yOiBlcnJvciB9KSxcbiAgICB1c2VVc2VyTG9jYWxTdG9yYWdlLFxuICAgIHdob2xlQm9vazogdHJ1ZSxcbiAgfSlcblxuICBjb25zdCBmZXRjaFJlc3BfID0gc2NyaXB0dXJlQ29uZmlnPy5mZXRjaFJlc3BvbnNlXG4gIC8vIEB0cy1pZ25vcmVcbiAgY29uc3QgcmVwbyA9IGAke3NjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/Lmxhbmd1YWdlSWR9XyR7c2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZT8ucHJvamVjdElkfWBcbiAgY29uc3QgcmVmZXJlbmNlXyA9IHNjcmlwdHVyZUNvbmZpZz8ucmVmZXJlbmNlIHx8IG51bGxcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyBnZXQgdGhlIF9zaGEgZnJvbSBsYXN0IHNjcmlwdHVyZSBkb3dubG9hZFxuICAgIGNvbnN0IF9zaGEgPSBmZXRjaFJlc3BfPy5kYXRhPy5zaGEgfHwgbnVsbFxuICAgIGNvbnN0IHVybCA9IGZldGNoUmVzcF8/LmRhdGE/LmRvd25sb2FkX3VybCB8fCBudWxsXG4gICAgbGV0IHZhbGlkQnJhbmNoID0gdHJ1ZVxuXG4gICAgaWYgKF9zaGEpIHsgLy8gVFJJQ0tZOiBzaW5jZSB0aGlzIGZldGNoIG1heSBiZSBkZWxheWVkIC0gbWFrZSBzdXJlIGl0IHdhcyBmb3IgdGhlIGN1cnJlbnQgYnJhbmNoIGJlZm9yZSB1c2luZyB0aGUgc2hhXG4gICAgICBjb25zdCBwYXJ0cyA9ICh1cmwgfHwgJycpLnNwbGl0KCcvJylcbiAgICAgIGNvbnN0IGZldGNoQnJhbmNoID0gcGFydHMubGVuZ3RoID4gNyA/IHBhcnRzWzddIDogJydcbiAgICAgIHZhbGlkQnJhbmNoID0gZmV0Y2hCcmFuY2ggPT09IHJlZlxuICAgIH1cblxuICAgIGlmICh2YWxpZEJyYW5jaCAmJiBfc2hhICE9PSBzaGEpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBTY3JpcHR1cmVDYXJkOiBmb3IgJHt1cmx9ICR7SlNPTi5zdHJpbmdpZnkocmVmZXJlbmNlXyl9IG5ldyBzaGEgaXMgJHtfc2hhfWApXG4gICAgICBzZXRTdGF0ZSh7IHNoYTogX3NoYSB9KVxuICAgIH1cbiAgfSwgW2ZldGNoUmVzcF9dKVxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgY29uc3QgY2FyZFJlc291cmNlSWQgPSBzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5wcm9qZWN0SWQgfHwgcmVzb3VyY2VJZFxuICAvLyBAdHMtaWdub3JlXG4gIGxldCByZWZfID0gc2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZT8ucmVmIHx8IGFwcFJlZlxuICBjb25zdCBjYW5Vc2VFZGl0QnJhbmNoID0gISEobG9nZ2VkSW5Vc2VyICYmIGF1dGhlbnRpY2F0aW9uICYmIChyZXNvdXJjZUlkICE9PSBPUklHSU5BTF9TT1VSQ0UpICYmIC8vIFRSSUNLWSBpZiBub3Qgb3JpZ2luYWwgbGFuZ3VhZ2UgYW5kIHdlIGhhdmUgbG9naW4gZGF0YSwgdGhlbiB3ZSBjYW4gdXNlIHRoZSBlZGl0IGJyYW5jaFxuICAgICgocmVmXyA9PT0gJ21hc3RlcicpIHx8IChyZWZfLmluY2x1ZGVzKGxvZ2dlZEluVXNlcikpKSkgLy8gYWxzbyBtYWtlIHN1cmUgbm90IGEgdmVyc2lvbiB0YWdcblxuICBjb25zdCB7XG4gICAgc3RhdGU6IHtcbiAgICAgIGJyYW5jaERldGVybWluZWQsXG4gICAgICB1c2VyRWRpdEJyYW5jaE5hbWUsXG4gICAgICB1c2luZ1VzZXJCcmFuY2g6IF91c2luZ1VzZXJCcmFuY2gsXG4gICAgICB3b3JraW5nUmVzb3VyY2VCcmFuY2gsXG4gICAgfSxcbiAgICBhY3Rpb25zOiB7IHN0YXJ0RWRpdDogc3RhcnRFZGl0QnJhbmNoIH0sXG4gIH0gPSB1c2VVc2VyQnJhbmNoKHtcbiAgICBhcHBSZWYsXG4gICAgYXV0aGVudGljYXRpb246IGNhblVzZUVkaXRCcmFuY2ggPyBhdXRoZW50aWNhdGlvbiA6IG51bGwsXG4gICAgYm9va0lkLFxuICAgIGNhcmRJZDogaWQsXG4gICAgY2FyZFJlc291cmNlSWQsXG4gICAgY2hlY2tGb3JFZGl0QnJhbmNoLFxuICAgIGxhbmd1YWdlSWQsXG4gICAgbG9nZ2VkSW5Vc2VyOiBjYW5Vc2VFZGl0QnJhbmNoID8gbG9nZ2VkSW5Vc2VyIDogbnVsbCxcbiAgICBvd25lcixcbiAgICBvblJlc291cmNlRXJyb3IsXG4gICAgc2VydmVyLFxuICAgIHVzZVVzZXJMb2NhbFN0b3JhZ2UsXG4gIH0pXG5cbiAgY29uc3Qgd29ya2luZ1JlZiA9IGNhblVzZUVkaXRCcmFuY2ggPyB3b3JraW5nUmVzb3VyY2VCcmFuY2ggOiBhcHBSZWZcbiAgbGV0IHNjcmlwdHVyZVRpdGxlXG5cbiAgaWYgKCFjYW5Vc2VFZGl0QnJhbmNoICYmICFyZWFkeUZvckZldGNoKSB7IC8vIGlmIGJpYmxlIG5vdCBlbGlnaWJsZSBmb3IgdXNlciBicmFuY2gsIG1ha2Ugc3VyZSBpdCdzIHJlYWR5XG4gICAgc2V0U3RhdGUoeyByZWFkeUZvckZldGNoOiB0cnVlIH0pXG4gIH1cblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGBTY3JpcHR1cmVDYXJkIGJvb2sgY2hhbmdlZGAsIHsgYm9va0lkLCBvd25lciwgbGFuZ3VhZ2VJZCwgcmVzb3VyY2VJZCB9KVxuXG4gICAgaWYgKGNhblVzZUVkaXRCcmFuY2gpIHsgLy8gaWYgYmlibGUgZWxpZ2libGUgZm9yIHVzZXIgYnJhbmNoLCByZWZyZXNoIGl0XG4gICAgICBzZXRTdGF0ZSh7IHJlYWR5Rm9yRmV0Y2g6IGZhbHNlLCBjaGVja0ZvckVkaXRCcmFuY2g6IGNoZWNrRm9yRWRpdEJyYW5jaCArIDEgfSlcbiAgICB9XG4gIH0sIFtib29rSWQsIG93bmVyLCBsYW5ndWFnZUlkLCByZXNvdXJjZUlkXSlcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaXNFcXVhbChyZWZlcmVuY2UsIGN1cnJlbnRSZWZlcmVuY2UpKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgU2NyaXB0dXJlQ2FyZCByZWZlcmVuY2UgY2hhbmdlZGAsIHJlZmVyZW5jZSlcbiAgICAgIHNldFN0YXRlKHsgY3VycmVudFJlZmVyZW5jZTogcmVmZXJlbmNlIH0pXG4gICAgfVxuICB9LCBbcmVmZXJlbmNlXSlcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyB3YWl0aW5nIGZvciBicmFuY2ggZmV0Y2ggdG8gY29tcGxldGVcbiAgICBjb25zb2xlLmxvZyhgU2NyaXB0dXJlQ2FyZCBicmFuY2hEZXRlcm1pbmVkIGlzICR7YnJhbmNoRGV0ZXJtaW5lZH0gYW5kIHdvcmtpbmdSZWYgaXMgJHt3b3JraW5nUmVmfSBhbmQgcmVhZHlGb3JGZXRjaCBpcyAke3JlYWR5Rm9yRmV0Y2h9YClcblxuICAgIGlmICghcmVhZHlGb3JGZXRjaCAmJiBicmFuY2hEZXRlcm1pbmVkICkge1xuICAgICAgc2V0U3RhdGUoeyByZWFkeUZvckZldGNoOiB0cnVlLCByZWY6IHdvcmtpbmdSZWYgfSlcbiAgICB9XG4gIH0sIFticmFuY2hEZXRlcm1pbmVkXSlcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyBzZWxlY3QgY29ycmVjdCB3b3JraW5nIHJlZiAtIGNvdWxkIGJlIG1hc3RlciwgdXNlciBicmFuY2gsIG9yIHJlbGVhc2VcbiAgICBpZiAoX3VzaW5nVXNlckJyYW5jaCAhPT0gdXNpbmdVc2VyQnJhbmNoKSB7XG4gICAgICBzZXRTdGF0ZSh7IHVzaW5nVXNlckJyYW5jaDogX3VzaW5nVXNlckJyYW5jaCB9KVxuICAgIH1cbiAgfSwgW191c2luZ1VzZXJCcmFuY2gsIHVzaW5nVXNlckJyYW5jaF0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gdXBkYXRlIGRpc3BsYXkgc3RhdHVzIGlmIGVycm9yXG4gICAgY29uc3QgZXJyb3IgPSBzY3JpcHR1cmVDb25maWc/LnJlc291cmNlU3RhdHVzPy5bRVJST1JfU1RBVEVdXG5cbiAgICBpZiAoZXJyb3IpIHsgLy8gaWYgZXJyb3Igd2FzIGZvdW5kIGRvIGNhbGxiYWNrXG4gICAgICBjb25zdCByZXNvdXJjZVN0YXR1cyA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2VTdGF0dXNcbiAgICAgIGNvbnN0IHJlc291cmNlTGluayA9IGdldFJlc291cmNlTGluayhzY3JpcHR1cmVDb25maWcpXG4gICAgICBjb25zdCBtZXNzYWdlID0gZ2V0UmVzb3VyY2VNZXNzYWdlKHJlc291cmNlU3RhdHVzLCBzZXJ2ZXIsIHJlc291cmNlTGluaywgaXNOVF8pXG4gICAgICBjb25zdCBpc0FjY2Vzc0Vycm9yID0gcmVzb3VyY2VTdGF0dXNbTUFOSUZFU1RfTk9UX0xPQURFRF9FUlJPUl1cbiAgICAgIG9uUmVzb3VyY2VFcnJvciAmJiBvblJlc291cmNlRXJyb3IobWVzc2FnZSwgaXNBY2Nlc3NFcnJvciwgcmVzb3VyY2VTdGF0dXMpXG4gICAgfVxuICB9LCBbc2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZVN0YXR1cz8uW0VSUk9SX1NUQVRFXV0pXG5cbiAgaWYgKHNjcmlwdHVyZUNvbmZpZy50aXRsZSAmJiBzY3JpcHR1cmVDb25maWcudmVyc2lvbikge1xuICAgIHNjcmlwdHVyZVRpdGxlID0gYCR7c2NyaXB0dXJlQ29uZmlnLnRpdGxlfSB2JHtzY3JpcHR1cmVDb25maWcudmVyc2lvbn1gXG4gICAgc2NyaXB0dXJlVmVyc2lvbkhpc3QudXBkYXRlVGl0bGUoc2NyaXB0dXJlQ29uZmlnLnJlc291cmNlTGluaywgc2NyaXB0dXJlVGl0bGUpXG4gIH0gZWxzZSB7XG4gICAgc2NyaXB0dXJlVGl0bGUgPSBgVGl0bGUgbWlzc2luZyBmcm9tIHByb2plY3QgbWFuaWZlc3RgXG4gIH1cblxuICAvKiogRHluYW1pY2FsbHkgY3JlYXRlcyB0aGUgc2NyaXB0dXJlIHNlbGVjdGlvbiBkcm9wZG93biB0byBiZSBpbnNlcnRlZCBpbnRvIGNhcmQgc2V0dGluZ3MgKi9cbiAgZnVuY3Rpb24gZ2V0U2NyaXB0dXJlU2VsZWN0b3IoKSB7XG4gICAgY29uc3Qgc2NyaXB0dXJlU2VsZWN0aW9uQ29uZmlnID0gZ2V0U2NyaXB0dXJlVmVyc2lvblNldHRpbmdzKHtcbiAgICAgIGxhYmVsLFxuICAgICAgcmVzb3VyY2VMaW5rOiBzY3JpcHR1cmVDb25maWcucmVzb3VyY2VMaW5rLFxuICAgICAgc2V0U2NyaXB0dXJlLFxuICAgICAgc2NyaXB0dXJlVmVyc2lvbkhpc3QsXG4gICAgfSlcblxuICAgIHJldHVybiA8U2NyaXB0dXJlU2VsZWN0b3Igey4uLnNjcmlwdHVyZVNlbGVjdGlvbkNvbmZpZ30gc3R5bGU9e3N0eWxlfSBlcnJvck1lc3NhZ2U9e3VybEVycm9yfSAvPlxuICB9XG5cbiAgZnVuY3Rpb24gb25NZW51Q2xvc2UoKSB7XG4gICAgLy8gY29uc29sZS5sb2coYG9uTWVudUNsb3NlKClgKVxuICAgIHNldFN0YXRlKHsgdXJsRXJyb3I6IG51bGwgfSlcbiAgfVxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgY29uc3QgbGFuZ3VhZ2VJZF8gPSBzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5sYW5ndWFnZUlkXG4gIGNvbnN0IGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UoeyBsYW5ndWFnZUlkOiBsYW5ndWFnZUlkXyB9KVxuICBjb25zdCBkaXJlY3Rpb24gPSAobGFuZ3VhZ2U/LmRpcmVjdGlvbikgfHwgJ2x0cidcbiAgY29uc3QgX3JlZmVyZW5jZSA9IGN1cnJlbnRSZWZlcmVuY2UgfHwgcmVmZXJlbmNlXG5cbiAgY29uc3QgaXNIZWJyZXcgPSAobGFuZ3VhZ2VJZF8gPT09ICdoYm8nKVxuICBjb25zdCBmb250RmFjdG9yID0gaXNIZWJyZXcgPyAxLjQgOiAxIC8vIHdlIGF1dG9tYXRpY2FsbHkgc2NhbGUgdXAgZm9udCBzaXplIGZvciBIZWJyZXdcbiAgY29uc3Qgc2NhbGVkRm9udFNpemUgPSBmb250U2l6ZSAqIGZvbnRGYWN0b3JcblxuICBjb25zdCBpdGVtcyA9IG51bGxcbiAgY29uc3Qge1xuICAgIHN0YXRlOiB7XG4gICAgICBoZWFkZXJzLCBmaWx0ZXJzLCBpdGVtSW5kZXgsIG1hcmtkb3duVmlldyxcbiAgICB9LFxuICAgIGFjdGlvbnM6IHtcbiAgICAgIHNldEZpbHRlcnMsIHNldEl0ZW1JbmRleCwgc2V0TWFya2Rvd25WaWV3LFxuICAgIH0sXG4gIH0gPSB1c2VDYXJkU3RhdGUoeyBpdGVtcyB9KVxuXG4gIGNvbnN0IHJlZlN0eWxlID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIGZvbnRGYW1pbHk6ICdOb3RvIFNhbnMnLFxuICAgIGZvbnRTaXplOiBgJHtNYXRoLnJvdW5kKHNjYWxlZEZvbnRTaXplICogMC45KX0lYCxcbiAgfSksIFtzY2FsZWRGb250U2l6ZV0pXG5cbiAgY29uc3QgY29udGVudFN0eWxlID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIGZvbnRGYW1pbHk6ICdOb3RvIFNhbnMnLFxuICAgIGZvbnRTaXplOiBgJHtzY2FsZWRGb250U2l6ZX0lYCxcbiAgfSksIFtzY2FsZWRGb250U2l6ZV0pXG5cbiAgY29uc3Qgc2NyaXB0dXJlTGFiZWwgPSA8VGl0bGU+e3NjcmlwdHVyZVRpdGxlfTwvVGl0bGU+XG4gIGxldCBkaXNhYmxlV29yZFBvcG92ZXJfID0gZGlzYWJsZVdvcmRQb3BvdmVyXG4gIGNvbnN0IHVzaW5nT3JpZ2luYWxCaWJsZSA9IGlzT3JpZ2luYWxCaWJsZShzY3JpcHR1cmVDb25maWdbJ3Jlc291cmNlJ10/LnByb2plY3RJZClcblxuICBpZiAoZGlzYWJsZVdvcmRQb3BvdmVyID09PSB1bmRlZmluZWQpIHsgLy8gaWYgbm90IHNwZWNpZmllZCwgdGhlbiBkZXRlcm1pbmUgaWYgb3JpZ2luYWwgbGFuZ3VhZ2UgcmVzb3VyY2VcbiAgICBkaXNhYmxlV29yZFBvcG92ZXJfID0gIXVzaW5nT3JpZ2luYWxCaWJsZVxuICB9XG5cbiAgY29uc3QgZW5hYmxlRWRpdCA9ICF1c2luZ09yaWdpbmFsQmlibGVcbiAgY29uc3QgZW5hYmxlQWxpZ25tZW50ID0gIXVzaW5nT3JpZ2luYWxCaWJsZVxuICBjb25zdCBvcmlnaW5hbFJlcG9VcmwgPSBpc05ld1Rlc3RhbWVudCA/IGdyZWVrUmVwb1VybCA6IGhlYnJld1JlcG9VcmxcbiAgY29uc3Qgc2NyaXB0dXJlQWxpZ25tZW50RWRpdENvbmZpZyA9IHtcbiAgICBhdXRoZW50aWNhdGlvbjogY2FuVXNlRWRpdEJyYW5jaCA/IGF1dGhlbnRpY2F0aW9uIDogbnVsbCxcbiAgICBib29rSW5kZXgsXG4gICAgY3VycmVudFZlcnNlUmVmOiBfcmVmZXJlbmNlLFxuICAgIGVuYWJsZUVkaXQsXG4gICAgZW5hYmxlQWxpZ25tZW50LFxuICAgIGh0dHBDb25maWcsXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlzTmV3VGVzdGFtZW50LFxuICAgIGxvZ2dlZEluVXNlcjogY2FuVXNlRWRpdEJyYW5jaCA/IGxvZ2dlZEluVXNlciA6IG51bGwsXG4gICAgb3JpZ2luYWxMYW5ndWFnZU93bmVyLFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcmlnaW5hbFJlcG9VcmwsXG4gICAgc2NyaXB0dXJlQ29uZmlnLFxuICAgIHNjcmlwdHVyZVNldHRpbmdzLFxuICAgIHN0YXJ0RWRpdEJyYW5jaCxcbiAgICBzZXRTYXZlZENoYW5nZXM6IF9zZXRTYXZlZENoYW5nZXMsXG4gICAgc291cmNlTGFuZ3VhZ2U6IGlzTlRfID8gTlRfT1JJR19MQU5HIDogT1RfT1JJR19MQU5HLFxuICAgIHRhcmdldExhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICB0aXRsZTogc2NyaXB0dXJlVGl0bGUsXG4gICAgd29ya2luZ1Jlc291cmNlQnJhbmNoOiByZWYsXG4gIH1cblxuICAvKipcbiAgICogdGhpcyBnZXRzIGNhbGxlZCB3aGVuZXZlciBhIHNjcmlwdHVyZSBwYW5lIGhhcyBhIGNoYW5nZSBpbiBzYXZlIHN0YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50SW5kZXhcbiAgICogQHBhcmFtIHtib29sZWFufSBzYXZlZFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBnZXRDaGFuZ2VzIC0gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgdXNlciBjbGlja3Mgc2F2ZSBidXR0b25cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2xlYXJDaGFuZ2VzIC0gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgc2F2ZSBoYXMgY29tcGxldGVkXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdGF0ZSAtIGN1cnJlbnQgc3RhdGUgb2Ygd29yZCBhbGlnbm1lbnQvZWRpdFxuICAgKi9cbiAgZnVuY3Rpb24gX3NldFNhdmVkQ2hhbmdlcyhjdXJyZW50SW5kZXgsIHNhdmVkLCB7IGdldENoYW5nZXMgPSBudWxsLCBjbGVhckNoYW5nZXMgPSBudWxsLCBzdGF0ZSA9IG51bGwgfSkge1xuICAgIGNvbnN0IF91bnNhdmVkQ2hhbmdlc0xpc3QgPSB7IC4uLnVuc2F2ZWRDaGFuZ2VzTGlzdCB9XG5cbiAgICBpZiAoc2F2ZWQpIHtcbiAgICAgIGlmIChfdW5zYXZlZENoYW5nZXNMaXN0Lmhhc093blByb3BlcnR5KGN1cnJlbnRJbmRleCkpIHtcbiAgICAgICAgZGVsZXRlIF91bnNhdmVkQ2hhbmdlc0xpc3RbY3VycmVudEluZGV4XVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBfdW5zYXZlZENoYW5nZXNMaXN0W2N1cnJlbnRJbmRleF0gPSB7IGdldENoYW5nZXMsIGNsZWFyQ2hhbmdlcywgc3RhdGUgfSAvLyB1cGRhdGUgd2l0aCBsYXRlc3RcbiAgICB9XG5cbiAgICBjb25zdCBfaGF2ZVVuc2F2ZWRDaGFuZ2VzID0gISFPYmplY3Qua2V5cyhfdW5zYXZlZENoYW5nZXNMaXN0KS5sZW5ndGhcblxuICAgIGlmIChoYXZlVW5zYXZlZENoYW5nZXMgIT0gX2hhdmVVbnNhdmVkQ2hhbmdlcykge1xuICAgICAgc2V0U2F2ZWRDaGFuZ2VzICYmIHNldFNhdmVkQ2hhbmdlcyhyZXNvdXJjZUlkLCAhX2hhdmVVbnNhdmVkQ2hhbmdlcylcbiAgICAgIHNldFN0YXRlKHsgaGF2ZVVuc2F2ZWRDaGFuZ2VzOiBfaGF2ZVVuc2F2ZWRDaGFuZ2VzIH0pXG4gICAgfVxuXG4gICAgaWYgKCFpc0VxdWFsKF91bnNhdmVkQ2hhbmdlc0xpc3QsIHVuc2F2ZWRDaGFuZ2VzTGlzdCkpIHtcbiAgICAgIHNldFN0YXRlKHsgdW5zYXZlZENoYW5nZXNMaXN0OiBfdW5zYXZlZENoYW5nZXNMaXN0IH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHNlYXJjaCBjaGFwdGVyIG9yIHZlcnNlIGNodW5rIHRvIGxpbmUgdGhhdCBzdGFydHMgd2l0aCBmaW5kSXRlbVxuICAgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IGZpbmRJdGVtXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGNodW5rc1xuICAgKi9cbiAgZnVuY3Rpb24gZmluZFJlZkluQXJyYXkoZmluZEl0ZW0sIGNodW5rcykge1xuICAgIGNvbnN0IHJlZl8gPSBmaW5kSXRlbSArICcnXG4gICAgY29uc3QgcmVmTGVuID0gcmVmXy5sZW5ndGhcbiAgICBjb25zdCBpbmRleCA9IGNodW5rcy5maW5kSW5kZXgoKGNodW5rLCBpZHgpID0+IHtcbiAgICAgIGlmIChpZHggPiAwKSB7XG4gICAgICAgIGlmIChjaHVuay5zdWJzdHJpbmcoMCwgcmVmTGVuKSA9PT0gcmVmXykge1xuICAgICAgICAgIGNvbnN0IG5leHRDaGFyID0gY2h1bmtbcmVmTGVuXVxuXG4gICAgICAgICAgaWYgKChuZXh0Q2hhciA+ICc5JykgfHwgKG5leHRDaGFyIDwgJzAnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGV4XG4gIH1cblxuICBmdW5jdGlvbiBnZXRCb29rTmFtZSgpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgYm9va0NhcHMgPSBzY3JpcHR1cmVDb25maWc/LnJlZmVyZW5jZT8ucHJvamVjdElkID8gc2NyaXB0dXJlQ29uZmlnLnJlZmVyZW5jZS5wcm9qZWN0SWQudG9VcHBlckNhc2UoKSA6ICcnXG4gICAgcmV0dXJuIGAke2Jvb2tJbmRleH0tJHtib29rQ2Fwc30udXNmbWBcbiAgfVxuXG4gIGNvbnN0IGZpbGVwYXRoID0gZ2V0Qm9va05hbWUoKVxuXG4gIC8vIGtlZXAgdHJhY2sgb2YgdmVyc2UgZWRpdCBzdGF0ZVxuICBjb25zdCB7XG4gICAgZXJyb3I6IHNhdmVFcnJvcixcbiAgICBpc0Vycm9yOiBpc1NhdmVFcnJvcixcbiAgICBvblNhdmVFZGl0LFxuICB9ID0gdXNlRWRpdCh7XG4gICAgc2hhLFxuICAgIG93bmVyLFxuICAgIGNvbnRlbnQ6IHNhdmVDb250ZW50LFxuICAgIGNvbmZpZzoge1xuICAgICAgY2FjaGU6IHsgbWF4QWdlOiAwIH0sXG4gICAgICAuLi5hdXRoZW50aWNhdGlvbj8uY29uZmlnLFxuICAgICAgdG9rZW46IGF1dGhlbnRpY2F0aW9uPy50b2tlbixcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRpbWVvdXQ6IGh0dHBDb25maWc/LnNlcnZlclRpbWVPdXQgfHwgaHR0cENvbmZpZz8udGltZW91dCB8fCAxMDAwMCxcbiAgICAgIHNlcnZlcixcbiAgICAgIGRvbnRDcmVhdGVCcmFuY2g6IHRydWUsXG4gICAgfSxcbiAgICBhdXRob3I6IGxvZ2dlZEluVXNlcixcbiAgICB0b2tlbjogYXV0aGVudGljYXRpb24/LnRva2VuLFxuICAgIGJyYW5jaDogd29ya2luZ1Jlc291cmNlQnJhbmNoLFxuICAgIGZpbGVwYXRoLFxuICAgIHJlcG8sXG4gIH0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gd2hlbiB3ZSBnZXQgYSBzYXZlIHNhdmVFcnJvclxuICAgIGlmIChzYXZlRXJyb3IgJiYgaXNTYXZlRXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBzYXZlIGVycm9yYCwgc2F2ZUVycm9yKVxuICAgICAgb25SZXNvdXJjZUVycm9yICYmIG9uUmVzb3VyY2VFcnJvcihudWxsLCBmYWxzZSwgbnVsbCwgYEVycm9yIHNhdmluZyAke2xhbmd1YWdlSWRffV8ke3Jlc291cmNlSWR9ICR7c2F2ZUVycm9yfWAsIHRydWUpXG4gICAgfVxuICB9LCBbc2F2ZUVycm9yLCBpc1NhdmVFcnJvcl0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gd2hlbiBzdGFydFNhdmUgZ29lcyB0cnVlLCBzYXZlIGVkaXRzIHRvIHVzZXIgYnJhbmNoIGFuZCB0aGVuIGNsZWFyIHN0YXJ0U2F2ZVxuICAgIGNvbnN0IF9zYXZlRWRpdCA9IGFzeW5jICgpID0+IHsgLy8gYmVnaW4gdXBsb2FkaW5nIG5ldyBVU0ZNXG4gICAgICBjb25zb2xlLmluZm8oYHNhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gVXNpbmcgc2hhOiAke3NoYX1gKVxuICAgICAgYXdhaXQgb25TYXZlRWRpdCh1c2VyRWRpdEJyYW5jaE5hbWUpLnRoZW4oKHN1Y2Nlc3MpID0+IHsgLy8gcHVzaCBjaGFuZ2VkIHRvIHNlcnZlclxuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQoKSAtIHNhdmUgc2NyaXB0dXJlIGVkaXRzIHN1Y2Nlc3NgKVxuICAgICAgICAgIGNvbnN0IHVuc2F2ZWRDYXJkSW5kaWNlcyA9IE9iamVjdC5rZXlzKHVuc2F2ZWRDaGFuZ2VzTGlzdClcblxuICAgICAgICAgIGlmICh1bnNhdmVkQ2FyZEluZGljZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjYXJkSW5kZXggb2YgdW5zYXZlZENhcmRJbmRpY2VzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgY2xlYXJDaGFuZ2VzIH0gPSB1bnNhdmVkQ2hhbmdlc0xpc3RbY2FyZEluZGV4XVxuICAgICAgICAgICAgICBjbGVhckNoYW5nZXMgJiYgY2xlYXJDaGFuZ2VzKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zb2xlLmluZm8oJ3NhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gUmVsb2FkaW5nIHJlc291cmNlJylcbiAgICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICBzdGFydFNhdmU6IGZhbHNlLFxuICAgICAgICAgICAgcmVhZHlGb3JGZXRjaDogdHJ1ZSxcbiAgICAgICAgICAgIHJlZjogdXNlckVkaXRCcmFuY2hOYW1lLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgZGVsYXkoNTAwKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHNjcmlwdHVyZUNvbmZpZz8ucmVsb2FkUmVzb3VyY2Uoc2hhKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignc2F2ZUNoYW5nZXNUb0Nsb3VkKCkgLSBzYXZpbmcgY2hhbmdlZCBzY3JpcHR1cmUgZmFpbGVkJylcbiAgICAgICAgICBzZXRTdGF0ZSh7IHN0YXJ0U2F2ZTogZmFsc2UgfSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoc3RhcnRTYXZlKSB7XG4gICAgICBpZiAoIWVkaXRCcmFuY2hSZWFkeSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gZWRpdCBicmFuY2ggbm90IHlldCBjcmVhdGVkYClcbiAgICAgIH0gZWxzZSBpZiAoIXNoYSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gc2F2ZSBzaGEgbm90IHlldCByZWFkeWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gY2FsbGluZyBfc2F2ZUVkaXQoKWApXG4gICAgICAgIF9zYXZlRWRpdCgpXG4gICAgICB9XG4gICAgfVxuICB9LCBbc3RhcnRTYXZlLCBlZGl0QnJhbmNoUmVhZHksIHNoYV0pXG5cbiAgLyoqXG4gICAqIGNvbnZlcnQgdXBkYXRlZFZlcnNlT2JqZWN0cyB0byBVU0ZNIGFuZCBtZXJnZSBpbnRvIHRoZSBiaWJsZVVzZm1cbiAgICogQHBhcmFtIHtzdHJpbmd9IGJpYmxlVXNmbSAtIFVTRk0gb2YgYmlibGVcbiAgICogQHBhcmFtIHtvYmplY3R9IHJlZiAtIHJlZmVyZW5jZSBvZiB2ZXJzZSB0byBtZXJnZSBpblxuICAgKiBAcGFyYW0ge29iamVjdFtdfSB1cGRhdGVkVmVyc2VPYmplY3RzIC0gbmV3IHZlcnNlIGluIHZlcnNlT2JqZWN0IGZvcm1hdFxuICAgKiBAcGFyYW0ge251bWJlcn0gY2FyZE51bVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VWZXJzZU9iamVjdHNJbnRvQmlibGVVc2ZtKGJpYmxlVXNmbSwgcmVmLCB1cGRhdGVkVmVyc2VPYmplY3RzLCBjYXJkTnVtOiBudW1iZXIpIHtcbiAgICBsZXQgbmV3VXNmbVxuICAgIGNvbnN0IGNoYXB0ZXJDaHVua3MgPSBiaWJsZVVzZm0/LnNwbGl0KCdcXFxcYyAnKVxuICAgIGNvbnN0IGNoYXB0ZXJJbmRleCA9IGZpbmRSZWZJbkFycmF5KHJlZj8uY2hhcHRlciwgY2hhcHRlckNodW5rcylcblxuICAgIGlmIChjaGFwdGVySW5kZXggPj0gMCkge1xuICAgICAgY29uc3QgY3VycmVudENoYXB0ZXIgPSBjaGFwdGVyQ2h1bmtzW2NoYXB0ZXJJbmRleF1cbiAgICAgIGNvbnN0IHZlcnNlQ2h1bmtzID0gY3VycmVudENoYXB0ZXIuc3BsaXQoJ1xcXFx2ICcpXG4gICAgICBjb25zdCB2ZXJzZUluZGV4ID0gZmluZFJlZkluQXJyYXkocmVmPy52ZXJzZSwgdmVyc2VDaHVua3MpXG5cbiAgICAgIGlmICh2ZXJzZUluZGV4ID49IDApIHtcbiAgICAgICAgY29uc3QgbmV3VmVyc2VVc2ZtID0gVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKHVwZGF0ZWRWZXJzZU9iamVjdHMpXG4gICAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQoJHtjYXJkTnVtfSkgLSBuZXcgVVNGTSBmb3IgY2FyZDp9IC0gJHtuZXdWZXJzZVVzZm0uc3Vic3RyaW5nKDAsIDEwMCl9YClcbiAgICAgICAgY29uc3Qgb2xkVmVyc2UgPSB2ZXJzZUNodW5rc1t2ZXJzZUluZGV4XVxuICAgICAgICBjb25zdCB2ZXJzZU51bUxlbiA9IChyZWY/LnZlcnNlICsgJycpLmxlbmd0aFxuICAgICAgICB2ZXJzZUNodW5rc1t2ZXJzZUluZGV4XSA9IG9sZFZlcnNlLnN1YnN0cmluZygwLCB2ZXJzZU51bUxlbiArIDEpICsgbmV3VmVyc2VVc2ZtXG4gICAgICAgIGNvbnN0IG5ld0NoYXB0ZXIgPSB2ZXJzZUNodW5rcy5qb2luKCdcXFxcdiAnKVxuICAgICAgICBjaGFwdGVyQ2h1bmtzW2NoYXB0ZXJJbmRleF0gPSBuZXdDaGFwdGVyXG4gICAgICAgIG5ld1VzZm0gPSBjaGFwdGVyQ2h1bmtzLmpvaW4oJ1xcXFxjICcpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdVc2ZtXG4gIH1cblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyBmb3IgZWFjaCB1bnNhdmVkIGNoYW5nZSwgY2FsbCBpbnRvIHNjcmlwdHVyZVBhbmUgdG8gZ2V0IGxhdGVzdCBjaGFuZ2VzIGZvciB2ZXJzZSB0byBzYXZlXG4gICAgYXN5bmMgZnVuY3Rpb24gZ2V0UmVhZHlGb3JTYXZlKCkge1xuICAgICAgaWYgKHNhdmVDbGlja2VkKSB7XG4gICAgICAgIGxldCBjcmVhdGVFZGl0QnJhbmNoID0gIV91c2luZ1VzZXJCcmFuY2hcblxuICAgICAgICBpZiAoIWNyZWF0ZUVkaXRCcmFuY2gpIHsgLy8gaWYgYWxyZWFkeSB1c2luZyB0aGUgdXNlciBicmFuY2hcbiAgICAgICAgICBpZiAod29ya2luZ1Jlc291cmNlQnJhbmNoICE9PSB1c2VyRWRpdEJyYW5jaE5hbWUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybihgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gc3RhdGUgY29uZmxpY3QgLSBzaG91bGQgYmUgaW4gdXNlciBicmFuY2ggJHt1c2VyRWRpdEJyYW5jaE5hbWV9LCBidXQgYWN0dWFsbHkgdXNpbmcgJHt3b3JraW5nUmVzb3VyY2VCcmFuY2h9YClcbiAgICAgICAgICAgIGNyZWF0ZUVkaXRCcmFuY2ggPSB0cnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQgLSBhbHJlYWR5IHVzaW5nIGVkaXQgYnJhbmNoOiAke3dvcmtpbmdSZXNvdXJjZUJyYW5jaH1gKVxuICAgICAgICAgICAgc2V0U3RhdGUoeyBlZGl0QnJhbmNoUmVhZHk6IHRydWUgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3JlYXRlRWRpdEJyYW5jaCkgeyAvLyBpZiBub3QgeWV0IHVzaW5nIHRoZSB1c2VyIGJyYW5jaCwgY3JlYXRlIGl0XG4gICAgICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCAtIGNyZWF0aW5nIGVkaXQgYnJhbmNoYClcbiAgICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICBlZGl0QnJhbmNoUmVhZHk6IGZhbHNlLFxuICAgICAgICAgICAgcmVhZHlGb3JGZXRjaDogZmFsc2UsXG4gICAgICAgICAgICBzaGE6IG51bGwsXG4gICAgICAgICAgfSkgLy8gd2Ugd2lsbCBuZWVkIGEgbmV3IHNoYSBmb3IgYm9vay9icmFuY2hcblxuICAgICAgICAgIGNvbnN0IGJyYW5jaCA9IGF3YWl0IHN0YXJ0RWRpdEJyYW5jaCgpXG5cbiAgICAgICAgICBpZiAoYnJhbmNoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gZWRpdCBicmFuY2ggY3JlYXRlZGApXG4gICAgICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGVkaXRCcmFuY2hSZWFkeTogdHJ1ZSxcbiAgICAgICAgICAgICAgcmVhZHlGb3JGZXRjaDogdHJ1ZSxcbiAgICAgICAgICAgICAgcmVmOiBicmFuY2gsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdzYXZlQ2hhbmdlc1RvQ2xvdWQoKSAtIGVycm9yIGNyZWF0aW5nIGVkaXQgYnJhbmNoJylcbiAgICAgICAgICAgIG9uUmVzb3VyY2VFcnJvciAmJiBvblJlc291cmNlRXJyb3IobnVsbCwgZmFsc2UsIG51bGwsIGBFcnJvciBjcmVhdGluZyBlZGl0IGJyYW5jaCAke2xhbmd1YWdlSWRffV8ke3Jlc291cmNlSWR9YCwgdHJ1ZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gZ2V0dGluZyB2ZXJzZSBjaGFuZ2VzYClcbiAgICAgICAgY29uc3QgdW5zYXZlZENhcmRJbmRpY2VzID0gT2JqZWN0LmtleXModW5zYXZlZENoYW5nZXNMaXN0KVxuXG4gICAgICAgIGlmICh1bnNhdmVkQ2FyZEluZGljZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIGxldCBiaWJsZVVzZm0gPSBjb3JlLmdldFJlc3BvbnNlRGF0YShzY3JpcHR1cmVDb25maWc/LmZldGNoUmVzcG9uc2UpXG4gICAgICAgICAgbGV0IG1lcmdlRmFpbCA9IGZhbHNlXG4gICAgICAgICAgbGV0IGNhcmROdW0gPSAwXG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGNhcmRJbmRleCBvZiB1bnNhdmVkQ2FyZEluZGljZXMpIHtcbiAgICAgICAgICAgIGNhcmROdW0gPSBwYXJzZUludChjYXJkSW5kZXgpXG4gICAgICAgICAgICBjb25zdCB7IGdldENoYW5nZXMsIHN0YXRlIH0gPSB1bnNhdmVkQ2hhbmdlc0xpc3RbY2FyZE51bV1cblxuICAgICAgICAgICAgaWYgKGdldENoYW5nZXMpIHtcbiAgICAgICAgICAgICAgbGV0IG5ld1VzZm1cbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIHJlZixcbiAgICAgICAgICAgICAgICB1cGRhdGVkVmVyc2VPYmplY3RzLFxuICAgICAgICAgICAgICB9ID0gZ2V0Q2hhbmdlcyhzdGF0ZSlcblxuICAgICAgICAgICAgICBpZiAodXBkYXRlZFZlcnNlT2JqZWN0cyAmJiBiaWJsZVVzZm0pIHsgLy8ganVzdCByZXBsYWNlIHZlcnNlXG4gICAgICAgICAgICAgICAgbmV3VXNmbSA9IG1lcmdlVmVyc2VPYmplY3RzSW50b0JpYmxlVXNmbShiaWJsZVVzZm0sIHJlZiwgdXBkYXRlZFZlcnNlT2JqZWN0cywgY2FyZE51bSlcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChuZXdVc2ZtKSB7XG4gICAgICAgICAgICAgICAgYmlibGVVc2ZtID0gbmV3VXNmbVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lcmdlRmFpbCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG1lcmdlRmFpbCkgeyAvLyBpZiB3ZSBmYWlsZWQgdG8gbWVyZ2UsIGZhbGxiYWNrIHRvIGJydXRlIGZvcmNlIHZlcnNlIG9iamVjdHMgdG8gVVNGTVxuICAgICAgICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCgke2NhcmROdW19KSAtIHZlcnNlIG5vdCBmb3VuZCwgZmFsbGluZyBiYWNrIHRvIGluc2VydGluZyB2ZXJzZSBvYmplY3RgKVxuICAgICAgICAgICAgbGV0IG5ld0Jvb2tKc29uXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgY2FyZEluZGV4IG9mIHVuc2F2ZWRDYXJkSW5kaWNlcykge1xuICAgICAgICAgICAgICBjb25zdCBjYXJkTnVtID0gcGFyc2VJbnQoY2FyZEluZGV4KVxuICAgICAgICAgICAgICBjb25zdCB7IGdldENoYW5nZXMsIHN0YXRlIH0gPSB1bnNhdmVkQ2hhbmdlc0xpc3RbY2FyZE51bV1cblxuICAgICAgICAgICAgICBpZiAoZ2V0Q2hhbmdlcykge1xuICAgICAgICAgICAgICAgIGxldCBuZXdVc2ZtXG4gICAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgICAgbmV3VmVyc2VUZXh0LFxuICAgICAgICAgICAgICAgICAgcmVmLFxuICAgICAgICAgICAgICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0cyxcbiAgICAgICAgICAgICAgICB9ID0gZ2V0Q2hhbmdlcyhzdGF0ZSlcblxuICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkVmVyc2VPYmplY3RzICYmICFuZXdVc2ZtKSB7XG4gICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0VmVyc2VPYmplY3RzXyA9IG51bGxcblxuICAgICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmVyc2VUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB0YXJnZXRWZXJzZU9iamVjdHMgfSA9IEFsaWdubWVudEhlbHBlcnMudXBkYXRlQWxpZ25tZW50c1RvVGFyZ2V0VmVyc2UodXBkYXRlZFZlcnNlT2JqZWN0cywgbmV3VmVyc2VUZXh0KVxuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFZlcnNlT2JqZWN0c18gPSB0YXJnZXRWZXJzZU9iamVjdHNcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRWZXJzZU9iamVjdHNfID0gdXBkYXRlZFZlcnNlT2JqZWN0c1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG5ld0Jvb2tKc29uID0gdGFyZ2V0VmVyc2VPYmplY3RzXyAmJiBzY3JpcHR1cmVDb25maWc/LnVwZGF0ZVZlcnNlKHJlZi5jaGFwdGVyLCByZWYudmVyc2UsIHt2ZXJzZU9iamVjdHM6IHRhcmdldFZlcnNlT2JqZWN0c199KVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBiaWJsZVVzZm0gPSB1c2ZtanMudG9VU0ZNKG5ld0Jvb2tKc29uLCB7Zm9yY2VkTmV3TGluZXM6IHRydWV9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQoKSAtIHNhdmluZyBuZXcgVVNGTTogJHtiaWJsZVVzZm0uc3Vic3RyaW5nKDAsIDEwMCl9Li4uYClcbiAgICAgICAgICBzZXRTdGF0ZSh7c2F2ZUNvbnRlbnQ6IGJpYmxlVXNmbSwgc3RhcnRTYXZlOiB0cnVlLCBzYXZlQ2xpY2tlZDogZmFsc2V9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UmVhZHlGb3JTYXZlKClcbiAgfSwgW3NhdmVDbGlja2VkXSlcblxuICAvLyBAdHMtaWdub3JlXG4gIGNvbnN0IHsgY2hhcHRlciB9ID0gX3JlZmVyZW5jZSB8fCB7fVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgX3ZlcnNlc0ZvclJlZiA9IHNjcmlwdHVyZUNvbmZpZz8udmVyc2VzRm9yUmVmXG4gICAgbGV0IG5ld1NlbGVjdGlvbnMgPSBuZXcgTWFwKClcbiAgICBsZXQgdXBkYXRlU2VsZWN0aW9ucyA9IGZhbHNlXG4gICAgY29uc3QgX21hcCA9IG5ld1NlbGVjdGlvbnNcbiAgICBjb25zdCBvcmlnaW5hbEJvb2tJZCA9IG9yaWdpbmFsU2NyaXB0dXJlQm9va09iamVjdHM/LmJvb2tJZFxuICAgIGNvbnN0IGJvb2tWZXJzZU9iamVjdCA9IG9yaWdpbmFsU2NyaXB0dXJlQm9va09iamVjdHM/LmNoYXB0ZXJzXG4gICAgbGV0IG5ld1NlbGVjdGVkUXVvdGUgPSBudWxsXG5cbiAgICAvLyBpZiB3ZSBoYXZlIGV2ZXJ5dGhpbmcgd2UgbmVlZCB0byBjYWxjdWxhdGUgc2VsZWN0aW9uc1xuICAgIGlmIChfdmVyc2VzRm9yUmVmPy5sZW5ndGggJiZcbiAgICAgIGJvb2tWZXJzZU9iamVjdCAmJlxuICAgICAgKGJvb2tJZCA9PT0gb3JpZ2luYWxCb29rSWQpICYmXG4gICAgICBib29rVmVyc2VPYmplY3RbY2hhcHRlcl0gJiYgLy8gd2UgbmVlZCB0byBoYXZlIGRhdGEgZm9yIGNoYXB0ZXJcbiAgICAgIHNlbGVjdGVkUXVvdGU/LnF1b3RlXG4gICAgKSB7XG4gICAgICAvLyBpZiBxdW90ZSBpcyBkaWZmZXJlbnQgdGhhbiBsYXN0XG4gICAgICBpZiAoIWlzRXF1YWwobGFzdFNlbGVjdGVkUXVvdGUsIHNlbGVjdGVkUXVvdGUpIHx8XG4gICAgICAgICFpc0VxdWFsKHZlcnNlc0ZvclJlZiwgX3ZlcnNlc0ZvclJlZikpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWZXJzZXMgPSB7fVxuICAgICAgICBjb25zdCBzdWJzdGl0dXRlID0ge30gLy8ga2VlcCB0cmFjayBvZiB2ZXJzZSBzdWJzdGl0dXRpb25zXG4gICAgICAgIGxldCBzdGFydFZlcnNlID0gX3ZlcnNlc0ZvclJlZlswXS52ZXJzZVxuXG4gICAgICAgIGlmICh0eXBlb2Ygc3RhcnRWZXJzZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBzdGFydFZlcnNlID0gcGFyc2VJbnQoc3RhcnRWZXJzZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsYXN0VmVyc2UgPSBzdGFydFZlcnNlXG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBfdmVyc2VzRm9yUmVmLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHZlcnNlUmVmID0gX3ZlcnNlc0ZvclJlZltpXVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNoYXB0ZXIsXG4gICAgICAgICAgICB2ZXJzZSxcbiAgICAgICAgICB9ID0gdmVyc2VSZWZcbiAgICAgICAgICAvLyBUUklDS1kgLSB3ZSByZW1hcCB2ZXJzZXMgaW4gcmVmZXJlbmNlIHJhbmdlIHRvIGEgbGluZWFyIHNlcmllcyBvZiB2ZXJzZXMgc28gdmVyc2Ugc3BhbnMgZG9uJ3QgY2hva2UgZ2V0UXVvdGVNYXRjaGVzSW5Cb29rUmVmXG4gICAgICAgICAgbGV0IF92ZXJzZSA9IHN0YXJ0VmVyc2UgKyBpXG4gICAgICAgICAgbGFzdFZlcnNlID0gX3ZlcnNlXG4gICAgICAgICAgc3Vic3RpdHV0ZVtgJHtjaGFwdGVyfToke192ZXJzZX1gXSA9IGAke2NoYXB0ZXJ9OiR7dmVyc2V9YFxuXG4gICAgICAgICAgaWYgKCFvcmlnaW5hbFZlcnNlc1tjaGFwdGVyXSkge1xuICAgICAgICAgICAgb3JpZ2luYWxWZXJzZXNbY2hhcHRlcl0gPSB7fVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCB2ZXJzZU9iamVjdHMgPSBbXVxuXG4gICAgICAgICAgaWYgKCh0eXBlb2YgdmVyc2UgPT09ICdzdHJpbmcnKSAmJiAodmVyc2UuaW5jbHVkZXMoJy0nKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZlcnNlcyA9IGdldFZlcnNlcyhib29rVmVyc2VPYmplY3QsIGAke2NoYXB0ZXJ9OiR7dmVyc2V9YClcblxuICAgICAgICAgICAgZm9yIChjb25zdCB2ZXJzZUl0ZW0gb2YgdmVyc2VzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZvID0gdmVyc2VJdGVtLnZlcnNlRGF0YS52ZXJzZU9iamVjdHNcbiAgICAgICAgICAgICAgdmVyc2VPYmplY3RzID0gdmVyc2VPYmplY3RzLmNvbmNhdCh2bylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmVyc2VPYmplY3RzID0gYm9va1ZlcnNlT2JqZWN0W2NoYXB0ZXJdW3ZlcnNlXT8udmVyc2VPYmplY3RzXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZlcnNlT2JqZWN0cykge1xuICAgICAgICAgICAgdmVyc2VPYmplY3RzID0gY2xlYW51cFZlcnNlT2JqZWN0cyh2ZXJzZU9iamVjdHMpXG4gICAgICAgICAgICBvcmlnaW5hbFZlcnNlc1tjaGFwdGVyXVtfdmVyc2VdID0geyB2ZXJzZU9iamVjdHMgfVxuICAgICAgICAgICAgX21hcC5zZXQoYCR7Y2hhcHRlcn06JHt2ZXJzZX1gLCB2ZXJzZU9iamVjdHMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY3JlYXRlIG5ldyByZWZlcmVuY2UgcmFuZ2UgZm9yIG5ldyBsaW5lYXIgdmVyc2UgcmFuZ2VcbiAgICAgICAgY29uc3QgW2NoYXB0ZXJdID0gc2VsZWN0ZWRRdW90ZT8ucmVmZXJlbmNlPy5zcGxpdCgnOicpXG4gICAgICAgIGxldCBzdWJSZWYgPSBgJHtjaGFwdGVyfToke3N0YXJ0VmVyc2V9YFxuXG4gICAgICAgIGlmIChsYXN0VmVyc2UgIT0gc3RhcnRWZXJzZSkge1xuICAgICAgICAgIHN1YlJlZiArPSBgLSR7bGFzdFZlcnNlfWBcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHF1b3RlTWF0Y2hlcyA9IGdldFF1b3RlTWF0Y2hlc0luQm9va1JlZih7XG4gICAgICAgICAgYm9va09iamVjdDogb3JpZ2luYWxWZXJzZXMsXG4gICAgICAgICAgcmVmOiBzdWJSZWYsXG4gICAgICAgICAgcXVvdGU6IHNlbGVjdGVkUXVvdGU/LnF1b3RlLFxuICAgICAgICAgIG9jY3VycmVuY2U6IHNlbGVjdGVkUXVvdGU/Lm9jY3VycmVuY2UsXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgICAgIGlmIChxdW90ZU1hdGNoZXM/LnNpemUpIHtcbiAgICAgICAgICBxdW90ZU1hdGNoZXMuZm9yRWFjaCgod29yZHMsIGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgX2tleSA9IHN1YnN0aXR1dGVba2V5XVxuXG4gICAgICAgICAgICBzZWxlY3Rpb25zLnNldChfa2V5LCB3b3Jkcy5tYXAod29yZCA9PiAoXG4gICAgICAgICAgICAgIHsgLi4ud29yZCwgdGV4dDogY29yZS5ub3JtYWxpemVTdHJpbmcod29yZC50ZXh0KSB9XG4gICAgICAgICAgICApKSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIG5ld1NlbGVjdGlvbnMgPSBzZWxlY3Rpb25zXG4gICAgICAgIG5ld1NlbGVjdGVkUXVvdGUgPSBzZWxlY3RlZFF1b3RlXG4gICAgICAgIHVwZGF0ZVNlbGVjdGlvbnMgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbmV3U3RhdGU6IGFueSA9IHt9XG5cbiAgICAvLyB1cGRhdGUgc3RhdGVzIHRoYXQgaGF2ZSBjaGFuZ2VkXG4gICAgaWYgKCFhcmVNYXBzVGhlU2FtZSh2ZXJzZU9iamVjdHNNYXAsIF9tYXApKSB7XG4gICAgICBuZXdTdGF0ZS52ZXJzZU9iamVjdHNNYXAgPSBfbWFwXG4gICAgfVxuXG4gICAgY29uc3QgYm9va3NOb3RTYW1lID0gcmVmZXJlbmNlPy5wcm9qZWN0SWQgIT09IGN1cnJlbnRSZWZlcmVuY2U/LnByb2plY3RJZFxuXG4gICAgaWYgKGJvb2tzTm90U2FtZSB8fCAhYXJlVmVyc2VzU2FtZSh2ZXJzZXNGb3JSZWYsIF92ZXJzZXNGb3JSZWYpKSB7XG4gICAgICBuZXdTdGF0ZS52ZXJzZXNGb3JSZWYgPSBfdmVyc2VzRm9yUmVmXG4gICAgICBuZXdTdGF0ZS5sYXN0U2VsZWN0ZWRRdW90ZSA9IG5ld1NlbGVjdGVkUXVvdGVcbiAgICAgIG5ld1N0YXRlLnNlbGVjdGlvbnMgPSBuZXdTZWxlY3Rpb25zXG4gICAgfVxuXG4gICAgaWYgKG5ld1NlbGVjdGVkUXVvdGUpIHtcbiAgICAgIG5ld1N0YXRlLmxhc3RTZWxlY3RlZFF1b3RlID0gbmV3U2VsZWN0ZWRRdW90ZVxuICAgIH1cblxuICAgIGlmICh1cGRhdGVTZWxlY3Rpb25zKSB7XG4gICAgICBpZiAoIWFyZU1hcHNUaGVTYW1lKHNlbGVjdGlvbnMgfHwgKG5ldyBNYXAoKSksIG5ld1NlbGVjdGlvbnMpKSB7XG4gICAgICAgIG5ld1N0YXRlLnNlbGVjdGlvbnMgPSBuZXdTZWxlY3Rpb25zXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKG5ld1N0YXRlKS5sZW5ndGgpIHtcbiAgICAgIHNldFN0YXRlKG5ld1N0YXRlKVxuICAgIH1cbiAgfSwgW293bmVyLCByZXNvdXJjZUlkLCBib29rSWQsIGxhbmd1YWdlSWRfLCBzY3JpcHR1cmVDb25maWc/LnZlcnNlc0ZvclJlZiwgb3JpZ2luYWxTY3JpcHR1cmVCb29rT2JqZWN0cywgc2VsZWN0ZWRRdW90ZV0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gY2xlYXIgc2V0dGluZ3Mgb24gdmVyc2UgY2hhbmdlXG4gICAgc2V0U3RhdGUoe1xuICAgICAgdmVyc2VzQWxpZ25tZW50U3RhdHVzOiBudWxsLFxuICAgICAgdW5zYXZlZENoYW5nZXNMaXN0OiB7fSxcbiAgICAgIGhhdmVVbnNhdmVkQ2hhbmdlczogZmFsc2UsXG4gICAgfSlcbiAgfSwgW19yZWZlcmVuY2VdKVxuXG4gIGNvbnN0IHVwZGF0ZVZlcnNlc0FsaWdubWVudFN0YXR1cyA9IChyZWZlcmVuY2UsIGFsaWduZWQpID0+IHtcbiAgICBzZXRTdGF0ZV8ocHJldlN0YXRlID0+ICh7XG4gICAgICAuLi5wcmV2U3RhdGUsXG4gICAgICB2ZXJzZXNBbGlnbm1lbnRTdGF0dXM6IHsgLi4ucHJldlN0YXRlLnZlcnNlc0FsaWdubWVudFN0YXR1cywgW2Ake3JlZmVyZW5jZS5jaGFwdGVyfToke3JlZmVyZW5jZS52ZXJzZX1gXTogYWxpZ25lZCB9LFxuICAgIH0pKVxuICB9XG5cbiAgbGV0IF92ZXJzZXNGb3JSZWYgPSBzY3JpcHR1cmVDb25maWc/LnZlcnNlc0ZvclJlZlxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKF92ZXJzZXNGb3JSZWY/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgeyByZWZlcmVuY2UsIHJlc291cmNlTGluayB9ID0gc2NyaXB0dXJlQ29uZmlnIHx8IHt9XG4gICAgICBjb25zb2xlLmxvZyhgU2NyaXB0dXJlQ2FyZC5fdmVyc2VzRm9yUmVmIGNoYW5nZWRgLCB7IHJlZmVyZW5jZSwgcmVzb3VyY2VMaW5rIH0pXG4gICAgfVxuICB9LCBbX3ZlcnNlc0ZvclJlZl0pXG5cbiAgaWYgKCFfdmVyc2VzRm9yUmVmPy5sZW5ndGgpIHsgLy8gaWYgZW1wdHkgb2YgcmVmZXJlbmNlcywgY3JlYXRlIHNpbmdsZSBlbXB0eSByZWZlcmVuY2VcbiAgICBfdmVyc2VzRm9yUmVmID0gW3sgLi4ucmVmZXJlbmNlIH1dXG4gIH1cblxuICBjb25zdCByZW5kZXJlZFNjcmlwdHVyZVBhbmVzID0gX3ZlcnNlc0ZvclJlZj8ubWFwKChfY3VycmVudFZlcnNlRGF0YSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBpbml0aWFsVmVyc2VPYmplY3RzID0gX2N1cnJlbnRWZXJzZURhdGE/LnZlcnNlRGF0YT8udmVyc2VPYmplY3RzIHx8IFtdXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHsgY2hhcHRlciwgdmVyc2UgfSA9IF9jdXJyZW50VmVyc2VEYXRhIHx8IHt9XG4gICAgY29uc3QgcHJvamVjdElkID0gY3VycmVudFJlZmVyZW5jZT8ucHJvamVjdElkIHx8IHJlZmVyZW5jZT8ucHJvamVjdElkXG4gICAgY29uc3QgX3JlZmVyZW5jZSA9IHtcbiAgICAgIC4uLl92ZXJzZXNGb3JSZWYsXG4gICAgICBjaGFwdGVyLFxuICAgICAgdmVyc2UsXG4gICAgICBwcm9qZWN0SWQsXG4gICAgfVxuICAgIGNvbnN0IF9zY3JpcHR1cmVBbGlnbm1lbnRFZGl0Q29uZmlnID0ge1xuICAgICAgLi4uc2NyaXB0dXJlQWxpZ25tZW50RWRpdENvbmZpZyxcbiAgICAgIGN1cnJlbnRJbmRleDogaW5kZXgsXG4gICAgICBpbml0aWFsVmVyc2VPYmplY3RzLFxuICAgICAgcmVmZXJlbmNlOiBfcmVmZXJlbmNlLFxuICAgICAgaXNOZXdUZXN0YW1lbnQsXG4gICAgfVxuXG4gICAgbGV0IGlzVmVyc2VTZWxlY3RlZEZvckFsaWdubWVudCA9IGZhbHNlXG5cbiAgICBpZiAodmVyc2VTZWxlY3RlZEZvckFsaWdubWVudCkge1xuICAgICAgaXNWZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50ID0gdmVyc2VTZWxlY3RlZEZvckFsaWdubWVudC5jaGFwdGVyID09IGNoYXB0ZXIgJiYgdmVyc2VTZWxlY3RlZEZvckFsaWdubWVudC52ZXJzZSA9PSB2ZXJzZVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8U2NyaXB0dXJlUGFuZVxuICAgICAgICB7Li4uc2NyaXB0dXJlQ29uZmlnfVxuICAgICAgICBjb250ZW50U3R5bGU9e2NvbnRlbnRTdHlsZX1cbiAgICAgICAgY3VycmVudEluZGV4PXtpbmRleH1cbiAgICAgICAgZGV0ZXJtaW5pbmdCcmFuY2g9eyFyZWFkeUZvckZldGNofVxuICAgICAgICBkaXJlY3Rpb249e2RpcmVjdGlvbn1cbiAgICAgICAgZGlzYWJsZVdvcmRQb3BvdmVyPXtkaXNhYmxlV29yZFBvcG92ZXJffVxuICAgICAgICBmb250U2l6ZT17Zm9udFNpemV9XG4gICAgICAgIGdldExleGljb25EYXRhPXtnZXRMZXhpY29uRGF0YX1cbiAgICAgICAgaXNOVD17aXNOVF99XG4gICAgICAgIGlzVmVyc2VTZWxlY3RlZEZvckFsaWdubWVudD17aXNWZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50fVxuICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICBvbkFsaWdubWVudEZpbmlzaD17KCkgPT4gc2V0U3RhdGUoeyB2ZXJzZVNlbGVjdGVkRm9yQWxpZ25tZW50OiBudWxsIH0pfVxuICAgICAgICBvcmlnaW5hbFNjcmlwdHVyZUJvb2tPYmplY3RzPXtvcmlnaW5hbFNjcmlwdHVyZUJvb2tPYmplY3RzfVxuICAgICAgICByZWZTdHlsZT17cmVmU3R5bGV9XG4gICAgICAgIHJlZmVyZW5jZT17X3JlZmVyZW5jZX1cbiAgICAgICAgc2F2aW5nPXtzdGFydFNhdmV9XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc2NyaXB0dXJlQWxpZ25tZW50RWRpdENvbmZpZz17X3NjcmlwdHVyZUFsaWdubWVudEVkaXRDb25maWd9XG4gICAgICAgIHNldFdvcmRBbGlnbmVyU3RhdHVzPXtzZXRXb3JkQWxpZ25lclN0YXR1c31cbiAgICAgICAgc2VydmVyPXtzZXJ2ZXJ9XG4gICAgICAgIHRyYW5zbGF0ZT17dHJhbnNsYXRlfVxuICAgICAgICB1cGRhdGVWZXJzZXNBbGlnbm1lbnRTdGF0dXM9e3VwZGF0ZVZlcnNlc0FsaWdubWVudFN0YXR1c31cbiAgICAgIC8+XG4gICAgKVxuICB9KVxuXG4gIGNvbnN0IGhhbmRsZUFsaWduQnV0dG9uQ2xpY2sgPSAoKSA9PiB7XG4gICAgaWYgKHZlcnNlc0ZvclJlZj8ubGVuZ3RoID4gMSkge1xuICAgICAgc2V0U3RhdGUoeyBzaG93QWxpZ25tZW50UG9wdXA6IHRydWUgfSlcbiAgICB9IGVsc2UgaWYgKHZlcnNlc0ZvclJlZj8ubGVuZ3RoID09PSAxKSB7XG4gICAgICBzZXRTdGF0ZSh7IHZlcnNlU2VsZWN0ZWRGb3JBbGlnbm1lbnQ6IHZlcnNlc0ZvclJlZlswXSB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG9uUmVuZGVyVG9vbGJhciA9ICh7IGl0ZW1zIH0pID0+IHtcbiAgICBjb25zdCBuZXdJdGVtcyA9IFsuLi5pdGVtc11cblxuICAgIGxldCBhbGxWZXJzZXNBbGlnbmVkID0gZmFsc2VcblxuICAgIC8vIENoZWNrIGlmIGFsbCB2YWx1ZXMgaW4gdmVyc2VzQWxpZ25tZW50U3RhdHVzIGFyZSB0cnVlXG4gICAgaWYgKHZlcnNlc0FsaWdubWVudFN0YXR1cykge1xuICAgICAgYWxsVmVyc2VzQWxpZ25lZCA9IE9iamVjdC52YWx1ZXModmVyc2VzQWxpZ25tZW50U3RhdHVzKS5ldmVyeShhbGlnblN0YXR1cyA9PiBhbGlnblN0YXR1cyA9PT0gdHJ1ZSlcbiAgICB9XG5cbiAgICBsZXQgYWxpZ25JY29uID0gbnVsbFxuICAgIGxldCBhbGlnbkJ1dHRvblRleHQgPSAnJ1xuXG4gICAgaWYgKGFsbFZlcnNlc0FsaWduZWQpIHtcbiAgICAgIGFsaWduSWNvbiA9IDxSeExpbmsyIGlkPXtgdmFsaWRfaWNvbl8ke3Jlc291cmNlSWR9YH0gY29sb3I9JyNCQkInLz5cbiAgICAgIGFsaWduQnV0dG9uVGV4dCA9ICdBbGlnbm1lbnQgaXMgVmFsaWQnXG4gICAgfSBlbHNlIHtcbiAgICAgIGFsaWduSWNvbiA9IDxSeExpbmtCcmVhazIgaWQ9e2BpbnZhbGlkX2FsaWdubWVudF9pY29uXyR7cmVzb3VyY2VJZH1gfSBjb2xvcj0nIzAwMCcvPlxuICAgICAgYWxpZ25CdXR0b25UZXh0ID0gJ0FsaWdubWVudCBpcyBJbnZhbGlkJ1xuICAgIH1cblxuICAgIGlmIChzZXRXb3JkQWxpZ25lclN0YXR1cyAmJiByZXNvdXJjZUlkICE9PSAnT1JJR0lOQUxfU09VUkNFJykge1xuICAgICAgbmV3SXRlbXMucHVzaChcbiAgICAgICAgPEljb25CdXR0b25cbiAgICAgICAgICBpZD17YGFsaWdubWVudF9pY29uXyR7cmVzb3VyY2VJZH1gfVxuICAgICAgICAgIGtleT0nY2hlY2tpbmctYnV0dG9uJ1xuICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUFsaWduQnV0dG9uQ2xpY2t9XG4gICAgICAgICAgdGl0bGU9e2FsaWduQnV0dG9uVGV4dH1cbiAgICAgICAgICBhcmlhLWxhYmVsPXthbGlnbkJ1dHRvblRleHR9XG4gICAgICAgICAgc3R5bGU9e3sgY3Vyc29yOiAncG9pbnRlcicgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHthbGlnbkljb259XG4gICAgICAgIDwvSWNvbkJ1dHRvbj5cbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3SXRlbXNcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNlbGVjdGlvbnNDb250ZXh0UHJvdmlkZXJcbiAgICAgIHNlbGVjdGlvbnM9e3NlbGVjdGlvbnN9XG4gICAgICBvblNlbGVjdGlvbnM9e25ld1NlbGVjdGlvbnMgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnb25TZWxlY3Rpb25zJywgbmV3U2VsZWN0aW9ucylcbiAgICAgIH19XG4gICAgICBxdW90ZT17c2VsZWN0ZWRRdW90ZT8ucXVvdGV9XG4gICAgICBvY2N1cnJlbmNlPXtmaXhPY2N1cnJlbmNlKHNlbGVjdGVkUXVvdGU/Lm9jY3VycmVuY2UpfVxuICAgICAgdmVyc2VPYmplY3RzTWFwPXt2ZXJzZU9iamVjdHNNYXB9XG4gICAgPlxuICAgICAgPENhcmRcbiAgICAgICAgaWQ9e2BzY3JpcHR1cmVfY2FyZF8ke2NhcmROdW19YH1cbiAgICAgICAgdGl0bGU9e3NjcmlwdHVyZUxhYmVsfVxuICAgICAgICBzZXR0aW5nc1RpdGxlPXtzY3JpcHR1cmVUaXRsZSArICcgU2V0dGluZ3MnfVxuICAgICAgICBpdGVtcz17aXRlbXN9XG4gICAgICAgIGNsYXNzZXM9e2NsYXNzZXN9XG4gICAgICAgIGhlYWRlcnM9e2hlYWRlcnN9XG4gICAgICAgIGZpbHRlcnM9e2ZpbHRlcnN9XG4gICAgICAgIGZvbnRTaXplPXtmb250U2l6ZX1cbiAgICAgICAgaXRlbUluZGV4PXtpdGVtSW5kZXh9XG4gICAgICAgIHNldEZpbHRlcnM9e3NldEZpbHRlcnN9XG4gICAgICAgIHNldEZvbnRTaXplPXtzZXRGb250U2l6ZX1cbiAgICAgICAgc2V0SXRlbUluZGV4PXtzZXRJdGVtSW5kZXh9XG4gICAgICAgIG1hcmtkb3duVmlldz17bWFya2Rvd25WaWV3fVxuICAgICAgICBzZXRNYXJrZG93blZpZXc9e3NldE1hcmtkb3duVmlld31cbiAgICAgICAgZ2V0Q3VzdG9tQ29tcG9uZW50PXtnZXRTY3JpcHR1cmVTZWxlY3Rvcn1cbiAgICAgICAgaGlkZU1hcmtkb3duVG9nZ2xlXG4gICAgICAgIG9uTWVudUNsb3NlPXtvbk1lbnVDbG9zZX1cbiAgICAgICAgb25NaW5pbWl6ZT17b25NaW5pbWl6ZSA/ICgpID0+IG9uTWluaW1pemUoaWQpIDogbnVsbH1cbiAgICAgICAgZWRpdGFibGU9e2VuYWJsZUVkaXQgfHwgZW5hYmxlQWxpZ25tZW50fVxuICAgICAgICBzYXZlZD17c3RhcnRTYXZlIHx8ICFoYXZlVW5zYXZlZENoYW5nZXN9XG4gICAgICAgIG9uU2F2ZUVkaXQ9eygpID0+IHNldFN0YXRlKHsgc2F2ZUNsaWNrZWQ6IHRydWUgfSl9XG4gICAgICAgIG9uUmVuZGVyVG9vbGJhcj17b25SZW5kZXJUb29sYmFyfVxuICAgICAgPlxuICAgICAgICA8ZGl2IGlkPVwic2NyaXB0dXJlLXBhbmUtbGlzdFwiPlxuICAgICAgICAgIHtyZW5kZXJlZFNjcmlwdHVyZVBhbmVzfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvQ2FyZD5cbiAgICAgIDxWZXJzZVNlbGVjdG9yUG9wdXBcbiAgICAgICAgcmVzb3VyY2VJZD17cmVzb3VyY2VJZH1cbiAgICAgICAgb3Blbj17c2hvd0FsaWdubWVudFBvcHVwfVxuICAgICAgICBvbkNsb3NlPXsoKSA9PiBzZXRTdGF0ZSh7IHNob3dBbGlnbm1lbnRQb3B1cDogZmFsc2UgfSl9XG4gICAgICAgIHZlcnNlc0ZvclJlZj17dmVyc2VzRm9yUmVmfVxuICAgICAgICB2ZXJzZXNBbGlnbm1lbnRTdGF0dXM9e3ZlcnNlc0FsaWdubWVudFN0YXR1c31cbiAgICAgICAgb25WZXJzZVNlbGVjdD17KHZlcnNlKSA9PiBzZXRTdGF0ZSh7XG4gICAgICAgICAgdmVyc2VTZWxlY3RlZEZvckFsaWdubWVudDogdmVyc2UsXG4gICAgICAgICAgc2hvd0FsaWdubWVudFBvcHVwOiBmYWxzZVxuICAgICAgICB9KX1cbiAgICAgIC8+XG4gICAgPC9TZWxlY3Rpb25zQ29udGV4dFByb3ZpZGVyPlxuICApXG59XG5cblNjcmlwdHVyZUNhcmQucHJvcFR5cGVzID0ge1xuICAvKiogcmVwbyBicmFuY2ggb3IgdGFnIHN1Y2ggYXMgbWFzdGVyICovXG4gIGFwcFJlZjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAvKiogYXV0aGVudGljYXRpb24gaW5mbyAqL1xuICBhdXRoZW50aWNhdGlvbjogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqIGluZGV4IGZvciBjdXJyZW50IGJvb2sgKGUuZy4gJzAxJyBmb3IgJ2dlbicpKi9cbiAgYm9va0luZGV4OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKiogc2NyaXB0dXJlIGNhcmQgbnVtYmVyICgwIHRvIDIgZm9yIGV4YW1wbGUpICovXG4gIGNhcmROdW06IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgLyoqIENTUyBjbGFzc2VzICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKiBpZiB0cnVlIHRoZW4gd29yZCBkYXRhIGhvdmVyIGlzIHNob3duICovXG4gIGRpc2FibGVXb3JkUG9wb3ZlcjogUHJvcFR5cGVzLmJvb2wsXG4gIC8qKiBnZXQgbGFuZ3VhZ2UgZGV0YWlscyAqL1xuICBnZXRMYW5ndWFnZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgLyoqIGZ1bmN0aW9uIHRvIGdldCBsYXRlc3QgbGV4aWNvbiBkYXRhICovXG4gIGdldExleGljb25EYXRhOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIG9wdGlvbmFsIHVybCBmb3IgZ3JlZWsgcmVwbyAqL1xuICBncmVla1JlcG9Vcmw6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKiBvcHRpb25hbCB1cmwgZm9yIGhlYnJldyByZXBvICovXG4gIGhlYnJld1JlcG9Vcmw6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKiBvcHRpb25hbCBodHRwIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBmZXRjaGluZyByZXNvdXJjZXMsIGRlZmF1bHQgaXMgMCAodmVyeSBsb25nIHdhaXQpICovXG4gIGh0dHBDb25maWc6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKiBodG1sIGlkZW50aWZpZXIgdG8gdXNlIGZvciBjYXJkICovXG4gIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKiogbWV0aG9kIHRvIGRldGVybWluZSBpZiBOVCBvciBPVCAqL1xuICBpc05UOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAvKiogdXNlci1uYW1lICovXG4gIGxvZ2dlZEluVXNlcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqIGZ1bmN0aW9uIHRvIG1pbmltaXplIHRoZSBjYXJkIChvcHRpb25hbCkgKi9cbiAgb25NaW5pbWl6ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiBvcHRpb25hbCBjYWxsYmFjayBpZiBlcnJvciBsb2FkaW5nIHJlc291cmNlLCBwYXJhbWV0ZXIgcmV0dXJuZWQgYXJlOlxuICAgKiAgICAoe3N0cmluZ30gZXJyb3JNZXNzYWdlLCB7Ym9vbGVhbn0gaXNBY2Nlc3NFcnJvciwge29iamVjdH0gcmVzb3VyY2VTdGF0dXMpXG4gICAqICAgICAgLSBpc0FjY2Vzc0Vycm9yIC0gaXMgdHJ1ZSBpZiB0aGlzIHdhcyBhbiBlcnJvciB0cnlpbmcgdG8gYWNjZXNzIGZpbGVcbiAgICogICAgICAtIHJlc291cmNlU3RhdHVzIC0gaXMgb2JqZWN0IGNvbnRhaW5pbmcgZGV0YWlscyBhYm91dCBwcm9ibGVtcyBmZXRjaGluZyByZXNvdXJjZSAqL1xuICBvblJlc291cmNlRXJyb3I6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogdGhlIG9yaWdpbmFsIHNjcmlwdHVyZSBib29rT2JqZWN0cyBmb3IgY3VycmVudCBib29rICovXG4gIG9yaWdpbmFsU2NyaXB0dXJlQm9va09iamVjdHM6IFByb3BUeXBlcy5vYmplY3QsXG4gIHJlZmVyZW5jZTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAvKiogcHJvamVjdElkIChib29rSUQpIHRvIHVzZSAqL1xuICAgIHByb2plY3RJZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIC8qKiBjdXJyZW50IGNoYXB0ZXIgbnVtYmVyICovXG4gICAgY2hhcHRlcjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLmlzUmVxdWlyZWQsXG4gICAgLyoqIGN1cnJlbnQgdmVyc2UgbnVtYmVyICovXG4gICAgdmVyc2U6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKS5pc1JlcXVpcmVkLFxuICB9KSxcbiAgLyoqIHJlc291cmNlIG9iamVjdCAqL1xuICByZXNvdXJjZTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAvKiogcmVzb3VyY2UgbGFuZ3VhZ2UgdG8gdXNlICovXG4gICAgbGFuZ3VhZ2VJZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIC8qKiByZXBvIG93bmVyIHN1Y2ggYXMgdW5mb2xkaW5nV29yZCAqL1xuICAgIG93bmVyOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgLyoqIHJlc291cmNlSWQgdG8gdXNlIChlLmcuIHVnbnQpICovXG4gICAgcmVzb3VyY2VJZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIC8qKiByZXBvIG93bmVyIGZvciBvcmlnaW5hbCBsYW5ndWFnZXMgc3VjaCBhcyB1bmZvbGRpbmdXb3JkICovXG4gICAgb3JpZ2luYWxMYW5ndWFnZU93bmVyOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIH0pLFxuICAvKiogcmVzb3VyY2VMaW5rICovXG4gIHJlc291cmNlTGluazogUHJvcFR5cGVzLmFueSxcbiAgLyoqVGhpcyBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgcXVvdGUgKi9cbiAgc2VsZWN0ZWRRdW90ZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqIHNlcnZlciAoZS5nLiAnaHR0cHM6Ly9naXQuZG9vcjQzLm9yZycpICovXG4gIHNlcnZlcjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAvKiogZnVuY3Rpb24gdG8gc2V0IHN0YXRlIGluIGFwcCB0aGF0IHRoZXJlIGFyZSB1bnNhdmVkIGNoYW5nZXMgKi9cbiAgc2V0U2F2ZWRDaGFuZ2VzOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqIGNhbGxiYWNrIHRvIHVwZGF0ZSB3b3JkIGFsaWduZXIgc3RhdGUgKi9cbiAgc2V0V29yZEFsaWduZXJTdGF0dXM6IFByb3BUeXBlcy5mdW5jLFxuICAvKiogdGl0bGUgZm9yIHNjcmlwdHVyZSBjYXJkICovXG4gIHRpdGxlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIC8qKiBvcHRpb25hbCBmdW5jdGlvbiBmb3IgbG9jYWxpemF0aW9uICovXG4gIHRyYW5zbGF0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKiB1c2UgbWV0aG9kIGZvciB1c2luZyBsb2NhbCBzdG9yYWdlIHNwZWNpZmljIGZvciB1c2VyICovXG4gIHVzZVVzZXJMb2NhbFN0b3JhZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG59XG4iXX0=