single-scripture-rcl 3.2.4 → 3.2.5
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.
- package/dist/components/ScriptureCard/ScriptureCard.js +42 -297
- package/dist/components/ScripturePane/ScripturePane.js +8 -83
- package/dist/hooks/useScripture.js +6 -100
- package/dist/hooks/useScriptureResources.js +3 -14
- package/dist/hooks/useScriptureSettings.js +4 -9
- package/dist/utils/ScriptureSettings.js +1 -1
- package/package.json +7 -20
- package/dist/hooks/useScriptureAlignmentEdit.js +0 -633
|
@@ -1,633 +0,0 @@
|
|
|
1
|
-
import "core-js/modules/es.array.concat.js";
|
|
2
|
-
import "core-js/modules/es.array.find-index.js";
|
|
3
|
-
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
|
-
import "regenerator-runtime/runtime.js";
|
|
8
|
-
|
|
9
|
-
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
|
-
|
|
11
|
-
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
|
-
|
|
13
|
-
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
|
-
|
|
15
|
-
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; }
|
|
16
|
-
|
|
17
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
18
|
-
|
|
19
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
20
|
-
|
|
21
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
22
|
-
|
|
23
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
24
|
-
|
|
25
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
26
|
-
|
|
27
|
-
function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
28
|
-
|
|
29
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
30
|
-
|
|
31
|
-
// @ts-ignore
|
|
32
|
-
import * as React from 'react';
|
|
33
|
-
import { AlignmentHelpers, UsfmFileConversionHelpers, usfmHelpers } from 'word-aligner-rcl';
|
|
34
|
-
import * as isEqual from 'deep-equal';
|
|
35
|
-
import useDeepCompareEffect from 'use-deep-compare-effect';
|
|
36
|
-
import { useEdit } from 'gitea-react-toolkit';
|
|
37
|
-
import { core } from 'scripture-resources-rcl';
|
|
38
|
-
import usfmjs from 'usfm-js';
|
|
39
|
-
import { ScriptureConfig, ServerConfig } from '../types';
|
|
40
|
-
import { getScriptureResourceSettings } from '../utils/ScriptureSettings';
|
|
41
|
-
import { ORIGINAL_SOURCE } from '../utils';
|
|
42
|
-
import useScriptureResources from './useScriptureResources';
|
|
43
|
-
|
|
44
|
-
function isUsfmAligned(targetVerseUSFM, originalVerseObjects) {
|
|
45
|
-
var _originalVerseObjects;
|
|
46
|
-
|
|
47
|
-
originalVerseObjects = (_originalVerseObjects = originalVerseObjects) !== null && _originalVerseObjects !== void 0 && _originalVerseObjects.length ? originalVerseObjects : null; // make sure not passing empty Array
|
|
48
|
-
|
|
49
|
-
var _AlignmentHelpers$ext = AlignmentHelpers.extractAlignmentsFromTargetVerse(targetVerseUSFM, originalVerseObjects),
|
|
50
|
-
alignments = _AlignmentHelpers$ext.alignments,
|
|
51
|
-
wordBank = _AlignmentHelpers$ext.wordBank;
|
|
52
|
-
|
|
53
|
-
return AlignmentHelpers.areAlgnmentsComplete(wordBank, alignments);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function getCurrentVerseUsfm(updatedVerseObjects, initialVerseObjects, verseTextChanged, newVerseText) {
|
|
57
|
-
var targetVerseUSFM = null;
|
|
58
|
-
var currentVerseObjects_ = updatedVerseObjects || initialVerseObjects;
|
|
59
|
-
|
|
60
|
-
if (verseTextChanged && newVerseText) {
|
|
61
|
-
var _AlignmentHelpers$upd = AlignmentHelpers.updateAlignmentsToTargetVerse(currentVerseObjects_, newVerseText),
|
|
62
|
-
targetVerseText = _AlignmentHelpers$upd.targetVerseText;
|
|
63
|
-
|
|
64
|
-
targetVerseUSFM = targetVerseText;
|
|
65
|
-
} else {
|
|
66
|
-
targetVerseUSFM = UsfmFileConversionHelpers.convertVerseDataToUSFM(currentVerseObjects_);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return targetVerseUSFM;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export function useScriptureAlignmentEdit(_ref) {
|
|
73
|
-
var _scriptureConfig$reso, _scriptureConfig$reso2, _scriptureConfig$reso3, _httpConfig, _httpConfig2;
|
|
74
|
-
|
|
75
|
-
var authentication = _ref.authentication,
|
|
76
|
-
currentVerseNum = _ref.currentVerseNum,
|
|
77
|
-
enableEdit = _ref.enableEdit,
|
|
78
|
-
enableAlignment = _ref.enableAlignment,
|
|
79
|
-
httpConfig = _ref.httpConfig,
|
|
80
|
-
initialVerseObjects = _ref.initialVerseObjects,
|
|
81
|
-
isNewTestament = _ref.isNewTestament,
|
|
82
|
-
loggedInUser = _ref.loggedInUser,
|
|
83
|
-
originalLanguageOwner = _ref.originalLanguageOwner,
|
|
84
|
-
originalRepoUrl = _ref.originalRepoUrl,
|
|
85
|
-
scriptureConfig = _ref.scriptureConfig,
|
|
86
|
-
scriptureSettings = _ref.scriptureSettings,
|
|
87
|
-
startEditBranch = _ref.startEditBranch,
|
|
88
|
-
bookIndex = _ref.bookIndex,
|
|
89
|
-
workingResourceBranch = _ref.workingResourceBranch;
|
|
90
|
-
|
|
91
|
-
var _React$useState = React.useState({
|
|
92
|
-
aligned: false,
|
|
93
|
-
alignerData: null,
|
|
94
|
-
editing: false,
|
|
95
|
-
initialVerseText: null,
|
|
96
|
-
newAlignments: null,
|
|
97
|
-
newVerseText: null,
|
|
98
|
-
updatedVerseObjects: null,
|
|
99
|
-
verseTextChanged: false,
|
|
100
|
-
saveContent: null,
|
|
101
|
-
startSave: false,
|
|
102
|
-
sha: null
|
|
103
|
-
}),
|
|
104
|
-
_React$useState2 = _slicedToArray(_React$useState, 2),
|
|
105
|
-
state = _React$useState2[0],
|
|
106
|
-
setState_ = _React$useState2[1];
|
|
107
|
-
|
|
108
|
-
var aligned = state.aligned,
|
|
109
|
-
alignerData = state.alignerData,
|
|
110
|
-
editing = state.editing,
|
|
111
|
-
initialVerseText = state.initialVerseText,
|
|
112
|
-
newAlignments = state.newAlignments,
|
|
113
|
-
newVerseText = state.newVerseText,
|
|
114
|
-
updatedVerseObjects = state.updatedVerseObjects,
|
|
115
|
-
verseTextChanged = state.verseTextChanged,
|
|
116
|
-
saveContent = state.saveContent,
|
|
117
|
-
startSave = state.startSave,
|
|
118
|
-
sha = state.sha;
|
|
119
|
-
|
|
120
|
-
function setState(newState) {
|
|
121
|
-
setState_(function (prevState) {
|
|
122
|
-
return _objectSpread(_objectSpread({}, prevState), newState);
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
var reference_ = (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reference) || null;
|
|
127
|
-
useDeepCompareEffect(function () {
|
|
128
|
-
// check for context changes, reset edit and alignment state
|
|
129
|
-
console.log("reference changed ".concat(JSON.stringify(reference_)));
|
|
130
|
-
|
|
131
|
-
var clearState = _objectSpread(_objectSpread({}, state), {}, {
|
|
132
|
-
alignerData: null,
|
|
133
|
-
editing: false,
|
|
134
|
-
newAlignments: null,
|
|
135
|
-
newVerseText: null,
|
|
136
|
-
updatedVerseObjects: null,
|
|
137
|
-
verseTextChanged: false
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
if (!isEqual(state, clearState)) {
|
|
141
|
-
console.log("reference changed, reset edit/alignment state variables");
|
|
142
|
-
setState(clearState);
|
|
143
|
-
}
|
|
144
|
-
}, [reference_]);
|
|
145
|
-
|
|
146
|
-
var originalScriptureSettings_ = _objectSpread(_objectSpread({}, scriptureSettings), {}, {
|
|
147
|
-
resourceId: ORIGINAL_SOURCE
|
|
148
|
-
}); // @ts-ignore
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
httpConfig = httpConfig || {};
|
|
152
|
-
var bookId = reference_ === null || reference_ === void 0 ? void 0 : reference_.projectId;
|
|
153
|
-
var originalScriptureSettings = getScriptureResourceSettings(bookId, originalScriptureSettings_, isNewTestament, originalRepoUrl); // @ts-ignore
|
|
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;
|
|
202
|
-
|
|
203
|
-
if (!enableAlignment) {
|
|
204
|
-
// if not enabled, then we don't fetch resource
|
|
205
|
-
originalScriptureSettings.resourceLink = null;
|
|
206
|
-
} // get original language for alignment
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
var originalScriptureResource = useScriptureResources({
|
|
210
|
-
bookId: bookId,
|
|
211
|
-
scriptureSettings: originalScriptureSettings,
|
|
212
|
-
chapter: reference_ === null || reference_ === void 0 ? void 0 : reference_.chapter,
|
|
213
|
-
verse: reference_ === null || reference_ === void 0 ? void 0 : reference_.verse,
|
|
214
|
-
isNewTestament: isNewTestament,
|
|
215
|
-
originalRepoUrl: originalRepoUrl,
|
|
216
|
-
currentLanguageId: originalScriptureSettings === null || originalScriptureSettings === void 0 ? void 0 : originalScriptureSettings.languageId,
|
|
217
|
-
currentOwner: originalLanguageOwner,
|
|
218
|
-
httpConfig: httpConfig
|
|
219
|
-
});
|
|
220
|
-
React.useEffect(function () {
|
|
221
|
-
// update alignment status when aligner is hidden
|
|
222
|
-
var notEmpty = !!initialVerseObjects;
|
|
223
|
-
var aligned_ = false;
|
|
224
|
-
|
|
225
|
-
if (!alignerData) {
|
|
226
|
-
// skip if aligner is being shown
|
|
227
|
-
if (notEmpty) {
|
|
228
|
-
// skip if empty
|
|
229
|
-
var originalVerseObjects = originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects;
|
|
230
|
-
var currentVerseObjects_ = updatedVerseObjects || initialVerseObjects;
|
|
231
|
-
|
|
232
|
-
if (!enableAlignment) {
|
|
233
|
-
aligned_ = true;
|
|
234
|
-
} else if (newVerseText && newVerseText !== initialVerseText) {
|
|
235
|
-
var results = AlignmentHelpers.updateAlignmentsToTargetVerse(currentVerseObjects_, newVerseText);
|
|
236
|
-
aligned_ = isUsfmAligned(results === null || results === void 0 ? void 0 : results.targetVerseText, originalVerseObjects);
|
|
237
|
-
} else {
|
|
238
|
-
var targetVerseUSFM = UsfmFileConversionHelpers.convertVerseDataToUSFM(currentVerseObjects_);
|
|
239
|
-
aligned_ = isUsfmAligned(targetVerseUSFM, originalVerseObjects);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
if (aligned !== aligned_) {
|
|
244
|
-
setState({
|
|
245
|
-
aligned: aligned_
|
|
246
|
-
});
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}, [initialVerseObjects, alignerData, newVerseText, initialVerseText, enableAlignment, originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects]);
|
|
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
|
-
}
|
|
274
|
-
|
|
275
|
-
function saveChangesToCloud() {
|
|
276
|
-
console.log("saveChangesToCloud - started");
|
|
277
|
-
var updatedVerseObjects_;
|
|
278
|
-
|
|
279
|
-
if (newAlignments) {
|
|
280
|
-
// if unsaved alignment changes, apply them
|
|
281
|
-
updatedVerseObjects_ = updateVerseWithNewAlignments();
|
|
282
|
-
} else if (verseTextChanged && newVerseText) {
|
|
283
|
-
var currentVerseObjects_ = updatedVerseObjects || initialVerseObjects;
|
|
284
|
-
|
|
285
|
-
var _AlignmentHelpers$upd2 = AlignmentHelpers.updateAlignmentsToTargetVerse(currentVerseObjects_, newVerseText),
|
|
286
|
-
targetVerseText = _AlignmentHelpers$upd2.targetVerseText,
|
|
287
|
-
targetVerseObjects = _AlignmentHelpers$upd2.targetVerseObjects; // console.log(`saveChangesToCloud() - new text:`, targetVerseText.substring(0,100))
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
updatedVerseObjects_ = targetVerseObjects;
|
|
291
|
-
} else {
|
|
292
|
-
// only alignment changes to upload
|
|
293
|
-
updatedVerseObjects_ = updatedVerseObjects || initialVerseObjects;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
if (updatedVerseObjects_) {
|
|
297
|
-
var _scriptureConfig$vers;
|
|
298
|
-
|
|
299
|
-
var newUsfm; // @ts-ignore
|
|
300
|
-
|
|
301
|
-
var ref = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$vers = scriptureConfig.versesForRef) === null || _scriptureConfig$vers === void 0 ? void 0 : _scriptureConfig$vers[currentVerseNum]; // @ts-ignore
|
|
302
|
-
|
|
303
|
-
var originalUsfm = core.getResponseData(scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.fetchResponse);
|
|
304
|
-
|
|
305
|
-
if (originalUsfm) {
|
|
306
|
-
var chapterChunks = originalUsfm === null || originalUsfm === void 0 ? void 0 : originalUsfm.split('\\c ');
|
|
307
|
-
var chapterIndex = findRefInArray(ref === null || ref === void 0 ? void 0 : ref.chapter, chapterChunks);
|
|
308
|
-
|
|
309
|
-
if (chapterIndex >= 0) {
|
|
310
|
-
var currentChapter = chapterChunks[chapterIndex];
|
|
311
|
-
var verseChunks = currentChapter.split('\\v ');
|
|
312
|
-
var verseIndex = findRefInArray(ref === null || ref === void 0 ? void 0 : ref.verse, verseChunks);
|
|
313
|
-
|
|
314
|
-
if (verseIndex >= 0) {
|
|
315
|
-
var newVerseUsfm = UsfmFileConversionHelpers.convertVerseDataToUSFM(updatedVerseObjects_);
|
|
316
|
-
var oldVerse = verseChunks[verseIndex];
|
|
317
|
-
var verseNumLen = ((ref === null || ref === void 0 ? void 0 : ref.verse) + '').length;
|
|
318
|
-
verseChunks[verseIndex] = oldVerse.substring(0, verseNumLen + 1) + newVerseUsfm;
|
|
319
|
-
var newChapter = verseChunks.join('\\v ');
|
|
320
|
-
chapterChunks[chapterIndex] = newChapter;
|
|
321
|
-
newUsfm = chapterChunks.join('\\c ');
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
if (!newUsfm) {
|
|
327
|
-
var newBookJson = updateVerseNum(currentVerseNum, updatedVerseObjects_);
|
|
328
|
-
newUsfm = usfmjs.toUSFM(newBookJson, {
|
|
329
|
-
forcedNewLines: true
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
console.log("saveChangesToCloud() - saving new USFM: ".concat(newUsfm.substring(0, 100), "..."));
|
|
334
|
-
setState({
|
|
335
|
-
saveContent: newUsfm,
|
|
336
|
-
startSave: true
|
|
337
|
-
});
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
React.useEffect(function () {
|
|
342
|
-
var _saveEdit = /*#__PURE__*/function () {
|
|
343
|
-
var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
|
|
344
|
-
var branch;
|
|
345
|
-
return regeneratorRuntime.wrap(function _callee$(_context) {
|
|
346
|
-
while (1) {
|
|
347
|
-
switch (_context.prev = _context.next) {
|
|
348
|
-
case 0:
|
|
349
|
-
// begin uploading new USFM
|
|
350
|
-
branch = workingResourceBranch !== 'master' ? workingResourceBranch : undefined;
|
|
351
|
-
|
|
352
|
-
if (branch) {
|
|
353
|
-
_context.next = 5;
|
|
354
|
-
break;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
_context.next = 4;
|
|
358
|
-
return startEditBranch();
|
|
359
|
-
|
|
360
|
-
case 4:
|
|
361
|
-
branch = _context.sent;
|
|
362
|
-
|
|
363
|
-
case 5:
|
|
364
|
-
_context.next = 7;
|
|
365
|
-
return onSaveEdit(branch).then(function (success) {
|
|
366
|
-
// push changed to server
|
|
367
|
-
if (success) {
|
|
368
|
-
console.log("saveChangesToCloud() - save scripture edits success");
|
|
369
|
-
setState({
|
|
370
|
-
updatedVerseObjects: null,
|
|
371
|
-
editing: false,
|
|
372
|
-
newVerseText: null,
|
|
373
|
-
alignerData: null,
|
|
374
|
-
startSave: false,
|
|
375
|
-
verseTextChanged: false,
|
|
376
|
-
initialVerseText: null
|
|
377
|
-
});
|
|
378
|
-
console.info('saveChangesToCloud() - Reloading resource');
|
|
379
|
-
scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.reloadResource();
|
|
380
|
-
} else {
|
|
381
|
-
console.error('saveChangesToCloud() - saving changed scripture failed');
|
|
382
|
-
setState({
|
|
383
|
-
startSave: false
|
|
384
|
-
});
|
|
385
|
-
}
|
|
386
|
-
});
|
|
387
|
-
|
|
388
|
-
case 7:
|
|
389
|
-
case "end":
|
|
390
|
-
return _context.stop();
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
}, _callee);
|
|
394
|
-
}));
|
|
395
|
-
|
|
396
|
-
return function _saveEdit() {
|
|
397
|
-
return _ref2.apply(this, arguments);
|
|
398
|
-
};
|
|
399
|
-
}();
|
|
400
|
-
|
|
401
|
-
if (startSave) {
|
|
402
|
-
console.log("saveChangesToCloud - calling _saveEdit()");
|
|
403
|
-
|
|
404
|
-
_saveEdit();
|
|
405
|
-
}
|
|
406
|
-
}, [startSave]);
|
|
407
|
-
|
|
408
|
-
function updateVerseNum(index) {
|
|
409
|
-
var _scriptureConfig$vers2;
|
|
410
|
-
|
|
411
|
-
var newVerseObjects = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : initialVerseObjects;
|
|
412
|
-
// @ts-ignore
|
|
413
|
-
var ref = scriptureConfig === null || scriptureConfig === void 0 ? void 0 : (_scriptureConfig$vers2 = scriptureConfig.versesForRef) === null || _scriptureConfig$vers2 === void 0 ? void 0 : _scriptureConfig$vers2[index];
|
|
414
|
-
var targetVerseObjects_ = null;
|
|
415
|
-
|
|
416
|
-
if (ref) {
|
|
417
|
-
if (newVerseText) {
|
|
418
|
-
var _AlignmentHelpers$upd3 = AlignmentHelpers.updateAlignmentsToTargetVerse(newVerseObjects, newVerseText),
|
|
419
|
-
targetVerseObjects = _AlignmentHelpers$upd3.targetVerseObjects;
|
|
420
|
-
|
|
421
|
-
targetVerseObjects_ = targetVerseObjects;
|
|
422
|
-
} else {
|
|
423
|
-
targetVerseObjects_ = newVerseObjects;
|
|
424
|
-
} // @ts-ignore
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
return targetVerseObjects_ && (scriptureConfig === null || scriptureConfig === void 0 ? void 0 : scriptureConfig.updateVerse(ref.chapter, ref.verse, {
|
|
428
|
-
verseObjects: targetVerseObjects_
|
|
429
|
-
}));
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
return null;
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
function handleAlignmentClick() {
|
|
436
|
-
return _handleAlignmentClick.apply(this, arguments);
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
function _handleAlignmentClick() {
|
|
440
|
-
_handleAlignmentClick = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
|
|
441
|
-
var alignerData_, targetVerseUSFM, originalVerseObjects, originalVerseUsfm, _AlignmentHelpers$par, wordBank, alignments;
|
|
442
|
-
|
|
443
|
-
return regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
444
|
-
while (1) {
|
|
445
|
-
switch (_context2.prev = _context2.next) {
|
|
446
|
-
case 0:
|
|
447
|
-
if (!enableAlignment) {
|
|
448
|
-
_context2.next = 7;
|
|
449
|
-
break;
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
alignerData_ = null;
|
|
453
|
-
_context2.next = 4;
|
|
454
|
-
return startEditBranch();
|
|
455
|
-
|
|
456
|
-
case 4:
|
|
457
|
-
if (!alignerData) {
|
|
458
|
-
// if word aligner not shown
|
|
459
|
-
console.log("handleAlignmentClick - toggle ON alignment");
|
|
460
|
-
targetVerseUSFM = getCurrentVerseUsfm(updatedVerseObjects, initialVerseObjects, verseTextChanged, newVerseText);
|
|
461
|
-
originalVerseObjects = originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects;
|
|
462
|
-
originalVerseUsfm = null;
|
|
463
|
-
|
|
464
|
-
if (originalVerseObjects) {
|
|
465
|
-
originalVerseUsfm = UsfmFileConversionHelpers.convertVerseDataToUSFM(originalVerseObjects);
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
_AlignmentHelpers$par = AlignmentHelpers.parseUsfmToWordAlignerData(targetVerseUSFM, originalVerseUsfm), wordBank = _AlignmentHelpers$par.targetWords, alignments = _AlignmentHelpers$par.verseAlignments;
|
|
469
|
-
alignerData_ = {
|
|
470
|
-
wordBank: wordBank,
|
|
471
|
-
alignments: alignments
|
|
472
|
-
};
|
|
473
|
-
} else {
|
|
474
|
-
// word aligner currently shown
|
|
475
|
-
console.log("handleAlignmentClick - alignment already shown");
|
|
476
|
-
alignerData_ = alignerData;
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
setState({
|
|
480
|
-
alignerData: alignerData_
|
|
481
|
-
});
|
|
482
|
-
console.log(alignerData_);
|
|
483
|
-
|
|
484
|
-
case 7:
|
|
485
|
-
case "end":
|
|
486
|
-
return _context2.stop();
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
}, _callee2);
|
|
490
|
-
}));
|
|
491
|
-
return _handleAlignmentClick.apply(this, arguments);
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
function updateVerseWithNewAlignments() {
|
|
495
|
-
var currentVerseObjects_ = updatedVerseObjects || initialVerseObjects;
|
|
496
|
-
var targetVerseText = newVerseText || UsfmFileConversionHelpers.convertVerseDataToUSFM(currentVerseObjects_);
|
|
497
|
-
var verseUsfm = AlignmentHelpers.addAlignmentsToVerseUSFM(newAlignments.targetWords, newAlignments.verseAlignments, targetVerseText);
|
|
498
|
-
var alignedVerseObjects = usfmHelpers.usfmVerseToJson(verseUsfm);
|
|
499
|
-
return alignedVerseObjects;
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
function saveAlignment() {
|
|
503
|
-
console.log("saveAlignment()");
|
|
504
|
-
|
|
505
|
-
if (newAlignments) {
|
|
506
|
-
var alignedVerseObjects = updateVerseWithNewAlignments();
|
|
507
|
-
setState({
|
|
508
|
-
alignerData: null,
|
|
509
|
-
editing: false,
|
|
510
|
-
newAlignments: null,
|
|
511
|
-
updatedVerseObjects: alignedVerseObjects
|
|
512
|
-
});
|
|
513
|
-
} else {
|
|
514
|
-
setState({
|
|
515
|
-
alignerData: null,
|
|
516
|
-
editing: false
|
|
517
|
-
});
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
function cancelAlignment() {
|
|
522
|
-
console.log("cancelAlignment()");
|
|
523
|
-
var targetVerseUSFM = getCurrentVerseUsfm(updatedVerseObjects, initialVerseObjects, verseTextChanged, newVerseText);
|
|
524
|
-
var aligned = isUsfmAligned(targetVerseUSFM, originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects);
|
|
525
|
-
setState({
|
|
526
|
-
alignerData: null,
|
|
527
|
-
aligned: aligned
|
|
528
|
-
});
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
function setEditing(_x) {
|
|
532
|
-
return _setEditing.apply(this, arguments);
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
function _setEditing() {
|
|
536
|
-
_setEditing = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(editing_) {
|
|
537
|
-
return regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
538
|
-
while (1) {
|
|
539
|
-
switch (_context3.prev = _context3.next) {
|
|
540
|
-
case 0:
|
|
541
|
-
if (!enableEdit) {
|
|
542
|
-
_context3.next = 5;
|
|
543
|
-
break;
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
if (!(editing_ && !editing)) {
|
|
547
|
-
_context3.next = 4;
|
|
548
|
-
break;
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
_context3.next = 4;
|
|
552
|
-
return startEditBranch();
|
|
553
|
-
|
|
554
|
-
case 4:
|
|
555
|
-
if (editing_ !== editing) {
|
|
556
|
-
setState({
|
|
557
|
-
editing: editing_
|
|
558
|
-
});
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
case 5:
|
|
562
|
-
case "end":
|
|
563
|
-
return _context3.stop();
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
}, _callee3);
|
|
567
|
-
}));
|
|
568
|
-
return _setEditing.apply(this, arguments);
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
function setVerseChanged(changed, newVerseText, initialVerseText) {
|
|
572
|
-
var _AlignmentHelpers$upd4 = AlignmentHelpers.updateAlignmentsToTargetVerse(initialVerseObjects, newVerseText),
|
|
573
|
-
targetVerseText = _AlignmentHelpers$upd4.targetVerseText;
|
|
574
|
-
|
|
575
|
-
var aligned = isUsfmAligned(targetVerseText, originalScriptureResource === null || originalScriptureResource === void 0 ? void 0 : originalScriptureResource.verseObjects);
|
|
576
|
-
setState({
|
|
577
|
-
verseTextChanged: changed,
|
|
578
|
-
initialVerseText: initialVerseText,
|
|
579
|
-
newVerseText: newVerseText,
|
|
580
|
-
aligned: aligned
|
|
581
|
-
});
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
var currentVerseObjects = React.useMemo(function () {
|
|
585
|
-
// if verse has been edited or alignment changed, then generate new verseObjects to display in ScripturePane
|
|
586
|
-
if (initialVerseObjects) {
|
|
587
|
-
var targetVerseUSFM = getCurrentVerseUsfm(updatedVerseObjects, initialVerseObjects, verseTextChanged, newVerseText);
|
|
588
|
-
var currentVerseObjects_ = usfmHelpers.usfmVerseToJson(targetVerseUSFM);
|
|
589
|
-
return currentVerseObjects_;
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
return initialVerseObjects;
|
|
593
|
-
}, [updatedVerseObjects, initialVerseObjects, verseTextChanged, newVerseText]);
|
|
594
|
-
var unsavedChanges = React.useMemo(function () {
|
|
595
|
-
// if verse has been edited or alignment changed, then indicate we have unsaved changes
|
|
596
|
-
var changed = verseTextChanged || updatedVerseObjects && !isEqual(initialVerseObjects, updatedVerseObjects);
|
|
597
|
-
return changed;
|
|
598
|
-
}, [updatedVerseObjects, initialVerseObjects, verseTextChanged]);
|
|
599
|
-
|
|
600
|
-
function onAlignmentsChange(results) {
|
|
601
|
-
console.log("onAlignmentsChange() - alignment changed, results", results); // merge alignments into target verse and convert to USFM
|
|
602
|
-
|
|
603
|
-
var targetWords = results.targetWords,
|
|
604
|
-
verseAlignments = results.verseAlignments;
|
|
605
|
-
var alignmentComplete = AlignmentHelpers.areAlgnmentsComplete(targetWords, verseAlignments);
|
|
606
|
-
console.log("Alignments are ".concat(alignmentComplete ? 'COMPLETE!' : 'incomplete'));
|
|
607
|
-
setState({
|
|
608
|
-
newAlignments: results,
|
|
609
|
-
aligned: alignmentComplete
|
|
610
|
-
});
|
|
611
|
-
}
|
|
612
|
-
|
|
613
|
-
return {
|
|
614
|
-
actions: {
|
|
615
|
-
cancelAlignment: cancelAlignment,
|
|
616
|
-
currentVerseObjects: currentVerseObjects,
|
|
617
|
-
handleAlignmentClick: handleAlignmentClick,
|
|
618
|
-
onAlignmentsChange: onAlignmentsChange,
|
|
619
|
-
saveAlignment: saveAlignment,
|
|
620
|
-
setEditing: setEditing,
|
|
621
|
-
setVerseChanged: setVerseChanged,
|
|
622
|
-
saveChangesToCloud: saveChangesToCloud
|
|
623
|
-
},
|
|
624
|
-
state: {
|
|
625
|
-
aligned: aligned,
|
|
626
|
-
alignerData: alignerData,
|
|
627
|
-
editing: editing,
|
|
628
|
-
verseTextChanged: verseTextChanged,
|
|
629
|
-
unsavedChanges: unsavedChanges
|
|
630
|
-
}
|
|
631
|
-
};
|
|
632
|
-
}
|
|
633
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VTY3JpcHR1cmVBbGlnbm1lbnRFZGl0LnRzeCJdLCJuYW1lcyI6WyJSZWFjdCIsIkFsaWdubWVudEhlbHBlcnMiLCJVc2ZtRmlsZUNvbnZlcnNpb25IZWxwZXJzIiwidXNmbUhlbHBlcnMiLCJpc0VxdWFsIiwidXNlRGVlcENvbXBhcmVFZmZlY3QiLCJ1c2VFZGl0IiwiY29yZSIsInVzZm1qcyIsIlNjcmlwdHVyZUNvbmZpZyIsIlNlcnZlckNvbmZpZyIsImdldFNjcmlwdHVyZVJlc291cmNlU2V0dGluZ3MiLCJPUklHSU5BTF9TT1VSQ0UiLCJ1c2VTY3JpcHR1cmVSZXNvdXJjZXMiLCJpc1VzZm1BbGlnbmVkIiwidGFyZ2V0VmVyc2VVU0ZNIiwib3JpZ2luYWxWZXJzZU9iamVjdHMiLCJsZW5ndGgiLCJleHRyYWN0QWxpZ25tZW50c0Zyb21UYXJnZXRWZXJzZSIsImFsaWdubWVudHMiLCJ3b3JkQmFuayIsImFyZUFsZ25tZW50c0NvbXBsZXRlIiwiZ2V0Q3VycmVudFZlcnNlVXNmbSIsInVwZGF0ZWRWZXJzZU9iamVjdHMiLCJpbml0aWFsVmVyc2VPYmplY3RzIiwidmVyc2VUZXh0Q2hhbmdlZCIsIm5ld1ZlcnNlVGV4dCIsImN1cnJlbnRWZXJzZU9iamVjdHNfIiwidXBkYXRlQWxpZ25tZW50c1RvVGFyZ2V0VmVyc2UiLCJ0YXJnZXRWZXJzZVRleHQiLCJjb252ZXJ0VmVyc2VEYXRhVG9VU0ZNIiwidXNlU2NyaXB0dXJlQWxpZ25tZW50RWRpdCIsImF1dGhlbnRpY2F0aW9uIiwiY3VycmVudFZlcnNlTnVtIiwiZW5hYmxlRWRpdCIsImVuYWJsZUFsaWdubWVudCIsImh0dHBDb25maWciLCJpc05ld1Rlc3RhbWVudCIsImxvZ2dlZEluVXNlciIsIm9yaWdpbmFsTGFuZ3VhZ2VPd25lciIsIm9yaWdpbmFsUmVwb1VybCIsInNjcmlwdHVyZUNvbmZpZyIsInNjcmlwdHVyZVNldHRpbmdzIiwic3RhcnRFZGl0QnJhbmNoIiwiYm9va0luZGV4Iiwid29ya2luZ1Jlc291cmNlQnJhbmNoIiwidXNlU3RhdGUiLCJhbGlnbmVkIiwiYWxpZ25lckRhdGEiLCJlZGl0aW5nIiwiaW5pdGlhbFZlcnNlVGV4dCIsIm5ld0FsaWdubWVudHMiLCJzYXZlQ29udGVudCIsInN0YXJ0U2F2ZSIsInNoYSIsInN0YXRlIiwic2V0U3RhdGVfIiwic2V0U3RhdGUiLCJuZXdTdGF0ZSIsInByZXZTdGF0ZSIsInJlZmVyZW5jZV8iLCJyZWZlcmVuY2UiLCJjb25zb2xlIiwibG9nIiwiSlNPTiIsInN0cmluZ2lmeSIsImNsZWFyU3RhdGUiLCJvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzXyIsInJlc291cmNlSWQiLCJib29rSWQiLCJwcm9qZWN0SWQiLCJvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzIiwiZmV0Y2hSZXNwXyIsImZldGNoUmVzcG9uc2UiLCJvd25lciIsInJlc291cmNlIiwicmVwbyIsImxhbmd1YWdlSWQiLCJ1c2VFZmZlY3QiLCJkYXRhIiwiZ2V0Qm9va05hbWUiLCJib29rQ2FwcyIsInRvVXBwZXJDYXNlIiwiZmlsZXBhdGgiLCJjb250ZW50IiwiY29uZmlnIiwiY2FjaGUiLCJtYXhBZ2UiLCJ0b2tlbiIsInRpbWVvdXQiLCJzZXJ2ZXJUaW1lT3V0IiwiYXV0aG9yIiwiYnJhbmNoIiwiZWRpdFJlc3BvbnNlIiwiZXJyb3IiLCJpc0VkaXRpbmciLCJpc0Vycm9yIiwib25TYXZlRWRpdCIsInJlc291cmNlTGluayIsIm9yaWdpbmFsU2NyaXB0dXJlUmVzb3VyY2UiLCJjaGFwdGVyIiwidmVyc2UiLCJjdXJyZW50TGFuZ3VhZ2VJZCIsImN1cnJlbnRPd25lciIsIm5vdEVtcHR5IiwiYWxpZ25lZF8iLCJ2ZXJzZU9iamVjdHMiLCJyZXN1bHRzIiwiZmluZFJlZkluQXJyYXkiLCJmaW5kSXRlbSIsImNodW5rcyIsInJlZl8iLCJyZWZMZW4iLCJpbmRleCIsImZpbmRJbmRleCIsImNodW5rIiwiaWR4Iiwic3Vic3RyaW5nIiwibmV4dENoYXIiLCJzYXZlQ2hhbmdlc1RvQ2xvdWQiLCJ1cGRhdGVkVmVyc2VPYmplY3RzXyIsInVwZGF0ZVZlcnNlV2l0aE5ld0FsaWdubWVudHMiLCJ0YXJnZXRWZXJzZU9iamVjdHMiLCJuZXdVc2ZtIiwicmVmIiwidmVyc2VzRm9yUmVmIiwib3JpZ2luYWxVc2ZtIiwiZ2V0UmVzcG9uc2VEYXRhIiwiY2hhcHRlckNodW5rcyIsInNwbGl0IiwiY2hhcHRlckluZGV4IiwiY3VycmVudENoYXB0ZXIiLCJ2ZXJzZUNodW5rcyIsInZlcnNlSW5kZXgiLCJuZXdWZXJzZVVzZm0iLCJvbGRWZXJzZSIsInZlcnNlTnVtTGVuIiwibmV3Q2hhcHRlciIsImpvaW4iLCJuZXdCb29rSnNvbiIsInVwZGF0ZVZlcnNlTnVtIiwidG9VU0ZNIiwiZm9yY2VkTmV3TGluZXMiLCJfc2F2ZUVkaXQiLCJ1bmRlZmluZWQiLCJ0aGVuIiwic3VjY2VzcyIsImluZm8iLCJyZWxvYWRSZXNvdXJjZSIsIm5ld1ZlcnNlT2JqZWN0cyIsInRhcmdldFZlcnNlT2JqZWN0c18iLCJ1cGRhdGVWZXJzZSIsImhhbmRsZUFsaWdubWVudENsaWNrIiwiYWxpZ25lckRhdGFfIiwib3JpZ2luYWxWZXJzZVVzZm0iLCJwYXJzZVVzZm1Ub1dvcmRBbGlnbmVyRGF0YSIsInRhcmdldFdvcmRzIiwidmVyc2VBbGlnbm1lbnRzIiwidmVyc2VVc2ZtIiwiYWRkQWxpZ25tZW50c1RvVmVyc2VVU0ZNIiwiYWxpZ25lZFZlcnNlT2JqZWN0cyIsInVzZm1WZXJzZVRvSnNvbiIsInNhdmVBbGlnbm1lbnQiLCJjYW5jZWxBbGlnbm1lbnQiLCJzZXRFZGl0aW5nIiwiZWRpdGluZ18iLCJzZXRWZXJzZUNoYW5nZWQiLCJjaGFuZ2VkIiwiY3VycmVudFZlcnNlT2JqZWN0cyIsInVzZU1lbW8iLCJ1bnNhdmVkQ2hhbmdlcyIsIm9uQWxpZ25tZW50c0NoYW5nZSIsImFsaWdubWVudENvbXBsZXRlIiwiYWN0aW9ucyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQSxPQUFPLEtBQUtBLEtBQVosTUFBdUIsT0FBdkI7QUFDQSxTQUNFQyxnQkFERixFQUVFQyx5QkFGRixFQUdFQyxXQUhGLFFBSU8sa0JBSlA7QUFLQSxPQUFPLEtBQUtDLE9BQVosTUFBeUIsWUFBekI7QUFDQSxPQUFPQyxvQkFBUCxNQUFpQyx5QkFBakM7QUFDQSxTQUFTQyxPQUFULFFBQXdCLHFCQUF4QjtBQUNBLFNBQVNDLElBQVQsUUFBcUIseUJBQXJCO0FBQ0EsT0FBT0MsTUFBUCxNQUFtQixTQUFuQjtBQUNBLFNBQVNDLGVBQVQsRUFBMEJDLFlBQTFCLFFBQThDLFVBQTlDO0FBQ0EsU0FBU0MsNEJBQVQsUUFBNkMsNEJBQTdDO0FBQ0EsU0FBU0MsZUFBVCxRQUFnQyxVQUFoQztBQUNBLE9BQU9DLHFCQUFQLE1BQWtDLHlCQUFsQzs7QUF5QkEsU0FBU0MsYUFBVCxDQUF1QkMsZUFBdkIsRUFBd0NDLG9CQUF4QyxFQUE4RDtBQUFBOztBQUM1REEsRUFBQUEsb0JBQW9CLEdBQUcseUJBQUFBLG9CQUFvQixVQUFwQiw4REFBc0JDLE1BQXRCLEdBQStCRCxvQkFBL0IsR0FBc0QsSUFBN0UsQ0FENEQsQ0FDc0I7O0FBRHRCLDhCQUUzQmYsZ0JBQWdCLENBQUNpQixnQ0FBakIsQ0FBa0RILGVBQWxELEVBQW1FQyxvQkFBbkUsQ0FGMkI7QUFBQSxNQUVwREcsVUFGb0QseUJBRXBEQSxVQUZvRDtBQUFBLE1BRXhDQyxRQUZ3Qyx5QkFFeENBLFFBRndDOztBQUc1RCxTQUFPbkIsZ0JBQWdCLENBQUNvQixvQkFBakIsQ0FBc0NELFFBQXRDLEVBQWdERCxVQUFoRCxDQUFQO0FBQ0Q7O0FBRUQsU0FBU0csbUJBQVQsQ0FBNkJDLG1CQUE3QixFQUFrREMsbUJBQWxELEVBQXVFQyxnQkFBdkUsRUFBa0dDLFlBQWxHLEVBQWdIO0FBQzlHLE1BQUlYLGVBQWUsR0FBRyxJQUF0QjtBQUNBLE1BQU1ZLG9CQUFvQixHQUFHSixtQkFBbUIsSUFBSUMsbUJBQXBEOztBQUVBLE1BQUlDLGdCQUFnQixJQUFJQyxZQUF4QixFQUFzQztBQUFBLGdDQUNSekIsZ0JBQWdCLENBQUMyQiw2QkFBakIsQ0FBK0NELG9CQUEvQyxFQUFxRUQsWUFBckUsQ0FEUTtBQUFBLFFBQzVCRyxlQUQ0Qix5QkFDNUJBLGVBRDRCOztBQUVwQ2QsSUFBQUEsZUFBZSxHQUFHYyxlQUFsQjtBQUNELEdBSEQsTUFHTztBQUNMZCxJQUFBQSxlQUFlLEdBQUdiLHlCQUF5QixDQUFDNEIsc0JBQTFCLENBQWlESCxvQkFBakQsQ0FBbEI7QUFDRDs7QUFDRCxTQUFPWixlQUFQO0FBQ0Q7O0FBRUQsT0FBTyxTQUFTZ0IseUJBQVQsT0FnQkk7QUFBQTs7QUFBQSxNQWZUQyxjQWVTLFFBZlRBLGNBZVM7QUFBQSxNQWRUQyxlQWNTLFFBZFRBLGVBY1M7QUFBQSxNQWJUQyxVQWFTLFFBYlRBLFVBYVM7QUFBQSxNQVpUQyxlQVlTLFFBWlRBLGVBWVM7QUFBQSxNQVhUQyxVQVdTLFFBWFRBLFVBV1M7QUFBQSxNQVZUWixtQkFVUyxRQVZUQSxtQkFVUztBQUFBLE1BVFRhLGNBU1MsUUFUVEEsY0FTUztBQUFBLE1BUlRDLFlBUVMsUUFSVEEsWUFRUztBQUFBLE1BUFRDLHFCQU9TLFFBUFRBLHFCQU9TO0FBQUEsTUFOVEMsZUFNUyxRQU5UQSxlQU1TO0FBQUEsTUFMVEMsZUFLUyxRQUxUQSxlQUtTO0FBQUEsTUFKVEMsaUJBSVMsUUFKVEEsaUJBSVM7QUFBQSxNQUhUQyxlQUdTLFFBSFRBLGVBR1M7QUFBQSxNQUZUQyxTQUVTLFFBRlRBLFNBRVM7QUFBQSxNQURUQyxxQkFDUyxRQURUQSxxQkFDUzs7QUFBQSx3QkFDa0I3QyxLQUFLLENBQUM4QyxRQUFOLENBQWU7QUFDeENDLElBQUFBLE9BQU8sRUFBRSxLQUQrQjtBQUV4Q0MsSUFBQUEsV0FBVyxFQUFFLElBRjJCO0FBR3hDQyxJQUFBQSxPQUFPLEVBQUUsS0FIK0I7QUFJeENDLElBQUFBLGdCQUFnQixFQUFFLElBSnNCO0FBS3hDQyxJQUFBQSxhQUFhLEVBQUUsSUFMeUI7QUFNeEN6QixJQUFBQSxZQUFZLEVBQUUsSUFOMEI7QUFPeENILElBQUFBLG1CQUFtQixFQUFFLElBUG1CO0FBUXhDRSxJQUFBQSxnQkFBZ0IsRUFBRSxLQVJzQjtBQVN4QzJCLElBQUFBLFdBQVcsRUFBRSxJQVQyQjtBQVV4Q0MsSUFBQUEsU0FBUyxFQUFFLEtBVjZCO0FBV3hDQyxJQUFBQSxHQUFHLEVBQUU7QUFYbUMsR0FBZixDQURsQjtBQUFBO0FBQUEsTUFDRkMsS0FERTtBQUFBLE1BQ0tDLFNBREw7O0FBQUEsTUFnQlBULE9BaEJPLEdBMkJMUSxLQTNCSyxDQWdCUFIsT0FoQk87QUFBQSxNQWlCUEMsV0FqQk8sR0EyQkxPLEtBM0JLLENBaUJQUCxXQWpCTztBQUFBLE1Ba0JQQyxPQWxCTyxHQTJCTE0sS0EzQkssQ0FrQlBOLE9BbEJPO0FBQUEsTUFtQlBDLGdCQW5CTyxHQTJCTEssS0EzQkssQ0FtQlBMLGdCQW5CTztBQUFBLE1Bb0JQQyxhQXBCTyxHQTJCTEksS0EzQkssQ0FvQlBKLGFBcEJPO0FBQUEsTUFxQlB6QixZQXJCTyxHQTJCTDZCLEtBM0JLLENBcUJQN0IsWUFyQk87QUFBQSxNQXNCUEgsbUJBdEJPLEdBMkJMZ0MsS0EzQkssQ0FzQlBoQyxtQkF0Qk87QUFBQSxNQXVCUEUsZ0JBdkJPLEdBMkJMOEIsS0EzQkssQ0F1QlA5QixnQkF2Qk87QUFBQSxNQXdCUDJCLFdBeEJPLEdBMkJMRyxLQTNCSyxDQXdCUEgsV0F4Qk87QUFBQSxNQXlCUEMsU0F6Qk8sR0EyQkxFLEtBM0JLLENBeUJQRixTQXpCTztBQUFBLE1BMEJQQyxHQTFCTyxHQTJCTEMsS0EzQkssQ0EwQlBELEdBMUJPOztBQTZCVCxXQUFTRyxRQUFULENBQWtCQyxRQUFsQixFQUE0QjtBQUMxQkYsSUFBQUEsU0FBUyxDQUFDLFVBQUFHLFNBQVM7QUFBQSw2Q0FBVUEsU0FBVixHQUF3QkQsUUFBeEI7QUFBQSxLQUFWLENBQVQ7QUFDRDs7QUFFRCxNQUFNRSxVQUFVLEdBQUcsQ0FBQW5CLGVBQWUsU0FBZixJQUFBQSxlQUFlLFdBQWYsWUFBQUEsZUFBZSxDQUFFb0IsU0FBakIsS0FBOEIsSUFBakQ7QUFFQXhELEVBQUFBLG9CQUFvQixDQUFDLFlBQU07QUFBRTtBQUMzQnlELElBQUFBLE9BQU8sQ0FBQ0MsR0FBUiw2QkFBaUNDLElBQUksQ0FBQ0MsU0FBTCxDQUFlTCxVQUFmLENBQWpDOztBQUNBLFFBQU1NLFVBQVUsbUNBQ1hYLEtBRFc7QUFFZFAsTUFBQUEsV0FBVyxFQUFFLElBRkM7QUFHZEMsTUFBQUEsT0FBTyxFQUFFLEtBSEs7QUFJZEUsTUFBQUEsYUFBYSxFQUFFLElBSkQ7QUFLZHpCLE1BQUFBLFlBQVksRUFBRSxJQUxBO0FBTWRILE1BQUFBLG1CQUFtQixFQUFFLElBTlA7QUFPZEUsTUFBQUEsZ0JBQWdCLEVBQUU7QUFQSixNQUFoQjs7QUFVQSxRQUFJLENBQUNyQixPQUFPLENBQUNtRCxLQUFELEVBQVFXLFVBQVIsQ0FBWixFQUFpQztBQUMvQkosTUFBQUEsT0FBTyxDQUFDQyxHQUFSO0FBQ0FOLE1BQUFBLFFBQVEsQ0FBQ1MsVUFBRCxDQUFSO0FBQ0Q7QUFDRixHQWhCbUIsRUFnQmpCLENBQUNOLFVBQUQsQ0FoQmlCLENBQXBCOztBQWtCQSxNQUFNTywwQkFBMEIsbUNBQzNCekIsaUJBRDJCO0FBRTlCMEIsSUFBQUEsVUFBVSxFQUFFeEQ7QUFGa0IsSUFBaEMsQ0FyRFMsQ0EwRFQ7OztBQUNBd0IsRUFBQUEsVUFBVSxHQUFHQSxVQUFVLElBQUksRUFBM0I7QUFDQSxNQUFNaUMsTUFBTSxHQUFHVCxVQUFILGFBQUdBLFVBQUgsdUJBQUdBLFVBQVUsQ0FBRVUsU0FBM0I7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRzVELDRCQUE0QixDQUM1RDBELE1BRDRELEVBQ3BERiwwQkFEb0QsRUFDeEI5QixjQUR3QixFQUNSRyxlQURRLENBQTlELENBN0RTLENBaUVUOztBQUNBLE1BQU1nQyxVQUFVLEdBQUcvQixlQUFILGFBQUdBLGVBQUgsdUJBQUdBLGVBQWUsQ0FBRWdDLGFBQXBDO0FBQ0EsTUFBTUMsS0FBSyxHQUFHakMsZUFBSCxhQUFHQSxlQUFILGdEQUFHQSxlQUFlLENBQUVrQyxRQUFwQiwwREFBRyxzQkFBMkJELEtBQXpDO0FBQ0EsTUFBTUUsSUFBSSxhQUFNbkMsZUFBTixhQUFNQSxlQUFOLGlEQUFNQSxlQUFlLENBQUVrQyxRQUF2QiwyREFBTSx1QkFBMkJFLFVBQWpDLGNBQStDcEMsZUFBL0MsYUFBK0NBLGVBQS9DLGlEQUErQ0EsZUFBZSxDQUFFa0MsUUFBaEUsMkRBQStDLHVCQUEyQkwsU0FBMUUsQ0FBVjtBQUVBdEUsRUFBQUEsS0FBSyxDQUFDOEUsU0FBTixDQUFnQixZQUFNO0FBQUE7O0FBQUU7QUFDdEIsUUFBTXhCLEdBQUcsR0FBRyxDQUFBa0IsVUFBVSxTQUFWLElBQUFBLFVBQVUsV0FBVixnQ0FBQUEsVUFBVSxDQUFFTyxJQUFaLHNFQUFrQnpCLEdBQWxCLEtBQXlCLElBQXJDO0FBQ0FRLElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixlQUFtQkMsSUFBSSxDQUFDQyxTQUFMLENBQWVMLFVBQWYsQ0FBbkIseUJBQTRETixHQUE1RDtBQUNBRyxJQUFBQSxRQUFRLENBQUM7QUFBRUgsTUFBQUEsR0FBRyxFQUFIQTtBQUFGLEtBQUQsQ0FBUixDQUhvQixDQUlwQjtBQUNELEdBTEQsRUFLRyxDQUFDa0IsVUFBRCxDQUxIOztBQU9BLFdBQVNRLFdBQVQsR0FBdUI7QUFBQTs7QUFDckIsUUFBTUMsUUFBUSxHQUFHeEMsZUFBZSxTQUFmLElBQUFBLGVBQWUsV0FBZiw2QkFBQUEsZUFBZSxDQUFFb0IsU0FBakIsd0VBQTRCUyxTQUE1QixHQUF3QzdCLGVBQWUsQ0FBQ29CLFNBQWhCLENBQTBCUyxTQUExQixDQUFvQ1ksV0FBcEMsRUFBeEMsR0FBNEYsRUFBN0c7QUFDQSxxQkFBVXRDLFNBQVYsY0FBdUJxQyxRQUF2QjtBQUNEOztBQUVELE1BQU1FLFFBQVEsR0FBR0gsV0FBVyxFQUE1QixDQWxGUyxDQW9GVDs7QUFwRlMsaUJBMkZMMUUsT0FBTyxDQUFDO0FBQ1ZnRCxJQUFBQSxHQUFHLEVBQUhBLEdBRFU7QUFFVm9CLElBQUFBLEtBQUssRUFBTEEsS0FGVTtBQUdWVSxJQUFBQSxPQUFPLEVBQUVoQyxXQUhDO0FBSVZpQyxJQUFBQSxNQUFNO0FBQ0pDLE1BQUFBLEtBQUssRUFBRTtBQUFFQyxRQUFBQSxNQUFNLEVBQUU7QUFBVjtBQURILE9BRUR2RCxjQUZDLGFBRURBLGNBRkMsdUJBRURBLGNBQWMsQ0FBRXFELE1BRmY7QUFHSkcsTUFBQUEsS0FBSyxFQUFFeEQsY0FBRixhQUFFQSxjQUFGLHVCQUFFQSxjQUFjLENBQUV3RCxLQUhuQjtBQUlKO0FBQ0FDLE1BQUFBLE9BQU8sRUFBRSxnQkFBQXJELFVBQVUsVUFBVixrREFBWXNELGFBQVosc0JBQTZCdEQsVUFBN0IsaURBQTZCLGFBQVlxRCxPQUF6QyxLQUFvRDtBQUx6RCxNQUpJO0FBV1ZFLElBQUFBLE1BQU0sRUFBRXJELFlBWEU7QUFZVmtELElBQUFBLEtBQUssRUFBRXhELGNBQUYsYUFBRUEsY0FBRix1QkFBRUEsY0FBYyxDQUFFd0QsS0FaYjtBQWFWSSxJQUFBQSxNQUFNLEVBQUUvQyxxQkFiRTtBQWNWc0MsSUFBQUEsUUFBUSxFQUFSQSxRQWRVO0FBZVZQLElBQUFBLElBQUksRUFBSkE7QUFmVSxHQUFELENBM0ZGO0FBQUEsTUFzRlBpQixZQXRGTyxZQXNGUEEsWUF0Rk87QUFBQSxNQXVGUEMsS0F2Rk8sWUF1RlBBLEtBdkZPO0FBQUEsTUF3RlBDLFNBeEZPLFlBd0ZQQSxTQXhGTztBQUFBLE1BeUZQQyxPQXpGTyxZQXlGUEEsT0F6Rk87QUFBQSxNQTBGUEMsVUExRk8sWUEwRlBBLFVBMUZPOztBQTZHVCxNQUFJLENBQUM5RCxlQUFMLEVBQXNCO0FBQUU7QUFDdEJvQyxJQUFBQSx5QkFBeUIsQ0FBQzJCLFlBQTFCLEdBQXlDLElBQXpDO0FBQ0QsR0EvR1EsQ0FpSFQ7OztBQUNBLE1BQU1DLHlCQUF5QixHQUFHdEYscUJBQXFCLENBQUM7QUFDdER3RCxJQUFBQSxNQUFNLEVBQU5BLE1BRHNEO0FBRXREM0IsSUFBQUEsaUJBQWlCLEVBQUU2Qix5QkFGbUM7QUFHdEQ2QixJQUFBQSxPQUFPLEVBQUV4QyxVQUFGLGFBQUVBLFVBQUYsdUJBQUVBLFVBQVUsQ0FBRXdDLE9BSGlDO0FBSXREQyxJQUFBQSxLQUFLLEVBQUV6QyxVQUFGLGFBQUVBLFVBQUYsdUJBQUVBLFVBQVUsQ0FBRXlDLEtBSm1DO0FBS3REaEUsSUFBQUEsY0FBYyxFQUFkQSxjQUxzRDtBQU10REcsSUFBQUEsZUFBZSxFQUFmQSxlQU5zRDtBQU90RDhELElBQUFBLGlCQUFpQixFQUFFL0IseUJBQUYsYUFBRUEseUJBQUYsdUJBQUVBLHlCQUF5QixDQUFFTSxVQVBRO0FBUXREMEIsSUFBQUEsWUFBWSxFQUFFaEUscUJBUndDO0FBU3RESCxJQUFBQSxVQUFVLEVBQVZBO0FBVHNELEdBQUQsQ0FBdkQ7QUFZQXBDLEVBQUFBLEtBQUssQ0FBQzhFLFNBQU4sQ0FBZ0IsWUFBTTtBQUFFO0FBQ3RCLFFBQU0wQixRQUFRLEdBQUcsQ0FBQyxDQUFDaEYsbUJBQW5CO0FBQ0EsUUFBSWlGLFFBQVEsR0FBRyxLQUFmOztBQUVBLFFBQUksQ0FBQ3pELFdBQUwsRUFBa0I7QUFBRTtBQUNsQixVQUFJd0QsUUFBSixFQUFjO0FBQUU7QUFDZCxZQUFNeEYsb0JBQW9CLEdBQUdtRix5QkFBSCxhQUFHQSx5QkFBSCx1QkFBR0EseUJBQXlCLENBQUVPLFlBQXhEO0FBQ0EsWUFBTS9FLG9CQUFvQixHQUFHSixtQkFBbUIsSUFBSUMsbUJBQXBEOztBQUVBLFlBQUksQ0FBQ1csZUFBTCxFQUFzQjtBQUNwQnNFLFVBQUFBLFFBQVEsR0FBRyxJQUFYO0FBQ0QsU0FGRCxNQUVPLElBQUkvRSxZQUFZLElBQUtBLFlBQVksS0FBS3dCLGdCQUF0QyxFQUF5RDtBQUM5RCxjQUFNeUQsT0FBTyxHQUFHMUcsZ0JBQWdCLENBQUMyQiw2QkFBakIsQ0FBK0NELG9CQUEvQyxFQUFxRUQsWUFBckUsQ0FBaEI7QUFDQStFLFVBQUFBLFFBQVEsR0FBRzNGLGFBQWEsQ0FBQzZGLE9BQUQsYUFBQ0EsT0FBRCx1QkFBQ0EsT0FBTyxDQUFFOUUsZUFBVixFQUEyQmIsb0JBQTNCLENBQXhCO0FBQ0QsU0FITSxNQUdBO0FBQ0wsY0FBTUQsZUFBZSxHQUFHYix5QkFBeUIsQ0FBQzRCLHNCQUExQixDQUFpREgsb0JBQWpELENBQXhCO0FBQ0E4RSxVQUFBQSxRQUFRLEdBQUczRixhQUFhLENBQUNDLGVBQUQsRUFBa0JDLG9CQUFsQixDQUF4QjtBQUNEO0FBQ0Y7O0FBRUQsVUFBSStCLE9BQU8sS0FBSzBELFFBQWhCLEVBQTBCO0FBQ3hCaEQsUUFBQUEsUUFBUSxDQUFDO0FBQUVWLFVBQUFBLE9BQU8sRUFBRTBEO0FBQVgsU0FBRCxDQUFSO0FBQ0Q7QUFDRjtBQUNGLEdBeEJELEVBd0JHLENBQUNqRixtQkFBRCxFQUFzQndCLFdBQXRCLEVBQW1DdEIsWUFBbkMsRUFBaUR3QixnQkFBakQsRUFBbUVmLGVBQW5FLEVBQW9GZ0UseUJBQXBGLGFBQW9GQSx5QkFBcEYsdUJBQW9GQSx5QkFBeUIsQ0FBRU8sWUFBL0csQ0F4Qkg7QUEwQkE7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7QUFDRSxXQUFTRSxjQUFULENBQXdCQyxRQUF4QixFQUFrQ0MsTUFBbEMsRUFBMEM7QUFDeEMsUUFBTUMsSUFBSSxHQUFHRixRQUFRLEdBQUcsRUFBeEI7QUFDQSxRQUFNRyxNQUFNLEdBQUdELElBQUksQ0FBQzlGLE1BQXBCO0FBQ0EsUUFBTWdHLEtBQUssR0FBR0gsTUFBTSxDQUFDSSxTQUFQLENBQWlCLFVBQUNDLEtBQUQsRUFBUUMsR0FBUixFQUFnQjtBQUM3QyxVQUFJQSxHQUFHLEdBQUcsQ0FBVixFQUFhO0FBQ1gsWUFBSUQsS0FBSyxDQUFDRSxTQUFOLENBQWdCLENBQWhCLEVBQW1CTCxNQUFuQixNQUErQkQsSUFBbkMsRUFBeUM7QUFDdkMsY0FBTU8sUUFBUSxHQUFHSCxLQUFLLENBQUNKLElBQUQsQ0FBdEI7O0FBRUEsY0FBS08sUUFBUSxHQUFHLEdBQVosSUFBcUJBLFFBQVEsR0FBRyxHQUFwQyxFQUEwQztBQUN4QyxtQkFBTyxJQUFQO0FBQ0Q7QUFDRjtBQUNGOztBQUNELGFBQU8sS0FBUDtBQUNELEtBWGEsQ0FBZDtBQVlBLFdBQU9MLEtBQVA7QUFDRDs7QUFFRCxXQUFTTSxrQkFBVCxHQUE4QjtBQUM1QnpELElBQUFBLE9BQU8sQ0FBQ0MsR0FBUjtBQUNBLFFBQUl5RCxvQkFBSjs7QUFFQSxRQUFJckUsYUFBSixFQUFtQjtBQUFFO0FBQ25CcUUsTUFBQUEsb0JBQW9CLEdBQUdDLDRCQUE0QixFQUFuRDtBQUNELEtBRkQsTUFFTyxJQUFJaEcsZ0JBQWdCLElBQUlDLFlBQXhCLEVBQXNDO0FBQzNDLFVBQU1DLG9CQUFvQixHQUFHSixtQkFBbUIsSUFBSUMsbUJBQXBEOztBQUQyQyxtQ0FFS3ZCLGdCQUFnQixDQUFDMkIsNkJBQWpCLENBQStDRCxvQkFBL0MsRUFBcUVELFlBQXJFLENBRkw7QUFBQSxVQUVuQ0csZUFGbUMsMEJBRW5DQSxlQUZtQztBQUFBLFVBRWxCNkYsa0JBRmtCLDBCQUVsQkEsa0JBRmtCLEVBRzNDOzs7QUFDQUYsTUFBQUEsb0JBQW9CLEdBQUdFLGtCQUF2QjtBQUNELEtBTE0sTUFLQTtBQUFFO0FBQ1BGLE1BQUFBLG9CQUFvQixHQUFHakcsbUJBQW1CLElBQUlDLG1CQUE5QztBQUNEOztBQUVELFFBQUlnRyxvQkFBSixFQUEwQjtBQUFBOztBQUN4QixVQUFJRyxPQUFKLENBRHdCLENBRXhCOztBQUNBLFVBQU1DLEdBQUcsR0FBR25GLGVBQUgsYUFBR0EsZUFBSCxnREFBR0EsZUFBZSxDQUFFb0YsWUFBcEIsMERBQUcsc0JBQWdDNUYsZUFBaEMsQ0FBWixDQUh3QixDQUl4Qjs7QUFDQSxVQUFNNkYsWUFBWSxHQUFHdkgsSUFBSSxDQUFDd0gsZUFBTCxDQUFxQnRGLGVBQXJCLGFBQXFCQSxlQUFyQix1QkFBcUJBLGVBQWUsQ0FBRWdDLGFBQXRDLENBQXJCOztBQUVBLFVBQUlxRCxZQUFKLEVBQWtCO0FBQ2hCLFlBQU1FLGFBQWEsR0FBR0YsWUFBSCxhQUFHQSxZQUFILHVCQUFHQSxZQUFZLENBQUVHLEtBQWQsQ0FBb0IsTUFBcEIsQ0FBdEI7QUFDQSxZQUFNQyxZQUFZLEdBQUd0QixjQUFjLENBQUNnQixHQUFELGFBQUNBLEdBQUQsdUJBQUNBLEdBQUcsQ0FBRXhCLE9BQU4sRUFBZTRCLGFBQWYsQ0FBbkM7O0FBRUEsWUFBSUUsWUFBWSxJQUFJLENBQXBCLEVBQXVCO0FBQ3JCLGNBQU1DLGNBQWMsR0FBR0gsYUFBYSxDQUFDRSxZQUFELENBQXBDO0FBQ0EsY0FBTUUsV0FBVyxHQUFHRCxjQUFjLENBQUNGLEtBQWYsQ0FBcUIsTUFBckIsQ0FBcEI7QUFDQSxjQUFNSSxVQUFVLEdBQUd6QixjQUFjLENBQUNnQixHQUFELGFBQUNBLEdBQUQsdUJBQUNBLEdBQUcsQ0FBRXZCLEtBQU4sRUFBYStCLFdBQWIsQ0FBakM7O0FBRUEsY0FBSUMsVUFBVSxJQUFJLENBQWxCLEVBQXFCO0FBQ25CLGdCQUFNQyxZQUFZLEdBQUdwSSx5QkFBeUIsQ0FBQzRCLHNCQUExQixDQUFpRDBGLG9CQUFqRCxDQUFyQjtBQUNBLGdCQUFNZSxRQUFRLEdBQUdILFdBQVcsQ0FBQ0MsVUFBRCxDQUE1QjtBQUNBLGdCQUFNRyxXQUFXLEdBQUcsQ0FBQyxDQUFBWixHQUFHLFNBQUgsSUFBQUEsR0FBRyxXQUFILFlBQUFBLEdBQUcsQ0FBRXZCLEtBQUwsSUFBYSxFQUFkLEVBQWtCcEYsTUFBdEM7QUFDQW1ILFlBQUFBLFdBQVcsQ0FBQ0MsVUFBRCxDQUFYLEdBQTBCRSxRQUFRLENBQUNsQixTQUFULENBQW1CLENBQW5CLEVBQXNCbUIsV0FBVyxHQUFHLENBQXBDLElBQXlDRixZQUFuRTtBQUNBLGdCQUFNRyxVQUFVLEdBQUdMLFdBQVcsQ0FBQ00sSUFBWixDQUFpQixNQUFqQixDQUFuQjtBQUNBVixZQUFBQSxhQUFhLENBQUNFLFlBQUQsQ0FBYixHQUE4Qk8sVUFBOUI7QUFDQWQsWUFBQUEsT0FBTyxHQUFHSyxhQUFhLENBQUNVLElBQWQsQ0FBbUIsTUFBbkIsQ0FBVjtBQUNEO0FBQ0Y7QUFDRjs7QUFFRCxVQUFJLENBQUNmLE9BQUwsRUFBYztBQUNaLFlBQU1nQixXQUFXLEdBQUdDLGNBQWMsQ0FBQzNHLGVBQUQsRUFBa0J1RixvQkFBbEIsQ0FBbEM7QUFDQUcsUUFBQUEsT0FBTyxHQUFHbkgsTUFBTSxDQUFDcUksTUFBUCxDQUFjRixXQUFkLEVBQTJCO0FBQUVHLFVBQUFBLGNBQWMsRUFBRTtBQUFsQixTQUEzQixDQUFWO0FBQ0Q7O0FBQ0RoRixNQUFBQSxPQUFPLENBQUNDLEdBQVIsbURBQXVENEQsT0FBTyxDQUFDTixTQUFSLENBQWtCLENBQWxCLEVBQXFCLEdBQXJCLENBQXZEO0FBQ0E1RCxNQUFBQSxRQUFRLENBQUM7QUFBRUwsUUFBQUEsV0FBVyxFQUFFdUUsT0FBZjtBQUF3QnRFLFFBQUFBLFNBQVMsRUFBRTtBQUFuQyxPQUFELENBQVI7QUFDRDtBQUNGOztBQUVEckQsRUFBQUEsS0FBSyxDQUFDOEUsU0FBTixDQUFnQixZQUFNO0FBQ3BCLFFBQU1pRSxTQUFTO0FBQUEsMEVBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWM7QUFDMUJuRCxnQkFBQUEsTUFEWSxHQUNGL0MscUJBQXFCLEtBQUssUUFBM0IsR0FBdUNBLHFCQUF2QyxHQUErRG1HLFNBRDVEOztBQUFBLG9CQUdYcEQsTUFIVztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLHVCQUlDakQsZUFBZSxFQUpoQjs7QUFBQTtBQUlkaUQsZ0JBQUFBLE1BSmM7O0FBQUE7QUFBQTtBQUFBLHVCQU9WSyxVQUFVLENBQUNMLE1BQUQsQ0FBVixDQUFtQnFELElBQW5CLENBQXdCLFVBQUNDLE9BQUQsRUFBYTtBQUFFO0FBQzNDLHNCQUFJQSxPQUFKLEVBQWE7QUFDWHBGLG9CQUFBQSxPQUFPLENBQUNDLEdBQVI7QUFDQU4sb0JBQUFBLFFBQVEsQ0FBQztBQUNQbEMsc0JBQUFBLG1CQUFtQixFQUFFLElBRGQ7QUFFUDBCLHNCQUFBQSxPQUFPLEVBQUUsS0FGRjtBQUdQdkIsc0JBQUFBLFlBQVksRUFBRSxJQUhQO0FBSVBzQixzQkFBQUEsV0FBVyxFQUFFLElBSk47QUFLUEssc0JBQUFBLFNBQVMsRUFBRSxLQUxKO0FBTVA1QixzQkFBQUEsZ0JBQWdCLEVBQUUsS0FOWDtBQU9QeUIsc0JBQUFBLGdCQUFnQixFQUFFO0FBUFgscUJBQUQsQ0FBUjtBQVNBWSxvQkFBQUEsT0FBTyxDQUFDcUYsSUFBUixDQUFhLDJDQUFiO0FBQ0ExRyxvQkFBQUEsZUFBZSxTQUFmLElBQUFBLGVBQWUsV0FBZixZQUFBQSxlQUFlLENBQUUyRyxjQUFqQjtBQUNELG1CQWJELE1BYU87QUFDTHRGLG9CQUFBQSxPQUFPLENBQUNnQyxLQUFSLENBQWMsd0RBQWQ7QUFDQXJDLG9CQUFBQSxRQUFRLENBQUM7QUFBRUosc0JBQUFBLFNBQVMsRUFBRTtBQUFiLHFCQUFELENBQVI7QUFDRDtBQUNGLGlCQWxCSyxDQVBVOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE9BQUg7O0FBQUEsc0JBQVQwRixTQUFTO0FBQUE7QUFBQTtBQUFBLE9BQWY7O0FBNEJBLFFBQUkxRixTQUFKLEVBQWU7QUFDYlMsTUFBQUEsT0FBTyxDQUFDQyxHQUFSOztBQUNBZ0YsTUFBQUEsU0FBUztBQUNWO0FBQ0YsR0FqQ0QsRUFpQ0csQ0FBQzFGLFNBQUQsQ0FqQ0g7O0FBbUNBLFdBQVN1RixjQUFULENBQXdCM0IsS0FBeEIsRUFBc0U7QUFBQTs7QUFBQSxRQUF2Q29DLGVBQXVDLHVFQUFyQjdILG1CQUFxQjtBQUNwRTtBQUNBLFFBQU1vRyxHQUFHLEdBQUduRixlQUFILGFBQUdBLGVBQUgsaURBQUdBLGVBQWUsQ0FBRW9GLFlBQXBCLDJEQUFHLHVCQUFnQ1osS0FBaEMsQ0FBWjtBQUNBLFFBQUlxQyxtQkFBbUIsR0FBRyxJQUExQjs7QUFFQSxRQUFJMUIsR0FBSixFQUFTO0FBQ1AsVUFBSWxHLFlBQUosRUFBa0I7QUFBQSxxQ0FDZXpCLGdCQUFnQixDQUFDMkIsNkJBQWpCLENBQStDeUgsZUFBL0MsRUFBZ0UzSCxZQUFoRSxDQURmO0FBQUEsWUFDUmdHLGtCQURRLDBCQUNSQSxrQkFEUTs7QUFFaEI0QixRQUFBQSxtQkFBbUIsR0FBRzVCLGtCQUF0QjtBQUNELE9BSEQsTUFHTztBQUNMNEIsUUFBQUEsbUJBQW1CLEdBQUdELGVBQXRCO0FBQ0QsT0FOTSxDQVFQOzs7QUFDQSxhQUFPQyxtQkFBbUIsS0FBSTdHLGVBQUosYUFBSUEsZUFBSix1QkFBSUEsZUFBZSxDQUFFOEcsV0FBakIsQ0FBNkIzQixHQUFHLENBQUN4QixPQUFqQyxFQUEwQ3dCLEdBQUcsQ0FBQ3ZCLEtBQTlDLEVBQXFEO0FBQUVLLFFBQUFBLFlBQVksRUFBRTRDO0FBQWhCLE9BQXJELENBQUosQ0FBMUI7QUFDRDs7QUFDRCxXQUFPLElBQVA7QUFDRDs7QUF2UlEsV0F5Uk1FLG9CQXpSTjtBQUFBO0FBQUE7O0FBQUE7QUFBQSxvRkF5UlQ7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUNNckgsZUFETjtBQUFBO0FBQUE7QUFBQTs7QUFFUXNILGNBQUFBLFlBRlIsR0FFdUIsSUFGdkI7QUFBQTtBQUFBLHFCQUdVOUcsZUFBZSxFQUh6Qjs7QUFBQTtBQUtJLGtCQUFJLENBQUNLLFdBQUwsRUFBa0I7QUFBRTtBQUNsQmMsZ0JBQUFBLE9BQU8sQ0FBQ0MsR0FBUjtBQUNNaEQsZ0JBQUFBLGVBRlUsR0FFUU8sbUJBQW1CLENBQUNDLG1CQUFELEVBQXNCQyxtQkFBdEIsRUFBMkNDLGdCQUEzQyxFQUE2REMsWUFBN0QsQ0FGM0I7QUFHVlYsZ0JBQUFBLG9CQUhVLEdBR2FtRix5QkFIYixhQUdhQSx5QkFIYix1QkFHYUEseUJBQXlCLENBQUVPLFlBSHhDO0FBSVpnRCxnQkFBQUEsaUJBSlksR0FJUSxJQUpSOztBQU1oQixvQkFBSTFJLG9CQUFKLEVBQTBCO0FBQ3hCMEksa0JBQUFBLGlCQUFpQixHQUFHeEoseUJBQXlCLENBQUM0QixzQkFBMUIsQ0FBaURkLG9CQUFqRCxDQUFwQjtBQUNEOztBQVJlLHdDQWFaZixnQkFBZ0IsQ0FBQzBKLDBCQUFqQixDQUE0QzVJLGVBQTVDLEVBQTZEMkksaUJBQTdELENBYlksRUFXRHRJLFFBWEMseUJBV2R3SSxXQVhjLEVBWUd6SSxVQVpILHlCQVlkMEksZUFaYztBQWNoQkosZ0JBQUFBLFlBQVksR0FBRztBQUFFckksa0JBQUFBLFFBQVEsRUFBUkEsUUFBRjtBQUFZRCxrQkFBQUEsVUFBVSxFQUFWQTtBQUFaLGlCQUFmO0FBQ0QsZUFmRCxNQWVPO0FBQUU7QUFDUDJDLGdCQUFBQSxPQUFPLENBQUNDLEdBQVI7QUFDQTBGLGdCQUFBQSxZQUFZLEdBQUd6RyxXQUFmO0FBQ0Q7O0FBQ0RTLGNBQUFBLFFBQVEsQ0FBQztBQUFFVCxnQkFBQUEsV0FBVyxFQUFFeUc7QUFBZixlQUFELENBQVI7QUFDQTNGLGNBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZMEYsWUFBWjs7QUF6Qko7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0F6UlM7QUFBQTtBQUFBOztBQXNUVCxXQUFTaEMsNEJBQVQsR0FBd0M7QUFDdEMsUUFBTTlGLG9CQUFvQixHQUFHSixtQkFBbUIsSUFBSUMsbUJBQXBEO0FBQ0EsUUFBTUssZUFBZSxHQUFHSCxZQUFZLElBQUl4Qix5QkFBeUIsQ0FBQzRCLHNCQUExQixDQUFpREgsb0JBQWpELENBQXhDO0FBQ0EsUUFBTW1JLFNBQVMsR0FBRzdKLGdCQUFnQixDQUFDOEosd0JBQWpCLENBQTBDNUcsYUFBYSxDQUFDeUcsV0FBeEQsRUFBcUV6RyxhQUFhLENBQUMwRyxlQUFuRixFQUFvR2hJLGVBQXBHLENBQWxCO0FBQ0EsUUFBTW1JLG1CQUFtQixHQUFHN0osV0FBVyxDQUFDOEosZUFBWixDQUE0QkgsU0FBNUIsQ0FBNUI7QUFDQSxXQUFPRSxtQkFBUDtBQUNEOztBQUVELFdBQVNFLGFBQVQsR0FBeUI7QUFDdkJwRyxJQUFBQSxPQUFPLENBQUNDLEdBQVI7O0FBRUEsUUFBSVosYUFBSixFQUFtQjtBQUNqQixVQUFNNkcsbUJBQW1CLEdBQUd2Qyw0QkFBNEIsRUFBeEQ7QUFFQWhFLE1BQUFBLFFBQVEsQ0FBQztBQUNQVCxRQUFBQSxXQUFXLEVBQUUsSUFETjtBQUVQQyxRQUFBQSxPQUFPLEVBQUUsS0FGRjtBQUdQRSxRQUFBQSxhQUFhLEVBQUUsSUFIUjtBQUlQNUIsUUFBQUEsbUJBQW1CLEVBQUV5STtBQUpkLE9BQUQsQ0FBUjtBQU1ELEtBVEQsTUFTTztBQUNMdkcsTUFBQUEsUUFBUSxDQUFDO0FBQ1BULFFBQUFBLFdBQVcsRUFBRSxJQUROO0FBRVBDLFFBQUFBLE9BQU8sRUFBRTtBQUZGLE9BQUQsQ0FBUjtBQUlEO0FBQ0Y7O0FBRUQsV0FBU2tILGVBQVQsR0FBMkI7QUFDekJyRyxJQUFBQSxPQUFPLENBQUNDLEdBQVI7QUFDQSxRQUFNaEQsZUFBZSxHQUFHTyxtQkFBbUIsQ0FBQ0MsbUJBQUQsRUFBc0JDLG1CQUF0QixFQUEyQ0MsZ0JBQTNDLEVBQTZEQyxZQUE3RCxDQUEzQztBQUNBLFFBQU1xQixPQUFPLEdBQUdqQyxhQUFhLENBQUNDLGVBQUQsRUFBa0JvRix5QkFBbEIsYUFBa0JBLHlCQUFsQix1QkFBa0JBLHlCQUF5QixDQUFFTyxZQUE3QyxDQUE3QjtBQUNBakQsSUFBQUEsUUFBUSxDQUFDO0FBQUVULE1BQUFBLFdBQVcsRUFBRSxJQUFmO0FBQXFCRCxNQUFBQSxPQUFPLEVBQVBBO0FBQXJCLEtBQUQsQ0FBUjtBQUNEOztBQXZWUSxXQXlWTXFILFVBelZOO0FBQUE7QUFBQTs7QUFBQTtBQUFBLDBFQXlWVCxrQkFBMEJDLFFBQTFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFDTW5JLFVBRE47QUFBQTtBQUFBO0FBQUE7O0FBQUEsb0JBRVFtSSxRQUFRLElBQUksQ0FBQ3BILE9BRnJCO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEscUJBR1lOLGVBQWUsRUFIM0I7O0FBQUE7QUFNSSxrQkFBSTBILFFBQVEsS0FBS3BILE9BQWpCLEVBQTBCO0FBQ3hCUSxnQkFBQUEsUUFBUSxDQUFDO0FBQUVSLGtCQUFBQSxPQUFPLEVBQUVvSDtBQUFYLGlCQUFELENBQVI7QUFDRDs7QUFSTDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQXpWUztBQUFBO0FBQUE7O0FBcVdULFdBQVNDLGVBQVQsQ0FBeUJDLE9BQXpCLEVBQWtDN0ksWUFBbEMsRUFBZ0R3QixnQkFBaEQsRUFBa0U7QUFBQSxpQ0FDcENqRCxnQkFBZ0IsQ0FBQzJCLDZCQUFqQixDQUErQ0osbUJBQS9DLEVBQW9FRSxZQUFwRSxDQURvQztBQUFBLFFBQ3hERyxlQUR3RCwwQkFDeERBLGVBRHdEOztBQUVoRSxRQUFNa0IsT0FBTyxHQUFHakMsYUFBYSxDQUFDZSxlQUFELEVBQWtCc0UseUJBQWxCLGFBQWtCQSx5QkFBbEIsdUJBQWtCQSx5QkFBeUIsQ0FBRU8sWUFBN0MsQ0FBN0I7QUFFQWpELElBQUFBLFFBQVEsQ0FBQztBQUNQaEMsTUFBQUEsZ0JBQWdCLEVBQUU4SSxPQURYO0FBRVBySCxNQUFBQSxnQkFBZ0IsRUFBaEJBLGdCQUZPO0FBR1B4QixNQUFBQSxZQUFZLEVBQVpBLFlBSE87QUFJUHFCLE1BQUFBLE9BQU8sRUFBUEE7QUFKTyxLQUFELENBQVI7QUFNRDs7QUFFRCxNQUFNeUgsbUJBQW1CLEdBQUd4SyxLQUFLLENBQUN5SyxPQUFOLENBQWUsWUFBTTtBQUFFO0FBQ2pELFFBQUlqSixtQkFBSixFQUF5QjtBQUN2QixVQUFNVCxlQUFlLEdBQUdPLG1CQUFtQixDQUFDQyxtQkFBRCxFQUFzQkMsbUJBQXRCLEVBQTJDQyxnQkFBM0MsRUFBNkRDLFlBQTdELENBQTNDO0FBQ0EsVUFBTUMsb0JBQW9CLEdBQUd4QixXQUFXLENBQUM4SixlQUFaLENBQTRCbEosZUFBNUIsQ0FBN0I7QUFDQSxhQUFPWSxvQkFBUDtBQUNEOztBQUNELFdBQU9ILG1CQUFQO0FBQ0QsR0FQMkIsRUFPekIsQ0FBQ0QsbUJBQUQsRUFBc0JDLG1CQUF0QixFQUEyQ0MsZ0JBQTNDLEVBQTZEQyxZQUE3RCxDQVB5QixDQUE1QjtBQVNBLE1BQU1nSixjQUFzQixHQUFHMUssS0FBSyxDQUFDeUssT0FBTixDQUFlLFlBQU07QUFBRTtBQUNwRCxRQUFNRixPQUFPLEdBQUc5SSxnQkFBZ0IsSUFBS0YsbUJBQW1CLElBQUksQ0FBQ25CLE9BQU8sQ0FBQ29CLG1CQUFELEVBQXNCRCxtQkFBdEIsQ0FBcEU7QUFDQSxXQUFPZ0osT0FBUDtBQUNELEdBSDhCLEVBRzVCLENBQUNoSixtQkFBRCxFQUFzQkMsbUJBQXRCLEVBQTJDQyxnQkFBM0MsQ0FINEIsQ0FBL0I7O0FBS0EsV0FBU2tKLGtCQUFULENBQTRCaEUsT0FBNUIsRUFBcUM7QUFDbkM3QyxJQUFBQSxPQUFPLENBQUNDLEdBQVIsc0RBQWlFNEMsT0FBakUsRUFEbUMsQ0FDdUM7O0FBRHZDLFFBRTNCaUQsV0FGMkIsR0FFTWpELE9BRk4sQ0FFM0JpRCxXQUYyQjtBQUFBLFFBRWRDLGVBRmMsR0FFTWxELE9BRk4sQ0FFZGtELGVBRmM7QUFHbkMsUUFBTWUsaUJBQWlCLEdBQUczSyxnQkFBZ0IsQ0FBQ29CLG9CQUFqQixDQUFzQ3VJLFdBQXRDLEVBQW1EQyxlQUFuRCxDQUExQjtBQUNBL0YsSUFBQUEsT0FBTyxDQUFDQyxHQUFSLDBCQUE4QjZHLGlCQUFpQixHQUFHLFdBQUgsR0FBaUIsWUFBaEU7QUFDQW5ILElBQUFBLFFBQVEsQ0FBQztBQUFFTixNQUFBQSxhQUFhLEVBQUV3RCxPQUFqQjtBQUEwQjVELE1BQUFBLE9BQU8sRUFBRTZIO0FBQW5DLEtBQUQsQ0FBUjtBQUNEOztBQUVELFNBQU87QUFDTEMsSUFBQUEsT0FBTyxFQUFFO0FBQ1BWLE1BQUFBLGVBQWUsRUFBZkEsZUFETztBQUVQSyxNQUFBQSxtQkFBbUIsRUFBbkJBLG1CQUZPO0FBR1BoQixNQUFBQSxvQkFBb0IsRUFBcEJBLG9CQUhPO0FBSVBtQixNQUFBQSxrQkFBa0IsRUFBbEJBLGtCQUpPO0FBS1BULE1BQUFBLGFBQWEsRUFBYkEsYUFMTztBQU1QRSxNQUFBQSxVQUFVLEVBQVZBLFVBTk87QUFPUEUsTUFBQUEsZUFBZSxFQUFmQSxlQVBPO0FBUVAvQyxNQUFBQSxrQkFBa0IsRUFBbEJBO0FBUk8sS0FESjtBQVdMaEUsSUFBQUEsS0FBSyxFQUFFO0FBQ0xSLE1BQUFBLE9BQU8sRUFBUEEsT0FESztBQUVMQyxNQUFBQSxXQUFXLEVBQVhBLFdBRks7QUFHTEMsTUFBQUEsT0FBTyxFQUFQQSxPQUhLO0FBSUx4QixNQUFBQSxnQkFBZ0IsRUFBaEJBLGdCQUpLO0FBS0xpSixNQUFBQSxjQUFjLEVBQWRBO0FBTEs7QUFYRixHQUFQO0FBbUJEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWlnbm9yZVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQge1xuICBBbGlnbm1lbnRIZWxwZXJzLFxuICBVc2ZtRmlsZUNvbnZlcnNpb25IZWxwZXJzLFxuICB1c2ZtSGVscGVycyxcbn0gZnJvbSAnd29yZC1hbGlnbmVyLXJjbCdcbmltcG9ydCAqIGFzIGlzRXF1YWwgZnJvbSAnZGVlcC1lcXVhbCdcbmltcG9ydCB1c2VEZWVwQ29tcGFyZUVmZmVjdCBmcm9tICd1c2UtZGVlcC1jb21wYXJlLWVmZmVjdCdcbmltcG9ydCB7IHVzZUVkaXQgfSBmcm9tICdnaXRlYS1yZWFjdC10b29sa2l0J1xuaW1wb3J0IHsgY29yZSB9IGZyb20gJ3NjcmlwdHVyZS1yZXNvdXJjZXMtcmNsJ1xuaW1wb3J0IHVzZm1qcyBmcm9tICd1c2ZtLWpzJ1xuaW1wb3J0IHsgU2NyaXB0dXJlQ29uZmlnLCBTZXJ2ZXJDb25maWcgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IGdldFNjcmlwdHVyZVJlc291cmNlU2V0dGluZ3MgfSBmcm9tICcuLi91dGlscy9TY3JpcHR1cmVTZXR0aW5ncydcbmltcG9ydCB7IE9SSUdJTkFMX1NPVVJDRSB9IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IHVzZVNjcmlwdHVyZVJlc291cmNlcyBmcm9tICcuL3VzZVNjcmlwdHVyZVJlc291cmNlcydcblxuaW50ZXJmYWNlIFN0YXJ0RWRpdCB7XG4gICgpOiBQcm9taXNlPHN0cmluZz47XG59XG5cbmludGVyZmFjZSBQcm9wcyB7XG4gIGF1dGhlbnRpY2F0aW9uOiB7IGNvbmZpZzogb2JqZWN0LCB0b2tlbjogc3RyaW5nIH0sXG4gIGN1cnJlbnRWZXJzZU51bTogbnVtYmVyLFxuICBlbmFibGVFZGl0OiBib29sZWFuLFxuICBlbmFibGVBbGlnbm1lbnQ6IGJvb2xlYW4sXG4gIGh0dHBDb25maWc6IFNlcnZlckNvbmZpZyxcbiAgaW5pdGlhbFZlcnNlT2JqZWN0czogW10sXG4gIGlzTmV3VGVzdGFtZW50OiBib29sZWFuLFxuICBsb2dnZWRJblVzZXI6IHN0cmluZyxcbiAgb3JpZ2luYWxMYW5ndWFnZU93bmVyOiBzdHJpbmcsXG4gIG9yaWdpbmFsUmVwb1VybDogc3RyaW5nLFxuICBzY3JpcHR1cmVDb25maWc6IFNjcmlwdHVyZUNvbmZpZyxcbiAgc2NyaXB0dXJlU2V0dGluZ3M6IHsgfSxcbiAgc2V0U2F2ZWRDaGFuZ2VzOiBGdW5jdGlvbixcbiAgc3RhcnRFZGl0QnJhbmNoOiBTdGFydEVkaXQsXG4gIGJvb2tJbmRleDogc3RyaW5nLFxuICB3b3JraW5nUmVzb3VyY2VCcmFuY2g6IHN0cmluZyxcbn1cblxuZnVuY3Rpb24gaXNVc2ZtQWxpZ25lZCh0YXJnZXRWZXJzZVVTRk0sIG9yaWdpbmFsVmVyc2VPYmplY3RzKSB7XG4gIG9yaWdpbmFsVmVyc2VPYmplY3RzID0gb3JpZ2luYWxWZXJzZU9iamVjdHM/Lmxlbmd0aCA/IG9yaWdpbmFsVmVyc2VPYmplY3RzIDogbnVsbCAvLyBtYWtlIHN1cmUgbm90IHBhc3NpbmcgZW1wdHkgQXJyYXlcbiAgY29uc3QgeyBhbGlnbm1lbnRzLCB3b3JkQmFuayB9ID0gQWxpZ25tZW50SGVscGVycy5leHRyYWN0QWxpZ25tZW50c0Zyb21UYXJnZXRWZXJzZSh0YXJnZXRWZXJzZVVTRk0sIG9yaWdpbmFsVmVyc2VPYmplY3RzKVxuICByZXR1cm4gQWxpZ25tZW50SGVscGVycy5hcmVBbGdubWVudHNDb21wbGV0ZSh3b3JkQmFuaywgYWxpZ25tZW50cylcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudFZlcnNlVXNmbSh1cGRhdGVkVmVyc2VPYmplY3RzLCBpbml0aWFsVmVyc2VPYmplY3RzLCB2ZXJzZVRleHRDaGFuZ2VkOiBib29sZWFuLCBuZXdWZXJzZVRleHQpIHtcbiAgbGV0IHRhcmdldFZlcnNlVVNGTSA9IG51bGxcbiAgY29uc3QgY3VycmVudFZlcnNlT2JqZWN0c18gPSB1cGRhdGVkVmVyc2VPYmplY3RzIHx8IGluaXRpYWxWZXJzZU9iamVjdHNcblxuICBpZiAodmVyc2VUZXh0Q2hhbmdlZCAmJiBuZXdWZXJzZVRleHQpIHtcbiAgICBjb25zdCB7IHRhcmdldFZlcnNlVGV4dCB9ID0gQWxpZ25tZW50SGVscGVycy51cGRhdGVBbGlnbm1lbnRzVG9UYXJnZXRWZXJzZShjdXJyZW50VmVyc2VPYmplY3RzXywgbmV3VmVyc2VUZXh0KVxuICAgIHRhcmdldFZlcnNlVVNGTSA9IHRhcmdldFZlcnNlVGV4dFxuICB9IGVsc2Uge1xuICAgIHRhcmdldFZlcnNlVVNGTSA9IFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMuY29udmVydFZlcnNlRGF0YVRvVVNGTShjdXJyZW50VmVyc2VPYmplY3RzXylcbiAgfVxuICByZXR1cm4gdGFyZ2V0VmVyc2VVU0ZNXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VTY3JpcHR1cmVBbGlnbm1lbnRFZGl0KHtcbiAgYXV0aGVudGljYXRpb24sXG4gIGN1cnJlbnRWZXJzZU51bSxcbiAgZW5hYmxlRWRpdCxcbiAgZW5hYmxlQWxpZ25tZW50LFxuICBodHRwQ29uZmlnLFxuICBpbml0aWFsVmVyc2VPYmplY3RzLFxuICBpc05ld1Rlc3RhbWVudCxcbiAgbG9nZ2VkSW5Vc2VyLFxuICBvcmlnaW5hbExhbmd1YWdlT3duZXIsXG4gIG9yaWdpbmFsUmVwb1VybCxcbiAgc2NyaXB0dXJlQ29uZmlnLFxuICBzY3JpcHR1cmVTZXR0aW5ncyxcbiAgc3RhcnRFZGl0QnJhbmNoLFxuICBib29rSW5kZXgsXG4gIHdvcmtpbmdSZXNvdXJjZUJyYW5jaCxcbn0gOiBQcm9wcykge1xuICBjb25zdCBbc3RhdGUsIHNldFN0YXRlX10gPSBSZWFjdC51c2VTdGF0ZSh7XG4gICAgYWxpZ25lZDogZmFsc2UsXG4gICAgYWxpZ25lckRhdGE6IG51bGwsXG4gICAgZWRpdGluZzogZmFsc2UsXG4gICAgaW5pdGlhbFZlcnNlVGV4dDogbnVsbCxcbiAgICBuZXdBbGlnbm1lbnRzOiBudWxsLFxuICAgIG5ld1ZlcnNlVGV4dDogbnVsbCxcbiAgICB1cGRhdGVkVmVyc2VPYmplY3RzOiBudWxsLFxuICAgIHZlcnNlVGV4dENoYW5nZWQ6IGZhbHNlLFxuICAgIHNhdmVDb250ZW50OiBudWxsLFxuICAgIHN0YXJ0U2F2ZTogZmFsc2UsXG4gICAgc2hhOiBudWxsLFxuICB9KVxuXG4gIGNvbnN0IHtcbiAgICBhbGlnbmVkLFxuICAgIGFsaWduZXJEYXRhLFxuICAgIGVkaXRpbmcsXG4gICAgaW5pdGlhbFZlcnNlVGV4dCxcbiAgICBuZXdBbGlnbm1lbnRzLFxuICAgIG5ld1ZlcnNlVGV4dCxcbiAgICB1cGRhdGVkVmVyc2VPYmplY3RzLFxuICAgIHZlcnNlVGV4dENoYW5nZWQsXG4gICAgc2F2ZUNvbnRlbnQsXG4gICAgc3RhcnRTYXZlLFxuICAgIHNoYSxcbiAgfSA9IHN0YXRlXG5cbiAgZnVuY3Rpb24gc2V0U3RhdGUobmV3U3RhdGUpIHtcbiAgICBzZXRTdGF0ZV8ocHJldlN0YXRlID0+ICh7IC4uLnByZXZTdGF0ZSwgLi4ubmV3U3RhdGUgfSkpXG4gIH1cblxuICBjb25zdCByZWZlcmVuY2VfID0gc2NyaXB0dXJlQ29uZmlnPy5yZWZlcmVuY2UgfHwgbnVsbFxuXG4gIHVzZURlZXBDb21wYXJlRWZmZWN0KCgpID0+IHsgLy8gY2hlY2sgZm9yIGNvbnRleHQgY2hhbmdlcywgcmVzZXQgZWRpdCBhbmQgYWxpZ25tZW50IHN0YXRlXG4gICAgY29uc29sZS5sb2coYHJlZmVyZW5jZSBjaGFuZ2VkICR7SlNPTi5zdHJpbmdpZnkocmVmZXJlbmNlXyl9YClcbiAgICBjb25zdCBjbGVhclN0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBhbGlnbmVyRGF0YTogbnVsbCxcbiAgICAgIGVkaXRpbmc6IGZhbHNlLFxuICAgICAgbmV3QWxpZ25tZW50czogbnVsbCxcbiAgICAgIG5ld1ZlcnNlVGV4dDogbnVsbCxcbiAgICAgIHVwZGF0ZWRWZXJzZU9iamVjdHM6IG51bGwsXG4gICAgICB2ZXJzZVRleHRDaGFuZ2VkOiBmYWxzZSxcbiAgICB9XG5cbiAgICBpZiAoIWlzRXF1YWwoc3RhdGUsIGNsZWFyU3RhdGUpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgcmVmZXJlbmNlIGNoYW5nZWQsIHJlc2V0IGVkaXQvYWxpZ25tZW50IHN0YXRlIHZhcmlhYmxlc2ApXG4gICAgICBzZXRTdGF0ZShjbGVhclN0YXRlKVxuICAgIH1cbiAgfSwgW3JlZmVyZW5jZV9dKVxuXG4gIGNvbnN0IG9yaWdpbmFsU2NyaXB0dXJlU2V0dGluZ3NfID0ge1xuICAgIC4uLnNjcmlwdHVyZVNldHRpbmdzLFxuICAgIHJlc291cmNlSWQ6IE9SSUdJTkFMX1NPVVJDRSxcbiAgfVxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgaHR0cENvbmZpZyA9IGh0dHBDb25maWcgfHwge31cbiAgY29uc3QgYm9va0lkID0gcmVmZXJlbmNlXz8ucHJvamVjdElkXG4gIGNvbnN0IG9yaWdpbmFsU2NyaXB0dXJlU2V0dGluZ3MgPSBnZXRTY3JpcHR1cmVSZXNvdXJjZVNldHRpbmdzKFxuICAgIGJvb2tJZCwgb3JpZ2luYWxTY3JpcHR1cmVTZXR0aW5nc18sIGlzTmV3VGVzdGFtZW50LCBvcmlnaW5hbFJlcG9VcmwsXG4gIClcblxuICAvLyBAdHMtaWdub3JlXG4gIGNvbnN0IGZldGNoUmVzcF8gPSBzY3JpcHR1cmVDb25maWc/LmZldGNoUmVzcG9uc2VcbiAgY29uc3Qgb3duZXIgPSBzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5vd25lclxuICBjb25zdCByZXBvID0gYCR7c2NyaXB0dXJlQ29uZmlnPy5yZXNvdXJjZT8ubGFuZ3VhZ2VJZH1fJHtzY3JpcHR1cmVDb25maWc/LnJlc291cmNlPy5wcm9qZWN0SWR9YFxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7IC8vIGdldCB0aGUgc2hhIGZyb20gbGFzdCBzY3JpcHR1cmUgZG93bmxvYWRcbiAgICBjb25zdCBzaGEgPSBmZXRjaFJlc3BfPy5kYXRhPy5zaGEgfHwgbnVsbFxuICAgIGNvbnNvbGUubG9nKGBmb3IgJHtKU09OLnN0cmluZ2lmeShyZWZlcmVuY2VfKX0gbmV3IHNoYSBpcyAke3NoYX1gKVxuICAgIHNldFN0YXRlKHsgc2hhIH0pXG4gICAgLy8gQHRzLWlnbm9yZVxuICB9LCBbZmV0Y2hSZXNwX10pXG5cbiAgZnVuY3Rpb24gZ2V0Qm9va05hbWUoKSB7XG4gICAgY29uc3QgYm9va0NhcHMgPSBzY3JpcHR1cmVDb25maWc/LnJlZmVyZW5jZT8ucHJvamVjdElkID8gc2NyaXB0dXJlQ29uZmlnLnJlZmVyZW5jZS5wcm9qZWN0SWQudG9VcHBlckNhc2UoKSA6ICcnXG4gICAgcmV0dXJuIGAke2Jvb2tJbmRleH0tJHtib29rQ2Fwc30udXNmbWBcbiAgfVxuXG4gIGNvbnN0IGZpbGVwYXRoID0gZ2V0Qm9va05hbWUoKVxuXG4gIC8vIFRPRE86ICBlbmFibGUgc2F2ZVxuICBjb25zdCB7XG4gICAgZWRpdFJlc3BvbnNlLFxuICAgIGVycm9yLFxuICAgIGlzRWRpdGluZyxcbiAgICBpc0Vycm9yLFxuICAgIG9uU2F2ZUVkaXQsXG4gIH0gPSB1c2VFZGl0KHtcbiAgICBzaGEsXG4gICAgb3duZXIsXG4gICAgY29udGVudDogc2F2ZUNvbnRlbnQsXG4gICAgY29uZmlnOiB7XG4gICAgICBjYWNoZTogeyBtYXhBZ2U6IDAgfSxcbiAgICAgIC4uLmF1dGhlbnRpY2F0aW9uPy5jb25maWcsXG4gICAgICB0b2tlbjogYXV0aGVudGljYXRpb24/LnRva2VuLFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGltZW91dDogaHR0cENvbmZpZz8uc2VydmVyVGltZU91dCB8fCBodHRwQ29uZmlnPy50aW1lb3V0IHx8IDUwMDAsXG4gICAgfSxcbiAgICBhdXRob3I6IGxvZ2dlZEluVXNlcixcbiAgICB0b2tlbjogYXV0aGVudGljYXRpb24/LnRva2VuLFxuICAgIGJyYW5jaDogd29ya2luZ1Jlc291cmNlQnJhbmNoLFxuICAgIGZpbGVwYXRoLFxuICAgIHJlcG8sXG4gIH0pXG5cbiAgaWYgKCFlbmFibGVBbGlnbm1lbnQpIHsgLy8gaWYgbm90IGVuYWJsZWQsIHRoZW4gd2UgZG9uJ3QgZmV0Y2ggcmVzb3VyY2VcbiAgICBvcmlnaW5hbFNjcmlwdHVyZVNldHRpbmdzLnJlc291cmNlTGluayA9IG51bGxcbiAgfVxuXG4gIC8vIGdldCBvcmlnaW5hbCBsYW5ndWFnZSBmb3IgYWxpZ25tZW50XG4gIGNvbnN0IG9yaWdpbmFsU2NyaXB0dXJlUmVzb3VyY2UgPSB1c2VTY3JpcHR1cmVSZXNvdXJjZXMoe1xuICAgIGJvb2tJZCxcbiAgICBzY3JpcHR1cmVTZXR0aW5nczogb3JpZ2luYWxTY3JpcHR1cmVTZXR0aW5ncyxcbiAgICBjaGFwdGVyOiByZWZlcmVuY2VfPy5jaGFwdGVyLFxuICAgIHZlcnNlOiByZWZlcmVuY2VfPy52ZXJzZSxcbiAgICBpc05ld1Rlc3RhbWVudCxcbiAgICBvcmlnaW5hbFJlcG9VcmwsXG4gICAgY3VycmVudExhbmd1YWdlSWQ6IG9yaWdpbmFsU2NyaXB0dXJlU2V0dGluZ3M/Lmxhbmd1YWdlSWQsXG4gICAgY3VycmVudE93bmVyOiBvcmlnaW5hbExhbmd1YWdlT3duZXIsXG4gICAgaHR0cENvbmZpZyxcbiAgfSlcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4geyAvLyB1cGRhdGUgYWxpZ25tZW50IHN0YXR1cyB3aGVuIGFsaWduZXIgaXMgaGlkZGVuXG4gICAgY29uc3Qgbm90RW1wdHkgPSAhIWluaXRpYWxWZXJzZU9iamVjdHNcbiAgICBsZXQgYWxpZ25lZF8gPSBmYWxzZVxuXG4gICAgaWYgKCFhbGlnbmVyRGF0YSkgeyAvLyBza2lwIGlmIGFsaWduZXIgaXMgYmVpbmcgc2hvd25cbiAgICAgIGlmIChub3RFbXB0eSkgeyAvLyBza2lwIGlmIGVtcHR5XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVmVyc2VPYmplY3RzID0gb3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZT8udmVyc2VPYmplY3RzXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWZXJzZU9iamVjdHNfID0gdXBkYXRlZFZlcnNlT2JqZWN0cyB8fCBpbml0aWFsVmVyc2VPYmplY3RzXG5cbiAgICAgICAgaWYgKCFlbmFibGVBbGlnbm1lbnQpIHtcbiAgICAgICAgICBhbGlnbmVkXyA9IHRydWVcbiAgICAgICAgfSBlbHNlIGlmIChuZXdWZXJzZVRleHQgJiYgKG5ld1ZlcnNlVGV4dCAhPT0gaW5pdGlhbFZlcnNlVGV4dCkpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHRzID0gQWxpZ25tZW50SGVscGVycy51cGRhdGVBbGlnbm1lbnRzVG9UYXJnZXRWZXJzZShjdXJyZW50VmVyc2VPYmplY3RzXywgbmV3VmVyc2VUZXh0KVxuICAgICAgICAgIGFsaWduZWRfID0gaXNVc2ZtQWxpZ25lZChyZXN1bHRzPy50YXJnZXRWZXJzZVRleHQsIG9yaWdpbmFsVmVyc2VPYmplY3RzKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHRhcmdldFZlcnNlVVNGTSA9IFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMuY29udmVydFZlcnNlRGF0YVRvVVNGTShjdXJyZW50VmVyc2VPYmplY3RzXylcbiAgICAgICAgICBhbGlnbmVkXyA9IGlzVXNmbUFsaWduZWQodGFyZ2V0VmVyc2VVU0ZNLCBvcmlnaW5hbFZlcnNlT2JqZWN0cylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWxpZ25lZCAhPT0gYWxpZ25lZF8pIHtcbiAgICAgICAgc2V0U3RhdGUoeyBhbGlnbmVkOiBhbGlnbmVkXyB9KVxuICAgICAgfVxuICAgIH1cbiAgfSwgW2luaXRpYWxWZXJzZU9iamVjdHMsIGFsaWduZXJEYXRhLCBuZXdWZXJzZVRleHQsIGluaXRpYWxWZXJzZVRleHQsIGVuYWJsZUFsaWdubWVudCwgb3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZT8udmVyc2VPYmplY3RzXSlcblxuICAvKipcbiAgICogc2VhcmNoIGNoYXB0ZXIgb3IgdmVyc2UgY2h1bmsgdG8gbGluZSB0aGF0IHN0YXJ0cyB3aXRoIGZpbmRJdGVtXG4gICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gZmluZEl0ZW1cbiAgICogQHBhcmFtIHthcnJheVtzdHJpbmddfSBjaHVua3NcbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRSZWZJbkFycmF5KGZpbmRJdGVtLCBjaHVua3MpIHtcbiAgICBjb25zdCByZWZfID0gZmluZEl0ZW0gKyAnJ1xuICAgIGNvbnN0IHJlZkxlbiA9IHJlZl8ubGVuZ3RoXG4gICAgY29uc3QgaW5kZXggPSBjaHVua3MuZmluZEluZGV4KChjaHVuaywgaWR4KSA9PiB7XG4gICAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgICBpZiAoY2h1bmsuc3Vic3RyaW5nKDAsIHJlZkxlbikgPT09IHJlZl8pIHtcbiAgICAgICAgICBjb25zdCBuZXh0Q2hhciA9IGNodW5rW3JlZl9dXG5cbiAgICAgICAgICBpZiAoKG5leHRDaGFyID4gJzknKSB8fCAobmV4dENoYXIgPCAnMCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSlcbiAgICByZXR1cm4gaW5kZXhcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVDaGFuZ2VzVG9DbG91ZCgpIHtcbiAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkIC0gc3RhcnRlZGApXG4gICAgbGV0IHVwZGF0ZWRWZXJzZU9iamVjdHNfXG5cbiAgICBpZiAobmV3QWxpZ25tZW50cykgeyAvLyBpZiB1bnNhdmVkIGFsaWdubWVudCBjaGFuZ2VzLCBhcHBseSB0aGVtXG4gICAgICB1cGRhdGVkVmVyc2VPYmplY3RzXyA9IHVwZGF0ZVZlcnNlV2l0aE5ld0FsaWdubWVudHMoKVxuICAgIH0gZWxzZSBpZiAodmVyc2VUZXh0Q2hhbmdlZCAmJiBuZXdWZXJzZVRleHQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWZXJzZU9iamVjdHNfID0gdXBkYXRlZFZlcnNlT2JqZWN0cyB8fCBpbml0aWFsVmVyc2VPYmplY3RzXG4gICAgICBjb25zdCB7IHRhcmdldFZlcnNlVGV4dCwgdGFyZ2V0VmVyc2VPYmplY3RzIH0gPSBBbGlnbm1lbnRIZWxwZXJzLnVwZGF0ZUFsaWdubWVudHNUb1RhcmdldFZlcnNlKGN1cnJlbnRWZXJzZU9iamVjdHNfLCBuZXdWZXJzZVRleHQpXG4gICAgICAvLyBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkKCkgLSBuZXcgdGV4dDpgLCB0YXJnZXRWZXJzZVRleHQuc3Vic3RyaW5nKDAsMTAwKSlcbiAgICAgIHVwZGF0ZWRWZXJzZU9iamVjdHNfID0gdGFyZ2V0VmVyc2VPYmplY3RzXG4gICAgfSBlbHNlIHsgLy8gb25seSBhbGlnbm1lbnQgY2hhbmdlcyB0byB1cGxvYWRcbiAgICAgIHVwZGF0ZWRWZXJzZU9iamVjdHNfID0gdXBkYXRlZFZlcnNlT2JqZWN0cyB8fCBpbml0aWFsVmVyc2VPYmplY3RzXG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZWRWZXJzZU9iamVjdHNfKSB7XG4gICAgICBsZXQgbmV3VXNmbVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY29uc3QgcmVmID0gc2NyaXB0dXJlQ29uZmlnPy52ZXJzZXNGb3JSZWY/LltjdXJyZW50VmVyc2VOdW1dXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBjb25zdCBvcmlnaW5hbFVzZm0gPSBjb3JlLmdldFJlc3BvbnNlRGF0YShzY3JpcHR1cmVDb25maWc/LmZldGNoUmVzcG9uc2UpXG5cbiAgICAgIGlmIChvcmlnaW5hbFVzZm0pIHtcbiAgICAgICAgY29uc3QgY2hhcHRlckNodW5rcyA9IG9yaWdpbmFsVXNmbT8uc3BsaXQoJ1xcXFxjICcpXG4gICAgICAgIGNvbnN0IGNoYXB0ZXJJbmRleCA9IGZpbmRSZWZJbkFycmF5KHJlZj8uY2hhcHRlciwgY2hhcHRlckNodW5rcylcblxuICAgICAgICBpZiAoY2hhcHRlckluZGV4ID49IDApIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Q2hhcHRlciA9IGNoYXB0ZXJDaHVua3NbY2hhcHRlckluZGV4XVxuICAgICAgICAgIGNvbnN0IHZlcnNlQ2h1bmtzID0gY3VycmVudENoYXB0ZXIuc3BsaXQoJ1xcXFx2ICcpXG4gICAgICAgICAgY29uc3QgdmVyc2VJbmRleCA9IGZpbmRSZWZJbkFycmF5KHJlZj8udmVyc2UsIHZlcnNlQ2h1bmtzKVxuXG4gICAgICAgICAgaWYgKHZlcnNlSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgbmV3VmVyc2VVc2ZtID0gVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKHVwZGF0ZWRWZXJzZU9iamVjdHNfKVxuICAgICAgICAgICAgY29uc3Qgb2xkVmVyc2UgPSB2ZXJzZUNodW5rc1t2ZXJzZUluZGV4XVxuICAgICAgICAgICAgY29uc3QgdmVyc2VOdW1MZW4gPSAocmVmPy52ZXJzZSArICcnKS5sZW5ndGhcbiAgICAgICAgICAgIHZlcnNlQ2h1bmtzW3ZlcnNlSW5kZXhdID0gb2xkVmVyc2Uuc3Vic3RyaW5nKDAsIHZlcnNlTnVtTGVuICsgMSkgKyBuZXdWZXJzZVVzZm1cbiAgICAgICAgICAgIGNvbnN0IG5ld0NoYXB0ZXIgPSB2ZXJzZUNodW5rcy5qb2luKCdcXFxcdiAnKVxuICAgICAgICAgICAgY2hhcHRlckNodW5rc1tjaGFwdGVySW5kZXhdID0gbmV3Q2hhcHRlclxuICAgICAgICAgICAgbmV3VXNmbSA9IGNoYXB0ZXJDaHVua3Muam9pbignXFxcXGMgJylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFuZXdVc2ZtKSB7XG4gICAgICAgIGNvbnN0IG5ld0Jvb2tKc29uID0gdXBkYXRlVmVyc2VOdW0oY3VycmVudFZlcnNlTnVtLCB1cGRhdGVkVmVyc2VPYmplY3RzXylcbiAgICAgICAgbmV3VXNmbSA9IHVzZm1qcy50b1VTRk0obmV3Qm9va0pzb24sIHsgZm9yY2VkTmV3TGluZXM6IHRydWUgfSlcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQoKSAtIHNhdmluZyBuZXcgVVNGTTogJHtuZXdVc2ZtLnN1YnN0cmluZygwLCAxMDApfS4uLmApXG4gICAgICBzZXRTdGF0ZSh7IHNhdmVDb250ZW50OiBuZXdVc2ZtLCBzdGFydFNhdmU6IHRydWUgfSlcbiAgICB9XG4gIH1cblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IF9zYXZlRWRpdCA9IGFzeW5jICgpID0+IHsgLy8gYmVnaW4gdXBsb2FkaW5nIG5ldyBVU0ZNXG4gICAgICBsZXQgYnJhbmNoID0gKHdvcmtpbmdSZXNvdXJjZUJyYW5jaCAhPT0gJ21hc3RlcicpID8gd29ya2luZ1Jlc291cmNlQnJhbmNoIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmICghYnJhbmNoKSB7XG4gICAgICAgIGJyYW5jaCA9IGF3YWl0IHN0YXJ0RWRpdEJyYW5jaCgpIC8vIG1ha2Ugc3VyZSB1c2VyIGJyYW5jaCBleGlzdHMgYW5kIGdldCBuYW1lXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG9uU2F2ZUVkaXQoYnJhbmNoKS50aGVuKChzdWNjZXNzKSA9PiB7IC8vIHB1c2ggY2hhbmdlZCB0byBzZXJ2ZXJcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgc2F2ZUNoYW5nZXNUb0Nsb3VkKCkgLSBzYXZlIHNjcmlwdHVyZSBlZGl0cyBzdWNjZXNzYClcbiAgICAgICAgICBzZXRTdGF0ZSh7XG4gICAgICAgICAgICB1cGRhdGVkVmVyc2VPYmplY3RzOiBudWxsLFxuICAgICAgICAgICAgZWRpdGluZzogZmFsc2UsXG4gICAgICAgICAgICBuZXdWZXJzZVRleHQ6IG51bGwsXG4gICAgICAgICAgICBhbGlnbmVyRGF0YTogbnVsbCxcbiAgICAgICAgICAgIHN0YXJ0U2F2ZTogZmFsc2UsXG4gICAgICAgICAgICB2ZXJzZVRleHRDaGFuZ2VkOiBmYWxzZSxcbiAgICAgICAgICAgIGluaXRpYWxWZXJzZVRleHQ6IG51bGwsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ3NhdmVDaGFuZ2VzVG9DbG91ZCgpIC0gUmVsb2FkaW5nIHJlc291cmNlJylcbiAgICAgICAgICBzY3JpcHR1cmVDb25maWc/LnJlbG9hZFJlc291cmNlKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzYXZlQ2hhbmdlc1RvQ2xvdWQoKSAtIHNhdmluZyBjaGFuZ2VkIHNjcmlwdHVyZSBmYWlsZWQnKVxuICAgICAgICAgIHNldFN0YXRlKHsgc3RhcnRTYXZlOiBmYWxzZSB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChzdGFydFNhdmUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBzYXZlQ2hhbmdlc1RvQ2xvdWQgLSBjYWxsaW5nIF9zYXZlRWRpdCgpYClcbiAgICAgIF9zYXZlRWRpdCgpXG4gICAgfVxuICB9LCBbc3RhcnRTYXZlXSlcblxuICBmdW5jdGlvbiB1cGRhdGVWZXJzZU51bShpbmRleCwgbmV3VmVyc2VPYmplY3RzID0gaW5pdGlhbFZlcnNlT2JqZWN0cykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCByZWYgPSBzY3JpcHR1cmVDb25maWc/LnZlcnNlc0ZvclJlZj8uW2luZGV4XVxuICAgIGxldCB0YXJnZXRWZXJzZU9iamVjdHNfID0gbnVsbFxuXG4gICAgaWYgKHJlZikge1xuICAgICAgaWYgKG5ld1ZlcnNlVGV4dCkge1xuICAgICAgICBjb25zdCB7IHRhcmdldFZlcnNlT2JqZWN0cyB9ID0gQWxpZ25tZW50SGVscGVycy51cGRhdGVBbGlnbm1lbnRzVG9UYXJnZXRWZXJzZShuZXdWZXJzZU9iamVjdHMsIG5ld1ZlcnNlVGV4dClcbiAgICAgICAgdGFyZ2V0VmVyc2VPYmplY3RzXyA9IHRhcmdldFZlcnNlT2JqZWN0c1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0VmVyc2VPYmplY3RzXyA9IG5ld1ZlcnNlT2JqZWN0c1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXR1cm4gdGFyZ2V0VmVyc2VPYmplY3RzXyAmJiBzY3JpcHR1cmVDb25maWc/LnVwZGF0ZVZlcnNlKHJlZi5jaGFwdGVyLCByZWYudmVyc2UsIHsgdmVyc2VPYmplY3RzOiB0YXJnZXRWZXJzZU9iamVjdHNfIH0pXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBoYW5kbGVBbGlnbm1lbnRDbGljaygpIHtcbiAgICBpZiAoZW5hYmxlQWxpZ25tZW50KSB7XG4gICAgICBsZXQgYWxpZ25lckRhdGFfID0gbnVsbFxuICAgICAgYXdhaXQgc3RhcnRFZGl0QnJhbmNoKClcblxuICAgICAgaWYgKCFhbGlnbmVyRGF0YSkgeyAvLyBpZiB3b3JkIGFsaWduZXIgbm90IHNob3duXG4gICAgICAgIGNvbnNvbGUubG9nKGBoYW5kbGVBbGlnbm1lbnRDbGljayAtIHRvZ2dsZSBPTiBhbGlnbm1lbnRgKVxuICAgICAgICBjb25zdCB0YXJnZXRWZXJzZVVTRk0gPSBnZXRDdXJyZW50VmVyc2VVc2ZtKHVwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWQsIG5ld1ZlcnNlVGV4dClcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWZXJzZU9iamVjdHMgPSBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZU9iamVjdHNcbiAgICAgICAgbGV0IG9yaWdpbmFsVmVyc2VVc2ZtID0gbnVsbFxuXG4gICAgICAgIGlmIChvcmlnaW5hbFZlcnNlT2JqZWN0cykge1xuICAgICAgICAgIG9yaWdpbmFsVmVyc2VVc2ZtID0gVXNmbUZpbGVDb252ZXJzaW9uSGVscGVycy5jb252ZXJ0VmVyc2VEYXRhVG9VU0ZNKG9yaWdpbmFsVmVyc2VPYmplY3RzKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHRhcmdldFdvcmRzOiB3b3JkQmFuayxcbiAgICAgICAgICB2ZXJzZUFsaWdubWVudHM6IGFsaWdubWVudHMsXG4gICAgICAgIH0gPSBBbGlnbm1lbnRIZWxwZXJzLnBhcnNlVXNmbVRvV29yZEFsaWduZXJEYXRhKHRhcmdldFZlcnNlVVNGTSwgb3JpZ2luYWxWZXJzZVVzZm0pXG4gICAgICAgIGFsaWduZXJEYXRhXyA9IHsgd29yZEJhbmssIGFsaWdubWVudHMgfVxuICAgICAgfSBlbHNlIHsgLy8gd29yZCBhbGlnbmVyIGN1cnJlbnRseSBzaG93blxuICAgICAgICBjb25zb2xlLmxvZyhgaGFuZGxlQWxpZ25tZW50Q2xpY2sgLSBhbGlnbm1lbnQgYWxyZWFkeSBzaG93bmApXG4gICAgICAgIGFsaWduZXJEYXRhXyA9IGFsaWduZXJEYXRhXG4gICAgICB9XG4gICAgICBzZXRTdGF0ZSh7IGFsaWduZXJEYXRhOiBhbGlnbmVyRGF0YV8gfSlcbiAgICAgIGNvbnNvbGUubG9nKGFsaWduZXJEYXRhXylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVWZXJzZVdpdGhOZXdBbGlnbm1lbnRzKCkge1xuICAgIGNvbnN0IGN1cnJlbnRWZXJzZU9iamVjdHNfID0gdXBkYXRlZFZlcnNlT2JqZWN0cyB8fCBpbml0aWFsVmVyc2VPYmplY3RzXG4gICAgY29uc3QgdGFyZ2V0VmVyc2VUZXh0ID0gbmV3VmVyc2VUZXh0IHx8IFVzZm1GaWxlQ29udmVyc2lvbkhlbHBlcnMuY29udmVydFZlcnNlRGF0YVRvVVNGTShjdXJyZW50VmVyc2VPYmplY3RzXylcbiAgICBjb25zdCB2ZXJzZVVzZm0gPSBBbGlnbm1lbnRIZWxwZXJzLmFkZEFsaWdubWVudHNUb1ZlcnNlVVNGTShuZXdBbGlnbm1lbnRzLnRhcmdldFdvcmRzLCBuZXdBbGlnbm1lbnRzLnZlcnNlQWxpZ25tZW50cywgdGFyZ2V0VmVyc2VUZXh0KVxuICAgIGNvbnN0IGFsaWduZWRWZXJzZU9iamVjdHMgPSB1c2ZtSGVscGVycy51c2ZtVmVyc2VUb0pzb24odmVyc2VVc2ZtKVxuICAgIHJldHVybiBhbGlnbmVkVmVyc2VPYmplY3RzXG4gIH1cblxuICBmdW5jdGlvbiBzYXZlQWxpZ25tZW50KCkge1xuICAgIGNvbnNvbGUubG9nKGBzYXZlQWxpZ25tZW50KClgKVxuXG4gICAgaWYgKG5ld0FsaWdubWVudHMpIHtcbiAgICAgIGNvbnN0IGFsaWduZWRWZXJzZU9iamVjdHMgPSB1cGRhdGVWZXJzZVdpdGhOZXdBbGlnbm1lbnRzKClcblxuICAgICAgc2V0U3RhdGUoe1xuICAgICAgICBhbGlnbmVyRGF0YTogbnVsbCxcbiAgICAgICAgZWRpdGluZzogZmFsc2UsXG4gICAgICAgIG5ld0FsaWdubWVudHM6IG51bGwsXG4gICAgICAgIHVwZGF0ZWRWZXJzZU9iamVjdHM6IGFsaWduZWRWZXJzZU9iamVjdHMsXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTdGF0ZSh7XG4gICAgICAgIGFsaWduZXJEYXRhOiBudWxsLFxuICAgICAgICBlZGl0aW5nOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsQWxpZ25tZW50KCkge1xuICAgIGNvbnNvbGUubG9nKGBjYW5jZWxBbGlnbm1lbnQoKWApXG4gICAgY29uc3QgdGFyZ2V0VmVyc2VVU0ZNID0gZ2V0Q3VycmVudFZlcnNlVXNmbSh1cGRhdGVkVmVyc2VPYmplY3RzLCBpbml0aWFsVmVyc2VPYmplY3RzLCB2ZXJzZVRleHRDaGFuZ2VkLCBuZXdWZXJzZVRleHQpXG4gICAgY29uc3QgYWxpZ25lZCA9IGlzVXNmbUFsaWduZWQodGFyZ2V0VmVyc2VVU0ZNLCBvcmlnaW5hbFNjcmlwdHVyZVJlc291cmNlPy52ZXJzZU9iamVjdHMpXG4gICAgc2V0U3RhdGUoeyBhbGlnbmVyRGF0YTogbnVsbCwgYWxpZ25lZCB9KVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2V0RWRpdGluZyhlZGl0aW5nXykge1xuICAgIGlmIChlbmFibGVFZGl0KSB7XG4gICAgICBpZiAoZWRpdGluZ18gJiYgIWVkaXRpbmcpIHtcbiAgICAgICAgYXdhaXQgc3RhcnRFZGl0QnJhbmNoKClcbiAgICAgIH1cblxuICAgICAgaWYgKGVkaXRpbmdfICE9PSBlZGl0aW5nKSB7XG4gICAgICAgIHNldFN0YXRlKHsgZWRpdGluZzogZWRpdGluZ18gfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXRWZXJzZUNoYW5nZWQoY2hhbmdlZCwgbmV3VmVyc2VUZXh0LCBpbml0aWFsVmVyc2VUZXh0KSB7XG4gICAgY29uc3QgeyB0YXJnZXRWZXJzZVRleHQgfSA9IEFsaWdubWVudEhlbHBlcnMudXBkYXRlQWxpZ25tZW50c1RvVGFyZ2V0VmVyc2UoaW5pdGlhbFZlcnNlT2JqZWN0cywgbmV3VmVyc2VUZXh0KVxuICAgIGNvbnN0IGFsaWduZWQgPSBpc1VzZm1BbGlnbmVkKHRhcmdldFZlcnNlVGV4dCwgb3JpZ2luYWxTY3JpcHR1cmVSZXNvdXJjZT8udmVyc2VPYmplY3RzKVxuXG4gICAgc2V0U3RhdGUoe1xuICAgICAgdmVyc2VUZXh0Q2hhbmdlZDogY2hhbmdlZCxcbiAgICAgIGluaXRpYWxWZXJzZVRleHQsXG4gICAgICBuZXdWZXJzZVRleHQsXG4gICAgICBhbGlnbmVkLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBjdXJyZW50VmVyc2VPYmplY3RzID0gUmVhY3QudXNlTWVtbyggKCkgPT4geyAvLyBpZiB2ZXJzZSBoYXMgYmVlbiBlZGl0ZWQgb3IgYWxpZ25tZW50IGNoYW5nZWQsIHRoZW4gZ2VuZXJhdGUgbmV3IHZlcnNlT2JqZWN0cyB0byBkaXNwbGF5IGluIFNjcmlwdHVyZVBhbmVcbiAgICBpZiAoaW5pdGlhbFZlcnNlT2JqZWN0cykge1xuICAgICAgY29uc3QgdGFyZ2V0VmVyc2VVU0ZNID0gZ2V0Q3VycmVudFZlcnNlVXNmbSh1cGRhdGVkVmVyc2VPYmplY3RzLCBpbml0aWFsVmVyc2VPYmplY3RzLCB2ZXJzZVRleHRDaGFuZ2VkLCBuZXdWZXJzZVRleHQpXG4gICAgICBjb25zdCBjdXJyZW50VmVyc2VPYmplY3RzXyA9IHVzZm1IZWxwZXJzLnVzZm1WZXJzZVRvSnNvbih0YXJnZXRWZXJzZVVTRk0pXG4gICAgICByZXR1cm4gY3VycmVudFZlcnNlT2JqZWN0c19cbiAgICB9XG4gICAgcmV0dXJuIGluaXRpYWxWZXJzZU9iamVjdHNcbiAgfSwgW3VwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWQsIG5ld1ZlcnNlVGV4dF0pXG5cbiAgY29uc3QgdW5zYXZlZENoYW5nZXM6Ym9vbGVhbiA9IFJlYWN0LnVzZU1lbW8oICgpID0+IHsgLy8gaWYgdmVyc2UgaGFzIGJlZW4gZWRpdGVkIG9yIGFsaWdubWVudCBjaGFuZ2VkLCB0aGVuIGluZGljYXRlIHdlIGhhdmUgdW5zYXZlZCBjaGFuZ2VzXG4gICAgY29uc3QgY2hhbmdlZCA9IHZlcnNlVGV4dENoYW5nZWQgfHwgKHVwZGF0ZWRWZXJzZU9iamVjdHMgJiYgIWlzRXF1YWwoaW5pdGlhbFZlcnNlT2JqZWN0cywgdXBkYXRlZFZlcnNlT2JqZWN0cykpXG4gICAgcmV0dXJuIGNoYW5nZWRcbiAgfSwgW3VwZGF0ZWRWZXJzZU9iamVjdHMsIGluaXRpYWxWZXJzZU9iamVjdHMsIHZlcnNlVGV4dENoYW5nZWRdKVxuXG4gIGZ1bmN0aW9uIG9uQWxpZ25tZW50c0NoYW5nZShyZXN1bHRzKSB7XG4gICAgY29uc29sZS5sb2coYG9uQWxpZ25tZW50c0NoYW5nZSgpIC0gYWxpZ25tZW50IGNoYW5nZWQsIHJlc3VsdHNgLCByZXN1bHRzKSAvLyBtZXJnZSBhbGlnbm1lbnRzIGludG8gdGFyZ2V0IHZlcnNlIGFuZCBjb252ZXJ0IHRvIFVTRk1cbiAgICBjb25zdCB7IHRhcmdldFdvcmRzLCB2ZXJzZUFsaWdubWVudHMgfSA9IHJlc3VsdHNcbiAgICBjb25zdCBhbGlnbm1lbnRDb21wbGV0ZSA9IEFsaWdubWVudEhlbHBlcnMuYXJlQWxnbm1lbnRzQ29tcGxldGUodGFyZ2V0V29yZHMsIHZlcnNlQWxpZ25tZW50cylcbiAgICBjb25zb2xlLmxvZyhgQWxpZ25tZW50cyBhcmUgJHthbGlnbm1lbnRDb21wbGV0ZSA/ICdDT01QTEVURSEnIDogJ2luY29tcGxldGUnfWApXG4gICAgc2V0U3RhdGUoeyBuZXdBbGlnbm1lbnRzOiByZXN1bHRzLCBhbGlnbmVkOiBhbGlnbm1lbnRDb21wbGV0ZSB9KVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhY3Rpb25zOiB7XG4gICAgICBjYW5jZWxBbGlnbm1lbnQsXG4gICAgICBjdXJyZW50VmVyc2VPYmplY3RzLFxuICAgICAgaGFuZGxlQWxpZ25tZW50Q2xpY2ssXG4gICAgICBvbkFsaWdubWVudHNDaGFuZ2UsXG4gICAgICBzYXZlQWxpZ25tZW50LFxuICAgICAgc2V0RWRpdGluZyxcbiAgICAgIHNldFZlcnNlQ2hhbmdlZCxcbiAgICAgIHNhdmVDaGFuZ2VzVG9DbG91ZCxcbiAgICB9LFxuICAgIHN0YXRlOiB7XG4gICAgICBhbGlnbmVkLFxuICAgICAgYWxpZ25lckRhdGEsXG4gICAgICBlZGl0aW5nLFxuICAgICAgdmVyc2VUZXh0Q2hhbmdlZCxcbiAgICAgIHVuc2F2ZWRDaGFuZ2VzLFxuICAgIH0sXG4gIH1cbn1cbiJdfQ==
|