single-scripture-rcl 3.3.1 → 3.3.2-beta
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,15 +1,12 @@
|
|
|
1
|
-
import "core-js/modules/es.array.concat.js";
|
|
2
|
-
import "core-js/modules/es.array.find-index.js";
|
|
3
1
|
import "core-js/modules/es.array.is-array.js";
|
|
4
|
-
import "core-js/modules/es.array.join.js";
|
|
5
|
-
import "core-js/modules/es.regexp.exec.js";
|
|
6
|
-
import "core-js/modules/es.string.split.js";
|
|
7
2
|
import "regenerator-runtime/runtime.js";
|
|
8
3
|
|
|
9
4
|
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); } }
|
|
10
5
|
|
|
11
6
|
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
12
7
|
|
|
8
|
+
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; } } }; }
|
|
9
|
+
|
|
13
10
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
14
11
|
|
|
15
12
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
@@ -32,15 +29,16 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
32
29
|
import * as React from 'react';
|
|
33
30
|
import { AlignmentHelpers, UsfmFileConversionHelpers, usfmHelpers } from 'word-aligner-rcl';
|
|
34
31
|
import * as isEqual from 'deep-equal';
|
|
35
|
-
import
|
|
36
|
-
import {
|
|
37
|
-
import { core } from 'scripture-resources-rcl';
|
|
38
|
-
import usfmjs from 'usfm-js';
|
|
39
|
-
import { ScriptureConfig, ServerConfig } from '../types';
|
|
40
|
-
import { getScriptureResourceSettings, getVerseDataFromScripConfig } from '../utils/ScriptureSettings';
|
|
32
|
+
import { ScriptureConfig, ScriptureReference, ServerConfig } from '../types';
|
|
33
|
+
import { getScriptureResourceSettings } from '../utils/ScriptureSettings';
|
|
41
34
|
import { ORIGINAL_SOURCE } from '../utils';
|
|
42
35
|
import useScriptureResources from './useScriptureResources';
|
|
43
36
|
|
|
37
|
+
/**
|
|
38
|
+
* determines if alignment is complete based on target USFM and original language verse objects
|
|
39
|
+
* @param {string} targetVerseUSFM
|
|
40
|
+
* @param {object[]} originalVerseObjects
|
|
41
|
+
*/
|
|
44
42
|
function isUsfmAligned(targetVerseUSFM, originalVerseObjects) {
|
|
45
43
|
var _originalVerseObjects;
|
|
46
44
|
|
|
@@ -52,6 +50,14 @@ function isUsfmAligned(targetVerseUSFM, originalVerseObjects) {
|
|
|
52
50
|
|
|
53
51
|
return AlignmentHelpers.areAlgnmentsComplete(wordBank, alignments);
|
|
54
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* get the updated USFM for target verse from the updated verse objects and latest text
|
|
55
|
+
* @param {object[]} updatedVerseObjects
|
|
56
|
+
* @param {object[]} initialVerseObjects
|
|
57
|
+
* @param {boolean} verseTextChanged
|
|
58
|
+
* @param {string} newVerseText
|
|
59
|
+
*/
|
|
60
|
+
|
|
55
61
|
|
|
56
62
|
function getCurrentVerseUsfm(updatedVerseObjects, initialVerseObjects, verseTextChanged, newVerseText) {
|
|
57
63
|
var targetVerseUSFM = null;
|
|
@@ -67,39 +73,37 @@ function getCurrentVerseUsfm(updatedVerseObjects, initialVerseObjects, verseText
|
|
|
67
73
|
}
|
|
68
74
|
|
|
69
75
|
return targetVerseUSFM;
|
|
70
|
-
}
|
|
76
|
+
} // manage verse edit and alignment states
|
|
71
77
|
|
|
72
|
-
export function useScriptureAlignmentEdit(_ref) {
|
|
73
|
-
var _scriptureConfig$reso, _scriptureConfig$reso2, _scriptureConfig$reso3, _httpConfig, _httpConfig2;
|
|
74
78
|
|
|
75
|
-
|
|
76
|
-
|
|
79
|
+
export function useScriptureAlignmentEdit(_ref) {
|
|
80
|
+
var currentIndex = _ref.currentIndex,
|
|
77
81
|
enableEdit = _ref.enableEdit,
|
|
78
82
|
enableAlignment = _ref.enableAlignment,
|
|
79
83
|
httpConfig = _ref.httpConfig,
|
|
80
84
|
initialVerseObjects = _ref.initialVerseObjects,
|
|
85
|
+
initialVerseText = _ref.initialVerseText,
|
|
81
86
|
isNewTestament = _ref.isNewTestament,
|
|
82
|
-
loggedInUser = _ref.loggedInUser,
|
|
83
87
|
originalLanguageOwner = _ref.originalLanguageOwner,
|
|
84
88
|
originalRepoUrl = _ref.originalRepoUrl,
|
|
89
|
+
reference = _ref.reference,
|
|
85
90
|
scriptureConfig = _ref.scriptureConfig,
|
|
86
91
|
scriptureSettings = _ref.scriptureSettings,
|
|
92
|
+
setSavedChanges = _ref.setSavedChanges,
|
|
93
|
+
sourceLanguage = _ref.sourceLanguage,
|
|
87
94
|
startEditBranch = _ref.startEditBranch,
|
|
88
|
-
|
|
95
|
+
targetLanguage = _ref.targetLanguage,
|
|
96
|
+
title = _ref.title,
|
|
89
97
|
workingResourceBranch = _ref.workingResourceBranch;
|
|
90
98
|
|
|
91
99
|
var _React$useState = React.useState({
|
|
92
100
|
aligned: false,
|
|
93
101
|
alignerData: null,
|
|
94
102
|
editing: false,
|
|
95
|
-
initialVerseText: null,
|
|
96
103
|
newAlignments: null,
|
|
97
104
|
newVerseText: null,
|
|
98
105
|
updatedVerseObjects: null,
|
|
99
|
-
verseTextChanged: false
|
|
100
|
-
saveContent: null,
|
|
101
|
-
startSave: false,
|
|
102
|
-
sha: null
|
|
106
|
+
verseTextChanged: false
|
|
103
107
|
}),
|
|
104
108
|
_React$useState2 = _slicedToArray(_React$useState, 2),
|
|
105
109
|
state = _React$useState2[0],
|
|
@@ -108,14 +112,10 @@ export function useScriptureAlignmentEdit(_ref) {
|
|
|
108
112
|
var aligned = state.aligned,
|
|
109
113
|
alignerData = state.alignerData,
|
|
110
114
|
editing = state.editing,
|
|
111
|
-
initialVerseText = state.initialVerseText,
|
|
112
115
|
newAlignments = state.newAlignments,
|
|
113
116
|
newVerseText = state.newVerseText,
|
|
114
117
|
updatedVerseObjects = state.updatedVerseObjects,
|
|
115
|
-
verseTextChanged = state.verseTextChanged
|
|
116
|
-
saveContent = state.saveContent,
|
|
117
|
-
startSave = state.startSave,
|
|
118
|
-
sha = state.sha;
|
|
118
|
+
verseTextChanged = state.verseTextChanged;
|
|
119
119
|
|
|
120
120
|
function setState(newState) {
|
|
121
121
|
setState_(function (prevState) {
|
|
@@ -123,10 +123,8 @@ export function useScriptureAlignmentEdit(_ref) {
|
|
|
123
123
|
});
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
// check for context changes, reset edit and alignment state
|
|
129
|
-
console.log("reference changed ".concat(JSON.stringify(reference_)));
|
|
126
|
+
function clearChanges() {
|
|
127
|
+
console.log("clearChanges() - ".concat(JSON.stringify(reference)));
|
|
130
128
|
|
|
131
129
|
var clearState = _objectSpread(_objectSpread({}, state), {}, {
|
|
132
130
|
alignerData: null,
|
|
@@ -141,7 +139,7 @@ export function useScriptureAlignmentEdit(_ref) {
|
|
|
141
139
|
console.log("reference changed, reset edit/alignment state variables");
|
|
142
140
|
setState(clearState);
|
|
143
141
|
}
|
|
144
|
-
}
|
|
142
|
+
}
|
|
145
143
|
|
|
146
144
|
var originalScriptureSettings_ = _objectSpread(_objectSpread({}, scriptureSettings), {}, {
|
|
147
145
|
resourceId: ORIGINAL_SOURCE
|
|
@@ -149,74 +147,59 @@ export function useScriptureAlignmentEdit(_ref) {
|
|
|
149
147
|
|
|
150
148
|
|
|
151
149
|
httpConfig = httpConfig || {};
|
|
152
|
-
var bookId =
|
|
153
|
-
var originalScriptureSettings = getScriptureResourceSettings(bookId, originalScriptureSettings_, isNewTestament, originalRepoUrl);
|
|
154
|
-
|
|
155
|
-
var fetchResp_ = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.fetchResponse;
|
|
156
|
-
var owner = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso = scriptureConfig.resource) === null || _scriptureConfig$reso === void 0 ? void 0 : _scriptureConfig$reso.owner;
|
|
157
|
-
var repo = "".concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso2 = scriptureConfig.resource) === null || _scriptureConfig$reso2 === void 0 ? void 0 : _scriptureConfig$reso2.languageId, "_").concat(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$reso3 = scriptureConfig.resource) === null || _scriptureConfig$reso3 === void 0 ? void 0 : _scriptureConfig$reso3.projectId);
|
|
158
|
-
React.useEffect(function () {
|
|
159
|
-
var _fetchResp_$data;
|
|
160
|
-
|
|
161
|
-
// get the sha from last scripture download
|
|
162
|
-
var sha = (fetchResp_ === null || fetchResp_ === void 0 ? void 0 : (_fetchResp_$data = fetchResp_.data) === null || _fetchResp_$data === void 0 ? void 0 : _fetchResp_$data.sha) || null;
|
|
163
|
-
console.log("for ".concat(JSON.stringify(reference_), " new sha is ").concat(sha));
|
|
164
|
-
setState({
|
|
165
|
-
sha: sha
|
|
166
|
-
}); // @ts-ignore
|
|
167
|
-
}, [fetchResp_]);
|
|
168
|
-
|
|
169
|
-
function getBookName() {
|
|
170
|
-
var _scriptureConfig$refe;
|
|
171
|
-
|
|
172
|
-
var bookCaps = scriptureConfig !== null && scriptureConfig !== void 0 && (_scriptureConfig$refe = scriptureConfig.reference) !== null && _scriptureConfig$refe !== void 0 && _scriptureConfig$refe.projectId ? scriptureConfig.reference.projectId.toUpperCase() : '';
|
|
173
|
-
return "".concat(bookIndex, "-").concat(bookCaps, ".usfm");
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
var filepath = getBookName(); // TODO: enable save
|
|
177
|
-
|
|
178
|
-
var _useEdit = useEdit({
|
|
179
|
-
sha: sha,
|
|
180
|
-
owner: owner,
|
|
181
|
-
content: saveContent,
|
|
182
|
-
config: _objectSpread(_objectSpread({
|
|
183
|
-
cache: {
|
|
184
|
-
maxAge: 0
|
|
185
|
-
}
|
|
186
|
-
}, authentication === null || authentication === void 0 ? void 0 : authentication.config), {}, {
|
|
187
|
-
token: authentication === null || authentication === void 0 ? void 0 : authentication.token,
|
|
188
|
-
// @ts-ignore
|
|
189
|
-
timeout: ((_httpConfig = httpConfig) === null || _httpConfig === void 0 ? void 0 : _httpConfig.serverTimeOut) || ((_httpConfig2 = httpConfig) === null || _httpConfig2 === void 0 ? void 0 : _httpConfig2.timeout) || 5000
|
|
190
|
-
}),
|
|
191
|
-
author: loggedInUser,
|
|
192
|
-
token: authentication === null || authentication === void 0 ? void 0 : authentication.token,
|
|
193
|
-
branch: workingResourceBranch,
|
|
194
|
-
filepath: filepath,
|
|
195
|
-
repo: repo
|
|
196
|
-
}),
|
|
197
|
-
editResponse = _useEdit.editResponse,
|
|
198
|
-
error = _useEdit.error,
|
|
199
|
-
isEditing = _useEdit.isEditing,
|
|
200
|
-
isError = _useEdit.isError,
|
|
201
|
-
onSaveEdit = _useEdit.onSaveEdit;
|
|
150
|
+
var bookId = reference === null || reference === void 0 ? void 0 : reference.projectId;
|
|
151
|
+
var originalScriptureSettings = getScriptureResourceSettings(bookId, originalScriptureSettings_, isNewTestament, originalRepoUrl);
|
|
202
152
|
|
|
203
153
|
if (!enableAlignment) {
|
|
204
154
|
// if not enabled, then we don't fetch resource
|
|
205
155
|
originalScriptureSettings.resourceLink = null;
|
|
206
|
-
} // get original language for alignment
|
|
156
|
+
} // get original language for this alignment
|
|
207
157
|
|
|
208
158
|
|
|
209
159
|
var originalScriptureResource = useScriptureResources({
|
|
210
160
|
bookId: bookId,
|
|
211
161
|
scriptureSettings: originalScriptureSettings,
|
|
212
|
-
chapter:
|
|
213
|
-
verse:
|
|
162
|
+
chapter: reference === null || reference === void 0 ? void 0 : reference.chapter,
|
|
163
|
+
verse: reference === null || reference === void 0 ? void 0 : reference.verse,
|
|
214
164
|
isNewTestament: isNewTestament,
|
|
215
165
|
originalRepoUrl: originalRepoUrl,
|
|
216
166
|
currentLanguageId: originalScriptureSettings === null || originalScriptureSettings === void 0 ? void 0 : originalScriptureSettings.languageId,
|
|
217
167
|
currentOwner: originalLanguageOwner,
|
|
218
168
|
httpConfig: httpConfig
|
|
219
169
|
});
|
|
170
|
+
var originalVerseObjects = React.useMemo(function () {
|
|
171
|
+
var _originalScriptureRes;
|
|
172
|
+
|
|
173
|
+
// get the original language verseObjects
|
|
174
|
+
if ((originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : (_originalScriptureRes = originalScriptureResource.versesForRef) === null || _originalScriptureRes === void 0 ? void 0 : _originalScriptureRes.length) > 1) {
|
|
175
|
+
// if multiple verses, then append them together
|
|
176
|
+
var verseObjects = [];
|
|
177
|
+
|
|
178
|
+
var _iterator = _createForOfIteratorHelper(originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.versesForRef),
|
|
179
|
+
_step;
|
|
180
|
+
|
|
181
|
+
try {
|
|
182
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
183
|
+
var _verseReference$verse;
|
|
184
|
+
|
|
185
|
+
var verseReference = _step.value;
|
|
186
|
+
var origVerseObjects = verseReference === null || verseReference === void 0 ? void 0 : (_verseReference$verse = verseReference.verseData) === null || _verseReference$verse === void 0 ? void 0 : _verseReference$verse.verseObjects;
|
|
187
|
+
|
|
188
|
+
if (origVerseObjects) {
|
|
189
|
+
Array.prototype.push.apply(verseObjects, origVerseObjects);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
} catch (err) {
|
|
193
|
+
_iterator.e(err);
|
|
194
|
+
} finally {
|
|
195
|
+
_iterator.f();
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return verseObjects;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects;
|
|
202
|
+
}, [originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects, originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.versesForRef]);
|
|
220
203
|
React.useEffect(function () {
|
|
221
204
|
// update alignment status when aligner is hidden
|
|
222
205
|
var notEmpty = !!initialVerseObjects;
|
|
@@ -226,7 +209,6 @@ export function useScriptureAlignmentEdit(_ref) {
|
|
|
226
209
|
// skip if aligner is being shown
|
|
227
210
|
if (notEmpty) {
|
|
228
211
|
// skip if empty
|
|
229
|
-
var originalVerseObjects = originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects;
|
|
230
212
|
var currentVerseObjects_ = updatedVerseObjects || initialVerseObjects;
|
|
231
213
|
|
|
232
214
|
if (!enableAlignment) {
|
|
@@ -246,34 +228,10 @@ export function useScriptureAlignmentEdit(_ref) {
|
|
|
246
228
|
});
|
|
247
229
|
}
|
|
248
230
|
}
|
|
249
|
-
}, [initialVerseObjects, alignerData, newVerseText, initialVerseText, enableAlignment,
|
|
250
|
-
/**
|
|
251
|
-
* search chapter or verse chunk to line that starts with findItem
|
|
252
|
-
* @param {number|string} findItem
|
|
253
|
-
* @param {array[string]} chunks
|
|
254
|
-
*/
|
|
255
|
-
|
|
256
|
-
function findRefInArray(findItem, chunks) {
|
|
257
|
-
var ref_ = findItem + '';
|
|
258
|
-
var refLen = ref_.length;
|
|
259
|
-
var index = chunks.findIndex(function (chunk, idx) {
|
|
260
|
-
if (idx > 0) {
|
|
261
|
-
if (chunk.substring(0, refLen) === ref_) {
|
|
262
|
-
var nextChar = chunk[ref_];
|
|
263
|
-
|
|
264
|
-
if (nextChar > '9' || nextChar < '0') {
|
|
265
|
-
return true;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
return false;
|
|
271
|
-
});
|
|
272
|
-
return index;
|
|
273
|
-
}
|
|
231
|
+
}, [initialVerseObjects, alignerData, newVerseText, initialVerseText, enableAlignment, originalVerseObjects]);
|
|
274
232
|
|
|
275
|
-
function
|
|
276
|
-
console.log("
|
|
233
|
+
function getChanges() {
|
|
234
|
+
console.log("getChanges - started %{currentIndex}");
|
|
277
235
|
var updatedVerseObjects_;
|
|
278
236
|
|
|
279
237
|
if (newAlignments) {
|
|
@@ -283,9 +241,7 @@ export function useScriptureAlignmentEdit(_ref) {
|
|
|
283
241
|
var currentVerseObjects_ = updatedVerseObjects || initialVerseObjects;
|
|
284
242
|
|
|
285
243
|
var _AlignmentHelpers$upd2 = AlignmentHelpers.updateAlignmentsToTargetVerse(currentVerseObjects_, newVerseText),
|
|
286
|
-
|
|
287
|
-
targetVerseObjects = _AlignmentHelpers$upd2.targetVerseObjects; // console.log(`saveChangesToCloud() - new text:`, targetVerseText.substring(0,100))
|
|
288
|
-
|
|
244
|
+
targetVerseObjects = _AlignmentHelpers$upd2.targetVerseObjects;
|
|
289
245
|
|
|
290
246
|
updatedVerseObjects_ = targetVerseObjects;
|
|
291
247
|
} else {
|
|
@@ -294,159 +250,47 @@ export function useScriptureAlignmentEdit(_ref) {
|
|
|
294
250
|
}
|
|
295
251
|
|
|
296
252
|
if (updatedVerseObjects_) {
|
|
297
|
-
var
|
|
298
|
-
|
|
299
|
-
var ref = getVerseDataFromScripConfig(scriptureConfig, currentVerseNum); // @ts-ignore
|
|
300
|
-
|
|
301
|
-
var originalUsfm = core.getResponseData(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.fetchResponse);
|
|
302
|
-
|
|
303
|
-
if (originalUsfm) {
|
|
304
|
-
var chapterChunks = originalUsfm === null || originalUsfm === void 0 ? void 0 : originalUsfm.split('\\c ');
|
|
305
|
-
var chapterIndex = findRefInArray(ref === null || ref === void 0 ? void 0 : ref.chapter, chapterChunks);
|
|
306
|
-
|
|
307
|
-
if (chapterIndex >= 0) {
|
|
308
|
-
var currentChapter = chapterChunks[chapterIndex];
|
|
309
|
-
var verseChunks = currentChapter.split('\\v ');
|
|
310
|
-
var verseIndex = findRefInArray(ref === null || ref === void 0 ? void 0 : ref.verse, verseChunks);
|
|
253
|
+
var _scriptureConfig$vers;
|
|
311
254
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
var newChapter = verseChunks.join('\\v ');
|
|
318
|
-
chapterChunks[chapterIndex] = newChapter;
|
|
319
|
-
newUsfm = chapterChunks.join('\\c ');
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
if (!newUsfm) {
|
|
325
|
-
var newBookJson = updateVerseNum(currentVerseNum, updatedVerseObjects_);
|
|
326
|
-
newUsfm = usfmjs.toUSFM(newBookJson, {
|
|
327
|
-
forcedNewLines: true
|
|
328
|
-
});
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
console.log("saveChangesToCloud() - saving new USFM: ".concat(newUsfm.substring(0, 100), "..."));
|
|
332
|
-
setState({
|
|
333
|
-
saveContent: newUsfm,
|
|
334
|
-
startSave: true
|
|
335
|
-
});
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
React.useEffect(function () {
|
|
340
|
-
var _saveEdit = /*#__PURE__*/function () {
|
|
341
|
-
var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
|
|
342
|
-
var branch;
|
|
343
|
-
return regeneratorRuntime.wrap(function _callee$(_context) {
|
|
344
|
-
while (1) {
|
|
345
|
-
switch (_context.prev = _context.next) {
|
|
346
|
-
case 0:
|
|
347
|
-
// begin uploading new USFM
|
|
348
|
-
branch = workingResourceBranch !== 'master' ? workingResourceBranch : undefined;
|
|
349
|
-
|
|
350
|
-
if (branch) {
|
|
351
|
-
_context.next = 5;
|
|
352
|
-
break;
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
_context.next = 4;
|
|
356
|
-
return startEditBranch();
|
|
357
|
-
|
|
358
|
-
case 4:
|
|
359
|
-
branch = _context.sent;
|
|
360
|
-
|
|
361
|
-
case 5:
|
|
362
|
-
_context.next = 7;
|
|
363
|
-
return onSaveEdit(branch).then(function (success) {
|
|
364
|
-
// push changed to server
|
|
365
|
-
if (success) {
|
|
366
|
-
console.log("saveChangesToCloud() - save scripture edits success");
|
|
367
|
-
setState({
|
|
368
|
-
updatedVerseObjects: null,
|
|
369
|
-
editing: false,
|
|
370
|
-
newVerseText: null,
|
|
371
|
-
alignerData: null,
|
|
372
|
-
startSave: false,
|
|
373
|
-
verseTextChanged: false,
|
|
374
|
-
initialVerseText: null
|
|
375
|
-
});
|
|
376
|
-
console.info('saveChangesToCloud() - Reloading resource');
|
|
377
|
-
scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reloadResource();
|
|
378
|
-
} else {
|
|
379
|
-
console.error('saveChangesToCloud() - saving changed scripture failed');
|
|
380
|
-
setState({
|
|
381
|
-
startSave: false
|
|
382
|
-
});
|
|
383
|
-
}
|
|
384
|
-
});
|
|
385
|
-
|
|
386
|
-
case 7:
|
|
387
|
-
case "end":
|
|
388
|
-
return _context.stop();
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
}, _callee);
|
|
392
|
-
}));
|
|
393
|
-
|
|
394
|
-
return function _saveEdit() {
|
|
395
|
-
return _ref2.apply(this, arguments);
|
|
255
|
+
var ref = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$vers = scriptureConfig.versesForRef) === null || _scriptureConfig$vers === void 0 ? void 0 : _scriptureConfig$vers[currentIndex];
|
|
256
|
+
return {
|
|
257
|
+
newVerseText: newVerseText,
|
|
258
|
+
ref: ref,
|
|
259
|
+
updatedVerseObjects: updatedVerseObjects_
|
|
396
260
|
};
|
|
397
|
-
}();
|
|
398
|
-
|
|
399
|
-
if (startSave) {
|
|
400
|
-
console.log("saveChangesToCloud - calling _saveEdit()");
|
|
401
|
-
|
|
402
|
-
_saveEdit();
|
|
403
|
-
}
|
|
404
|
-
}, [startSave]);
|
|
405
|
-
|
|
406
|
-
function updateVerseNum(verseNum) {
|
|
407
|
-
var newVerseObjects = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : initialVerseObjects;
|
|
408
|
-
// @ts-ignore
|
|
409
|
-
var ref = getVerseDataFromScripConfig(scriptureConfig, verseNum);
|
|
410
|
-
var targetVerseObjects_ = null;
|
|
411
|
-
|
|
412
|
-
if (ref) {
|
|
413
|
-
if (newVerseText) {
|
|
414
|
-
var _AlignmentHelpers$upd3 = AlignmentHelpers.updateAlignmentsToTargetVerse(newVerseObjects, newVerseText),
|
|
415
|
-
targetVerseObjects = _AlignmentHelpers$upd3.targetVerseObjects;
|
|
416
|
-
|
|
417
|
-
targetVerseObjects_ = targetVerseObjects;
|
|
418
|
-
} else {
|
|
419
|
-
targetVerseObjects_ = newVerseObjects;
|
|
420
|
-
} // @ts-ignore
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
return targetVerseObjects_ && (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.updateVerse(ref.chapter, ref.verse, {
|
|
424
|
-
verseObjects: targetVerseObjects_
|
|
425
|
-
}));
|
|
426
261
|
}
|
|
427
262
|
|
|
428
|
-
return
|
|
263
|
+
return {};
|
|
429
264
|
}
|
|
265
|
+
/**
|
|
266
|
+
* callback for when user clicked on alignment button - will show if not already shown
|
|
267
|
+
*/
|
|
268
|
+
|
|
430
269
|
|
|
431
270
|
function handleAlignmentClick() {
|
|
432
271
|
return _handleAlignmentClick.apply(this, arguments);
|
|
433
272
|
}
|
|
273
|
+
/**
|
|
274
|
+
* get updated verse objects after alignments changed
|
|
275
|
+
* @param {object} _newAlignments - results of aligner
|
|
276
|
+
*/
|
|
277
|
+
|
|
434
278
|
|
|
435
279
|
function _handleAlignmentClick() {
|
|
436
|
-
_handleAlignmentClick = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function
|
|
437
|
-
var
|
|
280
|
+
_handleAlignmentClick = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
|
|
281
|
+
var _alignerData, targetVerseUSFM, originalVerseUsfm, _AlignmentHelpers$par, wordBank, alignments;
|
|
438
282
|
|
|
439
|
-
return regeneratorRuntime.wrap(function
|
|
283
|
+
return regeneratorRuntime.wrap(function _callee$(_context) {
|
|
440
284
|
while (1) {
|
|
441
|
-
switch (
|
|
285
|
+
switch (_context.prev = _context.next) {
|
|
442
286
|
case 0:
|
|
443
287
|
if (!enableAlignment) {
|
|
444
|
-
|
|
288
|
+
_context.next = 7;
|
|
445
289
|
break;
|
|
446
290
|
}
|
|
447
291
|
|
|
448
|
-
|
|
449
|
-
|
|
292
|
+
_alignerData = null;
|
|
293
|
+
_context.next = 4;
|
|
450
294
|
return startEditBranch();
|
|
451
295
|
|
|
452
296
|
case 4:
|
|
@@ -454,7 +298,6 @@ export function useScriptureAlignmentEdit(_ref) {
|
|
|
454
298
|
// if word aligner not shown
|
|
455
299
|
console.log("handleAlignmentClick - toggle ON alignment");
|
|
456
300
|
targetVerseUSFM = getCurrentVerseUsfm(updatedVerseObjects, initialVerseObjects, verseTextChanged, newVerseText);
|
|
457
|
-
originalVerseObjects = originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects;
|
|
458
301
|
originalVerseUsfm = null;
|
|
459
302
|
|
|
460
303
|
if (originalVerseObjects) {
|
|
@@ -462,44 +305,54 @@ export function useScriptureAlignmentEdit(_ref) {
|
|
|
462
305
|
}
|
|
463
306
|
|
|
464
307
|
_AlignmentHelpers$par = AlignmentHelpers.parseUsfmToWordAlignerData(targetVerseUSFM, originalVerseUsfm), wordBank = _AlignmentHelpers$par.targetWords, alignments = _AlignmentHelpers$par.verseAlignments;
|
|
465
|
-
|
|
308
|
+
_alignerData = {
|
|
466
309
|
wordBank: wordBank,
|
|
467
310
|
alignments: alignments
|
|
468
311
|
};
|
|
469
312
|
} else {
|
|
470
313
|
// word aligner currently shown
|
|
471
314
|
console.log("handleAlignmentClick - alignment already shown");
|
|
472
|
-
|
|
315
|
+
_alignerData = alignerData;
|
|
473
316
|
}
|
|
474
317
|
|
|
475
318
|
setState({
|
|
476
|
-
alignerData:
|
|
319
|
+
alignerData: _alignerData
|
|
477
320
|
});
|
|
478
|
-
console.log(
|
|
321
|
+
console.log(_alignerData);
|
|
479
322
|
|
|
480
323
|
case 7:
|
|
481
324
|
case "end":
|
|
482
|
-
return
|
|
325
|
+
return _context.stop();
|
|
483
326
|
}
|
|
484
327
|
}
|
|
485
|
-
},
|
|
328
|
+
}, _callee);
|
|
486
329
|
}));
|
|
487
330
|
return _handleAlignmentClick.apply(this, arguments);
|
|
488
331
|
}
|
|
489
332
|
|
|
490
333
|
function updateVerseWithNewAlignments() {
|
|
334
|
+
var _newAlignments = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : newAlignments;
|
|
335
|
+
|
|
491
336
|
var currentVerseObjects_ = updatedVerseObjects || initialVerseObjects;
|
|
492
337
|
var targetVerseText = newVerseText || UsfmFileConversionHelpers.convertVerseDataToUSFM(currentVerseObjects_);
|
|
493
|
-
var verseUsfm = AlignmentHelpers.addAlignmentsToVerseUSFM(
|
|
338
|
+
var verseUsfm = AlignmentHelpers.addAlignmentsToVerseUSFM(_newAlignments.targetWords, _newAlignments.verseAlignments, targetVerseText);
|
|
494
339
|
var alignedVerseObjects = usfmHelpers.usfmVerseToJson(verseUsfm);
|
|
495
340
|
return alignedVerseObjects;
|
|
496
341
|
}
|
|
342
|
+
/**
|
|
343
|
+
* callback for when user clicked on button to save current alignments in word aligner. Generates new verse content and saves in state. Closes aligner display
|
|
344
|
+
* @param {object} _newAlignments - results of aligner
|
|
345
|
+
*/
|
|
346
|
+
|
|
497
347
|
|
|
498
348
|
function saveAlignment() {
|
|
499
|
-
|
|
349
|
+
var _newAlignments = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : newAlignments;
|
|
500
350
|
|
|
501
|
-
|
|
502
|
-
|
|
351
|
+
console.log("saveAlignment() - newAlignments", _newAlignments);
|
|
352
|
+
|
|
353
|
+
if (_newAlignments) {
|
|
354
|
+
var alignedVerseObjects = updateVerseWithNewAlignments(_newAlignments);
|
|
355
|
+
console.log("saveAlignment() - alignedVerseObjects", alignedVerseObjects);
|
|
503
356
|
setState({
|
|
504
357
|
alignerData: null,
|
|
505
358
|
editing: false,
|
|
@@ -513,6 +366,10 @@ export function useScriptureAlignmentEdit(_ref) {
|
|
|
513
366
|
});
|
|
514
367
|
}
|
|
515
368
|
}
|
|
369
|
+
/**
|
|
370
|
+
* callback for when user clicked on button to cancel work in word aligner. Calculates and displays current alignment valid state. Closes aligner display
|
|
371
|
+
*/
|
|
372
|
+
|
|
516
373
|
|
|
517
374
|
function cancelAlignment() {
|
|
518
375
|
console.log("cancelAlignment()");
|
|
@@ -522,30 +379,41 @@ export function useScriptureAlignmentEdit(_ref) {
|
|
|
522
379
|
alignerData: null,
|
|
523
380
|
aligned: aligned
|
|
524
381
|
});
|
|
525
|
-
}
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* callback for button to set editing state
|
|
385
|
+
* @param {boolean} editing_ - if true, editor is shown, otherwise editor is hidden
|
|
386
|
+
*/
|
|
526
387
|
|
|
527
388
|
|
|
528
389
|
function setEditing(_x) {
|
|
529
390
|
return _setEditing.apply(this, arguments);
|
|
530
391
|
}
|
|
392
|
+
/**
|
|
393
|
+
* callback from the edit onChange event to update edit state variables
|
|
394
|
+
* @param {boolean} changed - true if the newVerseText is different than the initialVerseText
|
|
395
|
+
* @param {string} newVerseText - current changed verse text
|
|
396
|
+
* @param {string} _initialVerseText - initial verse text
|
|
397
|
+
*/
|
|
398
|
+
|
|
531
399
|
|
|
532
400
|
function _setEditing() {
|
|
533
|
-
_setEditing = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function
|
|
534
|
-
return regeneratorRuntime.wrap(function
|
|
401
|
+
_setEditing = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(editing_) {
|
|
402
|
+
return regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
535
403
|
while (1) {
|
|
536
|
-
switch (
|
|
404
|
+
switch (_context2.prev = _context2.next) {
|
|
537
405
|
case 0:
|
|
538
406
|
if (!enableEdit) {
|
|
539
|
-
|
|
407
|
+
_context2.next = 5;
|
|
540
408
|
break;
|
|
541
409
|
}
|
|
542
410
|
|
|
543
411
|
if (!(editing_ && !editing)) {
|
|
544
|
-
|
|
412
|
+
_context2.next = 4;
|
|
545
413
|
break;
|
|
546
414
|
}
|
|
547
415
|
|
|
548
|
-
|
|
416
|
+
_context2.next = 4;
|
|
549
417
|
return startEditBranch();
|
|
550
418
|
|
|
551
419
|
case 4:
|
|
@@ -557,28 +425,30 @@ export function useScriptureAlignmentEdit(_ref) {
|
|
|
557
425
|
|
|
558
426
|
case 5:
|
|
559
427
|
case "end":
|
|
560
|
-
return
|
|
428
|
+
return _context2.stop();
|
|
561
429
|
}
|
|
562
430
|
}
|
|
563
|
-
},
|
|
431
|
+
}, _callee2);
|
|
564
432
|
}));
|
|
565
433
|
return _setEditing.apply(this, arguments);
|
|
566
434
|
}
|
|
567
435
|
|
|
568
|
-
function setVerseChanged(changed, newVerseText,
|
|
569
|
-
var _AlignmentHelpers$
|
|
570
|
-
targetVerseText = _AlignmentHelpers$
|
|
436
|
+
function setVerseChanged(changed, newVerseText, _initialVerseText) {
|
|
437
|
+
var _AlignmentHelpers$upd3 = AlignmentHelpers.updateAlignmentsToTargetVerse(initialVerseObjects, newVerseText),
|
|
438
|
+
targetVerseText = _AlignmentHelpers$upd3.targetVerseText;
|
|
571
439
|
|
|
572
440
|
var aligned = isUsfmAligned(targetVerseText, originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects);
|
|
441
|
+
|
|
442
|
+
var _changed = newVerseText !== initialVerseText;
|
|
443
|
+
|
|
573
444
|
setState({
|
|
574
|
-
verseTextChanged:
|
|
575
|
-
initialVerseText: initialVerseText,
|
|
445
|
+
verseTextChanged: _changed,
|
|
576
446
|
newVerseText: newVerseText,
|
|
577
447
|
aligned: aligned
|
|
578
448
|
});
|
|
579
449
|
}
|
|
580
450
|
|
|
581
|
-
var
|
|
451
|
+
var currentVerseObjects = React.useMemo(function () {
|
|
582
452
|
// if verse has been edited or alignment changed, then generate new verseObjects to display in ScripturePane
|
|
583
453
|
if (initialVerseObjects) {
|
|
584
454
|
var targetVerseUSFM = getCurrentVerseUsfm(updatedVerseObjects, initialVerseObjects, verseTextChanged, newVerseText);
|
|
@@ -593,6 +463,16 @@ export function useScriptureAlignmentEdit(_ref) {
|
|
|
593
463
|
var changed = verseTextChanged || updatedVerseObjects && !isEqual(initialVerseObjects, updatedVerseObjects);
|
|
594
464
|
return changed;
|
|
595
465
|
}, [updatedVerseObjects, initialVerseObjects, verseTextChanged]);
|
|
466
|
+
React.useEffect(function () {
|
|
467
|
+
// set saved changes whenever user edits verse text or alignments or if alignments are open
|
|
468
|
+
var unsavedChanges_ = unsavedChanges || alignerData;
|
|
469
|
+
setSavedChanges && setSavedChanges(currentIndex, !unsavedChanges_, getChanges, clearChanges);
|
|
470
|
+
}, [unsavedChanges, alignerData]);
|
|
471
|
+
/**
|
|
472
|
+
* callback for when alignments are being changed
|
|
473
|
+
* @param {object} results
|
|
474
|
+
* @return {boolean} true if alignment is complete
|
|
475
|
+
*/
|
|
596
476
|
|
|
597
477
|
function onAlignmentsChange(results) {
|
|
598
478
|
console.log("onAlignmentsChange() - alignment changed, results", results); // merge alignments into target verse and convert to USFM
|
|
@@ -605,26 +485,34 @@ export function useScriptureAlignmentEdit(_ref) {
|
|
|
605
485
|
newAlignments: results,
|
|
606
486
|
aligned: alignmentComplete
|
|
607
487
|
});
|
|
488
|
+
return alignmentComplete;
|
|
608
489
|
}
|
|
609
490
|
|
|
610
491
|
return {
|
|
611
492
|
actions: {
|
|
612
493
|
cancelAlignment: cancelAlignment,
|
|
613
|
-
|
|
494
|
+
getChanges: getChanges,
|
|
614
495
|
handleAlignmentClick: handleAlignmentClick,
|
|
615
496
|
onAlignmentsChange: onAlignmentsChange,
|
|
616
497
|
saveAlignment: saveAlignment,
|
|
617
498
|
setEditing: setEditing,
|
|
618
|
-
setVerseChanged: setVerseChanged
|
|
619
|
-
saveChangesToCloud: saveChangesToCloud
|
|
499
|
+
setVerseChanged: setVerseChanged
|
|
620
500
|
},
|
|
621
501
|
state: {
|
|
622
502
|
aligned: aligned,
|
|
623
503
|
alignerData: alignerData,
|
|
504
|
+
currentVerseObjects: currentVerseObjects,
|
|
624
505
|
editing: editing,
|
|
506
|
+
initialVerseText: initialVerseText,
|
|
507
|
+
initialVerseObjects: initialVerseObjects,
|
|
508
|
+
newVerseText: newVerseText,
|
|
509
|
+
sourceLanguage: sourceLanguage,
|
|
510
|
+
targetLanguage: targetLanguage,
|
|
511
|
+
unsavedChanges: unsavedChanges,
|
|
625
512
|
verseTextChanged: verseTextChanged,
|
|
626
|
-
|
|
513
|
+
reference: reference,
|
|
514
|
+
title: title
|
|
627
515
|
}
|
|
628
516
|
};
|
|
629
517
|
}
|
|
630
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VTY3JpcHR1cmVBbGlnbm1lbnRFZGl0LnRzeCJdLCJuYW1lcyI6WyJSZWFjdCIsIkFsaWdubWVudEhlbHBlcnMiLCJVc2ZtRmlsZUNvbnZlcnNpb25IZWxwZXJzIiwidXNmbUhlbHBlcnMiLCJpc0VxdWFsIiwidXNlRGVlcENvbXBhcmVFZmZlY3QiLCJ1c2VFZGl0IiwiY29yZSIsInVzZm1qcyIsIlNjcmlwdHVyZUNvbmZpZyIsIlNlcnZlckNvbmZpZyIsImdldFNjcmlwdHVyZVJlc291cmNlU2V0dGluZ3MiLCJnZXRWZXJzZURhdGFGcm9tU2NyaXBDb25maWciLCJPUklHSU5BTF9TT1VSQ0UiLCJ1c2VTY3JpcHR1cmVSZXNvdXJjZXMiLCJpc1VzZm1BbGlnbmVkIiwidGFyZ2V0VmVyc2VVU0ZNIiwib3JpZ2luYWxWZXJzZU9iamVjdHMiLCJsZW5ndGgiLCJleHRyYWN0QWxpZ25tZW50c0Zyb21UYXJnZXRWZXJzZSIsImFsaWdubWVudHMiLCJ3b3JkQmFuayIsImFyZUFsZ25tZW50c0NvbXBsZXRlIiwiZ2V0Q3VycmVudFZlcnNlVXNmbSIsInVwZGF0ZWRWZXJzZU9iamVjdHMiLCJpbml0aWFsVmVyc2VPYmplY3RzIiwidmVyc2VUZXh0Q2hhbmdlZCIsIm5ld1ZlcnNlVGV4dCIsImN1cnJlbnRWZXJzZU9iamVjdHNfIiwidXBkYXRlQWxpZ25tZW50c1RvVGFyZ2V0VmVyc2UiLCJ0YXJnZXRWZXJzZVRleHQiLCJjb252ZXJ0VmVyc2VEYXRhVG9VU0ZNIiwidXNlU2NyaXB0dXJlQWxpZ25tZW50RWRpdCIsImF1dGhlbnRpY2F0aW9uIiwiY3VycmVudFZlcnNlTnVtIiwiZW5hYmxlRWRpdCIsImVuYWJsZUFsaWdubWVudCIsImh0dHBDb25maWciLCJpc05ld1Rlc3RhbWVudCIsImxvZ2dlZEluVXNlciIsIm9yaWdpbmFsTGFuZ3VhZ2VPd25lciIsIm9yaWdpbmFsUmVwb1VybCIsInNjcmlwdHVyZUNvbmZpZyIsInNjcmlwdHVyZVNldHRpbmdzIiwic3RhcnRFZGl0QnJhbmNoIiwiYm9va0luZGV4Iiwid29ya2luZ1Jlc291cmNlQnJhbmNoIiwidXNlU3RhdGUiLCJhbGlnbmVkIiwiYWxpZ25lckRhdGEiLCJlZGl0aW5nIiwiaW5pdGlhbFZlcnNlVGV4dCIsIm5ld0FsaWdubWVudHMiLCJzYXZlQ29udGVudCIsInN0YXJ0U2F2ZSIsInNoYSIsInN0YXRlIiwic2V0U3RhdGVfIiwic2V0U3RhdGUiLCJuZXdTdGF0ZSIsInByZXZTdGF0ZSIsInJlZmVyZW5jZV8iLCJyZWZlcmVuY2UiLCJjb25zb2xlIiwibG9nIiwiSlNPTiIsInN0cmluZ2lmeSIsImNsZWFyU3RhdGUiLCJvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzXyIsInJlc291cmNlSWQiLCJib29rSWQiLCJwcm9qZWN0SWQiLCJvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzIiwiZmV0Y2hSZXNwXyIsImZldGNoUmVzcG9uc2UiLCJvd25lciIsInJlc291cmNlIiwicmVwbyIsImxhbmd1YWdlSWQiLCJ1c2VFZmZlY3QiLCJkYXRhIiwiZ2V0Qm9va05hbWUiLCJib29rQ2FwcyIsInRvVXBwZXJDYXNlIiwiZmlsZXBhdGgiLCJjb250ZW50IiwiY29uZmlnIiwiY2FjaGUiLCJtYXhBZ2UiLCJ0b2tlbiIsInRpbWVvdXQiLCJzZXJ2ZXJUaW1lT3V0IiwiYXV0aG9yIiwiYnJhbmNoIiwiZWRpdFJlc3BvbnNlIiwiZXJyb3IiLCJpc0VkaXRpbmciLCJpc0Vycm9yIiwib25TYXZlRWRpdCIsInJlc291cmNlTGluayIsIm9yaWdpbmFsU2NyaXB0dXJlUmVzb3VyY2UiLCJjaGFwdGVyIiwidmVyc2UiLCJjdXJyZW50TGFuZ3VhZ2VJZCIsImN1cnJlbnRPd25lciIsIm5vdEVtcHR5IiwiYWxpZ25lZF8iLCJ2ZXJzZU9iamVjdHMiLCJyZXN1bHRzIiwiZmluZFJlZkluQXJyYXkiLCJmaW5kSXRlbSIsImNodW5rcyIsInJlZl8iLCJyZWZMZW4iLCJpbmRleCIsImZpbmRJbmRleCIsImNodW5rIiwiaWR4Iiwic3Vic3RyaW5nIiwibmV4dENoYXIiLCJzYXZlQ2hhbmdlc1RvQ2xvdWQiLCJ1cGRhdGVkVmVyc2VPYmplY3RzXyIsInVwZGF0ZVZlcnNlV2l0aE5ld0FsaWdubWVudHMiLCJ0YXJnZXRWZXJzZU9iamVjdHMiLCJuZXdVc2ZtIiwicmVmIiwib3JpZ2luYWxVc2ZtIiwiZ2V0UmVzcG9uc2VEYXRhIiwiY2hhcHRlckNodW5rcyIsInNwbGl0IiwiY2hhcHRlckluZGV4IiwiY3VycmVudENoYXB0ZXIiLCJ2ZXJzZUNodW5rcyIsInZlcnNlSW5kZXgiLCJuZXdWZXJzZVVzZm0iLCJvbGRWZXJzZSIsInZlcnNlTnVtTGVuIiwibmV3Q2hhcHRlciIsImpvaW4iLCJuZXdCb29rSnNvbiIsInVwZGF0ZVZlcnNlTnVtIiwidG9VU0ZNIiwiZm9yY2VkTmV3TGluZXMiLCJfc2F2ZUVkaXQiLCJ1bmRlZmluZWQiLCJ0aGVuIiwic3VjY2VzcyIsImluZm8iLCJyZWxvYWRSZXNvdXJjZSIsInZlcnNlTnVtIiwibmV3VmVyc2VPYmplY3RzIiwidGFyZ2V0VmVyc2VPYmplY3RzXyIsInVwZGF0ZVZlcnNlIiwiaGFuZGxlQWxpZ25tZW50Q2xpY2siLCJhbGlnbmVyRGF0YV8iLCJvcmlnaW5hbFZlcnNlVXNmbSIsInBhcnNlVXNmbVRvV29yZEFsaWduZXJEYXRhIiwidGFyZ2V0V29yZHMiLCJ2ZXJzZUFsaWdubWVudHMiLCJ2ZXJzZVVzZm0iLCJhZGRBbGlnbm1lbnRzVG9WZXJzZVVTRk0iLCJhbGlnbmVkVmVyc2VPYmplY3RzIiwidXNmbVZlcnNlVG9Kc29uIiwic2F2ZUFsaWdubWVudCIsImNhbmNlbEFsaWdubWVudCIsInNldEVkaXRpbmciLCJlZGl0aW5nXyIsInNldFZlcnNlQ2hhbmdlZCIsImNoYW5nZWQiLCJlZGl0ZWRWZXJzZU9iamVjdHMiLCJ1c2VNZW1vIiwidW5zYXZlZENoYW5nZXMiLCJvbkFsaWdubWVudHNDaGFuZ2UiLCJhbGlnbm1lbnRDb21wbGV0ZSIsImFjdGlvbnMiXSwibWFwcGluZ3Mi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QUFBLGNBQWMsRUFBZEE7QUFMSztBQVhGLEdBQVA7QUFtQkQiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtaWdub3JlXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7XG4gIEFsaWdubWVudEhlbHBlcnMsXG4gIFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMsXG4gIHVzZm1IZWxwZXJzLFxufSBmcm9tICd3b3JkLWFsaWduZXItcmNsJ1xuaW1wb3J0ICogYXMgaXNFcXVhbCBmcm9tICdkZWVwLWVxdWFsJ1xuaW1wb3J0IHVzZURlZXBDb21wYXJlRWZmZWN0IGZyb20gJ3VzZS1kZWVwLWNvbXBhcmUtZWZmZWN0J1xuaW1wb3J0IHsgdXNlRWRpdCB9IGZyb20gJ2dpdGVhLXJlYWN0LXRvb2xraXQnXG5pbXBvcnQgeyBjb3JlIH0gZnJvbSAnc2NyaXB0dXJlLXJlc291cmNlcy1yY2wnXG5pbXBvcnQgdXNmbWpzIGZyb20gJ3VzZm0tanMnXG5pbXBvcnQgeyBTY3JpcHR1cmVDb25maWcsIFNlcnZlckNvbmZpZyB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHtcbiAgZ2V0U2NyaXB0dXJlUmVzb3VyY2VTZXR0aW5ncyxcbiAgZ2V0VmVyc2VEYXRhRnJvbVNjcmlwQ29uZmlnXG59IGZyb20gJy4uL3V0aWxzL1NjcmlwdHVyZVNldHRpbmdzJ1xuaW1wb3J0IHsgT1JJR0lOQUxfU09VUkNFIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgdXNlU2NyaXB0dXJlUmVzb3VyY2VzIGZyb20gJy4vdXNlU2NyaXB0dXJlUmVzb3VyY2VzJ1xuXG5pbnRlcmZhY2UgU3RhcnRFZGl0IHtcbiAgKCk6IFByb21pc2U8c3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgYXV0aGVudGljYXRpb246IHsgY29uZmlnOiBvYmplY3QsIHRva2VuOiBzdHJpbmcgfSxcbiAgY3VycmVudFZlcnNlTnVtOiBudW1iZXIsXG4gIGVuYWJsZUVkaXQ6IGJvb2xlYW4sXG4gIGVuYWJsZUFsaWdubWVudDogYm9vbGVhbixcbiAgaHR0cENvbmZpZzogU2VydmVyQ29uZmlnLFxuICBpbml0aWFsVmVyc2VPYmplY3RzOiBbXSxcbiAgaXNOZXdUZXN0YW1lbnQ6IGJvb2xlYW4sXG4gIGxvZ2dlZEluVXNlcjogc3RyaW5nLFxuICBvcmlnaW5hbExhbmd1YWdlT3duZXI6IHN0cmluZyxcbiAgb3JpZ2luYWxSZXBvVXJsOiBzdHJpbmcsXG4gIHNjcmlwdHVyZUNvbmZpZzogU2NyaXB0dXJlQ29uZmlnLFxuICBzY3JpcHR1cmVTZXR0aW5nczogeyB9LFxuICBzZXRTYXZlZENoYW5nZXM6IEZ1bmN0aW9uLFxuICBzdGFydEVkaXRCcmFuY2g6IFN0YXJ0RWRpdCxcbiAgYm9va0luZGV4OiBzdHJpbmcsXG4gIHdvcmtpbmdSZXNvdXJjZUJyYW5jaDogc3RyaW5nLFxufVxuXG5mdW5jdGlvbiBpc1VzZm1BbGlnbmVkKHRhcmdldFZlcnNlVVNGTSwgb3JpZ2luYWxWZXJzZU9iamVjdHMpIHtcbiAgb3JpZ2luYWxWZXJzZU9iamVjdHMgPSBvcmlnaW5hbFZlcnNlT2JqZWN0cz8ubGVuZ3RoID8gb3JpZ2luYWxWZXJzZU9iamVjdHMgOiBudWxsIC8vIG1ha2Ugc3VyZSBub3QgcGFzc2luZyBlbXB0eSBBcnJheVxuICBjb25zdCB7IGFsaWdubWVudHMsIHdvcmRCYW5rIH0gPSBBbGlnbm1lbnRIZWxwZXJzLmV4dHJhY3RBbGlnbm1lbnRzRnJvbVRhcmdldFZlcnNlKHRhcmdldFZlcnNlVVNGTSwgb3JpZ2luYWxWZXJzZU9iamVjdHMpXG4gIHJldHVybiBBbGlnbm1lbnRIZWxwZXJzLmFyZUFsZ25tZW50c0NvbXBsZXRlKHdvcmRCYW5rLCBhbGlnbm1lbnRzKVxufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50VmVyc2VVc2ZtKHVwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWQ6IGJvb2xlYW4sIG5ld1ZlcnNlVGV4dCkge1xuICBsZXQgdGFyZ2V0VmVyc2VVU0ZNID0gbnVsbFxuICBjb25zdCBjdXJyZW50VmVyc2VPYmplY3RzXyA9IHVwZGF0ZWRWZXJzZU9iamVjdHMgfHwgaW5pdGlhbFZlcnNlT2JqZWN0c1xuXG4gIGlmICh2ZXJzZVRleHRDaGFuZ2VkICYmIG5ld1ZlcnNlVGV4dCkge1xuICAgIGNvbnN0IHsgdGFyZ2V0VmVyc2VUZXh0IH0gPSBBbGlnbm1lbnRIZWxwZXJzLnVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlKGN1cnJlbnRWZXJzZU9iamVjdHNfLCBuZXdWZXJzZVRleHQpXG4gICAgdGFyZ2V0VmVyc2VVU0ZNID0gdGFyZ2V0VmVyc2VUZXh0XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0VmVyc2VVU0ZNID0gVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKGN1cnJlbnRWZXJzZU9iamVjdHNfKVxuICB9XG4gIHJldHVybiB0YXJnZXRWZXJzZVVTRk1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNjcmlwdHVyZUFsaWdubWVudEVkaXQoe1xuICBhdXRoZW50aWNhdGlvbixcbiAgY3VycmVudFZlcnNlTnVtLFxuICBlbmFibGVFZGl0LFxuICBlbmFibGVBbGlnbm1lbnQsXG4gIGh0dHBDb25maWcsXG4gIGluaXRpYWxWZXJzZU9iamVjdHMsXG4gIGlzTmV3VGVzdGFtZW50LFxuICBsb2dnZWRJblVzZXIsXG4gIG9yaWdpbmFsTGFuZ3VhZ2VPd25lcixcbiAgb3JpZ2luYWxSZXBvVXJsLFxuICBzY3JpcHR1cmVDb25maWcsXG4gIHNjcmlwdHVyZVNldHRpbmdzLFxuICBzdGFydEVkaXRCcmFuY2gsXG4gIGJvb2tJbmRleCxcbiAgd29ya2luZ1Jlc291cmNlQnJhbmNoLFxufSA6IFByb3BzKSB7XG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVfXSA9IFJlYWN0LnVzZVN0YXRlKHtcbiAgICBhbGlnbmVkOiBmYWxzZSxcbiAgICBhbGlnbmVyRGF0YTogbnVsbCxcbiAgICBlZGl0aW5nOiBmYWxzZSxcbiAgICBpbml0aWFsVmVyc2VUZXh0OiBudWxsLFxuICAgIG5ld0FsaWdubWVudHM6IG51bGwsXG4gICAgbmV3VmVyc2VUZXh0OiBudWxsLFxuICAgIHVwZGF0ZWRWZXJzZU9iamVjdHM6IG51bGwsXG4gICAgdmVyc2VUZXh0Q2hhbmdlZDogZmFsc2UsXG4gICAgc2F2ZUNvbnRlbnQ6IG51bGwsXG4gICAgc3RhcnRTYXZlOiBmYWxzZSxcbiAgICBzaGE6IG51bGwsXG4gIH0pXG5cbiAgY29uc3Qge1xuICAgIGFsaWduZWQsXG4gICAgYWxpZ25lckRhdGEsXG4gICAgZWRpdGluZyxcbiAgICBpbml0aWFsVmVyc2VUZXh0LFxuICAgIG5ld0FsaWdubWVudHMsXG4gICAgbmV3VmVyc2VUZXh0LFxuICAgIHVwZGF0ZWRWZXJzZU9iamVjdHMsXG4gICAgdmVyc2VUZXh0Q2hhbmdlZCxcbiAgICBzYXZlQ29udGVudCxcbiAgICBzdGFydFNhdmUsXG4gICAgc2hhLFxuICB9ID0gc3RhdGVcblxuICBmdW5jdGlvbiBzZXRTdGF0ZShuZXdTdGF0ZSkge1xuICAgIHNldFN0YXRlXyhwcmV2U3RhdGUgPT4gKHsgLi4ucHJldlN0YXRlLCAuLi5uZXdTdGF0ZSB9KSlcbiAgfVxuXG4gIGNvbnN0IHJlZmVyZW5jZV8gPSBzY3JpcHR1cmVDb25maWc/LnJlZmVyZW5jZSB8fCBudWxsXG5cbiAgdXNlRGVlcENvbXBhcmVFZmZlY3QoKCkgPT4geyAvLyBjaGVjayBmb3IgY29udGV4dCBjaGFuZ2VzLCByZXNldCBlZGl0IGFuZCBhbGlnbm1lbnQgc3RhdGVcbiAgICBjb25zb2xlLmxvZyhgcmVmZXJlbmNlIGNoYW5nZWQgJHtKU09OLnN0cmluZ2lmeShyZWZlcmVuY2VfKX1gKVxuICAgIGNvbnN0IGNsZWFyU3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGFsaWduZXJEYXRhOiBudWxsLFxuICAgICAgZWRpdGluZzogZmFsc2UsXG4gICAgICBuZXdBbGlnbm1lbnRzOiBudWxsLFxuICAgICAgbmV3VmVyc2VUZXh0OiBudWxsLFxuICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0czogbnVsbCxcbiAgICAgIHZlcnNlVGV4dENoYW5nZWQ6IGZhbHNlLFxuICAgIH1cblxuICAgIGlmICghaXNFcXVhbChzdGF0ZSwgY2xlYXJTdGF0ZSkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGByZWZlcmVuY2UgY2hhbmdlZCwgcmVzZXQgZWRpdC9hbGlnbm1lbnQgc3RhdGUgdmFyaWFibGVzYClcbiAgICAgIHNldFN0YXRlKGNsZWFyU3RhdGUpXG4gICAgfVxuICB9LCBbcmVmZXJlbmNlX10pXG5cbiAgY29uc3Qgb3JpZ2luYWxTY3JpcHR1cmVTZXR0aW5nc18gPSB7XG4gICAgLi4uc2NyaXB0dXJlU2V0dGluZ3MsXG4gICAgcmVzb3VyY2VJZDogT1JJR0lOQUxfU09VUkNFLFxuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBodHRwQ29uZmlnID0gaHR0cENvbmZpZyB8fCB7fVxuICBjb25zdCBib29rSWQgPSByZWZlcmVuY2VfPy5wcm9qZWN0SWRcbiAgY29uc3Qgb3JpZ2luYWxTY3JpcHR1cmVTZXR0aW5ncyA9IGdldFNjcmlwdHVyZVJlc291cmNlU2V0dGluZ3MoXG4gICAgYm9va0lkLCBvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzXywgaXNOZXdUZXN0YW1lbnQsIG9yaWdpbmFsUmVwb1VybCxcbiAgKVxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgY29uc3QgZmV0Y2hSZXNwXyA9IHNjcmlwdHVyZUNvbmZpZz8uZmV0Y2hSZXNwb25zZVxuICBjb25zdCBvd25lciA9IHNjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/Lm93bmVyXG4gIGNvbnN0IHJlcG8gPSBgJHtzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5sYW5ndWFnZUlkfV8ke3NjcmlwdHVyZUNvbmZpZz8ucmVzb3VyY2U/LnByb2plY3RJZH1gXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHsgLy8gZ2V0IHRoZSBzaGEgZnJvbSBsYXN0IHNjcmlwdHVyZSBkb3dubG9hZFxuICAgIGNvbnN0IHNoYSA9IGZldGNoUmVzcF8/LmRhdGE/LnNoYSB8fCBudWxsXG4gICAgY29uc29sZS5sb2coYGZvciAke0pTT04uc3RyaW5naWZ5KHJlZmVyZW5jZV8pfSBuZXcgc2hhIGlzICR7c2hhfWApXG4gICAgc2V0U3RhdGUoeyBzaGEgfSlcbiAgICAvLyBAdHMtaWdub3JlXG4gIH0sIFtmZXRjaFJlc3BfXSlcblxuICBmdW5jdGlvbiBnZXRCb29rTmFtZSgpIHtcbiAgICBjb25zdCBib29rQ2FwcyA9IHNjcmlwdHVyZUNvbmZpZz8ucmVmZXJlbmNlPy5wcm9qZWN0SWQgPyBzY3JpcHR1cmVDb25maWcucmVmZXJlbmNlLnByb2plY3RJZC50b1VwcGVyQ2FzZSgpIDogJydcbiAgICByZXR1cm4gYCR7Ym9va0luZGV4fS0ke2Jvb2tDYXBzfS51c2ZtYFxuICB9XG5cbiAgY29uc3QgZmlsZXBhdGggPSBnZXRCb29rTmFtZSgpXG5cbiAgLy8gVE9ETzogIGVuYWJsZSBzYXZlXG4gIGNvbnN0IHtcbiAgICBlZGl0UmVzcG9uc2UsXG4gICAgZXJyb3IsXG4gICAgaXNFZGl0aW5nLFxuICAgIGlzRXJyb3IsXG4gICAgb25TYXZlRWRpdCxcbiAgfSA9IHVzZUVkaXQoe1xuICAgIHNoYSxcbiAgICBvd25lcixcbiAgICBjb250ZW50OiBzYXZlQ29udGVudCxcbiAgICBjb25maWc6IHtcbiAgICAgIGNhY2hlOiB7IG1heEFnZTogMCB9LFxuICAgICAgLi4uYXV0aGVudGljYXRpb24/LmNvbmZpZyxcbiAgICAgIHRva2VuOiBhdXRoZW50aWNhdGlvbj8udG9rZW4sXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aW1lb3V0OiBodHRwQ29uZmlnPy5zZXJ2ZXJUaW1lT3V0IHx8IGh0dHBDb25maWc/LnRpbWVvdXQgfHwgNTAwMCxcbiAgICB9LFxuICAgIGF1dGhvcjogbG9nZ2VkSW5Vc2VyLFxuICAgIHRva2VuOiBhdXRoZW50aWNhdGlvbj8udG9rZW4sXG4gICAgYnJhbmNoOiB3b3JraW5nUmVzb3VyY2VCcmFuY2gsXG4gICAgZmlsZXBhdGgsXG4gICAgcmVwbyxcbiAgfSlcblxuICBpZiAoIWVuYWJsZUFsaWdubWVudCkgeyAvLyBpZiBub3QgZW5hYmxlZCwgdGhlbiB3ZSBkb24ndCBmZXRjaCByZXNvdXJjZVxuICAgIG9yaWdpbmFsU2NyaXB0dXJlU2V0dGluZ3MucmVzb3VyY2VMaW5rID0gbnVsbFxuICB9XG5cbiAgLy8gZ2V0IG9yaWdpbmFsIGxhbmd1YWdlIGZvciBhbGlnbm1lbnRcbiAgY29uc3Qgb3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZSA9IHVzZVNjcmlwdHVyZVJlc291cmNlcyh7XG4gICAgYm9va0lkLFxuICAgIHNjcmlwdHVyZVNldHRpbmdzOiBvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzLFxuICAgIGNoYXB0ZXI6IHJlZmVyZW5jZV8/LmNoYXB0ZXIsXG4gICAgdmVyc2U6IHJlZmVyZW5jZV8/LnZlcnNlLFxuICAgIGlzTmV3VGVzdGFtZW50LFxuICAgIG9yaWdpbmFsUmVwb1VybCxcbiAgICBjdXJyZW50TGFuZ3VhZ2VJZDogb3JpZ2luYWxTY3JpcHR1cmVTZXR0aW5ncz8ubGFuZ3VhZ2VJZCxcbiAgICBjdXJyZW50T3duZXI6IG9yaWdpbmFsTGFuZ3VhZ2VPd25lcixcbiAgICBodHRwQ29uZmlnLFxuICB9KVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIHVwZGF0ZSBhbGlnbm1lbnQgc3RhdHVzIHdoZW4gYWxpZ25lciBpcyBoaWRkZW5cbiAgICBjb25zdCBub3RFbXB0eSA9ICEhaW5pdGlhbFZlcnNlT2JqZWN0c1xuICAgIGxldCBhbGlnbmVkXyA9IGZhbHNlXG5cbiAgICBpZiAoIWFsaWduZXJEYXRhKSB7IC8vIHNraXAgaWYgYWxpZ25lciBpcyBiZWluZyBzaG93blxuICAgICAgaWYgKG5vdEVtcHR5KSB7IC8vIHNraXAgaWYgZW1wdHlcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWZXJzZU9iamVjdHMgPSBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZU9iamVjdHNcbiAgICAgICAgY29uc3QgY3VycmVudFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzIHx8IGluaXRpYWxWZXJzZU9iamVjdHNcblxuICAgICAgICBpZiAoIWVuYWJsZUFsaWdubWVudCkge1xuICAgICAgICAgIGFsaWduZWRfID0gdHJ1ZVxuICAgICAgICB9IGVsc2UgaWYgKG5ld1ZlcnNlVGV4dCAmJiAobmV3VmVyc2VUZXh0ICE9PSBpbml0aWFsVmVyc2VUZXh0KSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBBbGlnbm1lbnRIZWxwZXJzLnVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlKGN1cnJlbnRWZXJzZU9iamVjdHNfLCBuZXdWZXJzZVRleHQpXG4gICAgICAgICAgYWxpZ25lZF8gPSBpc1VzZm1BbGlnbmVkKHJlc3VsdHM/LnRhcmdldFZlcnNlVGV4dCwgb3JpZ2luYWxWZXJzZU9iamVjdHMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0VmVyc2VVU0ZNID0gVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKGN1cnJlbnRWZXJzZU9iamVjdHNfKVxuICAgICAgICAgIGFsaWduZWRfID0gaXNVc2ZtQWxpZ25lZCh0YXJnZXRWZXJzZVVTRk0sIG9yaWdpbmFsVmVyc2VPYmplY3RzKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhbGlnbmVkICE9PSBhbGlnbmVkXykge1xuICAgICAgICBzZXRTdGF0ZSh7IGFsaWduZWQ6IGFsaWduZWRfIH0pXG4gICAgICB9XG4gICAgfVxuICB9LCBbaW5pdGlhbFZlcnNlT2JqZWN0cywgYWxpZ25lckRhdGEsIG5ld1ZlcnNlVGV4dCwgaW5pdGlhbFZlcnNlVGV4dCwgZW5hYmxlQWxpZ25tZW50LCBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZU9iamVjdHNdKVxuXG4gIC8qKlxuICAgKiBzZWFyY2ggY2hhcHRlciBvciB2ZXJzZSBjaHVuayB0byBsaW5lIHRoYXQgc3RhcnRzIHdpdGggZmluZEl0ZW1cbiAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBmaW5kSXRlbVxuICAgKiBAcGFyYW0ge2FycmF5W3N0cmluZ119IGNodW5rc1xuICAgKi9cbiAgZnVuY3Rpb24gZmluZFJlZkluQXJyYXkoZmluZEl0ZW0sIGNodW5rcykge1xuICAgIGNvbnN0IHJlZl8gPSBmaW5kSXRlbSArICcnXG4gICAgY29uc3QgcmVmTGVuID0gcmVmXy5sZW5ndGhcbiAgICBjb25zdCBpbmRleCA9IGNodW5rcy5maW5kSW5kZXgoKGNodW5rLCBpZHgpID0+IHtcbiAgICAgIGlmIChpZHggPiAwKSB7XG4gICAgICAgIGlmIChjaHVuay5zdWJzdHJpbmcoMCwgcmVmTGVuKSA9PT0gcmVmXykge1xuICAgICAgICAgIGNvbnN0IG5leHRDaGFyID0gY2h1bmtbcmVmX11cblxuICAgICAgICAgIGlmICgobmV4dENoYXIgPiAnOScpIHx8IChuZXh0Q2hhciA8ICcwJykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9KVxuICAgIHJldHVybiBpbmRleFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUNoYW5nZXNUb0Nsb3VkKCkge1xuICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQgLSBzdGFydGVkYClcbiAgICBsZXQgdXBkYXRlZFZlcnNlT2JqZWN0c19cblxuICAgIGlmIChuZXdBbGlnbm1lbnRzKSB7IC8vIGlmIHVuc2F2ZWQgYWxpZ25tZW50IGNoYW5nZXMsIGFwcGx5IHRoZW1cbiAgICAgIHVwZGF0ZWRWZXJzZU9iamVjdHNfID0gdXBkYXRlVmVyc2VXaXRoTmV3QWxpZ25tZW50cygpXG4gICAgfSBlbHNlIGlmICh2ZXJzZVRleHRDaGFuZ2VkICYmIG5ld1ZlcnNlVGV4dCkge1xuICAgICAgY29uc3QgY3VycmVudFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzIHx8IGluaXRpYWxWZXJzZU9iamVjdHNcbiAgICAgIGNvbnN0IHsgdGFyZ2V0VmVyc2VUZXh0LCB0YXJnZXRWZXJzZU9iamVjdHMgfSA9IEFsaWdubWVudEhlbHBlcnMudXBkYXRlQWxpZ25tZW50c1RvVGFyZ2V0VmVyc2UoY3VycmVudFZlcnNlT2JqZWN0c18sIG5ld1ZlcnNlVGV4dClcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQoKSAtIG5ldyB0ZXh0OmAsIHRhcmdldFZlcnNlVGV4dC5zdWJzdHJpbmcoMCwxMDApKVxuICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0c18gPSB0YXJnZXRWZXJzZU9iamVjdHNcbiAgICB9IGVsc2UgeyAvLyBvbmx5IGFsaWdubWVudCBjaGFuZ2VzIHRvIHVwbG9hZFxuICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzIHx8IGluaXRpYWxWZXJzZU9iamVjdHNcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlZFZlcnNlT2JqZWN0c18pIHtcbiAgICAgIGxldCBuZXdVc2ZtXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBjb25zdCByZWYgPSBnZXRWZXJzZURhdGFGcm9tU2NyaXBDb25maWcoc2NyaXB0dXJlQ29uZmlnLCBjdXJyZW50VmVyc2VOdW0pXG5cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGNvbnN0IG9yaWdpbmFsVXNmbSA9IGNvcmUuZ2V0UmVzcG9uc2VEYXRhKHNjcmlwdHVyZUNvbmZpZz8uZmV0Y2hSZXNwb25zZSlcblxuICAgICAgaWYgKG9yaWdpbmFsVXNmbSkge1xuICAgICAgICBjb25zdCBjaGFwdGVyQ2h1bmtzID0gb3JpZ2luYWxVc2ZtPy5zcGxpdCgnXFxcXGMgJylcbiAgICAgICAgY29uc3QgY2hhcHRlckluZGV4ID0gZmluZFJlZkluQXJyYXkocmVmPy5jaGFwdGVyLCBjaGFwdGVyQ2h1bmtzKVxuXG4gICAgICAgIGlmIChjaGFwdGVySW5kZXggPj0gMCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDaGFwdGVyID0gY2hhcHRlckNodW5rc1tjaGFwdGVySW5kZXhdXG4gICAgICAgICAgY29uc3QgdmVyc2VDaHVua3MgPSBjdXJyZW50Q2hhcHRlci5zcGxpdCgnXFxcXHYgJylcbiAgICAgICAgICBjb25zdCB2ZXJzZUluZGV4ID0gZmluZFJlZkluQXJyYXkocmVmPy52ZXJzZSwgdmVyc2VDaHVua3MpXG5cbiAgICAgICAgICBpZiAodmVyc2VJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdWZXJzZVVzZm0gPSBVc2ZtRmlsZUNvbnZlcnNpb25IZWxwZXJzLmNvbnZlcnRWZXJzZURhdGFUb1VTRk0odXBkYXRlZFZlcnNlT2JqZWN0c18pXG4gICAgICAgICAgICBjb25zdCBvbGRWZXJzZSA9IHZlcnNlQ2h1bmtzW3ZlcnNlSW5kZXhdXG4gICAgICAgICAgICBjb25zdCB2ZXJzZU51bUxlbiA9IChyZWY/LnZlcnNlICsgJycpLmxlbmd0aFxuICAgICAgICAgICAgdmVyc2VDaHVua3NbdmVyc2VJbmRleF0gPSBvbGRWZXJzZS5zdWJzdHJpbmcoMCwgdmVyc2VOdW1MZW4gKyAxKSArIG5ld1ZlcnNlVXNmbVxuICAgICAgICAgICAgY29uc3QgbmV3Q2hhcHRlciA9IHZlcnNlQ2h1bmtzLmpvaW4oJ1xcXFx2ICcpXG4gICAgICAgICAgICBjaGFwdGVyQ2h1bmtzW2NoYXB0ZXJJbmRleF0gPSBuZXdDaGFwdGVyXG4gICAgICAgICAgICBuZXdVc2ZtID0gY2hhcHRlckNodW5rcy5qb2luKCdcXFxcYyAnKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIW5ld1VzZm0pIHtcbiAgICAgICAgY29uc3QgbmV3Qm9va0pzb24gPSB1cGRhdGVWZXJzZU51bShjdXJyZW50VmVyc2VOdW0sIHVwZGF0ZWRWZXJzZU9iamVjdHNfKVxuICAgICAgICBuZXdVc2ZtID0gdXNmbWpzLnRvVVNGTShuZXdCb29rSnNvbiwgeyBmb3JjZWROZXdMaW5lczogdHJ1ZSB9KVxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gc2F2aW5nIG5ldyBVU0ZNOiAke25ld1VzZm0uc3Vic3RyaW5nKDAsIDEwMCl9Li4uYClcbiAgICAgIHNldFN0YXRlKHsgc2F2ZUNvbnRlbnQ6IG5ld1VzZm0sIHN0YXJ0U2F2ZTogdHJ1ZSB9KVxuICAgIH1cbiAgfVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgX3NhdmVFZGl0ID0gYXN5bmMgKCkgPT4geyAvLyBiZWdpbiB1cGxvYWRpbmcgbmV3IFVTRk1cbiAgICAgIGxldCBicmFuY2ggPSAod29ya2luZ1Jlc291cmNlQnJhbmNoICE9PSAnbWFzdGVyJykgPyB3b3JraW5nUmVzb3VyY2VCcmFuY2ggOiB1bmRlZmluZWRcblxuICAgICAgaWYgKCFicmFuY2gpIHtcbiAgICAgICAgYnJhbmNoID0gYXdhaXQgc3RhcnRFZGl0QnJhbmNoKCkgLy8gbWFrZSBzdXJlIHVzZXIgYnJhbmNoIGV4aXN0cyBhbmQgZ2V0IG5hbWVcbiAgICAgIH1cblxuICAgICAgYXdhaXQgb25TYXZlRWRpdChicmFuY2gpLnRoZW4oKHN1Y2Nlc3MpID0+IHsgLy8gcHVzaCBjaGFuZ2VkIHRvIHNlcnZlclxuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQoKSAtIHNhdmUgc2NyaXB0dXJlIGVkaXRzIHN1Y2Nlc3NgKVxuICAgICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICAgIHVwZGF0ZWRWZXJzZU9iamVjdHM6IG51bGwsXG4gICAgICAgICAgICBlZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIG5ld1ZlcnNlVGV4dDogbnVsbCxcbiAgICAgICAgICAgIGFsaWduZXJEYXRhOiBudWxsLFxuICAgICAgICAgICAgc3RhcnRTYXZlOiBmYWxzZSxcbiAgICAgICAgICAgIHZlcnNlVGV4dENoYW5nZWQ6IGZhbHNlLFxuICAgICAgICAgICAgaW5pdGlhbFZlcnNlVGV4dDogbnVsbCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnc2F2ZUNoYW5nZXNUb0Nsb3VkKCkgLSBSZWxvYWRpbmcgcmVzb3VyY2UnKVxuICAgICAgICAgIHNjcmlwdHVyZUNvbmZpZz8ucmVsb2FkUmVzb3VyY2UoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3NhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gc2F2aW5nIGNoYW5nZWQgc2NyaXB0dXJlIGZhaWxlZCcpXG4gICAgICAgICAgc2V0U3RhdGUoeyBzdGFydFNhdmU6IGZhbHNlIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0U2F2ZSkge1xuICAgICAgY29uc29sZS5sb2coYHNhdmVDaGFuZ2VzVG9DbG91ZCAtIGNhbGxpbmcgX3NhdmVFZGl0KClgKVxuICAgICAgX3NhdmVFZGl0KClcbiAgICB9XG4gIH0sIFtzdGFydFNhdmVdKVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVZlcnNlTnVtKHZlcnNlTnVtLCBuZXdWZXJzZU9iamVjdHMgPSBpbml0aWFsVmVyc2VPYmplY3RzKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHJlZiA9IGdldFZlcnNlRGF0YUZyb21TY3JpcENvbmZpZyhzY3JpcHR1cmVDb25maWcsIHZlcnNlTnVtKVxuICAgIGxldCB0YXJnZXRWZXJzZU9iamVjdHNfID0gbnVsbFxuXG4gICAgaWYgKHJlZikge1xuICAgICAgaWYgKG5ld1ZlcnNlVGV4dCkge1xuICAgICAgICBjb25zdCB7IHRhcmdldFZlcnNlT2JqZWN0cyB9ID0gQWxpZ25tZW50SGVscGVycy51cGRhdGVBbGlnbm1lbnRzVG9UYXJnZXRWZXJzZShuZXdWZXJzZU9iamVjdHMsIG5ld1ZlcnNlVGV4dClcbiAgICAgICAgdGFyZ2V0VmVyc2VPYmplY3RzXyA9IHRhcmdldFZlcnNlT2JqZWN0c1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0VmVyc2VPYmplY3RzXyA9IG5ld1ZlcnNlT2JqZWN0c1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXR1cm4gdGFyZ2V0VmVyc2VPYmplY3RzXyAmJiBzY3JpcHR1cmVDb25maWc/LnVwZGF0ZVZlcnNlKHJlZi5jaGFwdGVyLCByZWYudmVyc2UsIHsgdmVyc2VPYmplY3RzOiB0YXJnZXRWZXJzZU9iamVjdHNfIH0pXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBoYW5kbGVBbGlnbm1lbnRDbGljaygpIHtcbiAgICBpZiAoZW5hYmxlQWxpZ25tZW50KSB7XG4gICAgICBsZXQgYWxpZ25lckRhdGFfID0gbnVsbFxuICAgICAgYXdhaXQgc3RhcnRFZGl0QnJhbmNoKClcblxuICAgICAgaWYgKCFhbGlnbmVyRGF0YSkgeyAvLyBpZiB3b3JkIGFsaWduZXIgbm90IHNob3duXG4gICAgICAgIGNvbnNvbGUubG9nKGBoYW5kbGVBbGlnbm1lbnRDbGljayAtIHRvZ2dsZSBPTiBhbGlnbm1lbnRgKVxuICAgICAgICBjb25zdCB0YXJnZXRWZXJzZVVTRk0gPSBnZXRDdXJyZW50VmVyc2VVc2ZtKHVwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWQsIG5ld1ZlcnNlVGV4dClcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWZXJzZU9iamVjdHMgPSBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZU9iamVjdHNcbiAgICAgICAgbGV0IG9yaWdpbmFsVmVyc2VVc2ZtID0gbnVsbFxuXG4gICAgICAgIGlmIChvcmlnaW5hbFZlcnNlT2JqZWN0cykge1xuICAgICAgICAgIG9yaWdpbmFsVmVyc2VVc2ZtID0gVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKG9yaWdpbmFsVmVyc2VPYmplY3RzKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHRhcmdldFdvcmRzOiB3b3JkQmFuayxcbiAgICAgICAgICB2ZXJzZUFsaWdubWVudHM6IGFsaWdubWVudHMsXG4gICAgICAgIH0gPSBBbGlnbm1lbnRIZWxwZXJzLnBhcnNlVXNmbVRvV29yZEFsaWduZXJEYXRhKHRhcmdldFZlcnNlVVNGTSwgb3JpZ2luYWxWZXJzZVVzZm0pXG4gICAgICAgIGFsaWduZXJEYXRhXyA9IHsgd29yZEJhbmssIGFsaWdubWVudHMgfVxuICAgICAgfSBlbHNlIHsgLy8gd29yZCBhbGlnbmVyIGN1cnJlbnRseSBzaG93blxuICAgICAgICBjb25zb2xlLmxvZyhgaGFuZGxlQWxpZ25tZW50Q2xpY2sgLSBhbGlnbm1lbnQgYWxyZWFkeSBzaG93bmApXG4gICAgICAgIGFsaWduZXJEYXRhXyA9IGFsaWduZXJEYXRhXG4gICAgICB9XG4gICAgICBzZXRTdGF0ZSh7IGFsaWduZXJEYXRhOiBhbGlnbmVyRGF0YV8gfSlcbiAgICAgIGNvbnNvbGUubG9nKGFsaWduZXJEYXRhXylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVWZXJzZVdpdGhOZXdBbGlnbm1lbnRzKCkge1xuICAgIGNvbnN0IGN1cnJlbnRWZXJzZU9iamVjdHNfID0gdXBkYXRlZFZlcnNlT2JqZWN0cyB8fCBpbml0aWFsVmVyc2VPYmplY3RzXG4gICAgY29uc3QgdGFyZ2V0VmVyc2VUZXh0ID0gbmV3VmVyc2VUZXh0IHx8IFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMuY29udmVydFZlcnNlRGF0YVRvVVNGTShjdXJyZW50VmVyc2VPYmplY3RzXylcbiAgICBjb25zdCB2ZXJzZVVzZm0gPSBBbGlnbm1lbnRIZWxwZXJzLmFkZEFsaWdubWVudHNUb1ZlcnNlVVNGTShuZXdBbGlnbm1lbnRzLnRhcmdldFdvcmRzLCBuZXdBbGlnbm1lbnRzLnZlcnNlQWxpZ25tZW50cywgdGFyZ2V0VmVyc2VUZXh0KVxuICAgIGNvbnN0IGFsaWduZWRWZXJzZU9iamVjdHMgPSB1c2ZtSGVscGVycy51c2ZtVmVyc2VUb0pzb24odmVyc2VVc2ZtKVxuICAgIHJldHVybiBhbGlnbmVkVmVyc2VPYmplY3RzXG4gIH1cblxuICBmdW5jdGlvbiBzYXZlQWxpZ25tZW50KCkge1xuICAgIGNvbnNvbGUubG9nKGBzYXZlQWxpZ25tZW50KClgKVxuXG4gICAgaWYgKG5ld0FsaWdubWVudHMpIHtcbiAgICAgIGNvbnN0IGFsaWduZWRWZXJzZU9iamVjdHMgPSB1cGRhdGVWZXJzZVdpdGhOZXdBbGlnbm1lbnRzKClcblxuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICBhbGlnbmVyRGF0YTogbnVsbCxcbiAgICAgICAgZWRpdGluZzogZmFsc2UsXG4gICAgICAgIG5ld0FsaWdubWVudHM6IG51bGwsXG4gICAgICAgIHVwZGF0ZWRWZXJzZU9iamVjdHM6IGFsaWduZWRWZXJzZU9iamVjdHMsXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGFsaWduZXJEYXRhOiBudWxsLFxuICAgICAgICBlZGl0aW5nOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsQWxpZ25tZW50KCkge1xuICAgIGNvbnNvbGUubG9nKGBjYW5jZWxBbGlnbm1lbnQoKWApXG4gICAgY29uc3QgdGFyZ2V0VmVyc2VVU0ZNID0gZ2V0Q3VycmVudFZlcnNlVXNmbSh1cGRhdGVkVmVyc2VPYmplY3RzLCBpbml0aWFsVmVyc2VPYmplY3RzLCB2ZXJzZVRleHRDaGFuZ2VkLCBuZXdWZXJzZVRleHQpXG4gICAgY29uc3QgYWxpZ25lZCA9IGlzVXNmbUFsaWduZWQodGFyZ2V0VmVyc2VVU0ZNLCBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZU9iamVjdHMpXG4gICAgc2V0U3RhdGUoeyBhbGlnbmVyRGF0YTogbnVsbCwgYWxpZ25lZCB9KVxuICB9XG5cbiAgLy8gVE9ETzogQ2hhbmdlIHRoaXMgZnVuY3Rpb24gdG8gdGFrZSBjdXJyZW50VmVyc2VOdW0gdG8gc2V0IGVkaXRpbmcgdmVyc2VcbiAgYXN5bmMgZnVuY3Rpb24gc2V0RWRpdGluZyhlZGl0aW5nXykge1xuICAgIGlmIChlbmFibGVFZGl0KSB7XG4gICAgICBpZiAoZWRpdGluZ18gJiYgIWVkaXRpbmcpIHtcbiAgICAgICAgYXdhaXQgc3RhcnRFZGl0QnJhbmNoKClcbiAgICAgIH1cblxuICAgICAgaWYgKGVkaXRpbmdfICE9PSBlZGl0aW5nKSB7XG4gICAgICAgIHNldFN0YXRlKHsgZWRpdGluZzogZWRpdGluZ18gfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXRWZXJzZUNoYW5nZWQoY2hhbmdlZCwgbmV3VmVyc2VUZXh0LCBpbml0aWFsVmVyc2VUZXh0KSB7XG4gICAgY29uc3QgeyB0YXJnZXRWZXJzZVRleHQgfSA9IEFsaWdubWVudEhlbHBlcnMudXBkYXRlQWxpZ25tZW50c1RvVGFyZ2V0VmVyc2UoaW5pdGlhbFZlcnNlT2JqZWN0cywgbmV3VmVyc2VUZXh0KVxuICAgIGNvbnN0IGFsaWduZWQgPSBpc1VzZm1BbGlnbmVkKHRhcmdldFZlcnNlVGV4dCwgb3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZT8udmVyc2VPYmplY3RzKVxuXG4gICAgc2V0U3RhdGUoe1xuICAgICAgdmVyc2VUZXh0Q2hhbmdlZDogY2hhbmdlZCxcbiAgICAgIGluaXRpYWxWZXJzZVRleHQsXG4gICAgICBuZXdWZXJzZVRleHQsXG4gICAgICBhbGlnbmVkLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBlZGl0ZWRWZXJzZU9iamVjdHMgPSBSZWFjdC51c2VNZW1vKCAoKSA9PiB7IC8vIGlmIHZlcnNlIGhhcyBiZWVuIGVkaXRlZCBvciBhbGlnbm1lbnQgY2hhbmdlZCwgdGhlbiBnZW5lcmF0ZSBuZXcgdmVyc2VPYmplY3RzIHRvIGRpc3BsYXkgaW4gU2NyaXB0dXJlUGFuZVxuICAgIGlmIChpbml0aWFsVmVyc2VPYmplY3RzKSB7XG4gICAgICBjb25zdCB0YXJnZXRWZXJzZVVTRk0gPSBnZXRDdXJyZW50VmVyc2VVc2ZtKHVwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWQsIG5ld1ZlcnNlVGV4dClcbiAgICAgIGNvbnN0IGN1cnJlbnRWZXJzZU9iamVjdHNfID0gdXNmbUhlbHBlcnMudXNmbVZlcnNlVG9Kc29uKHRhcmdldFZlcnNlVVNGTSlcbiAgICAgIHJldHVybiBjdXJyZW50VmVyc2VPYmplY3RzX1xuICAgIH1cbiAgICByZXR1cm4gaW5pdGlhbFZlcnNlT2JqZWN0c1xuICB9LCBbdXBkYXRlZFZlcnNlT2JqZWN0cywgaW5pdGlhbFZlcnNlT2JqZWN0cywgdmVyc2VUZXh0Q2hhbmdlZCwgbmV3VmVyc2VUZXh0XSlcblxuICBjb25zdCB1bnNhdmVkQ2hhbmdlczpib29sZWFuID0gUmVhY3QudXNlTWVtbyggKCkgPT4geyAvLyBpZiB2ZXJzZSBoYXMgYmVlbiBlZGl0ZWQgb3IgYWxpZ25tZW50IGNoYW5nZWQsIHRoZW4gaW5kaWNhdGUgd2UgaGF2ZSB1bnNhdmVkIGNoYW5nZXNcbiAgICBjb25zdCBjaGFuZ2VkID0gdmVyc2VUZXh0Q2hhbmdlZCB8fCAodXBkYXRlZFZlcnNlT2JqZWN0cyAmJiAhaXNFcXVhbChpbml0aWFsVmVyc2VPYmplY3RzLCB1cGRhdGVkVmVyc2VPYmplY3RzKSlcbiAgICByZXR1cm4gY2hhbmdlZFxuICB9LCBbdXBkYXRlZFZlcnNlT2JqZWN0cywgaW5pdGlhbFZlcnNlT2JqZWN0cywgdmVyc2VUZXh0Q2hhbmdlZF0pXG5cbiAgZnVuY3Rpb24gb25BbGlnbm1lbnRzQ2hhbmdlKHJlc3VsdHMpIHtcbiAgICBjb25zb2xlLmxvZyhgb25BbGlnbm1lbnRzQ2hhbmdlKCkgLSBhbGlnbm1lbnQgY2hhbmdlZCwgcmVzdWx0c2AsIHJlc3VsdHMpIC8vIG1lcmdlIGFsaWdubWVudHMgaW50byB0YXJnZXQgdmVyc2UgYW5kIGNvbnZlcnQgdG8gVVNGTVxuICAgIGNvbnN0IHsgdGFyZ2V0V29yZHMsIHZlcnNlQWxpZ25tZW50cyB9ID0gcmVzdWx0c1xuICAgIGNvbnN0IGFsaWdubWVudENvbXBsZXRlID0gQWxpZ25tZW50SGVscGVycy5hcmVBbGdubWVudHNDb21wbGV0ZSh0YXJnZXRXb3JkcywgdmVyc2VBbGlnbm1lbnRzKVxuICAgIGNvbnNvbGUubG9nKGBBbGlnbm1lbnRzIGFyZSAke2FsaWdubWVudENvbXBsZXRlID8gJ0NPTVBMRVRFIScgOiAnaW5jb21wbGV0ZSd9YClcbiAgICBzZXRTdGF0ZSh7IG5ld0FsaWdubWVudHM6IHJlc3VsdHMsIGFsaWduZWQ6IGFsaWdubWVudENvbXBsZXRlIH0pXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFjdGlvbnM6IHtcbiAgICAgIGNhbmNlbEFsaWdubWVudCxcbiAgICAgIGVkaXRlZFZlcnNlT2JqZWN0cyxcbiAgICAgIGhhbmRsZUFsaWdubWVudENsaWNrLFxuICAgICAgb25BbGlnbm1lbnRzQ2hhbmdlLFxuICAgICAgc2F2ZUFsaWdubWVudCxcbiAgICAgIHNldEVkaXRpbmcsXG4gICAgICBzZXRWZXJzZUNoYW5nZWQsXG4gICAgICBzYXZlQ2hhbmdlc1RvQ2xvdWQsXG4gICAgfSxcbiAgICBzdGF0ZToge1xuICAgICAgYWxpZ25lZCxcbiAgICAgIGFsaWduZXJEYXRhLFxuICAgICAgZWRpdGluZyxcbiAgICAgIHZlcnNlVGV4dENoYW5nZWQsXG4gICAgICB1bnNhdmVkQ2hhbmdlcyxcbiAgICB9LFxuICB9XG59XG4iXX0=
|
|
518
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VTY3JpcHR1cmVBbGlnbm1lbnRFZGl0LnRzeCJdLCJuYW1lcyI6WyJSZWFjdCIsIkFsaWdubWVudEhlbHBlcnMiLCJVc2ZtRmlsZUNvbnZlcnNpb25IZWxwZXJzIiwidXNmbUhlbHBlcnMiLCJpc0VxdWFsIiwiU2NyaXB0dXJlQ29uZmlnIiwiU2NyaXB0dXJlUmVmZXJlbmNlIiwiU2VydmVyQ29uZmlnIiwiZ2V0U2NyaXB0dXJlUmVzb3VyY2VTZXR0aW5ncyIsIk9SSUdJTkFMX1NPVVJDRSIsInVzZVNjcmlwdHVyZVJlc291cmNlcyIsImlzVXNmbUFsaWduZWQiLCJ0YXJnZXRWZXJzZVVTRk0iLCJvcmlnaW5hbFZlcnNlT2JqZWN0cyIsImxlbmd0aCIsImV4dHJhY3RBbGlnbm1lbnRzRnJvbVRhcmdldFZlcnNlIiwiYWxpZ25tZW50cyIsIndvcmRCYW5rIiwiYXJlQWxnbm1lbnRzQ29tcGxldGUiLCJnZXRDdXJyZW50VmVyc2VVc2ZtIiwidXBkYXRlZFZlcnNlT2JqZWN0cyIsImluaXRpYWxWZXJzZU9iamVjdHMiLCJ2ZXJzZVRleHRDaGFuZ2VkIiwibmV3VmVyc2VUZXh0IiwiY3VycmVudFZlcnNlT2JqZWN0c18iLCJ1cGRhdGVBbGlnbm1lbnRzVG9UYXJnZXRWZXJzZSIsInRhcmdldFZlcnNlVGV4dCIsImNvbnZlcnRWZXJzZURhdGFUb1VTRk0iLCJ1c2VTY3JpcHR1cmVBbGlnbm1lbnRFZGl0IiwiY3VycmVudEluZGV4IiwiZW5hYmxlRWRpdCIsImVuYWJsZUFsaWdubWVudCIsImh0dHBDb25maWciLCJpbml0aWFsVmVyc2VUZXh0IiwiaXNOZXdUZXN0YW1lbnQiLCJvcmlnaW5hbExhbmd1YWdlT3duZXIiLCJvcmlnaW5hbFJlcG9VcmwiLCJyZWZlcmVuY2UiLCJzY3JpcHR1cmVDb25maWciLCJzY3JpcHR1cmVTZXR0aW5ncyIsInNldFNhdmVkQ2hhbmdlcyIsInNvdXJjZUxhbmd1YWdlIiwic3RhcnRFZGl0QnJhbmNoIiwidGFyZ2V0TGFuZ3VhZ2UiLCJ0aXRsZSIsIndvcmtpbmdSZXNvdXJjZUJyYW5jaCIsInVzZVN0YXRlIiwiYWxpZ25lZCIsImFsaWduZXJEYXRhIiwiZWRpdGluZyIsIm5ld0FsaWdubWVudHMiLCJzdGF0ZSIsInNldFN0YXRlXyIsInNldFN0YXRlIiwibmV3U3RhdGUiLCJwcmV2U3RhdGUiLCJjbGVhckNoYW5nZXMiLCJjb25zb2xlIiwibG9nIiwiSlNPTiIsInN0cmluZ2lmeSIsImNsZWFyU3RhdGUiLCJvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzXyIsInJlc291cmNlSWQiLCJib29rSWQiLCJwcm9qZWN0SWQiLCJvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzIiwicmVzb3VyY2VMaW5rIiwib3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZSIsImNoYXB0ZXIiLCJ2ZXJzZSIsImN1cnJlbnRMYW5ndWFnZUlkIiwibGFuZ3VhZ2VJZCIsImN1cnJlbnRPd25lciIsInVzZU1lbW8iLCJ2ZXJzZXNGb3JSZWYiLCJ2ZXJzZU9iamVjdHMiLCJ2ZXJzZVJlZmVyZW5jZSIsIm9yaWdWZXJzZU9iamVjdHMiLCJ2ZXJzZURhdGEiLCJBcnJheSIsInByb3RvdHlwZSIsInB1c2giLCJhcHBseSIsInVzZUVmZmVjdCIsIm5vdEVtcHR5IiwiYWxpZ25lZF8iLCJyZXN1bHRzIiwiZ2V0Q2hhbmdlcyIsInVwZGF0ZWRWZXJzZU9iamVjdHNfIiwidXBkYXRlVmVyc2VXaXRoTmV3QWxpZ25tZW50cyIsInRhcmdldFZlcnNlT2JqZWN0cyIsInJlZiIsImhhbmRsZUFsaWdubWVudENsaWNrIiwiX2FsaWduZXJEYXRhIiwib3JpZ2luYWxWZXJzZVVzZm0iLCJwYXJzZVVzZm1Ub1dvcmRBbGlnbmVyRGF0YSIsInRhcmdldFdvcmRzIiwidmVyc2VBbGlnbm1lbnRzIiwiX25ld0FsaWdubWVudHMiLCJ2ZXJzZVVzZm0iLCJhZGRBbGlnbm1lbnRzVG9WZXJzZVVTRk0iLCJhbGlnbmVkVmVyc2VPYmplY3RzIiwidXNmbVZlcnNlVG9Kc29uIiwic2F2ZUFsaWdubWVudCIsImNhbmNlbEFsaWdubWVudCIsInNldEVkaXRpbmciLCJlZGl0aW5nXyIsInNldFZlcnNlQ2hhbmdlZCIsImNoYW5nZWQiLCJfaW5pdGlhbFZlcnNlVGV4dCIsIl9jaGFuZ2VkIiwiY3VycmVudFZlcnNlT2JqZWN0cyIsInVuc2F2ZWRDaGFuZ2VzIiwidW5zYXZlZENoYW5nZXNfIiwib25BbGlnbm1lbnRzQ2hhbmdlIiwiYWxpZ25tZW50Q29tcGxldGUiLCJhY3Rpb25zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBLE9BQU8sS0FBS0EsS0FBWixNQUF1QixPQUF2QjtBQUNBLFNBQ0VDLGdCQURGLEVBRUVDLHlCQUZGLEVBR0VDLFdBSEYsUUFJTyxrQkFKUDtBQUtBLE9BQU8sS0FBS0MsT0FBWixNQUF5QixZQUF6QjtBQUNBLFNBQ0VDLGVBREYsRUFFRUMsa0JBRkYsRUFHRUMsWUFIRixRQUlPLFVBSlA7QUFLQSxTQUFTQyw0QkFBVCxRQUE2Qyw0QkFBN0M7QUFDQSxTQUFTQyxlQUFULFFBQWdDLFVBQWhDO0FBQ0EsT0FBT0MscUJBQVAsTUFBa0MseUJBQWxDOztBQW1EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0MsYUFBVCxDQUF1QkMsZUFBdkIsRUFBd0NDLG9CQUF4QyxFQUE4RDtBQUFBOztBQUM1REEsRUFBQUEsb0JBQW9CLEdBQUcseUJBQUFBLG9CQUFvQixVQUFwQiw4REFBc0JDLE1BQXRCLEdBQStCRCxvQkFBL0IsR0FBc0QsSUFBN0UsQ0FENEQsQ0FDc0I7O0FBRHRCLDhCQUUzQlosZ0JBQWdCLENBQUNjLGdDQUFqQixDQUFrREgsZUFBbEQsRUFBbUVDLG9CQUFuRSxDQUYyQjtBQUFBLE1BRXBERyxVQUZvRCx5QkFFcERBLFVBRm9EO0FBQUEsTUFFeENDLFFBRndDLHlCQUV4Q0EsUUFGd0M7O0FBRzVELFNBQU9oQixnQkFBZ0IsQ0FBQ2lCLG9CQUFqQixDQUFzQ0QsUUFBdEMsRUFBZ0RELFVBQWhE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QUEsa0JBQWtCLEVBQWxCQSxrQkFKTztBQUtQWCxNQUFBQSxhQUFhLEVBQWJBLGFBTE87QUFNUEUsTUFBQUEsVUFBVSxFQUFWQSxVQU5PO0FBT1BFLE1BQUFBLGVBQWUsRUFBZkE7QUFQTyxLQURKO0FBVUx6RCxJQUFBQSxLQUFLLEVBQUU7QUFDTEosTUFBQUEsT0FBTyxFQUFQQSxPQURLO0FBRUxDLE1BQUFBLFdBQVcsRUFBWEEsV0FGSztBQUdMZ0UsTUFBQUEsbUJBQW1CLEVBQW5CQSxtQkFISztBQUlML0QsTUFBQUEsT0FBTyxFQUFQQSxPQUpLO0FBS0xoQixNQUFBQSxnQkFBZ0IsRUFBaEJBLGdCQUxLO0FBTUxaLE1BQUFBLG1CQUFtQixFQUFuQkEsbUJBTks7QUFPTEUsTUFBQUEsWUFBWSxFQUFaQSxZQVBLO0FBUUxrQixNQUFBQSxjQUFjLEVBQWRBLGNBUks7QUFTTEUsTUFBQUEsY0FBYyxFQUFkQSxjQVRLO0FBVUxzRSxNQUFBQSxjQUFjLEVBQWRBLGNBVks7QUFXTDNGLE1BQUFBLGdCQUFnQixFQUFoQkEsZ0JBWEs7QUFZTGUsTUFBQUEsU0FBUyxFQUFUQSxTQVpLO0FBYUxPLE1BQUFBLEtBQUssRUFBTEE7QUFiSztBQVZGLEdBQVA7QUEwQkQiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtaWdub3JlXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7XG4gIEFsaWdubWVudEhlbHBlcnMsXG4gIFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMsXG4gIHVzZm1IZWxwZXJzLFxufSBmcm9tICd3b3JkLWFsaWduZXItcmNsJ1xuaW1wb3J0ICogYXMgaXNFcXVhbCBmcm9tICdkZWVwLWVxdWFsJ1xuaW1wb3J0IHtcbiAgU2NyaXB0dXJlQ29uZmlnLFxuICBTY3JpcHR1cmVSZWZlcmVuY2UsXG4gIFNlcnZlckNvbmZpZyxcbn0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBnZXRTY3JpcHR1cmVSZXNvdXJjZVNldHRpbmdzIH0gZnJvbSAnLi4vdXRpbHMvU2NyaXB0dXJlU2V0dGluZ3MnXG5pbXBvcnQgeyBPUklHSU5BTF9TT1VSQ0UgfSBmcm9tICcuLi91dGlscydcbmltcG9ydCB1c2VTY3JpcHR1cmVSZXNvdXJjZXMgZnJvbSAnLi91c2VTY3JpcHR1cmVSZXNvdXJjZXMnXG5cbmludGVyZmFjZSBTdGFydEVkaXQge1xuICAoKTogUHJvbWlzZTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjcmlwdHVyZUFMaWdubWVudEVkaXRQcm9wcyB7XG4gIC8vIGN1cnJlbnQgdmVyc2Ugc2VsZWN0ZWQgZnJvbSBpbml0aWFsVmVyc2VPYmplY3RzW11cbiAgY3VycmVudEluZGV4OiBudW1iZXIsXG4gIC8vIHJlZmVyZW5jZSBmb3IgdmVyc2Ugc2VsZWN0ZWQgZm9yIGFsaWdubWVudFxuICBjdXJyZW50VmVyc2VSZWY6IFNjcmlwdHVyZVJlZmVyZW5jZSxcbiAgLy8gaWYgdHJ1ZSB0aGVuIGVkaXRpbmcgaXMgYWxsb3dlZFxuICBlbmFibGVFZGl0OiBib29sZWFuLFxuICAvLyBpZiB0cnVlIHRoZW4gYWxpZ25tZW50IGlzIGFsbG93ZWRcbiAgZW5hYmxlQWxpZ25tZW50OiBib29sZWFuLFxuICAvLyBjb25maWd1cmF0aW9uIHRvIHVzZSBmb3IgaHR0cCBjb21tdW5pY2F0aW9uXG4gIGh0dHBDb25maWc6IFNlcnZlckNvbmZpZyxcbiAgLy8gYXJyYXkgb2YgZWFjaCB2ZXJzZSBmb3IgaW4gcmVmZXJlbmNlIHJhbmdlXG4gIGluaXRpYWxWZXJzZU9iamVjdHM6IFtdLFxuICAvLyBpbml0aWFsIHRleHQgZm9yIHZlcnNlXG4gIGluaXRpYWxWZXJzZVRleHQ6IHN0cmluZyxcbiAgLy8gZmxhZyB0aGF0IHdlIGFyZSB3b3JraW5nIG9uIE5UIGJvb2tcbiAgaXNOZXdUZXN0YW1lbnQ6IGJvb2xlYW4sXG4gIC8vIHVzZXIgbmFtZSBvZiBsb2dnZWQgaW4gdXNlclxuICBsb2dnZWRJblVzZXI6IHN0cmluZyxcbiAgLy8gb3duZXIgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgb3JpZ2luYWwgbGFuZ3VhZ2UgcmVzb3VyY2VzXG4gIG9yaWdpbmFsTGFuZ3VhZ2VPd25lcjogc3RyaW5nLFxuICAvLyB1cmwgZm9yIHRoZSBvcmlnaW5hbCBsYW5ndWFnZSByZXBvXG4gIG9yaWdpbmFsUmVwb1VybDogc3RyaW5nLFxuICAvKiogY3VycmVudCByZWZlcmVuY2UgKiovXG4gIHJlZmVyZW5jZTogU2NyaXB0dXJlUmVmZXJlbmNlO1xuICAvLyBkZXRhaWxzIGFib3V0IHRoZSBjdXJyZW50IHNjcmlwdHVyZSBsb2FkZWRcbiAgc2NyaXB0dXJlQ29uZmlnOiBTY3JpcHR1cmVDb25maWcsXG4gIC8vIHNldHRpbmdzIHRvIGJlIHVzZWQgZm9yIHNjcmlwdHVyZVxuICBzY3JpcHR1cmVTZXR0aW5nczogeyB9LFxuICAvLyBjYWxsYmFjayB0byBzYXZlIGN1cnJlbnQgdmVyc2UgZWRpdCBhbmQgYWxpZ25tZW50IGNoYW5nZXNcbiAgc2V0U2F2ZWRDaGFuZ2VzOiBGdW5jdGlvbixcbiAgLy8gY2FsbGJhY2sgdG8gY3JlYXRlIGEgdXNlciBicmFuY2ggZm9yIHNhdmluZyBlZGl0IGRhdGFcbiAgc3RhcnRFZGl0QnJhbmNoOiBTdGFydEVkaXQsXG4gIC8vIGluZGV4IHRvIHVzZSBmb3IgYm9vayAoZS5nLiBgMDFgIGZvciBgR0VOYClcbiAgYm9va0luZGV4OiBzdHJpbmcsXG4gIC8vIGJyYW5jaCBuYW1lIGN1cnJlbnRseSBiZWluZyB1c2VkIChlLmcuIGBtYXN0ZXJgIG9yIHVzZXIgYnJhbmNoKVxuICB3b3JraW5nUmVzb3VyY2VCcmFuY2g6IHN0cmluZyxcbiAgLy8gY3VycmVudCB0YXJnZXQgbGFuZ3VhZ2VcbiAgdGFyZ2V0TGFuZ3VhZ2U6IG9iamVjdCxcbiAgLy8gc291cmNlIGxhbmd1YWdlXG4gIHNvdXJjZUxhbmd1YWdlOiBzdHJpbmcsXG4gIC8vIHRpdGxlIHRvIHNob3cgaW4gYWxpZ25tZW50XG4gIHRpdGxlOiBzdHJpbmcsXG59XG5cbi8qKlxuICogZGV0ZXJtaW5lcyBpZiBhbGlnbm1lbnQgaXMgY29tcGxldGUgYmFzZWQgb24gdGFyZ2V0IFVTRk0gYW5kIG9yaWdpbmFsIGxhbmd1YWdlIHZlcnNlIG9iamVjdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXRWZXJzZVVTRk1cbiAqIEBwYXJhbSB7b2JqZWN0W119IG9yaWdpbmFsVmVyc2VPYmplY3RzXG4gKi9cbmZ1bmN0aW9uIGlzVXNmbUFsaWduZWQodGFyZ2V0VmVyc2VVU0ZNLCBvcmlnaW5hbFZlcnNlT2JqZWN0cykge1xuICBvcmlnaW5hbFZlcnNlT2JqZWN0cyA9IG9yaWdpbmFsVmVyc2VPYmplY3RzPy5sZW5ndGggPyBvcmlnaW5hbFZlcnNlT2JqZWN0cyA6IG51bGwgLy8gbWFrZSBzdXJlIG5vdCBwYXNzaW5nIGVtcHR5IEFycmF5XG4gIGNvbnN0IHsgYWxpZ25tZW50cywgd29yZEJhbmsgfSA9IEFsaWdubWVudEhlbHBlcnMuZXh0cmFjdEFsaWdubWVudHNGcm9tVGFyZ2V0VmVyc2UodGFyZ2V0VmVyc2VVU0ZNLCBvcmlnaW5hbFZlcnNlT2JqZWN0cylcbiAgcmV0dXJuIEFsaWdubWVudEhlbHBlcnMuYXJlQWxnbm1lbnRzQ29tcGxldGUod29yZEJhbmssIGFsaWdubWVudHMpXG59XG5cbi8qKlxuICogZ2V0IHRoZSB1cGRhdGVkIFVTRk0gZm9yIHRhcmdldCB2ZXJzZSBmcm9tIHRoZSB1cGRhdGVkIHZlcnNlIG9iamVjdHMgYW5kIGxhdGVzdCB0ZXh0XG4gKiBAcGFyYW0ge29iamVjdFtdfSB1cGRhdGVkVmVyc2VPYmplY3RzXG4gKiBAcGFyYW0ge29iamVjdFtdfSBpbml0aWFsVmVyc2VPYmplY3RzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHZlcnNlVGV4dENoYW5nZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuZXdWZXJzZVRleHRcbiAqL1xuZnVuY3Rpb24gZ2V0Q3VycmVudFZlcnNlVXNmbSh1cGRhdGVkVmVyc2VPYmplY3RzLCBpbml0aWFsVmVyc2VPYmplY3RzLCB2ZXJzZVRleHRDaGFuZ2VkOiBib29sZWFuLCBuZXdWZXJzZVRleHQpIHtcbiAgbGV0IHRhcmdldFZlcnNlVVNGTSA9IG51bGxcbiAgY29uc3QgY3VycmVudFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzIHx8IGluaXRpYWxWZXJzZU9iamVjdHNcblxuICBpZiAodmVyc2VUZXh0Q2hhbmdlZCAmJiBuZXdWZXJzZVRleHQpIHtcbiAgICBjb25zdCB7IHRhcmdldFZlcnNlVGV4dCB9ID0gQWxpZ25tZW50SGVscGVycy51cGRhdGVBbGlnbm1lbnRzVG9UYXJnZXRWZXJzZShjdXJyZW50VmVyc2VPYmplY3RzXywgbmV3VmVyc2VUZXh0KVxuICAgIHRhcmdldFZlcnNlVVNGTSA9IHRhcmdldFZlcnNlVGV4dFxuICB9IGVsc2Uge1xuICAgIHRhcmdldFZlcnNlVVNGTSA9IFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMuY29udmVydFZlcnNlRGF0YVRvVVNGTShjdXJyZW50VmVyc2VPYmplY3RzXylcbiAgfVxuICByZXR1cm4gdGFyZ2V0VmVyc2VVU0ZNXG59XG5cbi8vIG1hbmFnZSB2ZXJzZSBlZGl0IGFuZCBhbGlnbm1lbnQgc3RhdGVzXG5leHBvcnQgZnVuY3Rpb24gdXNlU2NyaXB0dXJlQWxpZ25tZW50RWRpdCh7XG4gIGN1cnJlbnRJbmRleCxcbiAgZW5hYmxlRWRpdCxcbiAgZW5hYmxlQWxpZ25tZW50LFxuICBodHRwQ29uZmlnLFxuICBpbml0aWFsVmVyc2VPYmplY3RzLFxuICBpbml0aWFsVmVyc2VUZXh0LFxuICBpc05ld1Rlc3RhbWVudCxcbiAgb3JpZ2luYWxMYW5ndWFnZU93bmVyLFxuICBvcmlnaW5hbFJlcG9VcmwsXG4gIHJlZmVyZW5jZSxcbiAgc2NyaXB0dXJlQ29uZmlnLFxuICBzY3JpcHR1cmVTZXR0aW5ncyxcbiAgc2V0U2F2ZWRDaGFuZ2VzLFxuICBzb3VyY2VMYW5ndWFnZSxcbiAgc3RhcnRFZGl0QnJhbmNoLFxuICB0YXJnZXRMYW5ndWFnZSxcbiAgdGl0bGUsXG4gIHdvcmtpbmdSZXNvdXJjZUJyYW5jaCxcbn0gOiBTY3JpcHR1cmVBTGlnbm1lbnRFZGl0UHJvcHMpIHtcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV9dID0gUmVhY3QudXNlU3RhdGUoe1xuICAgIGFsaWduZWQ6IGZhbHNlLFxuICAgIGFsaWduZXJEYXRhOiBudWxsLFxuICAgIGVkaXRpbmc6IGZhbHNlLFxuICAgIG5ld0FsaWdubWVudHM6IG51bGwsXG4gICAgbmV3VmVyc2VUZXh0OiBudWxsLFxuICAgIHVwZGF0ZWRWZXJzZU9iamVjdHM6IG51bGwsXG4gICAgdmVyc2VUZXh0Q2hhbmdlZDogZmFsc2UsXG4gIH0pXG5cbiAgY29uc3Qge1xuICAgIGFsaWduZWQsXG4gICAgYWxpZ25lckRhdGEsXG4gICAgZWRpdGluZyxcbiAgICBuZXdBbGlnbm1lbnRzLFxuICAgIG5ld1ZlcnNlVGV4dCxcbiAgICB1cGRhdGVkVmVyc2VPYmplY3RzLFxuICAgIHZlcnNlVGV4dENoYW5nZWQsXG4gIH0gPSBzdGF0ZVxuXG4gIGZ1bmN0aW9uIHNldFN0YXRlKG5ld1N0YXRlKSB7XG4gICAgc2V0U3RhdGVfKHByZXZTdGF0ZSA9PiAoeyAuLi5wcmV2U3RhdGUsIC4uLm5ld1N0YXRlIH0pKVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXJDaGFuZ2VzKCkge1xuICAgIGNvbnNvbGUubG9nKGBjbGVhckNoYW5nZXMoKSAtICR7SlNPTi5zdHJpbmdpZnkocmVmZXJlbmNlKX1gKVxuICAgIGNvbnN0IGNsZWFyU3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGFsaWduZXJEYXRhOiBudWxsLFxuICAgICAgZWRpdGluZzogZmFsc2UsXG4gICAgICBuZXdBbGlnbm1lbnRzOiBudWxsLFxuICAgICAgbmV3VmVyc2VUZXh0OiBudWxsLFxuICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0czogbnVsbCxcbiAgICAgIHZlcnNlVGV4dENoYW5nZWQ6IGZhbHNlLFxuICAgIH1cblxuICAgIGlmICghaXNFcXVhbChzdGF0ZSwgY2xlYXJTdGF0ZSkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGByZWZlcmVuY2UgY2hhbmdlZCwgcmVzZXQgZWRpdC9hbGlnbm1lbnQgc3RhdGUgdmFyaWFibGVzYClcbiAgICAgIHNldFN0YXRlKGNsZWFyU3RhdGUpXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb3JpZ2luYWxTY3JpcHR1cmVTZXR0aW5nc18gPSB7XG4gICAgLi4uc2NyaXB0dXJlU2V0dGluZ3MsXG4gICAgcmVzb3VyY2VJZDogT1JJR0lOQUxfU09VUkNFLFxuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBodHRwQ29uZmlnID0gaHR0cENvbmZpZyB8fCB7fVxuICBjb25zdCBib29rSWQgPSByZWZlcmVuY2U/LnByb2plY3RJZFxuICBjb25zdCBvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzID0gZ2V0U2NyaXB0dXJlUmVzb3VyY2VTZXR0aW5ncyhcbiAgICBib29rSWQsIG9yaWdpbmFsU2NyaXB0dXJlU2V0dGluZ3NfLCBpc05ld1Rlc3RhbWVudCwgb3JpZ2luYWxSZXBvVXJsLFxuICApXG5cbiAgaWYgKCFlbmFibGVBbGlnbm1lbnQpIHsgLy8gaWYgbm90IGVuYWJsZWQsIHRoZW4gd2UgZG9uJ3QgZmV0Y2ggcmVzb3VyY2VcbiAgICBvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzLnJlc291cmNlTGluayA9IG51bGxcbiAgfVxuXG4gIC8vIGdldCBvcmlnaW5hbCBsYW5ndWFnZSBmb3IgdGhpcyBhbGlnbm1lbnRcbiAgY29uc3Qgb3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZSA9IHVzZVNjcmlwdHVyZVJlc291cmNlcyh7XG4gICAgYm9va0lkLFxuICAgIHNjcmlwdHVyZVNldHRpbmdzOiBvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzLFxuICAgIGNoYXB0ZXI6IHJlZmVyZW5jZT8uY2hhcHRlcixcbiAgICB2ZXJzZTogcmVmZXJlbmNlPy52ZXJzZSxcbiAgICBpc05ld1Rlc3RhbWVudCxcbiAgICBvcmlnaW5hbFJlcG9VcmwsXG4gICAgY3VycmVudExhbmd1YWdlSWQ6IG9yaWdpbmFsU2NyaXB0dXJlU2V0dGluZ3M/Lmxhbmd1YWdlSWQsXG4gICAgY3VycmVudE93bmVyOiBvcmlnaW5hbExhbmd1YWdlT3duZXIsXG4gICAgaHR0cENvbmZpZyxcbiAgfSlcblxuICBjb25zdCBvcmlnaW5hbFZlcnNlT2JqZWN0cyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4geyAvLyBnZXQgdGhlIG9yaWdpbmFsIGxhbmd1YWdlIHZlcnNlT2JqZWN0c1xuICAgIGlmIChvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZXNGb3JSZWY/Lmxlbmd0aCA+IDEpIHsgLy8gaWYgbXVsdGlwbGUgdmVyc2VzLCB0aGVuIGFwcGVuZCB0aGVtIHRvZ2V0aGVyXG4gICAgICBjb25zdCB2ZXJzZU9iamVjdHMgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IHZlcnNlUmVmZXJlbmNlIG9mIG9yaWdpbmFsU2NyaXB0dXJlUmVzb3VyY2U/LnZlcnNlc0ZvclJlZikge1xuICAgICAgICBjb25zdCBvcmlnVmVyc2VPYmplY3RzID0gdmVyc2VSZWZlcmVuY2U/LnZlcnNlRGF0YT8udmVyc2VPYmplY3RzXG5cbiAgICAgICAgaWYgKG9yaWdWZXJzZU9iamVjdHMpIHtcbiAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh2ZXJzZU9iamVjdHMsIG9yaWdWZXJzZU9iamVjdHMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2ZXJzZU9iamVjdHNcbiAgICB9XG4gICAgcmV0dXJuIG9yaWdpbmFsU2NyaXB0dXJlUmVzb3VyY2U/LnZlcnNlT2JqZWN0c1xuICB9LCBbb3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZT8udmVyc2VPYmplY3RzLCBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZXNGb3JSZWZdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIHVwZGF0ZSBhbGlnbm1lbnQgc3RhdHVzIHdoZW4gYWxpZ25lciBpcyBoaWRkZW5cbiAgICBjb25zdCBub3RFbXB0eSA9ICEhaW5pdGlhbFZlcnNlT2JqZWN0c1xuICAgIGxldCBhbGlnbmVkXyA9IGZhbHNlXG5cbiAgICBpZiAoIWFsaWduZXJEYXRhKSB7IC8vIHNraXAgaWYgYWxpZ25lciBpcyBiZWluZyBzaG93blxuICAgICAgaWYgKG5vdEVtcHR5KSB7IC8vIHNraXAgaWYgZW1wdHlcbiAgICAgICAgY29uc3QgY3VycmVudFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzIHx8IGluaXRpYWxWZXJzZU9iamVjdHNcblxuICAgICAgICBpZiAoIWVuYWJsZUFsaWdubWVudCkge1xuICAgICAgICAgIGFsaWduZWRfID0gdHJ1ZVxuICAgICAgICB9IGVsc2UgaWYgKG5ld1ZlcnNlVGV4dCAmJiAobmV3VmVyc2VUZXh0ICE9PSBpbml0aWFsVmVyc2VUZXh0KSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBBbGlnbm1lbnRIZWxwZXJzLnVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlKGN1cnJlbnRWZXJzZU9iamVjdHNfLCBuZXdWZXJzZVRleHQpXG4gICAgICAgICAgYWxpZ25lZF8gPSBpc1VzZm1BbGlnbmVkKHJlc3VsdHM/LnRhcmdldFZlcnNlVGV4dCwgb3JpZ2luYWxWZXJzZU9iamVjdHMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0VmVyc2VVU0ZNID0gVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKGN1cnJlbnRWZXJzZU9iamVjdHNfKVxuICAgICAgICAgIGFsaWduZWRfID0gaXNVc2ZtQWxpZ25lZCh0YXJnZXRWZXJzZVVTRk0sIG9yaWdpbmFsVmVyc2VPYmplY3RzKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhbGlnbmVkICE9PSBhbGlnbmVkXykge1xuICAgICAgICBzZXRTdGF0ZSh7IGFsaWduZWQ6IGFsaWduZWRfIH0pXG4gICAgICB9XG4gICAgfVxuICB9LCBbaW5pdGlhbFZlcnNlT2JqZWN0cywgYWxpZ25lckRhdGEsIG5ld1ZlcnNlVGV4dCwgaW5pdGlhbFZlcnNlVGV4dCwgZW5hYmxlQWxpZ25tZW50LCBvcmlnaW5hbFZlcnNlT2JqZWN0c10pXG5cbiAgZnVuY3Rpb24gZ2V0Q2hhbmdlcygpIHtcbiAgICBjb25zb2xlLmxvZyhgZ2V0Q2hhbmdlcyAtIHN0YXJ0ZWQgJXtjdXJyZW50SW5kZXh9YClcbiAgICBsZXQgdXBkYXRlZFZlcnNlT2JqZWN0c19cblxuICAgIGlmIChuZXdBbGlnbm1lbnRzKSB7IC8vIGlmIHVuc2F2ZWQgYWxpZ25tZW50IGNoYW5nZXMsIGFwcGx5IHRoZW1cbiAgICAgIHVwZGF0ZWRWZXJzZU9iamVjdHNfID0gdXBkYXRlVmVyc2VXaXRoTmV3QWxpZ25tZW50cygpXG4gICAgfSBlbHNlIGlmICh2ZXJzZVRleHRDaGFuZ2VkICYmIG5ld1ZlcnNlVGV4dCkge1xuICAgICAgY29uc3QgY3VycmVudFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzIHx8IGluaXRpYWxWZXJzZU9iamVjdHNcbiAgICAgIGNvbnN0IHsgdGFyZ2V0VmVyc2VPYmplY3RzIH0gPSBBbGlnbm1lbnRIZWxwZXJzLnVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlKGN1cnJlbnRWZXJzZU9iamVjdHNfLCBuZXdWZXJzZVRleHQpXG4gICAgICB1cGRhdGVkVmVyc2VPYmplY3RzXyA9IHRhcmdldFZlcnNlT2JqZWN0c1xuICAgIH0gZWxzZSB7IC8vIG9ubHkgYWxpZ25tZW50IGNoYW5nZXMgdG8gdXBsb2FkXG4gICAgICB1cGRhdGVkVmVyc2VPYmplY3RzXyA9IHVwZGF0ZWRWZXJzZU9iamVjdHMgfHwgaW5pdGlhbFZlcnNlT2JqZWN0c1xuICAgIH1cblxuICAgIGlmICh1cGRhdGVkVmVyc2VPYmplY3RzXykge1xuICAgICAgY29uc3QgcmVmID0gc2NyaXB0dXJlQ29uZmlnPy52ZXJzZXNGb3JSZWY/LltjdXJyZW50SW5kZXhdXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXdWZXJzZVRleHQsXG4gICAgICAgIHJlZixcbiAgICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0czogdXBkYXRlZFZlcnNlT2JqZWN0c18sXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICAvKipcbiAgICogY2FsbGJhY2sgZm9yIHdoZW4gdXNlciBjbGlja2VkIG9uIGFsaWdubWVudCBidXR0b24gLSB3aWxsIHNob3cgaWYgbm90IGFscmVhZHkgc2hvd25cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUFsaWdubWVudENsaWNrKCkge1xuICAgIGlmIChlbmFibGVBbGlnbm1lbnQpIHtcbiAgICAgIGxldCBfYWxpZ25lckRhdGEgPSBudWxsXG4gICAgICBhd2FpdCBzdGFydEVkaXRCcmFuY2goKVxuXG4gICAgICBpZiAoIWFsaWduZXJEYXRhKSB7IC8vIGlmIHdvcmQgYWxpZ25lciBub3Qgc2hvd25cbiAgICAgICAgY29uc29sZS5sb2coYGhhbmRsZUFsaWdubWVudENsaWNrIC0gdG9nZ2xlIE9OIGFsaWdubWVudGApXG4gICAgICAgIGNvbnN0IHRhcmdldFZlcnNlVVNGTSA9IGdldEN1cnJlbnRWZXJzZVVzZm0odXBkYXRlZFZlcnNlT2JqZWN0cywgaW5pdGlhbFZlcnNlT2JqZWN0cywgdmVyc2VUZXh0Q2hhbmdlZCwgbmV3VmVyc2VUZXh0KVxuICAgICAgICBsZXQgb3JpZ2luYWxWZXJzZVVzZm0gPSBudWxsXG5cbiAgICAgICAgaWYgKG9yaWdpbmFsVmVyc2VPYmplY3RzKSB7XG4gICAgICAgICAgb3JpZ2luYWxWZXJzZVVzZm0gPSBVc2ZtRmlsZUNvbnZlcnNpb25IZWxwZXJzLmNvbnZlcnRWZXJzZURhdGFUb1VTRk0ob3JpZ2luYWxWZXJzZU9iamVjdHMpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdGFyZ2V0V29yZHM6IHdvcmRCYW5rLFxuICAgICAgICAgIHZlcnNlQWxpZ25tZW50czogYWxpZ25tZW50cyxcbiAgICAgICAgfSA9IEFsaWdubWVudEhlbHBlcnMucGFyc2VVc2ZtVG9Xb3JkQWxpZ25lckRhdGEodGFyZ2V0VmVyc2VVU0ZNLCBvcmlnaW5hbFZlcnNlVXNmbSlcbiAgICAgICAgX2FsaWduZXJEYXRhID0geyB3b3JkQmFuaywgYWxpZ25tZW50cyB9XG4gICAgICB9IGVsc2UgeyAvLyB3b3JkIGFsaWduZXIgY3VycmVudGx5IHNob3duXG4gICAgICAgIGNvbnNvbGUubG9nKGBoYW5kbGVBbGlnbm1lbnRDbGljayAtIGFsaWdubWVudCBhbHJlYWR5IHNob3duYClcbiAgICAgICAgX2FsaWduZXJEYXRhID0gYWxpZ25lckRhdGFcbiAgICAgIH1cbiAgICAgIHNldFN0YXRlKHsgYWxpZ25lckRhdGE6IF9hbGlnbmVyRGF0YSB9KVxuICAgICAgY29uc29sZS5sb2coX2FsaWduZXJEYXRhKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdXBkYXRlZCB2ZXJzZSBvYmplY3RzIGFmdGVyIGFsaWdubWVudHMgY2hhbmdlZFxuICAgKiBAcGFyYW0ge29iamVjdH0gX25ld0FsaWdubWVudHMgLSByZXN1bHRzIG9mIGFsaWduZXJcbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVZlcnNlV2l0aE5ld0FsaWdubWVudHMoX25ld0FsaWdubWVudHMgPSBuZXdBbGlnbm1lbnRzKSB7XG4gICAgY29uc3QgY3VycmVudFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzIHx8IGluaXRpYWxWZXJzZU9iamVjdHNcbiAgICBjb25zdCB0YXJnZXRWZXJzZVRleHQgPSBuZXdWZXJzZVRleHQgfHwgVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKGN1cnJlbnRWZXJzZU9iamVjdHNfKVxuICAgIGNvbnN0IHZlcnNlVXNmbSA9IEFsaWdubWVudEhlbHBlcnMuYWRkQWxpZ25tZW50c1RvVmVyc2VVU0ZNKF9uZXdBbGlnbm1lbnRzLnRhcmdldFdvcmRzLCBfbmV3QWxpZ25tZW50cy52ZXJzZUFsaWdubWVudHMsIHRhcmdldFZlcnNlVGV4dClcbiAgICBjb25zdCBhbGlnbmVkVmVyc2VPYmplY3RzID0gdXNmbUhlbHBlcnMudXNmbVZlcnNlVG9Kc29uKHZlcnNlVXNmbSlcbiAgICByZXR1cm4gYWxpZ25lZFZlcnNlT2JqZWN0c1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGxiYWNrIGZvciB3aGVuIHVzZXIgY2xpY2tlZCBvbiBidXR0b24gdG8gc2F2ZSBjdXJyZW50IGFsaWdubWVudHMgaW4gd29yZCBhbGlnbmVyLiAgR2VuZXJhdGVzIG5ldyB2ZXJzZSBjb250ZW50IGFuZCBzYXZlcyBpbiBzdGF0ZS4gQ2xvc2VzIGFsaWduZXIgZGlzcGxheVxuICAgKiBAcGFyYW0ge29iamVjdH0gX25ld0FsaWdubWVudHMgLSByZXN1bHRzIG9mIGFsaWduZXJcbiAgICovXG4gIGZ1bmN0aW9uIHNhdmVBbGlnbm1lbnQoX25ld0FsaWdubWVudHMgPSBuZXdBbGlnbm1lbnRzKSB7XG4gICAgY29uc29sZS5sb2coYHNhdmVBbGlnbm1lbnQoKSAtIG5ld0FsaWdubWVudHNgLCBfbmV3QWxpZ25tZW50cylcblxuICAgIGlmIChfbmV3QWxpZ25tZW50cykge1xuICAgICAgY29uc3QgYWxpZ25lZFZlcnNlT2JqZWN0cyA9IHVwZGF0ZVZlcnNlV2l0aE5ld0FsaWdubWVudHMoX25ld0FsaWdubWVudHMpXG4gICAgICBjb25zb2xlLmxvZyhgc2F2ZUFsaWdubWVudCgpIC0gYWxpZ25lZFZlcnNlT2JqZWN0c2AsIGFsaWduZWRWZXJzZU9iamVjdHMpXG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGFsaWduZXJEYXRhOiBudWxsLFxuICAgICAgICBlZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgbmV3QWxpZ25tZW50czogbnVsbCxcbiAgICAgICAgdXBkYXRlZFZlcnNlT2JqZWN0czogYWxpZ25lZFZlcnNlT2JqZWN0cyxcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgYWxpZ25lckRhdGE6IG51bGwsXG4gICAgICAgIGVkaXRpbmc6IGZhbHNlLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY2FsbGJhY2sgZm9yIHdoZW4gdXNlciBjbGlja2VkIG9uIGJ1dHRvbiB0byBjYW5jZWwgd29yayBpbiB3b3JkIGFsaWduZXIuICBDYWxjdWxhdGVzIGFuZCBkaXNwbGF5cyBjdXJyZW50IGFsaWdubWVudCB2YWxpZCBzdGF0ZS4gQ2xvc2VzIGFsaWduZXIgZGlzcGxheVxuICAgKi9cbiAgZnVuY3Rpb24gY2FuY2VsQWxpZ25tZW50KCkge1xuICAgIGNvbnNvbGUubG9nKGBjYW5jZWxBbGlnbm1lbnQoKWApXG4gICAgY29uc3QgdGFyZ2V0VmVyc2VVU0ZNID0gZ2V0Q3VycmVudFZlcnNlVXNmbSh1cGRhdGVkVmVyc2VPYmplY3RzLCBpbml0aWFsVmVyc2VPYmplY3RzLCB2ZXJzZVRleHRDaGFuZ2VkLCBuZXdWZXJzZVRleHQpXG4gICAgY29uc3QgYWxpZ25lZCA9IGlzVXNmbUFsaWduZWQodGFyZ2V0VmVyc2VVU0ZNLCBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZU9iamVjdHMpXG4gICAgc2V0U3RhdGUoeyBhbGlnbmVyRGF0YTogbnVsbCwgYWxpZ25lZCB9KVxuICB9XG5cbiAgLyoqXG4gICAqIGNhbGxiYWNrIGZvciBidXR0b24gdG8gc2V0IGVkaXRpbmcgc3RhdGVcbiAgICogQHBhcmFtIHtib29sZWFufSBlZGl0aW5nXyAtIGlmIHRydWUsIGVkaXRvciBpcyBzaG93biwgb3RoZXJ3aXNlIGVkaXRvciBpcyBoaWRkZW5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIHNldEVkaXRpbmcoZWRpdGluZ18pIHtcbiAgICBpZiAoZW5hYmxlRWRpdCkge1xuICAgICAgaWYgKGVkaXRpbmdfICYmICFlZGl0aW5nKSB7XG4gICAgICAgIGF3YWl0IHN0YXJ0RWRpdEJyYW5jaCgpXG4gICAgICB9XG5cbiAgICAgIGlmIChlZGl0aW5nXyAhPT0gZWRpdGluZykge1xuICAgICAgICBzZXRTdGF0ZSh7IGVkaXRpbmc6IGVkaXRpbmdfIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNhbGxiYWNrIGZyb20gdGhlIGVkaXQgb25DaGFuZ2UgZXZlbnQgdG8gdXBkYXRlIGVkaXQgc3RhdGUgdmFyaWFibGVzXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hhbmdlZCAtIHRydWUgaWYgdGhlIG5ld1ZlcnNlVGV4dCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgaW5pdGlhbFZlcnNlVGV4dFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3VmVyc2VUZXh0IC0gY3VycmVudCBjaGFuZ2VkIHZlcnNlIHRleHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IF9pbml0aWFsVmVyc2VUZXh0IC0gaW5pdGlhbCB2ZXJzZSB0ZXh0XG4gICAqL1xuICBmdW5jdGlvbiBzZXRWZXJzZUNoYW5nZWQoY2hhbmdlZCwgbmV3VmVyc2VUZXh0LCBfaW5pdGlhbFZlcnNlVGV4dCkge1xuICAgIGNvbnN0IHsgdGFyZ2V0VmVyc2VUZXh0IH0gPSBBbGlnbm1lbnRIZWxwZXJzLnVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlKGluaXRpYWxWZXJzZU9iamVjdHMsIG5ld1ZlcnNlVGV4dClcbiAgICBjb25zdCBhbGlnbmVkID0gaXNVc2ZtQWxpZ25lZCh0YXJnZXRWZXJzZVRleHQsIG9yaWdpbmFsU2NyaXB0dXJlUmVzb3VyY2U/LnZlcnNlT2JqZWN0cylcbiAgICBjb25zdCBfY2hhbmdlZCA9IG5ld1ZlcnNlVGV4dCAhPT0gaW5pdGlhbFZlcnNlVGV4dFxuXG4gICAgc2V0U3RhdGUoe1xuICAgICAgdmVyc2VUZXh0Q2hhbmdlZDogX2NoYW5nZWQsXG4gICAgICBuZXdWZXJzZVRleHQsXG4gICAgICBhbGlnbmVkLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBjdXJyZW50VmVyc2VPYmplY3RzID0gUmVhY3QudXNlTWVtbyggKCkgPT4geyAvLyBpZiB2ZXJzZSBoYXMgYmVlbiBlZGl0ZWQgb3IgYWxpZ25tZW50IGNoYW5nZWQsIHRoZW4gZ2VuZXJhdGUgbmV3IHZlcnNlT2JqZWN0cyB0byBkaXNwbGF5IGluIFNjcmlwdHVyZVBhbmVcbiAgICBpZiAoaW5pdGlhbFZlcnNlT2JqZWN0cykge1xuICAgICAgY29uc3QgdGFyZ2V0VmVyc2VVU0ZNID0gZ2V0Q3VycmVudFZlcnNlVXNmbSh1cGRhdGVkVmVyc2VPYmplY3RzLCBpbml0aWFsVmVyc2VPYmplY3RzLCB2ZXJzZVRleHRDaGFuZ2VkLCBuZXdWZXJzZVRleHQpXG4gICAgICBjb25zdCBjdXJyZW50VmVyc2VPYmplY3RzXyA9IHVzZm1IZWxwZXJzLnVzZm1WZXJzZVRvSnNvbih0YXJnZXRWZXJzZVVTRk0pXG4gICAgICByZXR1cm4gY3VycmVudFZlcnNlT2JqZWN0c19cbiAgICB9XG4gICAgcmV0dXJuIGluaXRpYWxWZXJzZU9iamVjdHNcbiAgfSwgW3VwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWQsIG5ld1ZlcnNlVGV4dF0pXG5cbiAgY29uc3QgdW5zYXZlZENoYW5nZXM6Ym9vbGVhbiA9IFJlYWN0LnVzZU1lbW8oICgpID0+IHsgLy8gaWYgdmVyc2UgaGFzIGJlZW4gZWRpdGVkIG9yIGFsaWdubWVudCBjaGFuZ2VkLCB0aGVuIGluZGljYXRlIHdlIGhhdmUgdW5zYXZlZCBjaGFuZ2VzXG4gICAgY29uc3QgY2hhbmdlZCA9IHZlcnNlVGV4dENoYW5nZWQgfHwgKHVwZGF0ZWRWZXJzZU9iamVjdHMgJiYgIWlzRXF1YWwoaW5pdGlhbFZlcnNlT2JqZWN0cywgdXBkYXRlZFZlcnNlT2JqZWN0cykpXG4gICAgcmV0dXJuIGNoYW5nZWRcbiAgfSwgW3VwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWRdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIHNldCBzYXZlZCBjaGFuZ2VzIHdoZW5ldmVyIHVzZXIgZWRpdHMgdmVyc2UgdGV4dCBvciBhbGlnbm1lbnRzIG9yIGlmIGFsaWdubWVudHMgYXJlIG9wZW5cbiAgICBjb25zdCB1bnNhdmVkQ2hhbmdlc18gPSB1bnNhdmVkQ2hhbmdlcyB8fCBhbGlnbmVyRGF0YVxuICAgIHNldFNhdmVkQ2hhbmdlcyAmJiBzZXRTYXZlZENoYW5nZXMoY3VycmVudEluZGV4LCAhdW5zYXZlZENoYW5nZXNfLCBnZXRDaGFuZ2VzLCBjbGVhckNoYW5nZXMpXG4gIH0sIFt1bnNhdmVkQ2hhbmdlcywgYWxpZ25lckRhdGFdKVxuXG4gIC8qKlxuICAgKiBjYWxsYmFjayBmb3Igd2hlbiBhbGlnbm1lbnRzIGFyZSBiZWluZyBjaGFuZ2VkXG4gICAqIEBwYXJhbSB7b2JqZWN0fSByZXN1bHRzXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgYWxpZ25tZW50IGlzIGNvbXBsZXRlXG4gICAqL1xuICBmdW5jdGlvbiBvbkFsaWdubWVudHNDaGFuZ2UocmVzdWx0cykge1xuICAgIGNvbnNvbGUubG9nKGBvbkFsaWdubWVudHNDaGFuZ2UoKSAtIGFsaWdubWVudCBjaGFuZ2VkLCByZXN1bHRzYCwgcmVzdWx0cykgLy8gbWVyZ2UgYWxpZ25tZW50cyBpbnRvIHRhcmdldCB2ZXJzZSBhbmQgY29udmVydCB0byBVU0ZNXG4gICAgY29uc3QgeyB0YXJnZXRXb3JkcywgdmVyc2VBbGlnbm1lbnRzIH0gPSByZXN1bHRzXG4gICAgY29uc3QgYWxpZ25tZW50Q29tcGxldGUgPSBBbGlnbm1lbnRIZWxwZXJzLmFyZUFsZ25tZW50c0NvbXBsZXRlKHRhcmdldFdvcmRzLCB2ZXJzZUFsaWdubWVudHMpXG4gICAgY29uc29sZS5sb2coYEFsaWdubWVudHMgYXJlICR7YWxpZ25tZW50Q29tcGxldGUgPyAnQ09NUExFVEUhJyA6ICdpbmNvbXBsZXRlJ31gKVxuICAgIHNldFN0YXRlKHsgbmV3QWxpZ25tZW50czogcmVzdWx0cywgYWxpZ25lZDogYWxpZ25tZW50Q29tcGxldGUgfSlcbiAgICByZXR1cm4gYWxpZ25tZW50Q29tcGxldGVcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYWN0aW9uczoge1xuICAgICAgY2FuY2VsQWxpZ25tZW50LFxuICAgICAgZ2V0Q2hhbmdlcyxcbiAgICAgIGhhbmRsZUFsaWdubWVudENsaWNrLFxuICAgICAgb25BbGlnbm1lbnRzQ2hhbmdlLFxuICAgICAgc2F2ZUFsaWdubWVudCxcbiAgICAgIHNldEVkaXRpbmcsXG4gICAgICBzZXRWZXJzZUNoYW5nZWQsXG4gICAgfSxcbiAgICBzdGF0ZToge1xuICAgICAgYWxpZ25lZCxcbiAgICAgIGFsaWduZXJEYXRhLFxuICAgICAgY3VycmVudFZlcnNlT2JqZWN0cyxcbiAgICAgIGVkaXRpbmcsXG4gICAgICBpbml0aWFsVmVyc2VUZXh0LFxuICAgICAgaW5pdGlhbFZlcnNlT2JqZWN0cyxcbiAgICAgIG5ld1ZlcnNlVGV4dCxcbiAgICAgIHNvdXJjZUxhbmd1YWdlLFxuICAgICAgdGFyZ2V0TGFuZ3VhZ2UsXG4gICAgICB1bnNhdmVkQ2hhbmdlcyxcbiAgICAgIHZlcnNlVGV4dENoYW5nZWQsXG4gICAgICByZWZlcmVuY2UsXG4gICAgICB0aXRsZSxcbiAgICB9LFxuICB9XG59XG4iXX0=
|